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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 11418 - (show annotations)
Mon Feb 7 14:59:54 2022 UTC (2 years, 9 months ago) by softime
File size: 380356 byte(s)
* Fusion de la branche d'intégration 5.7.0-develop dans le trunk

1 <?php
2 /**
3 * DBFORM - 'instruction' - Surcharge gen.
4 *
5 * specific :
6 * - cle secondaire
7 * destruction autorisée que pour le dernier evenement
8 * [delete the last event ]
9 * - variable globale [global variables]
10 * var $retourformulaire;
11 * var $idxformulaire;
12 * - modification des données dans dossier trigger avant
13 * [modify dossier data with trigger function]
14 * - function mois_date : pour ajouter des mois a une date
15 * [add months (delay) and calculation final date]
16 * - voir script_lang.js : bible ...
17 *
18 * @package openfoncier
19 * @version SVN : $Id$
20 */
21
22 //
23 require_once "../gen/obj/instruction.class.php";
24
25 //
26 class instruction extends instruction_gen {
27
28 // Champs contenant les UID des fichiers
29 var $abstract_type = array(
30 "om_fichier_instruction" => "file",
31 );
32
33 var $valEvenement;
34 var $restriction_valid = null;
35 // Tableau contenant une partie des métadonnées arrêtés
36 var $metadonneesArrete;
37
38 /**
39 * Instance de la classe dossier
40 *
41 * @var mixed
42 */
43 var $inst_dossier = null;
44
45 /**
46 * Instance de la classe instructeur
47 *
48 * @var mixed
49 */
50 var $inst_instructeur = null;
51
52 /**
53 * Instance de la classe om_utilisateur
54 *
55 * @var mixed
56 */
57 var $inst_om_utilisateur = null;
58
59 var $metadata = array(
60 "om_fichier_instruction" => array(
61 "dossier" => "getDossier",
62 "dossier_version" => "getDossierVersion",
63 "numDemandeAutor" => "getNumDemandeAutor",
64 "anneemoisDemandeAutor" => "getAnneemoisDemandeAutor",
65 "typeInstruction" => "getTypeInstruction",
66 "statutAutorisation" => "getStatutAutorisation",
67 "typeAutorisation" => "getTypeAutorisation",
68 "dateEvenementDocument" => "getDateEvenementDocument",
69 "groupeInstruction" => 'getGroupeInstruction',
70 "title" => 'getTitle',
71 'concerneERP' => 'get_concerne_erp',
72
73 'date_cloture_metier' => 'getDossierDateDecision',
74 'type' => 'getDocumentType',
75 'dossier_autorisation_type_detaille' => 'getDossierAutorisationTypeDetaille',
76 'dossier_instruction_type' => 'getDossierInstructionTypeLibelle',
77 'region' => 'getDossierRegion',
78 'departement' => 'getDossierDepartement',
79 'commune' => 'getDossierCommune',
80 'annee' => 'getDossierAnnee',
81 'division' => 'getDossierDivision',
82 'collectivite' => 'getDossierServiceOrCollectivite',
83 ),
84 "arrete" => array(
85 "numArrete" => "getNumArrete",
86 "ReglementaireArrete" => "getReglementaireArrete",
87 "NotificationArrete" => "getNotificationArrete",
88 "dateNotificationArrete" => "getDateNotificationArrete",
89 "controleLegalite" => "getControleLegalite",
90 "dateSignature" => "getDateSignature",
91 "nomSignataire" => "getNomSignataire",
92 "qualiteSignataire" => "getQualiteSignataire",
93 "ap_numRue" => "getAp_numRue",
94 "ap_nomDeLaVoie" => "getAp_nomDeLaVoie",
95 "ap_codePostal" => "getAp_codePostal",
96 "ap_ville" => "getAp_ville",
97 "activite" => "getActivite",
98 "dateControleLegalite" => "getDateControleLegalite",
99 )
100 );
101
102 /**
103 * Flag pour identifier la reprise de l'instruction d'un dossier.
104 * Le statut de l'état passe de "cloture" à "encours".
105 *
106 * @var boolean
107 */
108 var $di_reopened = null;
109
110 // {{{ Gestion de la confidentialité des données spécifiques
111
112 /**
113 * Définition des actions disponibles sur la classe.
114 *
115 * @return void
116 */
117 function init_class_actions() {
118
119 parent::init_class_actions();
120
121 // ACTION - 000 - ajouter
122 // Modifie la condition d'affichage du bouton ajouter
123 $this->class_actions[0]["condition"] = array("is_addable", "can_user_access_dossier_contexte_ajout");
124
125 // ACTION - 001 - modifier
126 // Modifie la condition et le libellé du bouton modifier
127 $this->class_actions[1]["condition"] = array(
128 "is_editable",
129 "is_finalizable_without_bypass",
130 "can_user_access_dossier_contexte_modification",
131 "is_evenement_modifiable",
132 );
133 $this->class_actions[1]["portlet"]["libelle"] = _("Modifier");
134
135 // ACTION - 002 - supprimer
136 // Modifie la condition et le libellé du bouton supprimer
137 $this->class_actions[2]["condition"] = array(
138 "is_deletable",
139 "is_finalizable_without_bypass",
140 "can_user_access_dossier_contexte_modification",
141 "is_evenement_supprimable",
142 );
143 $this->class_actions[2]["portlet"]["libelle"] = _("Supprimer");
144
145 // ACTION - 003 - consulter
146 //
147 $this->class_actions[3]["condition"] = "can_user_access_dossier_contexte_modification";
148
149 // ACTION - 100 - finaliser
150 // Finalise l'enregistrement
151 $this->class_actions[100] = array(
152 "identifier" => "finaliser",
153 "portlet" => array(
154 "type" => "action-direct",
155 "libelle" => _("Finaliser le document"),
156 "order" => 110,
157 "class" => "finalise",
158 ),
159 "view" => "formulaire",
160 "method" => "finalize",
161 "button" => "finaliser",
162 "permission_suffix" => "finaliser",
163 "condition" => array(
164 "is_finalizable",
165 "is_finalizable_without_bypass",
166 "has_an_edition",
167 "can_user_access_dossier_contexte_modification",
168 ),
169 );
170
171 // ACTION - 110 - definaliser
172 // Finalise l'enregistrement
173 $this->class_actions[110] = array(
174 "identifier" => "definaliser",
175 "portlet" => array(
176 "type" => "action-direct",
177 "libelle" => _("Reprendre la redaction du document"),
178 "order" => 110,
179 "class" => "definalise",
180 ),
181 "view" => "formulaire",
182 "method" => "unfinalize",
183 "button" => "definaliser",
184 "permission_suffix" => "definaliser",
185 "condition" => array(
186 "is_unfinalizable",
187 "is_unfinalizable_without_bypass",
188 "can_user_access_dossier_contexte_modification",
189 "is_not_sent_for_signature",
190 ),
191 );
192
193 // ACTION - 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 //
415 $this->class_actions[401] = array(
416 "identifier" => "preview_edition",
417 "view" => "formulaire",
418 "permission_suffix" => "tab",
419 );
420
421 // ACTION - 410 - Notifier les pétitionnaires (mail ou autre)
422 $this->class_actions[410] = array(
423 "identifier" => "overlay_notification_manuelle",
424 "portlet" => array(
425 "libelle" => __("Notifier les pétitionnaires"),
426 "type" => "action-self",
427 "class" => "notifier_commune-16",
428 ),
429 "condition" => array(
430 "is_notifiable_by_task_manual",
431 "is_not_portail_notification_sans_annexe"
432 ),
433 "view" => "view_overlay_notification_manuelle",
434 "permission_suffix" => "modifier",
435 );
436
437 // ACTION - 410 - Notifier les pétitionnaires (portail citoyen)
438 $this->class_actions[411] = array(
439 "identifier" => "notification_manuelle_portal",
440 "portlet" => array(
441 "libelle" => __("Notifier les pétitionnaires"),
442 "type" => "action-direct-with-confirmation",
443 "class" => "notifier_commune-16",
444 ),
445 "condition" => array(
446 "is_notifiable_by_task_manual",
447 "is_portail_notification_sans_annexe"
448 ),
449 "method" => "notifier_demandeur_principal",
450 "permission_suffix" => "modifier",
451 );
452
453 //
454 $this->class_actions[403] = array(
455 "identifier" => "envoyer_au_controle_de_legalite",
456 "portlet" => array(
457 "libelle" => __("Envoyer au contrôle de légalité"),
458 "type" => "action-direct-with-confirmation",
459 "class" => "envoyer_au_controle_de_legalite-16",
460 ),
461 "view" => "formulaire",
462 "method" => "envoyer_au_controle_de_legalite",
463 "condition" => array(
464 "can_be_sended_to_cl"
465 ),
466 "permission_suffix" => "envoyer_au_controle_de_legalite",
467 );
468
469 //
470 $this->class_actions[998] = array(
471 "identifier" => "json_data",
472 "view" => "view_json_data",
473 "permission_suffix" => "consulter",
474 );
475 }
476
477 /**
478 * Clause select pour la requête de sélection des données de l'enregistrement.
479 *
480 * @return array
481 */
482 function get_var_sql_forminc__champs() {
483 return array(
484 "instruction",
485 "destinataire",
486 "instruction.evenement",
487 "instruction.commentaire",
488 "date_evenement",
489 "instruction.lettretype",
490 "signataire_arrete",
491 "flag_edition_integrale",
492 "om_final_instruction_utilisateur",
493 "date_finalisation_courrier",
494 "date_envoi_signature",
495 "date_envoi_rar",
496 "date_envoi_controle_legalite",
497
498 "date_retour_signature",
499 "date_retour_rar",
500 "date_retour_controle_legalite",
501
502 "numero_arrete",
503
504 "complement_om_html",
505 "'' as bible_auto",
506 "'' as bible",
507 "complement2_om_html",
508 "'' as bible2",
509 "complement3_om_html",
510 "'' as bible3",
511 "complement4_om_html",
512 "'' as bible4",
513
514 "titre_om_htmletat",
515 "corps_om_htmletatex",
516
517 "'' as btn_preview",
518 "'' as btn_redaction",
519
520 "'' as btn_refresh",
521 "'' as live_preview",
522
523 "dossier",
524 "instruction.action",
525 "instruction.delai",
526 "instruction.etat",
527 "instruction.autorite_competente",
528 "instruction.accord_tacite",
529 "instruction.delai_notification",
530 "instruction.avis_decision",
531 "archive_delai",
532 "archive_accord_tacite",
533 "archive_etat",
534 "archive_avis",
535 "archive_date_complet",
536 "archive_date_rejet",
537 "archive_date_limite",
538 "archive_date_notification_delai",
539 "archive_date_decision",
540 "archive_date_validite",
541 "archive_date_achevement",
542 "archive_date_conformite",
543 "archive_date_chantier",
544 "archive_date_dernier_depot",
545 "date_depot",
546 "date_depot_mairie",
547 "complement5_om_html",
548 "'' as bible5",
549 "complement6_om_html",
550 "'' as bible6",
551 "complement7_om_html",
552 "'' as bible7",
553 "complement8_om_html",
554 "'' as bible8",
555 "complement9_om_html",
556 "'' as bible9",
557 "complement10_om_html",
558 "'' as bible10",
559 "complement11_om_html",
560 "'' as bible11",
561 "complement12_om_html",
562 "complement13_om_html",
563 "complement14_om_html",
564 "complement15_om_html",
565 "archive_incompletude",
566 "archive_incomplet_notifie",
567 "archive_evenement_suivant_tacite",
568 "archive_evenement_suivant_tacite_incompletude",
569 "archive_etat_pendant_incompletude",
570 "archive_date_limite_incompletude",
571 "archive_delai_incompletude",
572 "archive_autorite_competente",
573 "code_barres",
574 "om_fichier_instruction",
575 "om_final_instruction",
576 "om_fichier_instruction_dossier_final",
577 "document_numerise",
578 "duree_validite_parametrage",
579 "duree_validite",
580 "created_by_commune",
581 "archive_date_cloture_instruction",
582 "archive_date_premiere_visite",
583 "archive_date_derniere_visite",
584 "archive_date_contradictoire",
585 "archive_date_retour_contradictoire",
586 "archive_date_ait",
587 "archive_date_transmission_parquet",
588 "archive_dossier_instruction_type",
589 "archive_date_affichage",
590 "pec_metier",
591 "archive_pec_metier",
592 "archive_a_qualifier",
593 "id_parapheur_signature",
594 "statut_signature",
595 "commentaire_signature",
596 "historique_signature",
597 "'' as suivi_notification",
598
599
600 "'' as preview_edition",
601 "envoye_cl_platau",
602 );
603 }
604
605 /**
606 * CONDITION - is_edition_integrale_enabled
607 *
608 * Vérifie que la rédaction libre est activée sur l'instruction en cours.
609 *
610 * @return boolean
611 */
612 function is_edition_integrale_enabled() {
613 if ($this->getVal("flag_edition_integrale") == 't') {
614 return true;
615 }
616 return false;
617 }
618
619 /**
620 * CONDITION - is_edition_integrale_not_enabled
621 *
622 * Vérifie que la rédaction libre est désactivée sur l'instruction en cours.
623 *
624 * @return boolean
625 */
626 function is_edition_integrale_not_enabled() {
627 return !$this->is_edition_integrale_enabled();
628 }
629
630 /**
631 * CONDITION - is_option_redaction_libre_enabled
632 *
633 * Vérifie que l'option de rédaction libre est activée.
634 *
635 * @return boolean
636 */
637 function is_option_redaction_libre_enabled() {
638 $collectivite_di = $this->get_dossier_instruction_om_collectivite();
639 return $this->f->is_option_redaction_libre_enabled($collectivite_di);
640 }
641
642 /**
643 * CONDITION - is_option_parapheur_relecture_enabled
644 *
645 * Vérifie que l'option de relecture lors de l'envoi en signature est activée.
646 *
647 * @return boolean
648 */
649 function is_parapheur_relecture_parameter_enabled() {
650 //Instanciation de la classe electronicsignature
651 $inst_es = $this->get_electronicsignature_instance();
652 if ($inst_es === false) {
653 return false;
654 }
655
656 if ($inst_es->get_conf('is_forced_view_files') !== 'true' && $inst_es->get_conf('is_forced_view_files') !== true) {
657 return false;
658 }
659
660 return true;
661 }
662
663
664 /**
665 * CONDITION - is_sent_for_signature
666 *
667 * Vérifie que l'instruction a été envoyé à signature
668 *
669 * @return boolean
670 */
671 function is_sent_for_signature() {
672 // Si un parapheur a été configuré
673 // et que le champ id_parapheur_signature n'est pas vide
674 // que le status est différent de "canceled" ou "expired"
675 // alors l'évènement a été envoyé en signature
676 if ($this->has_connector_electronicsignature() === true
677 && empty($this->getVal("id_parapheur_signature")) === false
678 && ($this->getVal("statut_signature") != "canceled"
679 || $this->getVal("statut_signature") != "expired"
680 || $this->getVal("statut_signature") != "finished")) {
681 //
682 return true;
683 }
684
685 return false;
686 }
687
688 /**
689 * CONDITION - is_not_sent_for_signature
690 *
691 * Vérifie que l'instruction n'a pas été envoyé à signature
692 *
693 * @return boolean
694 */
695 function is_not_sent_for_signature() {
696 // Contrôle si l'utilisateur possède un bypass
697 $bypass = $this->f->isAccredited($this->get_absolute_class_name()."_definaliser_bypass");
698 if ($bypass == true) {
699 return true;
700 }
701
702 return !$this->is_sent_for_signature();
703 }
704
705
706 /**
707 * CONDITION - is_signed
708 *
709 * Vérifie que l'instruction a été signé
710 *
711 * @return boolean
712 */
713 function is_signed() {
714 // Si un parapheur a été configuré
715 // et que le champ id_parapheur_signature n'est pas vide
716 // et que le statut est égal à "finished"
717 // alors le document de l'instruciton à été signé
718 if ($this->has_connector_electronicsignature() === true
719 && empty($this->getVal("id_parapheur_signature")) === false
720 && $this->getVal("statut_signature") == "finished") {
721 //
722 return true;
723 }
724
725 return false;
726 }
727
728 function is_sent_to_cl() {
729 // Si l'instruction a une édition
730 // et que l'événement est paramétré pour envoyer le contrôle de légalité
731 // par Plat'AU
732 // et que la date de retour signature est renseignée
733 // et que la date d'envoi au contrôle légalité n'est pas renseignée
734 // et qu'il n'existe pas de task envoi_CL en cours (!= done ou canceled)
735 if ($this->has_an_edition() === true) {
736 $inst_evenement = $this->get_inst_evenement($this->getVal('evenement'));
737 if ($inst_evenement->getVal('envoi_cl_platau') === 't'
738 || $this->getVal('envoye_cl_platau') === 't') {
739 //
740 return true;
741 }
742 }
743 //
744 return false;
745 }
746
747 /**
748 * CONDITION - is_portail_notification
749 *
750 * Vérifie si la notification est une notification de catégorie portail
751 *
752 * @return boolean
753 */
754 function is_portail_notification_sans_annexe() {
755 $collectiviteDi = $this->get_dossier_instruction_om_collectivite();
756 $ev = $this->get_inst_evenement($this->getVal('evenement'));
757 if (($this->f->get_param_option_notification($collectiviteDi) === null ||
758 $this->f->get_param_option_notification($collectiviteDi) === 'portal')
759 && $ev->getVal('notification') != 'notification_manuelle_annexe'
760 && $ev->getVal('notification') != 'notification_manuelle_annexe_signature_requise'
761 ) {
762 return true;
763 }
764 return false;
765 }
766
767 /**
768 * CONDITION - is_not_portail_notification
769 *
770 * Vérifie si la notification n'est pas une notification de catégorie portail
771 *
772 * @return boolean
773 */
774 function is_not_portail_notification_sans_annexe() {
775 return (! $this->is_portail_notification_sans_annexe());
776 }
777
778 /**
779 * CONDITION - can_be_signed
780 *
781 * Vérifie que le document de l'instruction peut être envoyé au parapheur pour signature
782 *
783 * @return boolean
784 */
785 function can_be_signed() {
786 // Instanciation de l'objet signataire_arrete
787 $inst_signataire_arrete = $this->f->get_inst__om_dbform(array(
788 "obj" => "signataire_arrete",
789 "idx" => $this->getVal("signataire_arrete"),
790 ));
791 // Si un parapheur a été configuré, que le document est finalisé, que le signataire
792 // possède une adresse email, on vérifie le champ id_parapheur_signature
793 // S'il est vide l'évènement peut être envoyé en signature
794 // S'il ne l'est pas, alors on vérifie le champ statut_signature
795 // Si la valeur de ce champ est égal à "canceled" ou "expired"
796 // alors l'évènement peut être envoyé en signature
797 if ($this->has_connector_electronicsignature() === true
798 && $this->getVal("om_final_instruction") == 't'
799 && empty($inst_signataire_arrete->getVal('email')) === false) {
800 //
801 if (empty($this->getVal("id_parapheur_signature")) === true
802 || $this->getVal("statut_signature") == "canceled"
803 || $this->getVal("statut_signature") == "expired") {
804 //
805 return true;
806 }
807 }
808
809 $this->addToLog(__METHOD__."() has_connector_electronicsignature: ".var_export($this->has_connector_electronicsignature(), true), EXTRA_VERBOSE_MODE);
810 $this->addToLog(__METHOD__."() om_final_instruction: ".var_export($this->getVal("om_final_instruction"), true), EXTRA_VERBOSE_MODE);
811 $this->addToLog(__METHOD__."() email: ".var_export($inst_signataire_arrete->getVal('email'), true), EXTRA_VERBOSE_MODE);
812 $this->addToLog(__METHOD__."() id_parapheur_signature: ".var_export($this->getVal("id_parapheur_signature"), true), EXTRA_VERBOSE_MODE);
813 $this->addToLog(__METHOD__."() statut_signature: ".var_export($this->getVal("statut_signature"), true), EXTRA_VERBOSE_MODE);
814
815 return false;
816 }
817
818 /**
819 * CONDITION - has_connector_electronicsignature
820 *
821 * Vérifie qu'un parapheur est paramétré
822 *
823 * @return boolean
824 */
825 function has_connector_electronicsignature() {
826 $inst_es = $this->get_electronicsignature_instance(false);
827 if ($inst_es === false) {
828 return false;
829 }
830 return true;
831 }
832
833 /**
834 * CONDITION - can_display_parapheur
835 *
836 * Vérifie que le fieldset "Suivi Parapheur" soit affichable
837 *
838 * @return boolean
839 */
840 function can_display_parapheur() {
841 $evenement_id = $this->getVal("evenement");
842 $inst_evenement = $this->get_inst_evenement($evenement_id);
843 if ($this->has_connector_electronicsignature() === true
844 && $inst_evenement->getVal('lettretype') !== ''
845 && $inst_evenement->getVal('lettretype') !== null
846 && (empty($this->getVal("id_parapheur_signature")) === false
847 || empty($this->getVal("historique_signature")) === false)) {
848 //
849 return true;
850 }
851
852 return false;
853 }
854
855 /**
856 * CONDITION - can_display_notification
857 *
858 * Vérifie que le fieldset "Suivi notification" soit affichable
859 *
860 * @return boolean
861 */
862 function can_display_notification() {
863 // Le suivi des notification est affiché si l'événement est notifiable
864 // et si des notifications ont été envoyées
865 $evenement_id = $this->getVal("evenement");
866 $inst_evenement = $this->get_inst_evenement($evenement_id);
867 if ($inst_evenement->getVal('notification') != null &&
868 $inst_evenement->getVal('notification') != '') {
869 // Des notifications ont été envoyé si il existe au moins une notification
870 // liées à l'instruction
871 $idsNotifs = $this->get_instruction_notification($this->getVal($this->clePrimaire));
872 if (isset($idsNotifs) && $idsNotifs !== array()) {
873 return true;
874 }
875 }
876 return false;
877 }
878
879 /**
880 * TREATMENT - disable_edition_integrale.
881 *
882 * Cette methode permet de passer la consultation en "lu"
883 *
884 * @return boolean true si maj effectué false sinon
885 */
886 function disable_edition_integrale() {
887 // Cette méthode permet d'exécuter une routine en début des méthodes
888 // dites de TREATMENT.
889 $this->begin_treatment(__METHOD__);
890 $this->correct = true;
891 $valF = array(
892 "flag_edition_integrale" => false,
893 "titre_om_htmletat" => null,
894 "corps_om_htmletatex" => null,
895 );
896 $res = $this->f->db->autoExecute(
897 DB_PREFIXE.$this->table,
898 $valF,
899 DB_AUTOQUERY_UPDATE,
900 $this->clePrimaire."=".$this->getVal($this->clePrimaire)
901 );
902 if ($this->f->isDatabaseError($res, true)) {
903 // Appel de la methode de recuperation des erreurs
904 $this->erreur_db($res->getDebugInfo(), $res->getMessage(), '');
905 $this->correct = false;
906 // Termine le traitement
907 return $this->end_treatment(__METHOD__, false);
908 } else {
909 $this->addToMessage(_("Rédaction par compléments activé."));
910 return $this->end_treatment(__METHOD__, true);
911 }
912
913 // Termine le traitement
914 return $this->end_treatment(__METHOD__, false);
915 }
916
917 /**
918 * TREATMENT - enable_edition_integrale.
919 *
920 * Cette methode permet de passer la consultation en "lu"
921 *
922 * @return boolean true si maj effectué false sinon
923 */
924 function enable_edition_integrale() {
925 // Cette méthode permet d'exécuter une routine en début des méthodes
926 // dites de TREATMENT.
927 $this->begin_treatment(__METHOD__);
928 $this->correct = true;
929
930 // Récupère la collectivite du dossier d'instruction
931 $dossier_instruction_om_collectivite = $this->get_dossier_instruction_om_collectivite();
932 $collectivite = $this->f->getCollectivite($dossier_instruction_om_collectivite);
933 //
934 $params = array(
935 "specific" => array(
936 "corps" => array(
937 "mode" => "get",
938 )
939 ),
940 );
941 $result = $this->compute_pdf_output('lettretype', $this->getVal('lettretype'), $collectivite, null, $params);
942 $corps = $result['pdf_output'];
943 //
944 $params = array(
945 "specific" => array(
946 "titre" => array(
947 "mode" => "get",
948 )
949 ),
950 );
951 $result = $this->compute_pdf_output('lettretype', $this->getVal('lettretype'), $collectivite, null, $params);
952 $titre = $result['pdf_output'];
953 //
954 $valF = array(
955 "flag_edition_integrale" => true,
956 "titre_om_htmletat" => $titre,
957 "corps_om_htmletatex" => $corps,
958 );
959 $res = $this->f->db->autoExecute(
960 DB_PREFIXE.$this->table,
961 $valF,
962 DB_AUTOQUERY_UPDATE,
963 $this->clePrimaire."=".$this->getVal($this->clePrimaire)
964 );
965 if ($this->f->isDatabaseError($res, true)) {
966 // Appel de la methode de recuperation des erreurs
967 $this->erreur_db($res->getDebugInfo(), $res->getMessage(), '');
968 $this->correct = false;
969 // Termine le traitement
970 return $this->end_treatment(__METHOD__, false);
971 } else {
972 $this->addToMessage(_("Rédaction libre activé."));
973 return $this->end_treatment(__METHOD__, true);
974 }
975
976 // Termine le traitement
977 return $this->end_treatment(__METHOD__, false);
978 }
979
980 /**
981 * Cette méthode permet de récupérer le dossier d'autorisation d'un dossier
982 */
983 function getNumDemandeAutorFromDossier($id) {
984 //
985 if (!isset($id)) {
986 return NULL;
987 }
988 //
989 $sql = "select dossier_autorisation from ".DB_PREFIXE."dossier ";
990 $sql .= " where dossier='".$id."'";
991 //
992 $dossier_autorisation = $this->f->db->getOne($sql);
993 $this->addToLog("getNumDemandeAutorFromDossier(): db->getone(\"".$sql."\")", VERBOSE_MODE);
994 database::isError($dossier_autorisation);
995 //
996 return $dossier_autorisation;
997 }
998
999 // }}}
1000
1001 function setType(&$form, $maj) {
1002 // Récupération du mode de l'action
1003 $crud = $this->get_action_crud($maj);
1004 // Récupère la collectivité du dossier d'instruction
1005 $collectivite_di = $this->get_dossier_instruction_om_collectivite();
1006
1007 // Cache tous les champs
1008 foreach ($this->champs as $value) {
1009 $form->setType($value, 'hidden');
1010 }
1011
1012 // Les champs historique_signature et statut_signature ne sont pas saisissable dans tous les cas
1013 if ($this->can_display_parapheur() === true && $maj == 3) {
1014 $form->setType('statut_signature', 'selectstatic');
1015 $form->setType('historique_signature', 'jsontotab');
1016 if ($this->getVal('commentaire_signature') == null) {
1017 $form->setType('commentaire_signature', 'hidden');
1018 } else {
1019 $form->setType('commentaire_signature', 'hiddenstatic');
1020 }
1021 }
1022
1023 // Le champ de suivi des notifications n'est pas affichable dans tous les cas
1024 if ($this->can_display_notification() === true && $maj == 3) {
1025 $form->setType('suivi_notification', 'jsontotab');
1026 }
1027
1028 // MODE AJOUTER
1029 if ($this->getParameter('maj') == 0) {
1030 $form->setType('commentaire', 'textareahidden');
1031 // Si l'option est active passage du champ date en lecture seule
1032 if ($this->f->is_option_date_evenement_instruction_lecture_seule($collectivite_di) === true) {
1033 $form->setType("date_evenement", "hiddenstaticdate");
1034 } else {
1035 $form->setType("date_evenement", "date");
1036 }
1037 if ($this->is_in_context_of_foreign_key("evenement", $this->getParameter("retourformulaire"))) {
1038 $form->setType("evenement", "selecthiddenstatic");
1039 } else {
1040 $form->setType("evenement", "select");
1041 }
1042 if ($this->is_in_context_of_foreign_key("signataire_arrete", $this->getParameter("retourformulaire"))) {
1043 $form->setType("signataire_arrete", "selecthiddenstatic");
1044 } else {
1045 $form->setType("signataire_arrete", "select");
1046 }
1047 if ($this->is_option_redaction_libre_enabled() === true) {
1048 $form->setType("flag_edition_integrale", "select");
1049 }
1050 }
1051
1052 // MODE MODIFIER
1053 if ($this->getParameter('maj') == 1) {
1054 // Si l'option est active passage du champ date en lecture seule
1055 if ($this->f->is_option_date_evenement_instruction_lecture_seule($collectivite_di) === true) {
1056 $form->setType("date_evenement", "hiddenstaticdate");
1057 } else {
1058 $form->setType("date_evenement", "date");
1059 }
1060 $form->setType("evenement", "selecthiddenstatic");
1061 if ($this->has_an_edition() === true) {
1062 $form->setType('lettretype', 'hiddenstatic');
1063 if ($this->is_in_context_of_foreign_key("signataire_arrete", $this->getParameter("retourformulaire"))) {
1064 $form->setType("signataire_arrete", "selecthiddenstatic");
1065 } else {
1066 $form->setType("signataire_arrete", "select");
1067 }
1068 if ($this->getVal("flag_edition_integrale") == "t") {
1069 $form->setType("titre_om_htmletat", "htmlEtat");
1070 $form->setType("corps_om_htmletatex", "htmlEtatEx");
1071 } else {
1072 $form->setType("complement_om_html", "html");
1073 $form->setType("complement2_om_html", "html");
1074 $form->setType("complement3_om_html", "html");
1075 $form->setType("complement4_om_html", "html");
1076 $form->setType('bible_auto', 'httpclick');
1077 $form->setType('bible', 'httpclick');
1078 $form->setType('bible2', 'httpclick');
1079 $form->setType('bible3', 'httpclick');
1080 $form->setType('bible4', 'httpclick');
1081 }
1082 if ($this->f->is_option_preview_pdf_enabled($collectivite_di) === true) {
1083 //
1084 $form->setType('btn_refresh', 'httpclickbutton');
1085 $form->setType('btn_preview', 'httpclickbutton');
1086 $form->setType('btn_redaction', 'httpclickbutton');
1087 $form->setType('live_preview', 'previsualiser_pdf');
1088 }
1089
1090 // necessaire pour calcul de date en modification
1091 //$form->setType('delai', 'hiddenstatic');
1092 // les administrateurs technique et fonctionnel peuvent
1093 // modifier tous les champs de date
1094 // si l'instruction a déjà été finalisée au moins une fois
1095 if (($this->f->isAccredited(array($this->get_absolute_class_name(), $this->get_absolute_class_name()."modification_dates"), "OR")
1096 || $this->f->isAccredited(array('instruction', 'instruction_modification_dates'), "OR"))
1097 && $this->getVal("date_finalisation_courrier") != '') {
1098 //
1099 $form->setType('date_envoi_signature', 'date');
1100 $form->setType('date_retour_signature', 'date');
1101 if ($this->is_sent_for_signature() === true
1102 && $this->is_signed() === true) {
1103 //
1104 $form->setType("date_envoi_signature", "datereadonly");
1105 $form->setType("date_retour_signature", "datereadonly");
1106 }
1107 $form->setType('date_envoi_rar', 'date');
1108 $form->setType('date_retour_rar', 'date');
1109 $form->setType('date_envoi_controle_legalite', 'date');
1110 if ($this->is_sent_to_cl() === true) {
1111 $form->setType("date_envoi_controle_legalite", "datereadonly");
1112 }
1113 $form->setType('date_retour_controle_legalite', 'date');
1114 $form->setType('date_finalisation_courrier', 'date');
1115 }
1116 }
1117 }
1118
1119 // MODE CONSULTER + SUPPRIMER + SUIVI DES DATES 125 + NOTIFICATION MANUELLE
1120 if ($this->getParameter('maj') == 3
1121 || $this->getParameter('maj') == 2
1122 || $this->getParameter('maj') == 125
1123 || $this->getParameter('maj') == 410) {
1124 //
1125 $form->setType("date_evenement", "datestatic");
1126 $form->setType("evenement", "selecthiddenstatic");
1127 if ($this->has_an_edition() === true) {
1128 $form->setType('lettretype', 'hiddenstatic');
1129 $form->setType("signataire_arrete", "selecthiddenstatic");
1130 if ($this->getVal("om_final_instruction") == 't') {
1131 $form->setType('om_final_instruction_utilisateur', 'textareastatic');
1132 } else {
1133 $form->setType('om_final_instruction_utilisateur', 'hidden');
1134 }
1135 }
1136 if ($this->evenement_has_a_commentaire($this->getVal('evenement')) === true ) {
1137 $form->setType('commentaire', 'textareastatic');
1138 }
1139 }
1140
1141 // MODE CONSULTER + SUPPRIMER + NOTIFICATION MANUELLE
1142 if ($this->getParameter('maj') == 3
1143 || $this->getParameter('maj') == 2
1144 || $this->getParameter('maj') == 410) {
1145 // Si il n'y a pas de lettre type (edition) associé à l'événement
1146 // les dates de suivi ne sont pas affichée
1147 if ($this->has_an_edition() === true) {
1148 $form->setType('date_envoi_signature', 'datestatic');
1149 $form->setType('date_retour_signature', 'datestatic');
1150 $form->setType('date_envoi_rar', 'datestatic');
1151 $form->setType('date_retour_rar', 'datestatic');
1152 $form->setType('date_envoi_controle_legalite', 'datestatic');
1153 $form->setType('date_retour_controle_legalite', 'datestatic');
1154 $form->setType('date_finalisation_courrier', 'datestatic');
1155 if ($this->getVal("flag_edition_integrale") == "t") {
1156 $form->setType("titre_om_htmletat", "htmlstatic");
1157 $form->setType("corps_om_htmletatex", "htmlstatic");
1158 } else {
1159 $form->setType("complement_om_html", "htmlstatic");
1160 $form->setType("complement2_om_html", "htmlstatic");
1161 $form->setType("complement3_om_html", "htmlstatic");
1162 $form->setType("complement4_om_html", "htmlstatic");
1163 }
1164 }
1165 }
1166
1167 // MODE SUIVI DES DATES 125
1168 if ($this->getParameter('maj') == 125) {
1169 $form->setType("date_evenement", "hiddenstaticdate");
1170 $form->setType('om_final_instruction_utilisateur', 'hiddenstatic');
1171 $form->setType('date_envoi_signature', 'date');
1172 $form->setType('date_retour_signature', 'date');
1173 if ($this->is_sent_for_signature() === true
1174 || $this->is_signed() === true) {
1175 //
1176 $form->setType("date_envoi_signature", "datereadonly");
1177 $form->setType("date_retour_signature", "datereadonly");
1178 }
1179 $form->setType('date_envoi_rar', 'date');
1180 $form->setType('date_retour_rar', 'date');
1181 $form->setType('date_envoi_controle_legalite', 'date');
1182 if ($this->is_sent_to_cl() === true) {
1183 $form->setType("date_envoi_controle_legalite", "datereadonly");
1184 }
1185 $form->setType('date_retour_controle_legalite', 'date');
1186 $form->setType('date_finalisation_courrier', 'date');
1187 }
1188
1189 if ($maj == 401) {
1190 foreach ($this->champs as $champ) {
1191 $form->setType($champ, 'hidden');
1192 }
1193 $form->setType('preview_edition', 'previsualiser');
1194 }
1195 }
1196
1197 function setOnchange(&$form,$maj){
1198 parent::setOnchange($form,$maj);
1199
1200 // MODE AJOUTER
1201 if ($this->getParameter('maj') == 0) {
1202 $form->setOnchange(
1203 "evenement",
1204 "manage_instruction_evenement_lettretype(this.value, '".addslashes($this->getParameter('idxformulaire'))."');
1205 manage_instruction_evenement_commentaire(this.value, '".addslashes($this->getParameter('idxformulaire'))."');"
1206 );
1207 }
1208 }
1209
1210 function evenement_has_an_edition($evenement_id) {
1211 $evenement = $this->get_inst_evenement($evenement_id);
1212 $lettretype = $evenement->getVal('lettretype');
1213 if ($lettretype !== '' && $lettretype !== null) {
1214 return true;
1215 }
1216 return false;
1217 }
1218
1219 function view_evenement_has_an_edition_json() {
1220 $json_return = array(
1221 "lettretype" => $this->evenement_has_an_edition($this->f->get_submitted_get_value('evenement_id')),
1222 "option_redaction_libre_enabled" => $this->is_option_redaction_libre_enabled(),
1223 );
1224 echo json_encode($json_return);
1225 }
1226
1227 function evenement_has_a_commentaire($evenement_id) {
1228 $evenement = $this->get_inst_evenement($evenement_id);
1229 return $this->get_boolean_from_pgsql_value($evenement->getVal('commentaire'));
1230 }
1231
1232 function view_evenement_has_a_commentaire_json() {
1233 $json_return = array(
1234 "commentaire" => $this->evenement_has_a_commentaire($this->f->get_submitted_get_value('evenement_id'))
1235 );
1236 echo json_encode($json_return);
1237 }
1238
1239
1240 /**
1241 * CONDITION - can_be_sended_to_cl
1242 *
1243 * Vérifie que le contrôle de légalité est disponible
1244 *
1245 * @return boolean
1246 */
1247 function can_be_sended_to_cl() {
1248 // Si l'instruction a une édition
1249 // et que l'événement est paramétré pour envoyer le contrôle de légalité
1250 // par Plat'AU
1251 // et que la date de retour signature est renseignée
1252 // et que la date d'envoi au contrôle légalité n'est pas renseignée
1253 // et qu'il n'existe pas de task envoi_CL en cours (!= done ou canceled)
1254 if ($this->has_an_edition() === true) {
1255 $inst_di = $this->get_inst_dossier($this->getVal('dossier'));
1256 $inst_evenement = $this->get_inst_evenement($this->getVal('evenement'));
1257 if ($inst_evenement->getVal('envoi_cl_platau') === 't'
1258 && empty($this->getVal('date_retour_signature')) === false
1259 && empty($this->getVal('date_envoi_controle_legalite')) === true
1260 && $this->getVal('envoye_cl_platau') === 'f'
1261 && $this->f->is_type_dossier_platau($inst_di->getVal('dossier_autorisation')) === true
1262 && $inst_di->getVal('etat_transmission_platau') !== 'jamais_transmissible') {
1263 //
1264 return true;
1265 }
1266 }
1267 //
1268 return false;
1269 }
1270
1271 /**
1272 *
1273 * @return string
1274 */
1275 function get_var_sql_forminc__sql_signataire_arrete() {
1276 return "SELECT
1277 signataire_arrete.signataire_arrete,
1278 CONCAT_WS(' - ', CONCAT_WS(' ', signataire_arrete.prenom, signataire_arrete.nom), signataire_arrete.description)
1279 FROM ".DB_PREFIXE."signataire_arrete
1280 WHERE ((signataire_arrete.om_validite_debut IS NULL AND (signataire_arrete.om_validite_fin IS NULL OR signataire_arrete.om_validite_fin > CURRENT_DATE)) OR (signataire_arrete.om_validite_debut <= CURRENT_DATE AND (signataire_arrete.om_validite_fin IS NULL OR signataire_arrete.om_validite_fin > CURRENT_DATE)))
1281 ORDER BY signataire_arrete.prenom, signataire_arrete.nom";
1282 }
1283
1284 /**
1285 *
1286 * @return string
1287 */
1288 function get_var_sql_forminc__sql_signataire_arrete_by_id() {
1289 return "SELECT
1290 signataire_arrete.signataire_arrete,
1291 CONCAT_WS(' - ', CONCAT_WS(' ', signataire_arrete.prenom, signataire_arrete.nom), signataire_arrete.description)
1292 FROM ".DB_PREFIXE."signataire_arrete
1293 WHERE signataire_arrete.signataire_arrete = <idx>";
1294 }
1295
1296 /**
1297 *
1298 * @return string
1299 */
1300 function get_var_sql_forminc__sql_signataire_arrete_by_di() {
1301 return "SELECT
1302 signataire_arrete.signataire_arrete,
1303 CONCAT_WS(' - ', CONCAT_WS(' ', signataire_arrete.prenom, signataire_arrete.nom), signataire_arrete.description)
1304 FROM ".DB_PREFIXE."signataire_arrete
1305 LEFT JOIN ".DB_PREFIXE."om_collectivite ON signataire_arrete.om_collectivite = om_collectivite.om_collectivite
1306 WHERE ((signataire_arrete.om_validite_debut IS NULL AND (signataire_arrete.om_validite_fin IS NULL OR signataire_arrete.om_validite_fin > CURRENT_DATE)) OR (signataire_arrete.om_validite_debut <= CURRENT_DATE AND (signataire_arrete.om_validite_fin IS NULL OR signataire_arrete.om_validite_fin > CURRENT_DATE)))
1307 AND (om_collectivite.niveau = '2' OR signataire_arrete.om_collectivite = <collectivite_di>)
1308 ORDER BY signataire_arrete.prenom, signataire_arrete.nom";
1309 }
1310
1311 /**
1312 *
1313 * @return string
1314 */
1315 function get_var_sql_forminc__sql_signataire_arrete_defaut() {
1316 return "SELECT
1317 signataire_arrete.signataire_arrete,
1318 CONCAT_WS(' - ', CONCAT_WS(' ', signataire_arrete.prenom, signataire_arrete.nom), signataire_arrete.description)
1319 FROM ".DB_PREFIXE."signataire_arrete
1320 WHERE ((signataire_arrete.om_validite_debut IS NULL AND (signataire_arrete.om_validite_fin IS NULL OR signataire_arrete.om_validite_fin > CURRENT_DATE)) OR (signataire_arrete.om_validite_debut <= CURRENT_DATE AND (signataire_arrete.om_validite_fin IS NULL OR signataire_arrete.om_validite_fin > CURRENT_DATE))) AND signataire_arrete.defaut IS TRUE
1321 ORDER BY signataire_arrete.prenom, signataire_arrete.nom";
1322 }
1323
1324 /**
1325 *
1326 * @return string
1327 */
1328 function get_var_sql_forminc__sql_signataire_arrete_defaut_by_di() {
1329 return "SELECT
1330 signataire_arrete.signataire_arrete,
1331 CONCAT_WS(' - ', CONCAT_WS(' ', signataire_arrete.prenom, signataire_arrete.nom), signataire_arrete.description)
1332 FROM ".DB_PREFIXE."signataire_arrete
1333 LEFT JOIN ".DB_PREFIXE."om_collectivite ON signataire_arrete.om_collectivite = om_collectivite.om_collectivite
1334 WHERE ((signataire_arrete.om_validite_debut IS NULL AND (signataire_arrete.om_validite_fin IS NULL OR signataire_arrete.om_validite_fin > CURRENT_DATE)) OR (signataire_arrete.om_validite_debut <= CURRENT_DATE AND (signataire_arrete.om_validite_fin IS NULL OR signataire_arrete.om_validite_fin > CURRENT_DATE))) AND signataire_arrete.defaut IS TRUE
1335 AND (om_collectivite.niveau = '2' OR signataire_arrete.om_collectivite = <collectivite_di>)
1336 ORDER BY signataire_arrete.prenom, signataire_arrete.nom";
1337 }
1338
1339 /**
1340 * SETTER_FORM - setSelect.
1341 *
1342 * @return void
1343 */
1344 function setSelect(&$form, $maj, &$dnu1 = null, $dnu2 = null) {
1345 //parent::setSelect($form, $maj);
1346 /**
1347 * On ne surcharge pas la méthode parent car une requête sur la table
1348 * dossier est mauvaise pour les performances, car la requête qui
1349 * concerne evenement est plus complexe que celle générée et car les
1350 * champs action, avis_decision et etat ne sont pas utilisés comme des
1351 * select
1352 */
1353 //// action
1354 //$this->init_select($form, $this->f->db, $maj, null, "action",
1355 // $sql_action, $sql_action_by_id, false);
1356
1357 //// avis_decision
1358 //$this->init_select($form, $this->f->db, $maj, null, "avis_decision",
1359 // $sql_avis_decision, $sql_avis_decision_by_id, false);
1360
1361 //// dossier
1362 //$this->init_select($form, $this->f->db, $maj, null, "dossier",
1363 // $sql_dossier, $sql_dossier_by_id, false);
1364
1365 //// etat
1366 //$this->init_select($form, $this->f->db, $maj, null, "etat",
1367 // $sql_etat, $sql_etat_by_id, false);
1368
1369 //// evenement
1370 //$this->init_select($form, $this->f->db, $maj, null, "evenement",
1371 // $sql_evenement, $sql_evenement_by_id, false);
1372
1373 // signataire_arrete
1374 // si contexte DI
1375 if ($this->getParameter("retourformulaire") == "dossier"
1376 || $this->getParameter("retourformulaire") == "dossier_instruction"
1377 || $this->getParameter("retourformulaire") == "dossier_instruction_mes_encours"
1378 || $this->getParameter("retourformulaire") == "dossier_instruction_tous_encours"
1379 || $this->getParameter("retourformulaire") == "dossier_instruction_mes_clotures"
1380 || $this->getParameter("retourformulaire") == "dossier_instruction_tous_clotures"
1381 || $this->getParameter("retourformulaire") == "dossier_contentieux_mes_infractions"
1382 || $this->getParameter("retourformulaire") == "dossier_contentieux_toutes_infractions"
1383 || $this->getParameter("retourformulaire") == "dossier_contentieux_mes_recours"
1384 || $this->getParameter("retourformulaire") == "dossier_contentieux_tous_recours") {
1385 // on recupère les signataires de la multicollectivité et de celle du DI
1386 $di = $this->f->get_inst__om_dbform(array(
1387 "obj" => "dossier_instruction",
1388 "idx" => $this->getParameter('idxformulaire'),
1389 ));
1390 $sql_signataire_arrete_by_di = str_replace(
1391 '<collectivite_di>',
1392 $di->getVal("om_collectivite"),
1393 $this->get_var_sql_forminc__sql("signataire_arrete_by_di")
1394 );
1395 $this->init_select(
1396 $form,
1397 $this->f->db,
1398 $maj,
1399 null,
1400 "signataire_arrete",
1401 $sql_signataire_arrete_by_di,
1402 $this->get_var_sql_forminc__sql("signataire_arrete_by_id"),
1403 true
1404 );
1405 } else {
1406 $this->init_select(
1407 $form,
1408 $this->f->db,
1409 $maj,
1410 null,
1411 "signataire_arrete",
1412 $this->get_var_sql_forminc__sql("signataire_arrete"),
1413 $this->get_var_sql_forminc__sql("signataire_arrete_by_id"),
1414 true
1415 );
1416 }
1417
1418 /**
1419 * Gestion du filtre sur les événements de workflow disponibles
1420 * On récupère ici en fonction de l'état du dossier d'instruction en
1421 * cours et du type du dossier d'instruction en cours la liste
1422 * événements disponibles.
1423 */
1424 if ($maj == 0) {
1425 // Récupération des événements par une jointure entre la table dossier
1426 // et la table transition et la table evenement et la table
1427 // lien_dossier_instruction_type_evenement en fonction de l'identifiant
1428 // du dossier d'instruction en cours
1429 $sql = "SELECT
1430 evenement.evenement,
1431 evenement.libelle as lib
1432 FROM ".DB_PREFIXE."dossier
1433 INNER JOIN ".DB_PREFIXE."lien_dossier_instruction_type_evenement
1434 ON dossier.dossier_instruction_type=lien_dossier_instruction_type_evenement.dossier_instruction_type
1435 INNER JOIN ".DB_PREFIXE."evenement
1436 ON evenement.evenement=lien_dossier_instruction_type_evenement.evenement
1437 INNER JOIN ".DB_PREFIXE."transition
1438 ON evenement.evenement = transition.evenement
1439 AND dossier.etat=transition.etat
1440 WHERE dossier.dossier='".$this->getParameter("idxformulaire")."' ";
1441
1442 // Si changement de décision par instructeur commune
1443 if($this->f->isUserInstructeur() === true
1444 && $this->getDivisionFromDossier($this->getParameter("idxformulaire")) != $_SESSION["division"]
1445 && $this->isInstrCanChangeDecision($this->getParameter("idxformulaire")) === true) {
1446 $sql .= "AND evenement.type IN ('arrete', 'changement_decision') ";
1447 }
1448 $sql .= "ORDER BY evenement.libelle, evenement.action";
1449 $res = $this->f->db->query($sql);
1450 $this->addToLog("setSelect(): db->query(\"".$sql."\");", VERBOSE_MODE);
1451 if (database::isError($res)) {
1452 die($res->getMessage());
1453 }
1454 // Remplissage du tableau du select
1455 $contenu = array(
1456 0 => array("",),
1457 1 => array(_('choisir')." "._('evenement'),)
1458 );
1459 while ($row=& $res->fetchRow()) {
1460 $contenu[0][] = $row[0];
1461 $contenu[1][] = $row[1];
1462 }
1463 $form->setSelect("evenement", $contenu);
1464
1465 } else {
1466 $sql = "SELECT
1467 evenement.libelle as lib
1468 FROM ".DB_PREFIXE."evenement
1469 WHERE evenement.evenement=".$this->getVal("evenement")."";
1470 $res = $this->f->db->getone($sql);
1471 $this->addToLog("setSelect(): db->getone(\"".$sql."\");", VERBOSE_MODE);
1472 if (database::isError($res)) {
1473 die($res->getMessage());
1474 }
1475 //
1476 $contenu = array(
1477 0 => array($this->getVal("evenement"),),
1478 1 => array($res,)
1479 );
1480 $form->setSelect("evenement", $contenu);
1481 }
1482
1483 /**
1484 * Gesion des liens vers la bible
1485 */
1486 // lien bible_auto
1487 $contenu = array(_("automatique"));
1488 $form->setSelect("bible_auto",$contenu);
1489 // lien bible1
1490 $contenu = array(_("bible"));
1491 $form->setSelect("bible",$contenu);
1492 // lien bible2
1493 $contenu = array(_("bible"));
1494 $form->setSelect("bible2",$contenu);
1495 // lien bible3
1496 $contenu = array(_("bible"));
1497 $form->setSelect("bible3",$contenu);
1498 // lien bible4
1499 $contenu = array(_("bible"));
1500 $form->setSelect("bible4",$contenu);
1501
1502 if ($maj == 1) {
1503 $base64 = $this->init_pdf_temp();
1504 $form->setSelect('live_preview', array('base64'=>$base64));
1505 $form->setSelect("btn_refresh", array(_('Prévisualiser')));
1506 $form->setSelect("btn_preview", array(_('Prévisualiser >>')));
1507 $form->setSelect("btn_redaction", array(_('<< Rédiger')));
1508 }
1509
1510 // Selection du type de rédaction à l'ajout
1511 $content = array(
1512 0 => array('f', 't', ),
1513 1 => array(_('Rédaction par compléments'), _('Rédaction libre'), ),
1514 );
1515 $form->setSelect('flag_edition_integrale', $content);
1516
1517 $contenu = array();
1518 foreach(array('waiting', 'in_progress', 'canceled', 'expired', 'finished') as $value) {
1519 $contenu[0][] = $value;
1520 $contenu[1][] = $this->get_trad_for_statut($value);
1521 }
1522 $form->setSelect('statut_signature', $contenu);
1523
1524
1525 if ($maj == 401) {
1526 $file = $this->f->storage->get($this->getVal('om_fichier_instruction'));
1527 $form->setSelect('preview_edition', array(
1528 'base64' => base64_encode($file['file_content']),
1529 'mimetype' => $file['metadata']['mimetype'],
1530 'label' => 'instruction_'.$this->getVal($this->clePrimaire),
1531 'href' => sprintf(
1532 '../app/index.php?module=form&snippet=file&obj=instruction&champ=om_fichier_instruction&id=%1$s',
1533 $this->getVal($this->clePrimaire)
1534 )
1535 ));
1536 }
1537 }
1538
1539 function cleSecondaire($id, &$dnu1 = null, $val = array(), $dnu2 = null) {
1540 //
1541 // Vérifie uniquementla cle secondaire : demande
1542 $this->rechercheTable($this->f->db, "demande", "instruction_recepisse", $id);
1543
1544 $id = $this->getVal($this->clePrimaire);
1545
1546
1547 //Requête de vérification que cet événement d'instruction n'est pas lié
1548 //à la création d'un dossier d'instruction
1549 $sql = "SELECT demande_type.dossier_instruction_type
1550 FROM ".DB_PREFIXE."demande_type
1551 LEFT JOIN ".DB_PREFIXE."demande
1552 ON demande.demande_type = demande_type.demande_type
1553 WHERE demande.instruction_recepisse = ".$id;
1554 $res = $this->f->db->getOne($sql);
1555 $this->addToLog("cleSecondaire(): db->getone(\"".$sql."\");", VERBOSE_MODE);
1556 if (database::isError($res)) {
1557 die($res->getMessage());
1558 }
1559
1560 // Aucune clé secondaire n'a été trouvée ou c'est un événement sans
1561 //création de dossier d'instruction, l'événement d'instruction peut être
1562 //supprimé
1563 if ( $this->correct !== false || $res == null || $res == ""){
1564
1565 // Requête de vérification que cet événement d'instruction est lié
1566 // à une demande
1567 $sql = "SELECT demande
1568 FROM ".DB_PREFIXE."demande
1569 WHERE instruction_recepisse = ".$id;
1570 $res = $this->f->db->getOne($sql);
1571 $this->addToLog("cleSecondaire(): db->getone(\"".$sql."\");", VERBOSE_MODE);
1572 if (database::isError($res)) {
1573 die($res->getMessage());
1574 }
1575
1576 //Si c'est un événement d'instruction lié à une demande
1577 if ($res != null || $res != ""){
1578 $demande = $this->f->get_inst__om_dbform(array(
1579 "obj" => "demande",
1580 "idx" => $res,
1581 ));
1582
1583 //On met à jour la demande en supprimant la liaison vers
1584 //l'événement d'instruction
1585 $demande->setParameter("maj", 1);
1586 $valF = array();
1587 foreach($demande->champs as $identifiant => $champ) {
1588 $valF[$champ] = $demande->val[$identifiant];
1589 }
1590 $valF['date_demande']=$demande->dateDBToForm($valF['date_demande']);
1591 $valF['instruction_recepisse']=NULL;
1592 $ret = $demande->modifier($valF);
1593 }
1594
1595 /**
1596 * Vérification que l'élément supprimé est le dernier pour pouvoir
1597 * remodifier les données de manière itérative.
1598 */
1599 // Initialisation
1600 $dernierevenement = "";
1601 // Récupération du dernier élément de la table d'instruction qui
1602 // concerne le dossier en cours
1603 $sql = "SELECT max(instruction)
1604 FROM ".DB_PREFIXE."instruction
1605 WHERE dossier ='".$this->getParameter("idxformulaire")."'";
1606 $dernierevenement = $this->f->db->getOne($sql);
1607 $this->addToLog("setSelect(): db->getone(\"".$sql."\");", VERBOSE_MODE);
1608 if (database::isError($dernierevenement)) {
1609 die($dernierevenement->getMessage());
1610 }
1611 // Si on se trouve effectivement sur le dernier evenement d'instruction
1612 if ($dernierevenement == $id) {
1613 // Alors on valide la suppression
1614 $this->correct = true;
1615 $this->addToMessage(_('Destruction_chronologique'));
1616 } else {
1617 // Alors on annule la suppression
1618 $this->correct = false;
1619 $this->addToMessage(_("Seul le dernier evenement d'instruction peut etre supprime."));
1620 }
1621 }
1622 }
1623
1624 /**
1625 * Vérification de la possibilité ou non de modifier des dates de suivi
1626 * @param string $champ champ date à vérifier
1627 */
1628 function updateDate($champ) {
1629
1630 //Si le retourformulaire est "dossier_instruction"
1631 if ($this->getParameter("retourformulaire") == "dossier"
1632 || $this->getParameter("retourformulaire") == "dossier_instruction"
1633 || $this->getParameter("retourformulaire") == "dossier_instruction_mes_encours"
1634 || $this->getParameter("retourformulaire") == "dossier_instruction_tous_encours"
1635 || $this->getParameter("retourformulaire") == "dossier_instruction_mes_clotures"
1636 || $this->getParameter("retourformulaire") == "dossier_instruction_tous_clotures"
1637 || $this->getParameter("retourformulaire") == "dossier_contentieux_mes_infractions"
1638 || $this->getParameter("retourformulaire") == "dossier_contentieux_toutes_infractions"
1639 || $this->getParameter("retourformulaire") == "dossier_contentieux_mes_recours"
1640 || $this->getParameter("retourformulaire") == "dossier_contentieux_tous_recours") {
1641
1642 // Vérification de la possibilité de modifier les dates si déjà éditées
1643 if($this->valF[$champ] != "" AND !$this->f->user_is_admin) {
1644 // si l'utilisateur n'est pas un admin
1645 if($this->getVal($champ) != "" AND $this->getVal($champ) != $this->valF[$champ]) {
1646 $this->correct = false;
1647 $this->addToMessage(_("Les dates de suivis ne peuvent etre modifiees"));
1648 }
1649 }
1650 }
1651
1652 //
1653 return true;
1654 }
1655
1656 /**
1657 * SETTER_FORM - setValsousformulaire (setVal).
1658 *
1659 * @return void
1660 */
1661 function setValsousformulaire(&$form, $maj, $validation, $idxformulaire, $retourformulaire, $typeformulaire, &$dnu1 = null, $dnu2 = null) {
1662 // parent::setValsousformulaire($form, $maj, $validation, $idxformulaire, $retourformulaire, $typeformulaire);
1663 //
1664 $this->retourformulaire = $retourformulaire;
1665 //
1666 if ($maj == 0) {
1667 $form->setVal("destinataire", $this->getParameter("idxformulaire"));
1668 $form->setVal("dossier", $this->getParameter("idxformulaire"));
1669 }
1670 //
1671 $this->set_form_default_values($form, $maj, $validation);
1672 }
1673
1674 /**
1675 * SETTER_FORM - set_form_default_values (setVal).
1676 *
1677 * @return void
1678 */
1679 function set_form_default_values(&$form, $maj, $validation) {
1680 //
1681 if ($maj == 0) {
1682 // si contexte DI
1683 if ($this->getParameter("retourformulaire") == "dossier"
1684 || $this->getParameter("retourformulaire") == "dossier_instruction"
1685 || $this->getParameter("retourformulaire") == "dossier_instruction_mes_encours"
1686 || $this->getParameter("retourformulaire") == "dossier_instruction_tous_encours"
1687 || $this->getParameter("retourformulaire") == "dossier_instruction_mes_clotures"
1688 || $this->getParameter("retourformulaire") == "dossier_instruction_tous_clotures"
1689 || $this->getParameter("retourformulaire") == "dossier_contentieux_mes_infractions"
1690 || $this->getParameter("retourformulaire") == "dossier_contentieux_toutes_infractions"
1691 || $this->getParameter("retourformulaire") == "dossier_contentieux_mes_recours"
1692 || $this->getParameter("retourformulaire") == "dossier_contentieux_tous_recours") {
1693 // on recupère les signataires de la multicollectivité et de celle du DI
1694 $di = $this->f->get_inst__om_dbform(array(
1695 "obj" => "dossier_instruction",
1696 "idx" => $this->getParameter("idxformulaire"),
1697 ));
1698 $sql = str_replace(
1699 "<collectivite_di>",
1700 $di->getVal("om_collectivite"),
1701 $this->get_var_sql_forminc__sql("signataire_arrete_defaut_by_di")
1702 );
1703 } else {
1704 $sql = $this->get_var_sql_forminc__sql("signataire_arrete_defaut");
1705 }
1706 $res = $this->f->db->query($sql);
1707 $this->f->addToLog(__METHOD__."(): db->query(\"".$sql."\")", VERBOSE_MODE);
1708 $this->f->isDatabaseError($res);
1709 $row = $res->fetchrow(DB_FETCHMODE_ASSOC);
1710 if (isset($row["signataire_arrete"])
1711 && is_numeric($row["signataire_arrete"])) {
1712 //
1713 $form->setVal("signataire_arrete", $row["signataire_arrete"]);
1714 }
1715 // Date du jour
1716 $form->setVal("date_evenement", date("Y-m-d"));
1717 }
1718 //
1719 if ($maj == 0 || $maj == 1 || $maj == 125) {
1720 $form->setVal("bible_auto", "bible_auto()");
1721 $form->setVal("bible", "bible(1)");
1722 $form->setVal("bible2", "bible(2)");
1723 $form->setVal("bible3", "bible(3)");
1724 $form->setVal("bible4", "bible(4)");
1725 }
1726 //
1727 $collectivite_di = $this->get_dossier_instruction_om_collectivite();
1728 if ($maj == 1
1729 && $this->f->is_option_preview_pdf_enabled($collectivite_di) === true
1730 && $this->has_an_edition() === true) {
1731 //
1732 $form->setVal("live_preview", $this->getVal($this->clePrimaire));
1733 $form->setVal("btn_refresh", "reload_pdf_viewer()");
1734 $form->setVal("btn_preview", "show_instr_preview()");
1735 $form->setVal("btn_redaction", "show_instr_redaction()");
1736 }
1737
1738 if ($maj == 3
1739 && $this->can_display_notification()
1740 ) {
1741 $form->setVal("suivi_notification", $this->get_json_suivi_notification());
1742 }
1743 }
1744
1745 function setLayout(&$form, $maj){
1746 $form->setBloc('evenement','D',"","sousform-instruction-action-".$maj);
1747
1748 $form->setFieldset('evenement','D',_('Evenement'));
1749 $form->setFieldset('om_final_instruction_utilisateur','F','');
1750
1751 $form->setBloc('om_final_instruction_utilisateur','F');
1752
1753 $form->setBloc('date_finalisation_courrier','D',"","");
1754
1755 $form->setFieldset('date_finalisation_courrier','D',_('Dates'));
1756 $form->setBloc('date_finalisation_courrier','D',"","col_6");
1757 $form->setBloc('date_envoi_controle_legalite','F');
1758
1759 $form->setBloc('date_retour_signature','D',"","col_6");
1760 $form->setBloc('date_retour_controle_legalite','F');
1761 $form->setFieldset('date_retour_controle_legalite','F','');
1762
1763 $form->setBloc('date_retour_controle_legalite','F');
1764
1765 $form->setBloc('statut_signature','D');
1766 $form->setFieldset('statut_signature','D','Suivi Parapheur');
1767 $form->setBloc('commentaire_signature','F');
1768 $form->setBloc('historique_signature','D');
1769 $form->setFieldset('historique_signature', 'DF', __("Historique"), "collapsible, startClosed");
1770 $form->setBloc('historique_signature','F');
1771 $form->setFieldset('historique_signature','F');
1772
1773 $form->setFieldset('suivi_notification', 'D', __("Suivi notification"), "collapsible");
1774 $form->setFieldset('suivi_notification','F');
1775
1776 if ($maj == 1) {
1777 // Récupère la collectivité du dossier d'instruction
1778 $collectivite_di = $this->get_dossier_instruction_om_collectivite();
1779
1780 //
1781 if ($this->f->is_option_preview_pdf_enabled($collectivite_di) === true
1782 && $this->has_an_edition() === true) {
1783 //
1784 $form->setBloc('complement_om_html','D',"","container_instr_edition");
1785 $form->setBloc('complement_om_html','D',"","hidelabel box_instr_edition redaction_instr_edition");
1786 $form->setBloc('complement_om_html','D',"","box_instr_edition_main");
1787 $form->setFieldset('complement_om_html','D',_('Complement'));
1788 $form->setFieldset('bible','F','');
1789 $form->setFieldset('complement2_om_html','D',_('Complement 2'));
1790 $form->setFieldset('bible2','F','');
1791 $form->setFieldset('complement3_om_html','D',_('Complement 3'));
1792 $form->setFieldset('bible3','F','');
1793 $form->setFieldset('complement4_om_html','D',_('Complement 4'));
1794 $form->setFieldset('bible4','F','');
1795 $form->setFieldset('titre_om_htmletat','DF',_('Titre'), 'startClosed');
1796 $form->setFieldset('corps_om_htmletatex','DF',_('Corps'));
1797 $form->setBloc('corps_om_htmletatex','F');
1798 $form->setBloc('btn_preview','DF',"","box_instr_edition_btn");
1799 $form->setBloc('btn_preview','F');
1800 $form->setBloc('btn_redaction','D', '',"hidelabel box_instr_edition preview_instr_edition");
1801 $form->setBloc('btn_redaction','DF',"","box_instr_edition_btn");
1802 $form->setFieldset('btn_refresh','D',_('Prévisualisation'), "box_instr_edition_main");
1803 $form->setFieldset('live_preview','F');
1804 $form->setBloc('live_preview','F');
1805 $form->setBloc('live_preview','F');
1806 } else {
1807 $form->setBloc('complement_om_html','D',"","hidelabel");
1808 $form->setFieldset('complement_om_html','D',_('Complement'));
1809 $form->setFieldset('bible','F','');
1810 $form->setFieldset('complement2_om_html','D',_('Complement 2'));
1811 $form->setFieldset('bible2','F','');
1812 $form->setFieldset('complement3_om_html','D',_('Complement 3'));
1813 $form->setFieldset('bible3','F','');
1814 $form->setFieldset('complement4_om_html','D',_('Complement 4'));
1815 $form->setFieldset('bible4','F','');
1816 $form->setFieldset('titre_om_htmletat','DF',_('Titre'), 'startClosed');
1817 $form->setFieldset('corps_om_htmletatex','DF',_('Corps'));
1818 $form->setBloc('corps_om_htmletatex','F');
1819 }
1820 } else {
1821 $form->setBloc('complement_om_html','D',"","hidelabel");
1822 $form->setFieldset('complement_om_html','D',_('Complement'));
1823 $form->setFieldset('bible','F','');
1824 $form->setFieldset('complement2_om_html','D',_('Complement 2'));
1825 $form->setFieldset('bible2','F','');
1826 $form->setFieldset('complement3_om_html','D',_('Complement 3'));
1827 $form->setFieldset('bible3','F','');
1828 $form->setFieldset('complement4_om_html','D',_('Complement 4'));
1829 $form->setFieldset('bible4','F','');
1830 $form->setFieldset('titre_om_htmletat','DF',_('Titre'), 'startClosed');
1831 $form->setFieldset('corps_om_htmletatex','DF',_('Corps'));
1832 $form->setBloc('corps_om_htmletatex','F');
1833 }
1834 }
1835
1836 function setLib(&$form, $maj) {
1837 //
1838 parent::setLib($form, $maj);
1839 //
1840 $form->setLib('bible_auto', "");
1841 $form->setLib('bible', "");
1842 $form->setLib('bible2', "");
1843 $form->setLib('bible3', "");
1844 $form->setLib('bible4', "");
1845 $form->setLib('btn_refresh', "");
1846 $form->setLib('btn_preview', "");
1847 $form->setLib('btn_redaction', "");
1848 $form->setLib('live_preview', "");
1849 $form->setLib('om_final_instruction_utilisateur', _("finalise par"));
1850 $form->setLib('date_envoi_rar', __("date_envoi_ar"));
1851 $form->setLib('date_retour_rar', __("date_notification"));
1852 $form->setLib('statut_signature', __("statut"));
1853 $form->setLib('commentaire_signature', __("commentaire"));
1854 $form->setLib('historique_signature', '');
1855 $form->setLib('suivi_notification', '');
1856 $form->setLib('preview_edition', "");
1857
1858 // Ajout d'une infobulle d'aide lorsque le formulaire est en mode
1859 // ajout et que l'option de rédaction libre est activée sur la
1860 // collectivité du dossier
1861 if ($maj === '0' && $this->is_option_redaction_libre_enabled() === true) {
1862 //
1863 $help_text_template = '%s <span class="info-16" title="%s"></span>';
1864 $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.");
1865 $form->setLib('flag_edition_integrale', sprintf($help_text_template, _("Type de rédaction"), $help_text));
1866 }
1867 else {
1868 $form->setLib('flag_edition_integrale', _("Type de rédaction"));
1869 }
1870
1871 // Ajout d'une infobulle d'aide lorsque le formulaire est en mode
1872 // modification et que l'option de prévisualisation de l'édition est
1873 // activée sur la collectivité du dossier
1874 if ($maj === '1'
1875 && $this->f->is_option_preview_pdf_enabled($this->get_dossier_instruction_om_collectivite()) === true) {
1876 //
1877 $help_text_template = '%s <span class="info-16" title="%s"></span>';
1878 $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.");
1879 $form->setLib('date_evenement', sprintf($help_text_template, _('date_evenement'), $help_text));
1880 $form->setLib('signataire_arrete', sprintf($help_text_template, _('signataire_arrete'), $help_text));
1881 }
1882 }
1883
1884 /**
1885 * TRIGGER - triggerajouter.
1886 *
1887 * @return boolean
1888 */
1889 function triggerajouter($id, &$dnu1 = null, $val = array(), $dnu2 = null) {
1890 $this->addToLog(__METHOD__."(): start", EXTRA_VERBOSE_MODE);
1891 /**
1892 * Le code suivant permet de récupérer des valeurs des tables evenement
1893 * et dossier pour les stocker dans l'instruction :
1894 * DEPUIS L'EVENEMENT
1895 * - action
1896 * - delai
1897 * - accord_tacite
1898 * - etat
1899 * - avis_decision
1900 * - delai_notification
1901 * - lettretype
1902 * - autorite_competente
1903 * - pec_metier
1904 * - complement_om_html
1905 * - complement2_om_html
1906 * - complement3_om_html
1907 * - complement4_om_html
1908 * - complement5_om_html
1909 * DEPUIS LE DOSSIER D'INSTRUCTION
1910 * - archive_delai
1911 * - archive_accord_tacite
1912 * - archive_etat
1913 * - archive_avis
1914 * - date_complet
1915 * - date_rejet
1916 * - date_limite
1917 * - date_notification_delai
1918 * - date_decision
1919 * - date_validite
1920 * - date_achevement
1921 * - date_chantier
1922 * - date_conformite
1923 * - avis_decision
1924 */
1925 // Récupération de tous les paramètres de l'événement sélectionné
1926 $sql = "SELECT * FROM ".DB_PREFIXE."evenement
1927 WHERE evenement=".$this->valF['evenement'];
1928 $res = $this->f->db->query($sql);
1929 $this->addToLog(__METHOD__."(): db->query(\"".$sql."\");", VERBOSE_MODE);
1930 if (database::isError($res)) {
1931 die($res->getMessage());
1932 }
1933 while ($row=& $res->fetchRow(DB_FETCHMODE_ASSOC)) {
1934 // Récupération de l'identifiant de l'action
1935 // si une action est paramétrée dans l'événement
1936 $this->valF['action'] = NULL;
1937 if (isset($row['action']) and !empty($row['action'])) {
1938 $this->valF['action']=$row['action'];
1939 }
1940 // Récupération de la valeur du délai
1941 $this->valF['delai'] = $row['delai'];
1942 // Récupération de l'identifiant de l'état
1943 // si un état est paramétré dans l'événement
1944 $this->valF['etat']=NULL;
1945 if (isset($row['etat']) and !empty($row['etat'])) {
1946 $this->valF['etat']=$row['etat'];
1947 }
1948 // Récupération de la valeur d'accord tacite
1949 $this->valF['accord_tacite']=$row['accord_tacite'];
1950 // Récupération de la valeur du délai de notification
1951 $this->valF['delai_notification']=$row['delai_notification'];
1952 // Récupération de l'identifiant de l'avis
1953 // si un avis est paramétré dans l'événement
1954 $this->valF['avis_decision'] = NULL;
1955 if(isset($row['avis_decision']) and !empty($row['avis_decision'])) {
1956 $this->valF['avis_decision']=$row['avis_decision'];
1957 }
1958 // Récupération de la valeur de l'autorité compétente
1959 // si l'autorité compétente est paramétré dans l'événement
1960 $this->valF['autorite_competente'] = NULL;
1961 if(isset($row['autorite_competente']) and !empty($row['autorite_competente'])) {
1962 $this->valF['autorite_competente']=$row['autorite_competente'];
1963 }
1964 // Récupération de la valeur de la lettre type
1965 $this->valF['lettretype']=$row['lettretype'];
1966 // Récupération de la valeur de la prise en compte métier
1967 // si la prise en compte métier est paramétrée dans l'événement
1968 $this->valF['pec_metier'] = NULL;
1969 if(isset($row['pec_metier']) === true and empty($row['pec_metier']) === false) {
1970 $this->valF['pec_metier'] = $row['pec_metier'];
1971 }
1972 }
1973 // Récupération de toutes les valeurs du dossier d'instruction en cours
1974 $sql = "SELECT * FROM ".DB_PREFIXE."dossier
1975 WHERE dossier='".$this->valF['dossier']."'";
1976 $res = $this->f->db->query($sql);
1977 $this->addToLog(__METHOD__."(): db->query(\"".$sql."\");", VERBOSE_MODE);
1978 if (database::isError($res)) {
1979 die($res->getMessage());
1980 }
1981 $row=& $res->fetchRow(DB_FETCHMODE_ASSOC);
1982 $this->updateArchiveData($row);
1983
1984 // Récupération de la duree de validite du dossier d'autorisation
1985 $sql = "SELECT duree_validite_parametrage
1986 FROM ".DB_PREFIXE."dossier_autorisation_type_detaille
1987 LEFT JOIN ".DB_PREFIXE."dossier_autorisation
1988 ON dossier_autorisation.dossier_autorisation_type_detaille = dossier_autorisation_type_detaille.dossier_autorisation_type_detaille
1989 LEFT JOIN ".DB_PREFIXE."dossier
1990 ON dossier.dossier_autorisation = dossier_autorisation.dossier_autorisation
1991 WHERE dossier.dossier='".$this->valF['dossier']."'";
1992 $duree_validite_parametrage = $this->f->db->getOne($sql);
1993 $this->addToLog(__METHOD__."(): db->getOne(\"".$sql."\");", VERBOSE_MODE);
1994 database::isError($duree_validite_parametrage);
1995 if ($duree_validite_parametrage != '') {
1996 $this->valF['duree_validite_parametrage']= $duree_validite_parametrage;
1997 }
1998
1999 // Identifiant du type de courrier
2000 $idTypeCourrier = '11';
2001 $idCourrier = str_pad($this->valF["instruction"], 10, "0", STR_PAD_LEFT);
2002 // Code barres
2003 $this->valF["code_barres"] = $idTypeCourrier . $idCourrier;
2004 }
2005
2006 // Test si une restriction est valide
2007 // return boolean
2008 function restrictionIsValid($restriction){
2009 if($this->restriction_valid != null) {
2010 return $this->restriction_valid;
2011 }
2012 if(empty($restriction)) {
2013 $this->restriction_valid = true;
2014 return $this->restriction_valid;
2015 }
2016 // Liste des opérateurs possibles sans espace
2017 $operateurs = array(">=", "<=", "+", "-", "&&", "||", "==", "!=");
2018 // Liste identique mais avec le marqueur §
2019 $mark = "§";
2020 $operateurs_marked = array();
2021 foreach ($operateurs as $operateur) {
2022 $operateurs_marked[] = $mark.$operateur.$mark;
2023 }
2024
2025 // Supprime tous les espaces de la chaîne de caractère
2026 $restriction = preg_replace('/\s+/', '', $restriction);
2027
2028 // Met un marqueur avant et après les opérateurs
2029 // puis transforme la chaine en un tableau
2030 $restriction = str_replace($operateurs, $operateurs_marked,
2031 $restriction);
2032
2033 // Pour chaque opérateur logique
2034 foreach (array('&&', '||') as $operator) {
2035
2036 // S'il est absent on ne fait aucun traitement
2037 if (strpos($restriction, $mark.$operator.$mark) === false) {
2038 continue;
2039 }
2040 // Sinon on vérifie les deux conditions avec le OU/ET logique
2041 $restrictions = explode($mark.$operator.$mark, $restriction);
2042 $restrictions[0] = explode($mark, $restrictions[0]);
2043 $restrictions[1] = explode($mark, $restrictions[1]);
2044 $res_bool = false;
2045 if ($operator == '&&') {
2046 if ($this->is_restriction_satisfied($restrictions[0], $operateurs)
2047 && $this->is_restriction_satisfied($restrictions[1], $operateurs)) {
2048 $res_bool = true;
2049 }
2050 }
2051 if ($operator == '||') {
2052 if ($this->is_restriction_satisfied($restrictions[0], $operateurs)
2053 || $this->is_restriction_satisfied($restrictions[1], $operateurs)) {
2054 $res_bool = true;
2055 }
2056 }
2057 return $res_bool;
2058 }
2059 $tabRestriction = explode($mark, $restriction);
2060 return $this->is_restriction_satisfied($tabRestriction, $operateurs);
2061
2062 }
2063
2064 function is_restriction_satisfied($restriction, $operateurs) {
2065 // Tableau comprenant les résultat
2066 $res = array();
2067 // Compteur pour les résultat
2068 // commence à 1 car le 0 doit rester inchangé tout au long du traitement
2069 $j = 1;
2070 // Comparateur du calcul
2071 $comparateur = '';
2072 // Booléen retourné
2073 $res_bool = true;
2074
2075 // S'il y a un comparateur
2076 if (in_array(">=", $restriction)
2077 || in_array("<=", $restriction)
2078 || in_array("==", $restriction)
2079 || in_array("!=", $restriction)) {
2080
2081 // Si le tableau n'est pas vide
2082 if (count($restriction) > 0) {
2083
2084 // Boucle dans le tableau pour récupérer seulement les valeurs
2085 foreach ($restriction as $key => $value) {
2086 //
2087 if (!in_array($value, $operateurs)) {
2088 if ($this->getRestrictionValue($value) != false) {
2089 $res[] = $this->getRestrictionValue($value);
2090 } else {
2091 // Message d'erreur
2092 $error_message = sprintf(_("Le champ %s de l'instruction %s est vide"), "<span class='bold'>".$value."</span>", "<span class='bold'>".$this->valF["instruction"]."</span>");
2093 $this->addToMessage($error_message);
2094 // Arrête le traitement
2095 return false;
2096 }
2097 }
2098 }
2099
2100 // Boucle dans le tableau
2101 // commence à 1 car le 0 doit rester inchangé tout au long du
2102 // traitement
2103 for ($i = 1; $i<count($restriction); $i++) {
2104
2105 // Récupère le comparateur
2106 if ($restriction[$i] === ">="
2107 || $restriction[$i] === "<="
2108 || $restriction[$i] === "=="
2109 || $restriction[$i] === "!=") {
2110 $comparateur = $restriction[$i];
2111 }
2112
2113 // Si l'opérateur qui suit est un "+"
2114 if ($restriction[$i] === "+") {
2115 $dateDep = $res[$j];
2116 unset($res[$j]);$j++;
2117 $duree = $res[$j];
2118 unset($res[$j]);
2119 $res[$j] = $this->f->mois_date($dateDep, $duree, "+");
2120 }
2121
2122 // Si l'opérateur qui suit est un "-"
2123 if ($restriction[$i] === "-") {
2124 $dateDep = $res[$j];
2125 unset($res[$j]);$j++;
2126 $duree = $res[$j];
2127 unset($res[$j]);
2128 $res[$j] = $this->f->mois_date($dateDep, $duree, "-");
2129 }
2130 }
2131
2132 }
2133
2134 // Si les tableau des résultats n'est pas vide
2135 if (count($res) > 0) {
2136 //
2137 $res_bool = false;
2138 // Effectue le test
2139 if ($comparateur === ">=") {
2140 //
2141 if (strtotime($res[0]) >= strtotime($res[$j])) {
2142 $res_bool = true;
2143 }
2144 }
2145 if ($comparateur === "<=") {
2146 //
2147 if (strtotime($res[0]) <= strtotime($res[$j])) {
2148 $res_bool = true;
2149 }
2150 }
2151 if ($comparateur === "==") {
2152 //
2153 if (strtotime($res[0]) == strtotime($res[$j])) {
2154 $res_bool = true;
2155 }
2156 }
2157 if ($comparateur === "!=") {
2158 //
2159 if (strtotime($res[0]) != strtotime($res[$j])) {
2160 $res_bool = true;
2161 }
2162 }
2163 }
2164 // Sinon une erreur s'affiche
2165 } else {
2166
2167 // Message d'erreur
2168 $error_message = _("Mauvais parametrage de la restriction.")." ".
2169 _("Contactez votre administrateur");
2170 $this->addToMessage($error_message);
2171 // Arrête le traitement
2172 return false;
2173 }
2174
2175 return $res_bool;
2176
2177 }
2178
2179 /**
2180 * Permet de définir si l'événement passé en paramètre est un événement retour.
2181 * @param integer $evenement événement à tester
2182 *
2183 * @return boolean retourne true si événement retour sinon false
2184 */
2185 function is_evenement_retour($evenement) {
2186 if(empty($evenement) || !is_numeric($evenement)) {
2187 return "";
2188 }
2189 $sql = "SELECT retour
2190 FROM ".DB_PREFIXE."evenement
2191 WHERE evenement = ".$evenement;
2192 $retour = $this->f->db->getOne($sql);
2193 $this->addToLog("verifier(): db->query(\"".$sql."\");", VERBOSE_MODE);
2194 if (database::isError($retour)) {
2195 die($retour->getMessage());
2196 }
2197 if ($retour == 't') {
2198 return true;
2199 } else {
2200 return false;
2201 }
2202 }
2203
2204 /**
2205 * Retourne le champ restriction de l'événement passé en paramètre.
2206 *
2207 * @param integer $evenement id de l'événement sur lequel récupérer la restriction
2208 *
2209 * @return string contenu du champ restriction
2210 */
2211 function get_restriction($evenement) {
2212 if(empty($evenement) || !is_numeric($evenement)) {
2213 return "";
2214 }
2215 //Récupère la restriction
2216 $sql= "SELECT
2217 restriction
2218 FROM
2219 ".DB_PREFIXE."evenement
2220 WHERE
2221 evenement =".$evenement;
2222
2223 $restriction = $this->f->db->getOne($sql);
2224 $this->addToLog("verifier(): db->query(\"".$sql."\");", VERBOSE_MODE);
2225 if (database::isError($restriction)) {
2226 die($restriction->getMessage());
2227 }
2228 return $restriction;
2229 }
2230
2231 /**
2232 * Récupère la valeur du champ dans la restriction
2233 * @param string $restrictionValue Nom du champ
2234 * @return mixed Valeur du champ
2235 */
2236 function getRestrictionValue($restrictionValue){
2237
2238 // Initialisation de la valeur de retour
2239 $return = false;
2240
2241 // Récupére les valeurs du dossier
2242 $value_dossier = $this->get_dossier_actual();
2243
2244 //
2245 if (is_numeric($restrictionValue)) {
2246 $return = $restrictionValue;
2247 }elseif (isset($value_dossier[$restrictionValue])) {
2248 $return = $value_dossier[$restrictionValue];
2249 }elseif (isset($this->valF[$restrictionValue])) {
2250 $return = $this->valF[$restrictionValue];
2251 }
2252
2253 // Retourne la valeur du champ
2254 return $return;
2255 }
2256
2257
2258 /**
2259 * Calcul des règle d'action selon leur type.
2260 *
2261 * Types de règle :
2262 * - date
2263 * - numeric
2264 * - text
2265 * - bool
2266 * - specific
2267 * - technical_data
2268 *
2269 * @param string $rule Règle d'action.
2270 * @param string $rule_name Nom de la règle.
2271 * @param string $type Type de la règle.
2272 *
2273 * @return mixed Résultat de la règle
2274 */
2275 public function regle($rule, $rule_name, $type = null) {
2276
2277 // Supprime tous les espaces de la chaîne de caractère
2278 $rule = str_replace(' ', '', $rule);
2279 // Coupe la chaîne au niveau de l'opérateur
2280 $operands = explode ("+", $rule);
2281 // Nombre d'opérande
2282 $nb_operands = count($operands);
2283
2284 // Règle à null
2285 if ($rule == "null") {
2286 return null;
2287 }
2288
2289 // Tableau des champs de type date
2290 $rule_type_date = array(
2291 "regle_date_limite",
2292 "regle_date_notification_delai",
2293 "regle_date_complet",
2294 "regle_date_validite",
2295 "regle_date_decision",
2296 "regle_date_chantier",
2297 "regle_date_achevement",
2298 "regle_date_conformite",
2299 "regle_date_rejet",
2300 "regle_date_dernier_depot",
2301 "regle_date_limite_incompletude",
2302 "regle_date_cloture_instruction",
2303 "regle_date_premiere_visite",
2304 "regle_date_derniere_visite",
2305 "regle_date_contradictoire",
2306 "regle_date_retour_contradictoire",
2307 "regle_date_ait",
2308 "regle_date_transmission_parquet",
2309 "regle_date_affichage",
2310 );
2311 // Tableau des champs de type numérique
2312 $rule_type_numeric = array(
2313 "regle_delai",
2314 "regle_delai_incompletude",
2315 );
2316 // Tableau des champs de type text
2317 $rule_type_text = array(
2318 );
2319 // Tableau des champs de type booléen
2320 $rule_type_bool = array(
2321 "regle_a_qualifier",
2322 "regle_incompletude",
2323 "regle_incomplet_notifie",
2324 "regle_evenement_suivant_tacite_incompletude",
2325 );
2326 // Tableau des champs spécifiques
2327 $rule_type_specific = array(
2328 "regle_autorite_competente",
2329 "regle_etat",
2330 "regle_accord_tacite",
2331 "regle_avis",
2332 "regle_pec_metier",
2333 "regle_etat_pendant_incompletude",
2334 );
2335 // Tableau des champs de données techniques
2336 $rule_type_technical_data = array(
2337 'regle_donnees_techniques1',
2338 'regle_donnees_techniques2',
2339 'regle_donnees_techniques3',
2340 'regle_donnees_techniques4',
2341 'regle_donnees_techniques5',
2342 );
2343 // Tableau des champs simple
2344 $rule_type_simple = array(
2345 "regle_dossier_instruction_type",
2346 );
2347
2348 // Définit le type du champ
2349 if (in_array($rule_name, $rule_type_date) == true) {
2350 $type = "date";
2351 }
2352 if (in_array($rule_name, $rule_type_numeric) == true) {
2353 $type = "numeric";
2354 }
2355 if (in_array($rule_name, $rule_type_text) === true) {
2356 $type = "text";
2357 }
2358 if (in_array($rule_name, $rule_type_bool) === true) {
2359 $type = "bool";
2360 }
2361 if (in_array($rule_name, $rule_type_specific) === true) {
2362 $type = "specific";
2363 }
2364 if (in_array($rule_name, $rule_type_technical_data) === true) {
2365 $type = 'text';
2366 }
2367 if (in_array($rule_name, $rule_type_simple) === true) {
2368 $type = 'simple';
2369 }
2370
2371 // Si c'est un type spécifique ou booléen alors il n'a qu'un opérande
2372 // Récupère directement la valeur de l'opérande
2373 if ($type === 'specific') {
2374 //
2375 return $this->get_value_for_rule($rule);
2376 }
2377
2378 // Initialisation des variables
2379 $key_date = 0;
2380 $total_numeric = 0;
2381 $res_text = '';
2382
2383 // Pour chaque opérande
2384 foreach ($operands as $key => $operand) {
2385
2386 // Si c'est une règle de type date
2387 if ($type == 'date') {
2388 // Vérifie si au moins une des opérandes est une date
2389 if (is_numeric($operand) === false
2390 && $this->get_value_for_rule($operand) !== null
2391 && $this->f->check_date($this->get_value_for_rule($operand)) == true) {
2392 // Récupère la position de la date
2393 $key_date = $key;
2394 }
2395 // Les autres opérandes doivent être que des numériques
2396 if (is_numeric($operand) == true) {
2397 // Ajoute l'opérande au total
2398 $total_numeric += $operand;
2399 }
2400 if (is_numeric($operand) === false
2401 && $this->get_value_for_rule($operand) !== null
2402 && is_numeric($this->get_value_for_rule($operand)) == true) {
2403 // Ajoute l'opérande au total
2404 $total_numeric += $this->get_value_for_rule($operand);
2405 }
2406 }
2407
2408 // Si c'est une règle de type numérique
2409 if ($type == 'numeric') {
2410 // Les opérandes doivent être que des numériques
2411 if (is_numeric($operand) == true) {
2412 // Ajoute l'opérande au total
2413 $total_numeric += $operand;
2414 }
2415 if (is_numeric($operand) === false
2416 && $this->get_value_for_rule($operand) !== null
2417 && is_numeric($this->get_value_for_rule($operand)) == true) {
2418 // Ajoute l'opérande au total
2419 $total_numeric += $this->get_value_for_rule($operand);
2420 }
2421 }
2422
2423 // Si c'est une règle de type text
2424 if ($type === 'text') {
2425 // Concatène toutes les chaînes de caractère
2426 $res_text .= $this->get_value_for_rule($operand);
2427 }
2428 }
2429
2430 // Résultat pour une règle de type date
2431 if ($type == 'date') {
2432 // Retourne le calcul de la date
2433 return $this->f->mois_date($this->valF[$operands[$key_date]],
2434 $total_numeric, "+");
2435 }
2436
2437 // Résultat pour une règle de type numérique
2438 if ($type == 'numeric') {
2439 // Retourne le calcul
2440 return $total_numeric;
2441 }
2442
2443 // Résultat pour une règle de type text
2444 if ($type === 'text') {
2445 // Retourne la chaîne de caractère
2446 return $res_text;
2447 }
2448 if ($type === 'simple' || $type === 'bool') {
2449 // Retourne la valeur du champs rule
2450 return $rule;
2451 }
2452 }
2453
2454
2455 /**
2456 * Récupère la valeur du champs dans l'instruction ou dans les données
2457 * techniques.
2458 * Spécifique au calcul des règles.
2459 *
2460 * @param string $field Champ
2461 *
2462 * @return mixed Valeur du champ
2463 */
2464 private function get_value_for_rule($field) {
2465 // Si le champ n'existe pas dans la table instruction
2466 if (array_key_exists($field, $this->valF) === false) {
2467 // Récupère l'instance de la classe donnees_techniques
2468 $inst_donnees_techniques = $this->get_inst_donnees_techniques();
2469 // Retourne la valeur de la donnée technique
2470 return $inst_donnees_techniques->getVal($field);
2471 }
2472
2473 //
2474 return $this->valF[$field];
2475 }
2476
2477
2478 /**
2479 * [get_inst_donnees_techniques description]
2480 *
2481 * @param [type] $donnees_techniques [description]
2482 *
2483 * @return [type] [description]
2484 */
2485 function get_inst_donnees_techniques($donnees_techniques = null) {
2486 //
2487 if (isset($this->inst_donnees_techniques) === false or
2488 $this->inst_donnees_techniques === null) {
2489 //
2490 if (is_null($donnees_techniques)) {
2491 $donnees_techniques = $this->getDonneesTechniques();
2492 }
2493 //
2494 $this->inst_donnees_techniques = $this->f->get_inst__om_dbform(array(
2495 "obj" => "donnees_techniques",
2496 "idx" => $donnees_techniques,
2497 ));
2498 }
2499 //
2500 return $this->inst_donnees_techniques;
2501 }
2502
2503
2504 /**
2505 * Retourne l'identifiant des données techniques liées du dossier
2506 * @return string L'identifiant des données techniques liées du dossier
2507 */
2508 function getDonneesTechniques() {
2509
2510 $donnees_techniques = '';
2511
2512 $sql = "SELECT donnees_techniques
2513 FROM ".DB_PREFIXE."donnees_techniques
2514 WHERE dossier_instruction ='".$this->valF["dossier"]."'";
2515 $donnees_techniques = $this->f->db->getOne($sql);
2516 $this->f->addToLog("getStatut() : db->getOne(\"".$sql."\")", VERBOSE_MODE);
2517 if ( database::isError($donnees_techniques)){
2518 die();
2519 }
2520
2521 return $donnees_techniques;
2522 }
2523
2524 /**
2525 * TRIGGER - triggerajouterapres.
2526 *
2527 * - Mise à jour des informations liées au workflow sur le dossier
2528 * - Interface avec le référentiel ERP [105][111]
2529 * - Mise à jour du DA
2530 * - Historisation de la vie du DI
2531 *
2532 * @return boolean
2533 */
2534 function triggerajouterapres($id, &$dnu1 = null, $val = array(), $dnu2 = null) {
2535 $this->addToLog(__METHOD__."(): start", EXTRA_VERBOSE_MODE);
2536
2537 // On a besoin de l'instance du dossier lié à l'événement d'instruction
2538 $inst_di = $this->get_inst_dossier($this->valF['dossier']);
2539 // Instance de la classe evenement
2540 $inst_evenement = $this->get_inst_evenement($this->valF['evenement']);
2541 // Instance de l'état courant du dossier d'instruction
2542 $inst_current_etat = $this->f->get_inst__om_dbform(array(
2543 "obj" => "etat",
2544 "idx" => $inst_di->get_id_etat(),
2545 ));
2546
2547 /**
2548 * Mise à jour des valeurs du dossier en fonction des valeurs calculées
2549 * par l'action
2550 */
2551 // état de complétude actuel du dossier
2552 $incompletude = ($inst_di->getVal('incompletude') == 't' ? true : false);
2553 // L'événement suivant tacite paramétré est destiné à la gestion de l'incomplétude
2554 $ev_suiv_tacite_incompletude = false;
2555 // Initialisation
2556 $valF = array();
2557 $valF_dt = array();
2558 //
2559 // Récupération des paramètres de l'action
2560 $sql = "SELECT * FROM ".DB_PREFIXE."action
2561 WHERE action='".$this->valF['action']."'";
2562 $res = $this->f->db->query($sql);
2563 $this->addToLog(__METHOD__."(): db->query(\"".$sql."\");", VERBOSE_MODE);
2564 if (database::isError($res)) {
2565 die($res->getMessage());
2566 }
2567 while ($row=& $res->fetchRow(DB_FETCHMODE_ASSOC)) {
2568
2569 // pour chacune des regles, on applique la regle
2570 if ($row['regle_delai'] != '') {
2571 $valF['delai'] = $this->regle($row['regle_delai'], 'regle_delai');
2572 }
2573 if ($row['regle_accord_tacite'] != '') {
2574 $valF['accord_tacite'] = $this->regle($row['regle_accord_tacite'], 'regle_accord_tacite');
2575 }
2576 if ($row['regle_avis'] != '') {
2577 $valF['avis_decision'] = $this->regle($row['regle_avis'], 'regle_avis');
2578 }
2579 if ($row['regle_date_limite'] != '') {
2580 $valF['date_limite'] = $this->regle($row['regle_date_limite'], 'regle_date_limite');
2581 }
2582 if ($row['regle_date_complet'] != '') {
2583 $valF['date_complet'] = $this->regle($row['regle_date_complet'], 'regle_date_complet');
2584 }
2585 if ($row['regle_date_dernier_depot'] != '') {
2586 $valF['date_dernier_depot'] = $this->regle($row['regle_date_dernier_depot'], 'regle_date_dernier_depot');
2587 }
2588 if ($row['regle_date_notification_delai'] != '') {
2589 $valF['date_notification_delai'] = $this->regle($row['regle_date_notification_delai'], 'regle_date_notification_delai');
2590 }
2591 if ($row['regle_date_decision'] != '') {
2592 $valF['date_decision'] = $this->regle($row['regle_date_decision'], 'regle_date_decision');
2593 }
2594 if ($row['regle_date_rejet'] != '') {
2595 $valF['date_rejet'] = $this->regle($row['regle_date_rejet'], 'regle_date_rejet');
2596 }
2597 if ($row['regle_date_validite'] != '') {
2598 $valF['date_validite'] = $this->regle($row['regle_date_validite'], 'regle_date_validite');
2599 }
2600 if ($row['regle_date_chantier'] != '') {
2601 $valF['date_chantier'] = $this->regle($row['regle_date_chantier'], 'regle_date_chantier');
2602 }
2603 if ($row['regle_date_achevement'] != '') {
2604 $valF['date_achevement'] = $this->regle($row['regle_date_achevement'], 'regle_date_achevement');
2605 }
2606 if ($row['regle_date_conformite'] != '') {
2607 $valF['date_conformite'] = $this->regle($row['regle_date_conformite'], 'regle_date_conformite');
2608 }
2609 if ($row['regle_date_limite_incompletude'] != '') {
2610 $valF['date_limite_incompletude'] = $this->regle($row['regle_date_limite_incompletude'], 'regle_date_limite_incompletude');
2611 }
2612 if ($row['regle_delai_incompletude'] != '') {
2613 $valF['delai_incompletude'] = $this->regle($row['regle_delai_incompletude'], 'regle_delai_incompletude');
2614 }
2615 if ($row['regle_autorite_competente'] != '') {
2616 $valF['autorite_competente'] = $this->regle($row['regle_autorite_competente'], 'regle_autorite_competente');
2617 }
2618 if ($row['regle_etat'] != '') {
2619 $valF['etat'] = $this->regle($row['regle_etat'], 'regle_etat');
2620 }
2621 if ($row['regle_date_cloture_instruction'] !== '') {
2622 $valF['date_cloture_instruction'] = $this->regle($row['regle_date_cloture_instruction'], 'regle_date_cloture_instruction');
2623 }
2624 if ($row['regle_date_premiere_visite'] !== '') {
2625 $valF['date_premiere_visite'] = $this->regle($row['regle_date_premiere_visite'], 'regle_date_premiere_visite');
2626 }
2627 if ($row['regle_date_derniere_visite'] !== '') {
2628 $valF['date_derniere_visite'] = $this->regle($row['regle_date_derniere_visite'], 'regle_date_derniere_visite');
2629 }
2630 if ($row['regle_date_contradictoire'] !== '') {
2631 $valF['date_contradictoire'] = $this->regle($row['regle_date_contradictoire'], 'regle_date_contradictoire');
2632 }
2633 if ($row['regle_date_retour_contradictoire'] !== '') {
2634 $valF['date_retour_contradictoire'] = $this->regle($row['regle_date_retour_contradictoire'], 'regle_date_retour_contradictoire');
2635 }
2636 if ($row['regle_date_ait'] !== '') {
2637 $valF['date_ait'] = $this->regle($row['regle_date_ait'], 'regle_date_ait');
2638 }
2639 if ($row['regle_donnees_techniques1'] !== '') {
2640 $valF_dt[$row['cible_regle_donnees_techniques1']] = $this->regle($row['regle_donnees_techniques1'], 'regle_donnees_techniques1');
2641 }
2642 if ($row['regle_donnees_techniques2'] !== '') {
2643 $valF_dt[$row['cible_regle_donnees_techniques2']] = $this->regle($row['regle_donnees_techniques2'], 'regle_donnees_techniques2');
2644 }
2645 if ($row['regle_donnees_techniques3'] !== '') {
2646 $valF_dt[$row['cible_regle_donnees_techniques3']] = $this->regle($row['regle_donnees_techniques3'], 'regle_donnees_techniques3');
2647 }
2648 if ($row['regle_donnees_techniques4'] !== '') {
2649 $valF_dt[$row['cible_regle_donnees_techniques4']] = $this->regle($row['regle_donnees_techniques4'], 'regle_donnees_techniques4');
2650 }
2651 if ($row['regle_donnees_techniques5'] !== '') {
2652 $valF_dt[$row['cible_regle_donnees_techniques5']] = $this->regle($row['regle_donnees_techniques5'], 'regle_donnees_techniques5');
2653 }
2654 if ($row['regle_date_transmission_parquet'] !== '') {
2655 $valF['date_transmission_parquet'] = $this->regle($row['regle_date_transmission_parquet'], 'regle_date_transmission_parquet');
2656 }
2657 if ($row['regle_dossier_instruction_type'] !== '') {
2658 $valF['dossier_instruction_type'] = $this->regle($row['regle_dossier_instruction_type'], 'regle_dossier_instruction_type');
2659 }
2660 // La date d'affichage est modifiée seulement si le champ n'est pas
2661 // renseigné
2662 if ($row['regle_date_affichage'] !== ''
2663 && ($inst_di->getVal('date_affichage') === ''
2664 || $inst_di->getVal('date_affichage') === null)) {
2665 //
2666 $valF['date_affichage'] = $this->regle($row['regle_date_affichage'], 'regle_date_affichage');
2667 }
2668 //
2669 if ($row['regle_pec_metier'] != '') {
2670 $valF['pec_metier'] = $this->regle($row['regle_pec_metier'], 'regle_pec_metier');
2671 }
2672 if ($row['regle_a_qualifier'] != '') {
2673 $valF['a_qualifier'] = $this->regle($row['regle_a_qualifier'], 'regle_a_qualifier');
2674 }
2675 //
2676 if ($row['regle_incompletude'] != '') {
2677 $valF['incompletude'] = $this->regle($row['regle_incompletude'], 'regle_incompletude');
2678 }
2679 if ($row['regle_incomplet_notifie'] != '') {
2680 $valF['incomplet_notifie'] = $this->regle($row['regle_incomplet_notifie'], 'regle_incomplet_notifie');
2681 }
2682 if ($row['regle_etat_pendant_incompletude'] != '') {
2683 $valF['etat_pendant_incompletude'] = $this->regle($row['regle_etat_pendant_incompletude'], 'regle_etat_pendant_incompletude');
2684 }
2685 if ($row['regle_evenement_suivant_tacite_incompletude'] != '') {
2686 $resti = $this->regle($row['regle_evenement_suivant_tacite_incompletude'], 'regle_evenement_suivant_tacite_incompletude');
2687 if (strtolower($resti) === 't' || strtolower($resti) === 'true') {
2688 $ev_suiv_tacite_incompletude = true;
2689 }
2690 }
2691 }
2692
2693 // Si l'événement a un événement suivant tacite
2694 if($inst_evenement->getVal('evenement_suivant_tacite') != '') {
2695 // En fonction de l'action de l'événement, l'événement suivant tacite ne sera
2696 // pas associé de le même façon au dossier d'instruction
2697 if ($ev_suiv_tacite_incompletude === false) {
2698 $valF['evenement_suivant_tacite'] = $inst_evenement->getVal('evenement_suivant_tacite');
2699 }
2700 if ($ev_suiv_tacite_incompletude === true) {
2701 $valF['evenement_suivant_tacite_incompletude'] = $inst_evenement->getVal('evenement_suivant_tacite');
2702 }
2703 }
2704 // Si des valeurs de données techniques ont été calculées alors on met à jour l'enregistrement
2705 if (count($valF_dt) > 0) {
2706 $dt_id = $this->getDonneesTechniques();
2707 // On met à jour le dossier
2708 $cle = " donnees_techniques='".$dt_id."'";
2709 $res1 = $this->f->db->autoExecute(DB_PREFIXE.'donnees_techniques', $valF_dt, DB_AUTOQUERY_UPDATE, $cle);
2710 $this->addToLog(__METHOD__."(): db->autoexecute(\"".DB_PREFIXE."donnees_techniques\", ".print_r($valF_dt, true).", DB_AUTOQUERY_UPDATE, \"".$cle."\");", VERBOSE_MODE);
2711 if (database::isError($res1)) {
2712 die($res->getMessage());
2713 }
2714 // Affichage d'informations à l'utilisateur
2715 $this->addToMessage(_('enregistrement')." ".$this->valF['dossier']." "._('table')." dossier [".$this->f->db->affectedRows()." "._('enregistrement')." "._('mis_a_jour')."]");
2716 }
2717 // Si des valeurs ont été calculées alors on met à jour l'enregistrement
2718 if (count($valF) > 0) {
2719 //
2720 $inst_dossier = $this->f->get_inst__om_dbform(array(
2721 "obj" => "dossier",
2722 "idx" => $this->valF['dossier'],
2723 ));
2724 $valF['instruction'] = $id;
2725 $valF['crud'] = 'create';
2726 $update_by_instruction = $inst_dossier->update_by_instruction($valF);
2727 if ($update_by_instruction === false) {
2728 $this->cleanMessage();
2729 $this->addToMessage(sprintf('%s %s', __("Une erreur s'est produite lors de la mise à jour du dossier d'instruction."), __("Veuillez contacter votre administrateur.")));
2730 return false;
2731 }
2732 // Affichage d'informations à l'utilisateur
2733 $this->addToMessage(_('enregistrement')." ".$this->valF['dossier']." "._('table')." dossier [".$this->f->db->affectedRows()." "._('enregistrement')." "._('mis_a_jour')."]");
2734 }
2735
2736 /**
2737 * Interface avec le référentiel ERP.
2738 *
2739 * (WS->ERP)[105] Arrêté d'un dossier PC effectué -> PC qui concerne un ERP
2740 * (WS->ERP)[111] Décision de conformité effectuée -> PC qui concerne un ERP
2741 * Déclencheur :
2742 * - L'option ERP est activée
2743 * - Le dossier est marqué comme "connecté au référentiel ERP"
2744 * - Le dossier est de type PC
2745 * - Le formulaire d'ajout d'un événement d'instruction est validé
2746 * avec un événement pour lequel les services ERP doivent être
2747 * informé
2748 */
2749 //
2750 if ($this->f->is_option_referentiel_erp_enabled() === true
2751 && $inst_di->is_connected_to_referentiel_erp() === true
2752 && $this->f->getDATCode($this->valF['dossier']) == $this->f->getParameter('erp__dossier__nature__pc')
2753 && in_array($inst_evenement->getVal($inst_evenement->clePrimaire), explode(";", $this->f->getParameter('erp__evenements__decision__pc')))) {
2754 //
2755 $infos = array(
2756 "dossier_instruction" => $this->valF['dossier'],
2757 "decision" => $inst_evenement->getVal("libelle"),
2758 );
2759 //
2760 $ret = $this->f->send_message_to_referentiel_erp(105, $infos);
2761 if ($ret !== true) {
2762 $this->cleanMessage();
2763 $this->addToMessage(_("Une erreur s'est produite lors de la notification (105) du référentiel ERP. Contactez votre administrateur."));
2764 return false;
2765 }
2766 $this->addToMessage(_("Notification (105) du référentiel ERP OK."));
2767 }
2768
2769 // Si le mode en rédaction intégrale est activé
2770 if (isset($this->valF['flag_edition_integrale']) === true
2771 && $this->valF['flag_edition_integrale'] === true) {
2772 $redactionIntegraleValF = array();
2773
2774 // Récupère la collectivite du dossier d'instruction
2775 $dossier_instruction_om_collectivite = $this->get_dossier_instruction_om_collectivite();
2776 $collectivite = $this->f->getCollectivite($dossier_instruction_om_collectivite);
2777 // Récupère le corps de la lettre type
2778 $params = array(
2779 "specific" => array(
2780 "corps" => array(
2781 "mode" => "get",
2782 )
2783 ),
2784 );
2785 $result = $this->compute_pdf_output('lettretype', $this->valF['lettretype'], $collectivite, $id, $params);
2786 $redactionIntegraleValF['corps_om_htmletatex'] = $result['pdf_output'];
2787 // Récupère le titre de la lettre type
2788 $params = array(
2789 "specific" => array(
2790 "titre" => array(
2791 "mode" => "get",
2792 )
2793 ),
2794 );
2795 $result = $this->compute_pdf_output('lettretype', $this->valF['lettretype'], $collectivite, $id, $params);
2796 $redactionIntegraleValF['titre_om_htmletat'] = $result['pdf_output'];
2797
2798 // mise à jour en base de données
2799 $res = $this->f->db->autoExecute(
2800 DB_PREFIXE.$this->table,
2801 $redactionIntegraleValF,
2802 DB_AUTOQUERY_UPDATE,
2803 $this->clePrimaire."=".$id
2804 );
2805 $this->addToLog(__METHOD__."(): db->autoexecute(\"".DB_PREFIXE.'.'.$this->table."\", ".print_r($redactionIntegraleValF, true).", DB_AUTOQUERY_UPDATE, \"".$this->clePrimaire."=".$id."\");", VERBOSE_MODE);
2806 if ($this->f->isDatabaseError($res, true) === true) {
2807 return false;
2808 }
2809 }
2810
2811 /**
2812 * Finalisation automatique de l'instruction si le paramétrage de l'événement l'autorise
2813 */
2814 // Si la finalisation automatique de l'événement est activée
2815 // ET si l'instruction n'a pas déjà été finalisée
2816 // ET s'il existe une lettre type associée
2817 if ($inst_evenement->getVal('finaliser_automatiquement') === 't'
2818 && $inst_evenement->getVal('om_final_instruction') !== 't'
2819 && $inst_evenement->getVal('lettretype') !== ''
2820 && $inst_evenement->getVal('lettretype') !== null) {
2821
2822 // On instancie l'instruction
2823 $inst_instruction = $this->f->get_inst__om_dbform(array(
2824 "obj" => "instruction",
2825 "idx" => $this->valF[$this->clePrimaire],
2826 ));
2827
2828 // On finalise l'instruction dans le contexte de finalisation : action 100
2829 $inst_instruction->setParameter('maj', 100);
2830 $finalize = $inst_instruction->finalize($inst_instruction->valF);
2831
2832 // Une erreur de finalisation renvoie 'false' : ajout dans les logs
2833 // et dans le message d'erreur
2834 if ($finalize === false) {
2835 $this->f->addToLog(__METHOD__."() : ERROR - Impossible de finaliser l'instruction.", DEBUG_MODE);
2836 $this->addToMessage(_("Erreur lors de la finalisation de l'instruction. Contactez votre administrateur."));
2837 return false;
2838 }
2839 }
2840
2841 /**
2842 * Finalisation automatique des instructions tacites ou retours.
2843 */
2844 // Si l'option de finalisation automatique des instructions tacites ou
2845 // retours est activée et l'événement d'instruction a une lettre type
2846 // associée
2847 $collectivite_di = $this->get_dossier_instruction_om_collectivite($val['dossier']);
2848 if ($this->f->is_option_finalisation_auto_enabled($collectivite_di) === true
2849 && $inst_evenement->getVal('lettretype') !== ''
2850 && $inst_evenement->getVal('lettretype') !== null) {
2851
2852 // Rècupère l'identifiant de l'événement
2853 $evenement_id = $inst_evenement->getVal($inst_evenement->clePrimaire);
2854
2855 // Si l'événement d'instruction est identifié comme un événement
2856 // retour
2857 // OU l'événement d'instruction est l'événement suivant tacite du
2858 // dossier d'instruction (incomplétude prise en compte)
2859 // ET l'événement d'instruction n'a pas déjà été finalisé
2860 if (($inst_evenement->getVal("retour") === 't'
2861 || ($inst_di->getVal('evenement_suivant_tacite_incompletude') === $evenement_id
2862 || $inst_di->getVal('evenement_suivant_tacite') === $evenement_id))
2863 && ($inst_evenement->getVal('om_final_instruction') !== 't')) {
2864
2865 // Finalise l'instruction
2866 $inst_instruction = $this->f->get_inst__om_dbform(array(
2867 "obj" => "instruction",
2868 "idx" => $this->valF[$this->clePrimaire],
2869 ));
2870 $inst_instruction->setParameter('maj', 100);
2871 $finalize = $inst_instruction->finalize($inst_instruction->valF);
2872 if ($finalize === false) {
2873 //
2874 return false;
2875 }
2876 }
2877 }
2878
2879 /**
2880 * Mise à jour de la version de clôture *version_clos* du dossier si et
2881 * seulement si l'instruction met à jour l'état du dossier.
2882 */
2883 if (isset($valF['etat']) === true
2884 && $valF['etat'] !== null
2885 && $valF['etat'] !== '') {
2886 // Instanciation de l'état appliqué sur le dossier par l'instruction
2887 $inst_etat = $this->f->get_inst__om_dbform(array(
2888 "obj" => "etat",
2889 "idx" => $valF['etat'],
2890 ));
2891 //
2892 $update_version_clos = null;
2893 // En cas d'instruction qui clôture le dossier
2894 if ($inst_etat->getVal('statut') === 'cloture') {
2895 $update_version_clos = $inst_di->update_version_clos('up');
2896 }
2897 // En cas d'instruction qui rouvre le dossier
2898 if ($inst_current_etat->getVal('statut') === 'cloture'
2899 && $inst_etat->getVal('statut') !== 'cloture') {
2900 //
2901 $update_version_clos = $inst_di->update_version_clos('down');
2902 //
2903 $params = array(
2904 'di_reopened' => true,
2905 );
2906 }
2907 //
2908 if ($update_version_clos === false) {
2909 $this->f->addToLog(sprintf(
2910 "%s() : ERREUR - %s %s",
2911 __METHOD__,
2912 sprintf(
2913 __("Impossible de mettre à jour la version de clôture du dossier d'instruction %s."),
2914 $inst_di->getVal($inst_di->clePrimaire)
2915 ),
2916 sprintf(
2917 __("L'instruction tente d'appliquer l'état %s."),
2918 $inst_etat->getVal($inst_etat->clePrimaire)
2919 )
2920 ));
2921 $this->addToMessage(sprintf(
2922 "%s %s",
2923 __("Erreur lors de la mise à jour de la version de clôture du dossier d'instruction."),
2924 __("Veuillez contacter votre administrateur.")
2925 ));
2926 return false;
2927 }
2928 }
2929
2930 /**
2931 * Notification automatique
2932 */
2933 // Notification automatique à l'ajout de l'instruction si la notification
2934 // automatique est choisie et qu'il n'y a pas de lettretype associée à l'événement
2935 if ($inst_evenement->getVal('notification') === 'notification_automatique' &&
2936 ($inst_evenement->getVal('lettretype') === null ||
2937 $inst_evenement->getVal('lettretype') === '')) {
2938 // Récupération de la liste des demandeurs à notifier et de la catégorie
2939 $categorie = $this->f->get_param_option_notification($collectivite_di);
2940 $isPortal = $categorie == null || $categorie == '' || $categorie == 'portal' ? true : false;
2941 $demandeursANotifie = $this->get_demandeurs_notifiable(
2942 $this->valF['dossier'],
2943 $isPortal
2944 );
2945
2946 // Création d'une notification et d'une tâche pour chaque demandeur à notifier
2947 foreach ($demandeursANotifie as $demandeur) {
2948 // Ajout de la notif et récupération de son id
2949 $idNotif = $this->ajouter_notification(
2950 $this->valF[$this->clePrimaire],
2951 $this->f->get_connected_user_login_name(),
2952 $demandeur,
2953 $collectivite_di,
2954 true
2955 );
2956 if ($idNotif === false) {
2957 return false;
2958 }
2959 // Création de la tache en lui donnant l'id de la notification
2960 $notification_by_task = $this->notification_by_task(
2961 $idNotif,
2962 $this->valF['dossier'],
2963 $categorie
2964 );
2965 if ($notification_by_task === false) {
2966 $this->addToMessage(
2967 __("Erreur lors de la génération de la notification au(x) pétitionnaire(s).")
2968 );
2969 return false;
2970 }
2971 }
2972 $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.")));
2973 }
2974
2975 /**
2976 * Mise à jour de la date de dernière modification du dossier
2977 */
2978 $inst_di->update_last_modification_date();
2979
2980 /**
2981 * Mise à jour des données du DA.
2982 */
2983 $inst_da = $inst_di->get_inst_dossier_autorisation();
2984 $params['di_id'] = $this->valF['dossier'];
2985 if ($inst_da->majDossierAutorisation($params) === false) {
2986 $this->addToMessage(_("Erreur lors de la mise a jour des donnees du dossier d'autorisation. Contactez votre administrateur."));
2987 $this->correct = false;
2988 return false;
2989 }
2990
2991 /**
2992 * Historisation de la vie du DI.
2993 */
2994 //
2995 return $this->add_log_to_dossier($id, array_merge($val, $this->valF));
2996 }
2997
2998 public function is_notifiable_by_task_manual() {
2999 $ev = $this->get_inst_evenement($this->getVal('evenement'));
3000
3001 // Si l'instruction a une édition non finalisé quel que soit
3002 // le type de notification, il n'est pas notifiable
3003 if ($this->has_an_edition() === true) {
3004 if ($this->is_unfinalizable_without_bypass() === false) {
3005 return false;
3006 }
3007 }
3008
3009 // Gestion des différents cas selon la valeur du champs notification
3010 switch ($ev->getVal('notification')) {
3011 case 'notification_manuelle':
3012 return true;
3013 case 'notification_manuelle_annexe':
3014 return true;
3015 case 'notification_automatique':
3016 return false;
3017 case 'notification_auto_signature_requise':
3018 return false;
3019 case 'notification_manuelle_signature_requise':
3020 // Si il y a une date de retour de signature la notification est possible
3021 if ($this->getVal('date_retour_signature') === null
3022 || $this->getVal('date_retour_signature') === '') {
3023 return false;
3024 }
3025 return true;
3026 case 'notification_manuelle_annexe_signature_requise':
3027 // Si il y a une date de retour de signature la notification est possible
3028 if ($this->getVal('date_retour_signature') === null
3029 || $this->getVal('date_retour_signature') === '') {
3030 return false;
3031 }
3032 return true;
3033 default:
3034 return false;
3035 }
3036 }
3037
3038 /**
3039 * Crée une instance et une tache de notification pour le demandeur
3040 * principal.
3041 *
3042 * @return boolean true si le traitement à réussi
3043 */
3044 protected function notifier_demandeur_principal() {
3045 $this->begin_treatment(__METHOD__);
3046 $message = '';
3047 // Récupération des informations concernant le demandeur
3048 $dossier = $this->getVal('dossier');
3049 $collectivite_di = $this->get_dossier_instruction_om_collectivite($dossier);
3050 $demandeur = $this->get_demandeurs_notifiable(
3051 $dossier,
3052 true
3053 );
3054 if ($demandeur !== array()) {
3055 $destinataire = array_values($demandeur);
3056 // Ajout de la notif et récupération de son id
3057 $idNotification = $this->ajouter_notification(
3058 $this->getVal($this->clePrimaire),
3059 $this->f->get_connected_user_login_name(),
3060 $destinataire[0],
3061 $collectivite_di,
3062 true
3063 );
3064 if ($idNotification === false) {
3065 return $this->end_treatment(__METHOD__, false);
3066 }
3067 // Création de la tâche en lui donnant l'id de la notification
3068 $notification_by_task = $this->notification_by_task($idNotification, $dossier);
3069 if ($notification_by_task === false) {
3070 $this->addToMessage(
3071 __("Erreur lors de la génération de la notification au(x) pétitionnaire(s).")
3072 );
3073 return $this->end_treatment(__METHOD__, false);
3074 }
3075 $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.")));
3076 return $this->end_treatment(__METHOD__, true);
3077 }
3078 $this->addToMessage( __("Le demandeur principal n'est pas notifiable."));
3079 return $this->end_treatment(__METHOD__, true);
3080 }
3081
3082 public function notification_by_task($object_id, $dossier, $category = null, $type = null) {
3083 // Par défaut le type est portal
3084 if ($category === null) {
3085 $category = 'portal';
3086 }
3087 // Si le type n'est pas correctement spécifié, alors il est calculé
3088 if ($type === null
3089 || $type !== 'notification_recepisse'
3090 || $type !== 'notification_instruction'
3091 || $type !== 'notification_decision') {
3092 //
3093 $type = 'notification_instruction';
3094 // Vérifie si l'instruction est un récépissé
3095 $trace = debug_backtrace();
3096 foreach ($trace as $key => $value) {
3097 if (isset($trace[$key]['class']) === true
3098 && empty($trace[$key]['class']) === false) {
3099 //
3100 if (strtolower($trace[$key]['class']) === 'demande') {
3101 $type = 'notification_recepisse';
3102 }
3103 }
3104 }
3105 // Vérifie si l'instruction est une décision
3106 if ($type !== 'notification_recepisse') {
3107 $avis_decision = $this->getVal('avis_decision') !== null ? $this->getVal('avis_decision') : $this->valF['avis_decision'];
3108 if ($avis_decision !== null && $avis_decision !== '') {
3109 $type = 'notification_decision';
3110 }
3111 }
3112 }
3113 // Préparation de la tache de notification
3114 $inst_task = $this->f->get_inst__om_dbform(array(
3115 "obj" => "task",
3116 "idx" => 0,
3117 ));
3118 $task_val = array(
3119 'type' => $type,
3120 'object_id' => $object_id,
3121 'dossier' => $dossier,
3122 'category' => $category,
3123 );
3124
3125 $add_task = $inst_task->add_task(array('val' => $task_val));
3126 if ($add_task === false) {
3127 return false;
3128 }
3129
3130 return true;
3131 }
3132
3133 /**
3134 * A partir des informations passée en argument ajoute un nouvel élément
3135 * dans la table instruction_notification.
3136 * Avant l'ajout vérifie en utilisant l'id de la collectivité passée en
3137 * paramètre si le paramétrage attendus est ok.
3138 * Ajoute également un nouvel élement dans instruction_notification_document
3139 * si l'instruction possède une lettretype.
3140 * Si un identifiant d'une instruction annexe est donnée ajoute un deuxième
3141 * élement dans la table instruction_notification_document qui correspondra
3142 * à l'annexe de la notification.
3143 *
3144 * @param integer identifiant de l'instruction notifiée
3145 * @param string information concernant l'emetteur
3146 * @param array tableau contenant 2 entrées
3147 * - destinatire : nom, prenom ou raison sociale, dénomination et courriel
3148 * - courriel : adresse mail de la personne à notifier
3149 * @param integer identifiant de la collectivité permettant de récupèrer les
3150 * paramètres à valider
3151 * @param boolean indique si la notification est automatique ou manuelle
3152 * @param integer identifiant d'une instruction dont l'édition sera annexé
3153 * à la notification
3154 *
3155 * @return integer|boolean identifiant de la notification créée si le traitement
3156 * a réussie, false sinon.
3157 */
3158 protected function ajouter_notification(
3159 $idInstruction,
3160 $emetteur,
3161 $destinataire,
3162 $collectiviteId,
3163 $demandeAuto = false,
3164 $idInstrDocAnnexe = null
3165 ) {
3166 // Vérification que les paramètres nécessaires à l'envoi de la notification existe avant
3167 // de créer la notification
3168 if (! $this->is_parametrage_notification_correct($collectiviteId)) {
3169 $this->addToMessage(__("Erreur de paramétrage. L'url d'accès au(x) document(s) notifié(s) n'est pas paramétrée."));
3170 return false;
3171 }
3172 // Préparation de la notification
3173 $inst_notif = $this->f->get_inst__om_dbform(array(
3174 "obj" => "instruction_notification",
3175 "idx" => "]",
3176 ));
3177 $notif_val = array(
3178 'instruction_notification' => null,
3179 'instruction' => $idInstruction,
3180 'automatique' => $demandeAuto,
3181 'emetteur' => $emetteur,
3182 'date_envoi' => null,
3183 'destinataire' => $destinataire['destinataire'],
3184 'courriel' => $destinataire['courriel'],
3185 'date_premier_acces' => null,
3186 'statut' => 'en cours d\'envoi',
3187 'commentaire' => 'Notification en cours de traitement'
3188 );
3189
3190 // Création de la notification
3191 $add_notif = $inst_notif->ajouter($notif_val);
3192 if ($add_notif === false) {
3193 $this->addToMessage(__("Erreur lors de la génération de la notification au(x) pétitionnaire(s)."));
3194 return false;
3195 }
3196
3197 // Si il y a une lettretype finalisé stockage de la clé d'accès au documents
3198 if ($this->evenement_has_an_edition($this->getVal('evenement')) === true) {
3199 $add_notif_doc = $this->ajouter_notification_document(
3200 $this->getVal($this->clePrimaire),
3201 $inst_notif->getVal($inst_notif->clePrimaire)
3202 );
3203 if ($add_notif_doc === false) {
3204 $this->addToMessage(__("Erreur lors de la génération de la notification du document."));
3205 return false;
3206 }
3207 }
3208 // Si une annexe a été choisie stockage de la clé d'accès à l'annexe
3209 if ($idInstrDocAnnexe != null || $idInstrDocAnnexe != '') {
3210 $add_notif_annexe = $this->ajouter_notification_document(
3211 $idInstrDocAnnexe,
3212 $inst_notif->getVal($inst_notif->clePrimaire),
3213 true
3214 );
3215 if ($add_notif_annexe === false) {
3216 $this->addToMessage(__("Erreur lors de la génération de la notification de l'annexe."));
3217 return false;
3218 }
3219 }
3220
3221 // Renvoie l'id de la nouvelle instance de instruction_notification
3222 return $inst_notif->getVal($inst_notif->clePrimaire);
3223 }
3224
3225 /**
3226 * Vérifie si le paramétrage de la notification des demandeurs est correct.
3227 *
3228 * @param integer identifiant de la collectivité
3229 * @return boolean
3230 */
3231 protected function is_parametrage_notification_correct($collectiviteId) {
3232 $categorie = $this->f->get_param_option_notification($collectiviteId);
3233 $urlAccesNotif = $this->f->get_parametre_notification_url_acces($collectiviteId);
3234 if ($categorie == 'mail' && $urlAccesNotif == null) {
3235 return false;
3236 }
3237 return true;
3238 }
3239
3240 /**
3241 * Ajoute un élément dans la table instruction_notification_document.
3242 *
3243 * @param integer $idInstruction : id de l'instruction à laquelle est rattaché le document
3244 * @param integer $idNotification : id de la notification à laquelle on associe le document
3245 * @param boolean $isAnnexe : indique si le document est une annexe ou pas
3246 *
3247 * @return boolean indique si le traitement a réussi
3248 */
3249 protected function ajouter_notification_document($idInstruction, $idNotification, $isAnnexe = false) {
3250 $inst_notif_doc = $this->f->get_inst__om_dbform(array(
3251 "obj" => "instruction_notification_document",
3252 "idx" => "]",
3253 ));
3254 $notif_doc_val = array(
3255 'instruction_notification_document' => null,
3256 'instruction_notification' => $idNotification,
3257 'instruction' => $idInstruction,
3258 'cle' => $this->getCleAccesDocument(),
3259 'annexe' => $isAnnexe
3260 );
3261
3262 $add_notif_doc = $inst_notif_doc->ajouter($notif_doc_val);
3263 if ($add_notif_doc === false) {
3264 return false;
3265 }
3266 return true;
3267 }
3268
3269 /**
3270 * TRIGGER - triggermodifierapres.
3271 *
3272 * @return boolean
3273 */
3274 function triggermodifierapres($id, &$dnu1 = null, $val = array(), $dnu2 = null) {
3275 $this->addToLog(__METHOD__."(): start", EXTRA_VERBOSE_MODE);
3276 $collectivite_di = $this->get_dossier_instruction_om_collectivite($val['dossier']);
3277 $message = '';
3278 /**
3279 * L'objectif ici est d'effectuer les recalculs de date dans le dossier
3280 * si la date de l'evenement est modifiee
3281 */
3282 // Initialisation
3283 $valF = array();
3284 $valF_dt = array();
3285 // Initialisation du type d'événement
3286 $type_evmt = "";
3287 // Récupération de l'action correspondante à l'événement
3288 $sql = "SELECT action
3289 FROM ".DB_PREFIXE."evenement
3290 WHERE evenement=".$this->valF['evenement'];
3291 $action = $this->f->db->getOne($sql);
3292 $this->addToLog(__METHOD__."(): db->getone(\"".$sql."\");", VERBOSE_MODE);
3293 if (database::isError($action)) {
3294 die($action->getMessage());
3295 }
3296
3297 // Récupération des paramètres de l'action
3298 $sql = "SELECT * FROM ".DB_PREFIXE."action
3299 WHERE action='".$action."'";
3300 $res = $this->f->db->query($sql);
3301 $this->addToLog(__METHOD__."(): db->query(\"".$sql."\");", VERBOSE_MODE);
3302 if (database::isError($res)) {
3303 die($res->getMessage());
3304 }
3305 while ($row=& $res->fetchRow(DB_FETCHMODE_ASSOC)){
3306 // application des regles sur le courrier + delai
3307 if(preg_match("/date_evenement/",$row['regle_date_limite'])){
3308 $valF['date_limite']= $this->regle($row['regle_date_limite'], 'regle_date_limite');
3309 }
3310 if(preg_match("/date_evenement/",$row['regle_date_complet'])){
3311 $valF['date_complet']= $this->regle($row['regle_date_complet'], 'regle_date_complet');
3312 }
3313 if(preg_match("/date_evenement/",$row['regle_date_dernier_depot'])){
3314 $valF['date_dernier_depot']= $this->regle($row['regle_date_dernier_depot'], 'regle_date_dernier_depot');
3315 }
3316 if(preg_match("/date_evenement/",$row['regle_date_notification_delai'])){
3317 $valF['date_notification_delai']= $this->regle($row['regle_date_notification_delai'], 'regle_date_notification_delai');
3318 }
3319 if(preg_match("/date_evenement/",$row['regle_date_decision'])){
3320 $valF['date_decision']= $this->regle($row['regle_date_decision'], 'regle_date_decision');
3321 }
3322 if(preg_match("/date_evenement/",$row['regle_date_rejet'])){
3323 $valF['date_rejet']= $this->regle($row['regle_date_rejet'], 'regle_date_rejet');
3324 }
3325 if(preg_match("/date_evenement/",$row['regle_date_validite'])){
3326 $valF['date_validite']= $this->regle($row['regle_date_validite'], 'regle_date_validite');
3327 }
3328 if(preg_match("/date_evenement/",$row['regle_date_chantier'])){
3329 $valF['date_chantier']= $this->regle($row['regle_date_chantier'], 'regle_date_chantier');
3330 }
3331 if(preg_match("/date_evenement/",$row['regle_date_achevement'])){
3332 $valF['date_achevement']= $this->regle($row['regle_date_achevement'], 'regle_date_achevement');
3333 }
3334 if(preg_match("/date_evenement/",$row['regle_date_conformite'])){
3335 $valF['date_conformite']= $this->regle($row['regle_date_conformite'], 'regle_date_conformite');
3336 }
3337 if(preg_match("/date_evenement/",$row['regle_date_cloture_instruction'])){
3338 $valF['date_cloture_instruction']= $this->regle($row['regle_date_cloture_instruction'], 'regle_date_cloture_instruction');
3339 }
3340 if(preg_match("/date_evenement/",$row['regle_date_premiere_visite'])){
3341 $valF['date_premiere_visite']= $this->regle($row['regle_date_premiere_visite'], 'regle_date_premiere_visite');
3342 }
3343 if(preg_match("/date_evenement/",$row['regle_date_derniere_visite'])){
3344 $valF['date_derniere_visite']= $this->regle($row['regle_date_derniere_visite'], 'regle_date_derniere_visite');
3345 }
3346 if(preg_match("/date_evenement/",$row['regle_date_contradictoire'])){
3347 $valF['date_contradictoire']= $this->regle($row['regle_date_contradictoire'], 'regle_date_contradictoire');
3348 }
3349 if(preg_match("/date_evenement/",$row['regle_date_retour_contradictoire'])){
3350 $valF['date_retour_contradictoire']= $this->regle($row['regle_date_retour_contradictoire'], 'regle_date_retour_contradictoire');
3351 }
3352 if(preg_match("/date_evenement/",$row['regle_date_ait'])){
3353 $valF['date_ait']= $this->regle($row['regle_date_ait'], 'regle_date_ait');
3354 }
3355 if(preg_match("/date_evenement/",$row['regle_date_transmission_parquet'])){
3356 $valF['date_transmission_parquet']= $this->regle($row['regle_date_transmission_parquet'], 'regle_date_transmission_parquet');
3357 }
3358 if ($row['regle_donnees_techniques1'] !== '') {
3359 $valF_dt[$row['cible_regle_donnees_techniques1']] = $this->regle($row['regle_donnees_techniques1'], 'regle_donnees_techniques1');
3360 }
3361 if ($row['regle_donnees_techniques2'] !== '') {
3362 $valF_dt[$row['cible_regle_donnees_techniques2']] = $this->regle($row['regle_donnees_techniques2'], 'regle_donnees_techniques2');
3363 }
3364 if ($row['regle_donnees_techniques3'] !== '') {
3365 $valF_dt[$row['cible_regle_donnees_techniques3']] = $this->regle($row['regle_donnees_techniques3'], 'regle_donnees_techniques3');
3366 }
3367 if ($row['regle_donnees_techniques4'] !== '') {
3368 $valF_dt[$row['cible_regle_donnees_techniques4']] = $this->regle($row['regle_donnees_techniques4'], 'regle_donnees_techniques4');
3369 }
3370 if ($row['regle_donnees_techniques5'] !== '') {
3371 $valF_dt[$row['cible_regle_donnees_techniques5']] = $this->regle($row['regle_donnees_techniques5'], 'regle_donnees_techniques5');
3372 }
3373 if ($row['regle_dossier_instruction_type'] !== '') {
3374 $valF['dossier_instruction_type'] = $this->regle($row['regle_dossier_instruction_type'], 'regle_dossier_instruction_type');
3375 }
3376 }
3377 // Si des valeurs de données techniques ont été calculées alors on met à jour l'enregistrement
3378 if (count($valF_dt) > 0) {
3379 $dt_id = $this->getDonneesTechniques();
3380 // On met à jour le dossier
3381 $cle = " donnees_techniques='".$dt_id."'";
3382 $res1 = $this->f->db->autoExecute(DB_PREFIXE.'donnees_techniques', $valF_dt, DB_AUTOQUERY_UPDATE, $cle);
3383 $this->addToLog(__METHOD__."(): db->autoexecute(\"".DB_PREFIXE."donnees_techniques\", ".print_r($valF_dt, true).", DB_AUTOQUERY_UPDATE, \"".$cle."\");", VERBOSE_MODE);
3384 if (database::isError($res1)) {
3385 die($res->getMessage());
3386 }
3387 // Affichage d'informations à l'utilisateur
3388 $this->addToMessage(_('enregistrement')." ".$this->valF['dossier']." "._('table')." dossier [".$this->f->db->affectedRows()." "._('enregistrement')." "._('mis_a_jour')."]");
3389 }
3390 // Si des valeurs ont été calculées alors on met à jour l'enregistrement
3391 if (count($valF) > 0) {
3392 //
3393 $inst_dossier = $this->f->get_inst__om_dbform(array(
3394 "obj" => "dossier",
3395 "idx" => $this->valF['dossier'],
3396 ));
3397 $valF['instruction'] = $id;
3398 $valF['crud'] = 'update';
3399 $update_by_instruction = $inst_dossier->update_by_instruction($valF);
3400 if ($update_by_instruction === false) {
3401 $this->cleanMessage();
3402 $this->addToMessage(sprintf('%s %s', __("Une erreur s'est produite lors de la mise à jour du dossier d'instruction."), __("Veuillez contacter votre administrateur.")));
3403 return false;
3404 }
3405 // Affichage d'informations à l'utilisateur
3406 $this->addToMessage(_('enregistrement')." ".$this->valF['dossier']." "._('table')." dossier [".$this->f->db->affectedRows()." "._('enregistrement')." "._('mis_a_jour')."]");
3407 }
3408
3409 $restriction = $this->get_restriction($val['evenement']);
3410 $this->restriction_valid = $this->restrictionIsValid($restriction);
3411
3412 if($restriction == "" || $this->restriction_valid ){
3413 // Récupération de tous les paramètres de l'événement sélectionné
3414 $sql = "SELECT * FROM ".DB_PREFIXE."evenement
3415 WHERE evenement=".$this->valF['evenement'];
3416 $res = $this->f->db->query($sql);
3417 $this->addToLog(__METHOD__."(): db->query(\"".$sql."\");", VERBOSE_MODE);
3418 if (database::isError($res)) {
3419 die($res->getMessage());
3420 }
3421 $current_id = $this->getVal($this->clePrimaire);
3422 while ($row=& $res->fetchRow(DB_FETCHMODE_ASSOC)) {
3423 // Si la date de retour signature est éditée on vérifie si il existe un événement automatique
3424 if ($this->getVal('date_retour_signature') == "" AND
3425 $this->valF['date_retour_signature'] != "" AND
3426 $row['evenement_retour_signature'] != "") {
3427 $new_instruction = $this->f->get_inst__om_dbform(array(
3428 "obj" => "instruction",
3429 "idx" => "]",
3430 ));
3431 // Création d'un tableau avec la liste des champs de l'instruction
3432 foreach($new_instruction->champs as $champ) {
3433 $valNewInstr[$champ] = "";
3434 }
3435 // Définition des valeurs de la nouvelle instruction
3436 $valNewInstr["evenement"] = $row['evenement_retour_signature'];
3437 $valNewInstr["destinataire"] = $this->valF['destinataire'];
3438 $valNewInstr["dossier"] = $this->valF['dossier'];
3439 $valNewInstr["date_evenement"] = $this->f->formatDate($this->valF['date_retour_signature']);
3440 $valNewInstr["date_envoi_signature"] = $this->f->formatDate($this->valF['date_envoi_signature']);
3441 $valNewInstr["date_retour_signature"] = $this->f->formatDate($this->valF['date_retour_signature']);
3442 $valNewInstr["date_envoi_rar"] = $this->f->formatDate($this->valF['date_envoi_rar']);
3443 $valNewInstr["date_retour_rar"] = $this->f->formatDate($this->valF['date_retour_rar']);
3444 $valNewInstr["date_envoi_controle_legalite"] = $this->f->formatDate($this->valF['date_envoi_controle_legalite']);
3445 $valNewInstr["date_retour_controle_legalite"] = $this->f->formatDate($this->valF['date_retour_controle_legalite']);
3446 $new_instruction->setParameter("maj", 0);
3447 $new_instruction->class_actions[0]["identifier"] =
3448 "retour signature de l'instruction $current_id";
3449 $retour = $new_instruction->ajouter($valNewInstr);
3450
3451 //Si une erreur s'est produite et qu'il s'agit d'un problème
3452 //de restriction
3453 if ($retour == false && !$new_instruction->restriction_valid){
3454 $error_message = $this->get_restriction_error_message($restriction);
3455 $this->f->displayMessage("error", $error_message);
3456 $this->addToLog(__METHOD__."(): evenement retour ".
3457 "instruction ".$this->valF[$this->clePrimaire]." : ".
3458 $new_instruction->msg);
3459 }
3460 //Si une erreur s'est produite après le test de la restriction
3461 elseif ($retour == false && $new_instruction->restriction_valid){
3462 $this->correct = false ;
3463 $this->msg .= $new_instruction->msg;
3464 return false;
3465 }
3466 }
3467 // Si la date de retour AR est éditée on vérifie si il existe un événement automatique
3468 if ($this->getVal('date_retour_rar') == "" AND
3469 $this->valF['date_retour_rar'] != "") {
3470
3471 if($row['evenement_retour_ar'] != "") {
3472 $new_instruction = $this->f->get_inst__om_dbform(array(
3473 "obj" => "instruction",
3474 "idx" => "]",
3475 ));
3476 // Création d'un tableau avec la liste des champs de l'instruction
3477 foreach($new_instruction->champs as $champ) {
3478 $valNewInstr[$champ] = "";
3479 }
3480 // Définition des valeurs de la nouvelle instruction
3481 $valNewInstr["evenement"] = $row['evenement_retour_ar'];
3482 $valNewInstr["destinataire"] = $this->valF['destinataire'];
3483 $valNewInstr["dossier"] = $this->valF['dossier'];
3484 $valNewInstr["date_evenement"] = $this->f->formatDate($this->valF['date_retour_rar']);
3485 $valNewInstr["date_envoi_signature"] = $this->f->formatDate($this->valF['date_envoi_signature']);
3486 $valNewInstr["date_retour_signature"] = $this->f->formatDate($this->valF['date_retour_signature']);
3487 $valNewInstr["date_envoi_rar"] = $this->f->formatDate($this->valF['date_envoi_rar']);
3488 $valNewInstr["date_retour_rar"] = $this->f->formatDate($this->valF['date_retour_rar']);
3489 $valNewInstr["date_envoi_controle_legalite"] = $this->f->formatDate($this->valF['date_envoi_controle_legalite']);
3490 $valNewInstr["date_retour_controle_legalite"] = $this->f->formatDate($this->valF['date_retour_controle_legalite']);
3491 $new_instruction->setParameter("maj", 0);
3492 $new_instruction->class_actions[0]["identifier"] =
3493 "notification de l'instruction $current_id";
3494 $retour = $new_instruction->ajouter($valNewInstr);
3495
3496 //Si une erreur s'est produite et qu'il s'agit d'un problème
3497 //de restriction
3498 if ($retour == false && !$new_instruction->restriction_valid) {
3499 $error_message = $this->get_restriction_error_message($restriction);
3500 $this->f->displayMessage("error", $error_message);
3501 $this->addToLog(
3502 __METHOD__."(): evenement retour instruction ".
3503 $this->valF[$this->clePrimaire]." : ".
3504 $new_instruction->msg
3505 );
3506 }
3507 //Si une erreur s'est produite après le test de la restriction
3508 elseif ($retour == false && $new_instruction->restriction_valid){
3509 $this->correct = false ;
3510 $this->msg .= $new_instruction->msg;
3511 return false;
3512 }
3513 }
3514 }
3515 }
3516 }
3517
3518 /**
3519 * Mise à jour de la date de dernière modification du dossier
3520 * d'instruction
3521 */
3522 $inst_di = $this->get_inst_dossier($this->getVal('dossier'));
3523 $inst_di->update_last_modification_date();
3524
3525 // Mise à jour des données du dossier d'autorisation
3526 $da = $this->f->get_inst__om_dbform(array(
3527 "obj" => "dossier_autorisation",
3528 "idx" => $this->getNumDemandeAutorFromDossier($this->valF['dossier']),
3529 ));
3530 $params = array(
3531 'di_id' => $this->getVal('dossier'),
3532 );
3533 if($da->majDossierAutorisation($params) === false) {
3534 $this->addToMessage(_("Erreur lors de la mise a jour des donnees du dossier d'autorisation. Contactez votre administrateur."));
3535 $this->correct = false;
3536 return false;
3537 }
3538
3539 // mise à jour des métadonnées issues des dates de suivi
3540 $dateRetourSignatureModified = ($this->valF['date_retour_signature'] != $this->getVal('date_retour_signature'));
3541 $dateRetourRARModified = ($this->valF['date_retour_rar'] != $this->getVal('date_retour_rar'));
3542 if ($dateRetourSignatureModified || $dateRetourRARModified) {
3543
3544 // Calculs des nouvelles métadonnées
3545 $metadata = $this->getMetadata("om_fichier_instruction");
3546
3547 // On vérifie si l'instruction à finaliser a un événement de type arrete
3548 $sql = "SELECT type FROM ".DB_PREFIXE."evenement WHERE evenement = ".$this->getVal("evenement");
3549 $typeEvenement = $this->f->db->getOne($sql);
3550 $this->addToLog(__METHOD__."(): db->getOne(\"".$sql."\");", VERBOSE_MODE);
3551 if ($this->f->isDatabaseError($typeEvenement, true) === true) {
3552 $this->correct = false;
3553 $this->addToMessage(__("Erreur de traitement de fichier."));
3554 $this->addToLog(__METHOD__."() erreur BDD: ".var_export($typeEvenement->getMessage(), true), DEBUG_MODE);
3555 return false;
3556 }
3557
3558 // Si l'événement est de type arrete, on ajoute les métadonnées spécifiques
3559 if ($typeEvenement == 'arrete'){
3560 $metadata = array_merge($metadata, $this->getMetadata("arrete"));
3561 }
3562
3563 // Filtre pour conserver uniquement les métadonnées liées aux dates
3564 $metadataToKeep = array(
3565 "statutAutorisation",
3566 "dateEvenementDocument",
3567 'date_cloture_metier',
3568 "NotificationArrete",
3569 "dateNotificationArrete",
3570 "controleLegalite",
3571 "dateSignature",
3572 "nomSignataire",
3573 "qualiteSignataire",
3574 "dateControleLegalite",
3575 );
3576 $metadata = array_filter(
3577 $metadata,
3578 function($key) use ($metadataToKeep) { return in_array($key, $metadataToKeep); },
3579 ARRAY_FILTER_USE_KEY
3580 );
3581
3582 // Mise à jour des métadonnées du document en GED
3583 $docUid = $this->getVal("om_fichier_instruction");
3584 $operationOrUID = $this->f->storage->update_metadata($docUid, $metadata);
3585 if ($operationOrUID == 'OP_FAILURE') {
3586 $this->correct = false;
3587 $this->addToMessage(__("Erreur de traitement de fichier."));
3588 $this->addToLog(__METHOD__."() failed to update metadata: ".var_export($operationOrUID, true), DEBUG_MODE);
3589 return false;
3590 }
3591
3592 // mise à jour de l'UID du document en BDD
3593 else {
3594 $valF = array('om_fichier_instruction' => $operationOrUID);
3595 $res = $this->f->db->autoExecute(DB_PREFIXE.$this->table, $valF, DB_AUTOQUERY_UPDATE, $this->getCle($id));
3596 $this->addToLog(__METHOD__.'() : db->autoExecute("'.DB_PREFIXE.$this->table.'", '.print_r($valF, true).', DB_AUTOQUERY_UPDATE, "'.$this->getCle($id).'")', VERBOSE_MODE);
3597 if ($this->f->isDatabaseError($res, true) === true) {
3598 $this->correct = false;
3599 $this->addToMessage(__("Erreur de traitement de fichier."));
3600 $this->addToLog(__METHOD__."() erreur BDD: ".var_export($res->getMessage(), true), DEBUG_MODE);
3601 return false;
3602 }
3603 $this->addToMessage(__("La mise a jour du document s'est effectuee avec succes."));
3604 }
3605 }
3606
3607 // Notification auto des demandeurs
3608 if ($dateRetourSignatureModified === true
3609 && $this->valF['date_retour_signature'] !== ''
3610 && $this->valF['date_retour_signature'] !== null) {
3611 //
3612 $ev = $this->get_inst_evenement($this->valF['evenement']);
3613 if ($ev->getVal('notification') === 'notification_auto_signature_requise') {
3614 // Récupération de la liste des demandeurs à notifier et de la catégorie
3615 $categorie = $this->f->get_param_option_notification($collectivite_di);
3616 $isPortal = $categorie == null || $categorie == '' || $categorie == 'portal' ? true : false;
3617 $demandeursANotifie = $this->get_demandeurs_notifiable(
3618 $this->valF['dossier'],
3619 $isPortal
3620 );
3621
3622 // Création d'une notification et d'une tâche pour chaque demandeur à notifier
3623 foreach ($demandeursANotifie as $demandeur) {
3624 // Ajout de la notif et récupération de son id
3625 $idNotif = $this->ajouter_notification(
3626 $this->valF[$this->clePrimaire],
3627 $this->f->get_connected_user_login_name(),
3628 $demandeur,
3629 $collectivite_di,
3630 true
3631 );
3632 if ($idNotif === false) {
3633 return false;
3634 }
3635 // Création de la tache en lui donnant l'id de la notification
3636 $notification_by_task = $this->notification_by_task(
3637 $idNotif,
3638 $this->valF['dossier'],
3639 $categorie
3640 );
3641 if ($notification_by_task === false) {
3642 $this->addToMessage(
3643 __("Erreur lors de la génération de la notification au(x) pétitionnaire(s).")
3644 );
3645 return false;
3646 }
3647 }
3648 $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.")));
3649 }
3650 }
3651
3652 return $this->add_log_to_dossier($id, $val);
3653 }
3654
3655 /**
3656 * TRIGGER - triggersupprimer.
3657 *
3658 * @return boolean
3659 */
3660 function triggersupprimer($id, &$dnu1 = null, $val = array(), $dnu2 = null) {
3661 $this->addToLog(__METHOD__."(): start", EXTRA_VERBOSE_MODE);
3662 /**
3663 * L'objectif ici est de repositionner les valeurs récupérées en
3664 * archive dans le dossier d'instruction avant de supprimer l'événement
3665 * d'instruction si les valeurs du dossier sont différentes
3666 */
3667 $valF = array();
3668 $inst_di = $this->get_inst_dossier($this->getVal('dossier'));
3669 foreach ($inst_di->champs as $key => $champ) {
3670 // Si le champ du DI à une archive dans l'instruction
3671 if (isset($val[sprintf('archive_%s', $champ)]) === true) {
3672 // Si la valeur entre le champ du DI et son archive dans instruction
3673 // est différente
3674 if ($inst_di->getVal($champ) !== $val[sprintf('archive_%s', $champ)]) {
3675 $val[sprintf('archive_%s', $champ)] === '' ? $valF[$champ] = null : $valF[$champ] = $val[sprintf('archive_%s', $champ)];
3676 }
3677 }
3678 }
3679 // Spécificité du champ avis_decision dont le champ archive est nommé
3680 // différemment
3681 if ($inst_di->getVal('avis_decision') !== $val['archive_avis']) {
3682 $val['archive_avis'] === '' ? $valF['avis_decision'] = null : $valF['avis_decision'] = $val['archive_avis'];
3683 }
3684 // Spécificité de la date d'affichage dont la valeur n'ai jamais modifiée
3685 // par l'archive
3686 unset($valF['date_affichage']);
3687
3688 /**
3689 * Mise à jour de la version de clôture *version_clos* du dossier si et
3690 * seulement si l'instruction met à jour l'état du dossier.
3691 */
3692 if (isset($valF['etat']) === true
3693 && $valF['etat'] !== null
3694 && $valF['etat'] !== '') {
3695 // Récupère l'état actuel du dossier d'instruction
3696 $inst_current_etat = $this->f->get_inst__om_dbform(array(
3697 "obj" => "etat",
3698 "idx" => $inst_di->get_id_etat(),
3699 ));
3700 // Instanciation de l'état archivé appliqué sur le dossier
3701 $inst_etat = $this->f->get_inst__om_dbform(array(
3702 "obj" => "etat",
3703 "idx" => $valF['etat'],
3704 ));
3705 //
3706 $update_version_clos = null;
3707 // En cas de clôture du dossier par l'état archivé
3708 if ($inst_etat->getVal('statut') === 'cloture') {
3709 $update_version_clos = $inst_di->update_version_clos('up');
3710 }
3711 // En cas de réouverture du dossier par l'état archivé
3712 if ($inst_current_etat->getVal('statut') === 'cloture'
3713 && $inst_etat->getVal('statut') !== 'cloture') {
3714 //
3715 $update_version_clos = $inst_di->update_version_clos('down');
3716 //
3717 $this->set_att_di_reopened(true);
3718 }
3719 //
3720 if ($update_version_clos === false) {
3721 $this->f->addToLog(sprintf(
3722 "%s() : ERREUR - %s %s",
3723 __METHOD__,
3724 sprintf(
3725 __("Impossible de mettre à jour la version de clôture du dossier d'instruction %s."),
3726 $inst_di->getVal($inst_di->clePrimaire)
3727 ),
3728 sprintf(
3729 __("L'instruction tente d'appliquer l'état %s."),
3730 $inst_etat->getVal($inst_etat->clePrimaire)
3731 )
3732 ));
3733 $this->addToMessage(sprintf(
3734 "%s %s",
3735 __("Erreur lors de la mise à jour de la version de clôture du dossier d'instruction."),
3736 __("Veuillez contacter votre administrateur.")
3737 ));
3738 return false;
3739 }
3740 }
3741 // On supprime toutes les notications liées à l'instruction
3742 $notifASupprimer = $this->get_instruction_notification($this->getVal($this->clePrimaire));
3743 foreach ($notifASupprimer as $idNotif) {
3744 $inst_notif = $this->f->get_inst__om_dbform(array(
3745 "obj" => "instruction_notification",
3746 "idx" => $idNotif,
3747 ));
3748 $val_notif = array();
3749 foreach ($inst_notif->champs as $champ) {
3750 $val_notif[$champ] = $inst_notif->getVal($champ);
3751 }
3752 // La suppression des notifications entrainera la suppression des tâches qui y sont
3753 // liées
3754 $supprNotif = $inst_notif->supprimer($val_notif);
3755 if ($supprNotif == false) {
3756 $this->addToMessage(sprintf(
3757 "%s %s",
3758 __("Erreur lors de la suppression des notifications de l'instruction."),
3759 __("Veuillez contacter votre administrateur.")
3760 ));
3761 return false;
3762 }
3763 }
3764
3765 // On met à jour le dossier
3766 $valF['instruction'] = $id;
3767 $valF['crud'] = 'delete';
3768 $update_by_instruction = $inst_di->update_by_instruction($valF);
3769 if ($update_by_instruction === false) {
3770 $this->cleanMessage();
3771 $this->addToMessage(sprintf('%s %s', __("Une erreur s'est produite lors de la mise à jour du dossier d'instruction."), __("Veuillez contacter votre administrateur.")));
3772 return false;
3773 }
3774
3775 // Affichage d'informations à l'utilisateur
3776 $this->addToMessage(_("Suppression de l'instruction")." [".$this->f->db->affectedRows()." "._('enregistrement')." "._('mis_a_jour')."]");
3777
3778 // Mise à jour de la demande si un récépissé d'instruction correspond à l'instruction à supprimer
3779 }
3780
3781 /**
3782 * TRIGGER - triggersupprimerapres.
3783 *
3784 * @return boolean
3785 */
3786 function triggersupprimerapres($id, &$dnu1 = null, $val = array(), $dnu2 = null) {
3787 $this->addToLog(__METHOD__."(): start", EXTRA_VERBOSE_MODE);
3788 /**
3789 * Mise à jour de la date de dernière modification du dossier
3790 * d'instruction
3791 */
3792 $inst_di = $this->get_inst_dossier($this->getVal('dossier'));
3793 $inst_di->update_last_modification_date();
3794
3795 /**
3796 * Mise à jour des données du dossier d'autorisation
3797 */
3798 $da = $this->f->get_inst__om_dbform(array(
3799 "obj" => "dossier_autorisation",
3800 "idx" => $this->getNumDemandeAutorFromDossier($val["dossier"]),
3801 ));
3802 $params = array(
3803 'di_id' => $this->getVal('dossier'),
3804 'di_reopened' => $this->get_att_di_reopened(),
3805 );
3806 if($da->majDossierAutorisation($params) === false) {
3807 $this->addToMessage(_("Erreur lors de la mise a jour des donnees du dossier d'autorisation. Contactez votre administrateur."));
3808 $this->correct = false;
3809 return false;
3810 }
3811
3812 /**
3813 * Gestion des tâches pour la dématérialisation
3814 */
3815 $inst_task_empty = $this->f->get_inst__om_dbform(array(
3816 "obj" => "task",
3817 "idx" => 0,
3818 ));
3819 foreach ($inst_di->task_types as $task_type) {
3820 $task_exists = $inst_task_empty->task_exists($task_type, $id);
3821 if ($task_exists !== false) {
3822 $inst_task = $this->f->get_inst__om_dbform(array(
3823 "obj" => "task",
3824 "idx" => $task_exists,
3825 ));
3826 if ($inst_task->getVal('state') === $inst_task::STATUS_NEW || $inst_task->getVal('state') === $inst_task::STATUS_DRAFT) {
3827 $task_val = array(
3828 'state' => $inst_task::STATUS_CANCELED,
3829 );
3830 $update_task = $inst_task->update_task(array('val' => $task_val));
3831 if ($update_task === false) {
3832 $this->addToMessage(sprintf('%s %s',
3833 sprintf(__("Une erreur s'est produite lors de la modification de la tâche %."), $inst_task->getVal($inst_task->clePrimaire)),
3834 __("Veuillez contacter votre administrateur.")
3835 ));
3836 $this->correct = false;
3837 return false;
3838 }
3839 }
3840 }
3841 }
3842
3843 //
3844 $val['evenement'] = $this->getVal('evenement');
3845 return $this->add_log_to_dossier($id, $val);
3846 }
3847
3848 /**
3849 * Permet de mettre la valeur passée en paramètre dans l'attribut de classe
3850 * "di_reopened".
3851 *
3852 * @param boolean $val
3853 */
3854 function set_att_di_reopened($val) {
3855 $this->di_reopened = $val;
3856 }
3857
3858 /**
3859 * Permet de récupérer la valeur de l'attribut de classe "di_reopened".
3860 *
3861 * @return boolean
3862 */
3863 function get_att_di_reopened() {
3864 return $this->di_reopened;
3865 }
3866
3867 /**
3868 * Permet de composer un message d'erreur sur restriction non valide en
3869 * fonction du contexte.
3870 *
3871 * @param string $restriction formule de la restriction
3872 *
3873 * @return string message d'erreur
3874 */
3875 function get_restriction_error_message($restriction) {
3876 // Affichage du message si la restriction s'applique
3877 // Contexte du suivi des dates (message simple)
3878 $message_restrict = _("Probleme de dates :");
3879 // Split restriction
3880 $champs_restrict = preg_split(
3881 '/(\W+)/',
3882 $restriction,
3883 null,
3884 PREG_SPLIT_NO_EMPTY|PREG_SPLIT_DELIM_CAPTURE
3885 );
3886 $formated_restrict = "";
3887 // Ajout des chaînes à traduire
3888 foreach ($champs_restrict as $value) {
3889 $formated_restrict .= _($value)." ";
3890 }
3891 $formated_restrict = substr($formated_restrict, 0, -1);
3892 // Message d'erreur dans le contexte du suivi des dates
3893 if($this->getParameter("maj") == 170) {
3894 $message_restrict .= " "._("contactez l'instructeur du dossier");
3895 $message_restrict .= "<br/>(".$formated_restrict.")";
3896 } else {
3897 // Affichage du message si la restriction s'applique
3898 // Contexte instruction
3899 $message_restrict .= "<br/>".$formated_restrict;
3900 }
3901
3902 return $message_restrict;
3903 }
3904
3905 /**
3906 * @return void
3907 */
3908 function verifier($val = array(), &$dnu1 = null, $dnu2 = null) {
3909 parent::verifier($val);
3910 //
3911 if ( isset($val['evenement']) && is_numeric($val['evenement'])){
3912 $restriction = $this->get_restriction($val['evenement']);
3913
3914 //Test qu'une restriction est présente
3915 if ($restriction != "" ){
3916
3917 //Test si la restriction est valide
3918 $this->restriction_valid = $this->restrictionIsValid($restriction);
3919 if ( !$this->restriction_valid ){
3920
3921 // Affichage du message si la restriction s'applique
3922 $this->addToMessage(
3923 $this->get_restriction_error_message($restriction)
3924 );
3925 $this->correct=false;
3926 return false;
3927 }
3928
3929 // Liste des opérateurs possible
3930 $operateurs = array(">=", "<=", "+", "-", "&&", "||", "==", "!=");
3931 // Supprime tous les espaces de la chaîne de caractère
3932 $restriction = str_replace(' ', '', $restriction);
3933
3934 // Met des espace avant et après les opérateurs puis transforme la
3935 // chaine en un tableau
3936 $tabRestriction = str_replace($operateurs, " ", $restriction);
3937 // Tableau des champ
3938 $tabRestriction = explode(" ", $tabRestriction);
3939 // Supprime les numériques du tableau
3940 foreach ($tabRestriction as $key => $value) {
3941 if (is_numeric($value)) {
3942 unset($tabRestriction[$key]);
3943 }
3944 }
3945
3946 // Vérifie les champs utilisés pour la restriction
3947 $check_field_exist = $this->f->check_field_exist($tabRestriction, 'instruction');
3948 if ($check_field_exist !== true) {
3949
3950 // Liste des champs en erreur
3951 $string_error_fields = implode(", ", $check_field_exist);
3952
3953 // Message d'erreur
3954 $error_message = _("Le champ %s n'est pas utilisable pour le champ %s");
3955 if (count($check_field_exist) > 1) {
3956 $error_message = _("Les champs %s ne sont pas utilisable pour le champ %s");
3957 }
3958
3959 // Affiche l'erreur
3960 $this->correct=false;
3961 $this->addToMessage(sprintf($error_message, $string_error_fields, _("restriction")));
3962 $this->addToMessage(_("Veuillez contacter votre administrateur."));
3963 }
3964 }
3965
3966 }
3967 if(!$this->updateDate("date_envoi_signature")) {
3968 return false;
3969 }
3970 if(!$this->updateDate("date_retour_signature")) {
3971 return false;
3972 }
3973 if(!$this->updateDate("date_envoi_rar")) {
3974 return false;
3975 }
3976 if(!$this->updateDate("date_retour_rar")) {
3977 return false;
3978 }
3979 if(!$this->updateDate("date_envoi_controle_legalite")) {
3980 return false;
3981 }
3982 if(!$this->updateDate("date_retour_controle_legalite")) {
3983 return false;
3984 }
3985
3986 }
3987
3988 /**
3989 * Finalisation des documents.
3990 * @param string $champ champ du fichier à finaliser
3991 * @param booleen $status permet de définir si on finalise ou définalise
3992 * @param string $sousform permet de savoir si se trouve dans un sousformulaire (passé au javascript)
3993 */
3994 function manage_finalizing($mode = null, $val = array()) {
3995 //
3996 $this->begin_treatment(__METHOD__);
3997
3998 //
3999 $id_inst = $this->getVal($this->clePrimaire);
4000
4001 //
4002 $admin_msg_error = _("Veuillez contacter votre administrateur.");
4003 $file_msg_error = _("Erreur de traitement de fichier.")
4004 ." ".$admin_msg_error;
4005 $bdd_msg_error = _("Erreur de base de données.")
4006 ." ".$admin_msg_error;
4007 $log_msg_error = "Finalisation non enregistrée - id instruction = %s - uid fichier = %s";
4008
4009 // Si on finalise le document
4010 if ($mode == "finalize"){
4011 //
4012 $etat = _('finalisation');
4013
4014 // Récupère la collectivite du dossier d'instruction
4015 $dossier_instruction_om_collectivite = $this->get_dossier_instruction_om_collectivite();
4016
4017 //
4018 $collectivite = $this->f->getCollectivite($dossier_instruction_om_collectivite);
4019
4020 //
4021 $params = array(
4022 "specific" => array(),
4023 );
4024 // Si la rédaction libre est activée sur l'instruction
4025 if ($this->getVal("flag_edition_integrale") == 't') {
4026 $params["specific"]["corps"] = array(
4027 "mode" => "set",
4028 "value" => $this->getVal("corps_om_htmletatex"),
4029 );
4030 $params["specific"]["titre"] = array(
4031 "mode" => "set",
4032 "value" => $this->getVal("titre_om_htmletat"),
4033 );
4034 }
4035 // Génération du PDF
4036 $result = $this->compute_pdf_output('lettretype', $this->getVal('lettretype'), $collectivite, null, $params);
4037 $pdf_output = $result['pdf_output'];
4038
4039 //Métadonnées du document
4040 $metadata = array(
4041 'filename' => 'instruction_'.$id_inst.'.pdf',
4042 'mimetype' => 'application/pdf',
4043 'size' => strlen($pdf_output)
4044 );
4045
4046 // Récupération des métadonnées calculées après validation
4047 $spe_metadata = $this->getMetadata("om_fichier_instruction");
4048
4049 //On vérifie si l'instruction à finaliser a un événement de type arrete
4050 $sql = "SELECT type
4051 FROM ".DB_PREFIXE."evenement
4052 WHERE evenement = ".$this->getVal("evenement");
4053 $typeEvenement = $this->f->db->getOne($sql);
4054 $this->addToLog(__METHOD__."(): db->getOne(\"".$sql."\");", VERBOSE_MODE);
4055 if ($this->f->isDatabaseError($typeEvenement, true) === true) {
4056 $this->correct = false;
4057 $this->addToMessage($bdd_msg_error);
4058 return $this->end_treatment(__METHOD__, false);
4059 }
4060
4061 //Initialisation de la variable
4062 $arrete_metadata = array();
4063 // Si l'événement est de type arrete, on ajoute les métadonnées spécifiques
4064 if ( $typeEvenement === 'arrete' ){
4065 $arrete_metadata = $this->getMetadata("arrete");
4066 }
4067
4068 $metadata = array_merge($metadata, $spe_metadata, $arrete_metadata);
4069
4070 /*
4071 // transforme le tableau de métadonnées en objet
4072 $mdf = new MetadataFactory();
4073 $md = $mdf->build('Instruction', $metadata);
4074 */
4075
4076 // Si le document a déjà été finalisé on le met à jour
4077 // en conservant son UID
4078 if ($this->getVal("om_fichier_instruction") != ''){
4079 $uid = $this->f->storage->update(
4080 $this->getVal("om_fichier_instruction"), $pdf_output, $metadata);
4081 }
4082 // Sinon on crée un nouveau document et dont on récupère l'UID
4083 else {
4084 $uid = $this->f->storage->create($pdf_output, $metadata, "from_content", $this->table.".om_fichier_instruction");
4085 }
4086 }
4087
4088 // Si on définalise le document
4089 if ($mode == "unfinalize") {
4090 //
4091 $etat = _('définalisation');
4092 // Récupération de l'uid du document finalisé
4093 $uid = $this->getVal("om_fichier_instruction");
4094 }
4095
4096 // Si on définalise l'UID doit être défini
4097 // Si on finalise la création/modification du fichier doit avoir réussi
4098 if ($uid == '' || $uid == 'OP_FAILURE' ) {
4099 $this->correct = false;
4100 $this->addToMessage($file_msg_error);
4101 $this->addToLog(sprintf($log_msg_error, $id_inst, $uid), DEBUG_MODE);
4102 return $this->end_treatment(__METHOD__, false);
4103 }
4104
4105 //
4106 foreach ($this->champs as $key => $champ) {
4107 //
4108 $val[$champ] = $this->val[$key];
4109 }
4110
4111 //
4112 $val['date_evenement'] = $this->dateDBToForm($val['date_evenement']);
4113 $val['archive_date_complet'] = $this->dateDBToForm($val['archive_date_complet']);
4114 $val['archive_date_rejet'] = $this->dateDBToForm($val['archive_date_rejet']);
4115 $val['archive_date_limite'] = $this->dateDBToForm($val['archive_date_limite']);
4116 $val['archive_date_notification_delai'] = $this->dateDBToForm($val['archive_date_notification_delai']);
4117 $val['archive_date_decision'] = $this->dateDBToForm($val['archive_date_decision']);
4118 $val['archive_date_validite'] = $this->dateDBToForm($val['archive_date_validite']);
4119 $val['archive_date_achevement'] = $this->dateDBToForm($val['archive_date_achevement']);
4120 $val['archive_date_chantier'] = $this->dateDBToForm($val['archive_date_chantier']);
4121 $val['archive_date_conformite'] = $this->dateDBToForm($val['archive_date_conformite']);
4122 $val['archive_date_dernier_depot'] = $this->dateDBToForm($val['archive_date_dernier_depot']);
4123 $val['archive_date_limite_incompletude'] = $this->dateDBToForm($val['archive_date_limite_incompletude']);
4124 $val['date_finalisation_courrier'] = $this->dateDBToForm($val['date_finalisation_courrier']);
4125 $val['date_envoi_signature'] = $this->dateDBToForm($val['date_envoi_signature']);
4126 $val['date_retour_signature'] = $this->dateDBToForm($val['date_retour_signature']);
4127 $val['date_envoi_rar'] = $this->dateDBToForm($val['date_envoi_rar']);
4128 $val['date_retour_rar'] = $this->dateDBToForm($val['date_retour_rar']);
4129 $val['date_envoi_controle_legalite'] = $this->dateDBToForm($val['date_envoi_controle_legalite']);
4130 $val['date_retour_controle_legalite'] = $this->dateDBToForm($val['date_retour_controle_legalite']);
4131 $val['archive_date_cloture_instruction'] = $this->dateDBToForm($val['archive_date_cloture_instruction']);
4132 $val['archive_date_premiere_visite'] = $this->dateDBToForm($val['archive_date_premiere_visite']);
4133 $val['archive_date_derniere_visite'] = $this->dateDBToForm($val['archive_date_derniere_visite']);
4134 $val['archive_date_contradictoire'] = $this->dateDBToForm($val['archive_date_contradictoire']);
4135 $val['archive_date_retour_contradictoire'] = $this->dateDBToForm($val['archive_date_retour_contradictoire']);
4136 $val['archive_date_ait'] = $this->dateDBToForm($val['archive_date_ait']);
4137 $val['archive_date_transmission_parquet'] = $this->dateDBToForm($val['archive_date_transmission_parquet']);
4138 $val['archive_date_affichage'] = $this->dateDBToForm($val['archive_date_affichage']);
4139 $this->setvalF($val);
4140
4141 // Verification de la validite des donnees
4142 $this->verifier($this->val);
4143 // Si les verifications precedentes sont correctes, on procede a
4144 // la modification, sinon on ne fait rien et on retourne une erreur
4145 if ($this->correct === true) {
4146 //
4147 $valF = array(
4148 "om_fichier_instruction" => $uid,
4149 "date_finalisation_courrier" => date('Y-m-d')
4150 );
4151 //
4152 if($mode=="finalize") {
4153 // état finalisé vrai
4154 $valF["om_final_instruction"] = true;
4155 // ajout log utilisateur
4156 $login = $_SESSION['login'];
4157 $nom = "";
4158 $this->f->getUserInfos();
4159 if (isset($this->f->om_utilisateur["nom"])
4160 && !empty($this->f->om_utilisateur["nom"])) {
4161 $nom = $this->f->om_utilisateur["nom"];
4162 }
4163 $valF["om_final_instruction_utilisateur"] = $_SESSION['login'];
4164 if ($nom != "") {
4165 $valF["om_final_instruction_utilisateur"] .= " (".$nom.")";
4166 }
4167 } else {
4168 // état finalisé faux
4169 $valF["om_final_instruction"] = false;
4170 // suppression log utilisateur
4171 $valF["om_final_instruction_utilisateur"] = '';
4172 }
4173
4174 // Execution de la requête de modification des donnees de l'attribut
4175 // valF de l'objet dans l'attribut table de l'objet
4176 $res = $this->f->db->autoExecute(DB_PREFIXE.$this->table, $valF,
4177 DB_AUTOQUERY_UPDATE, $this->getCle($id_inst));
4178 $this->addToLog(__METHOD__."() : db->autoExecute(\"".DB_PREFIXE.$this->table."\", ".print_r($valF, true).", DB_AUTOQUERY_UPDATE, \"".$this->getCle($id_inst)."\")", VERBOSE_MODE);
4179 //
4180 if ($this->f->isDatabaseError($res, true) === true) {
4181 $this->correct = false;
4182 $this->addToMessage($bdd_msg_error);
4183 return $this->end_treatment(__METHOD__, false);
4184 }
4185
4186 //
4187 $this->addToMessage(sprintf(_("La %s du document s'est effectuee avec succes."), $etat));
4188 //
4189 if ($this->add_log_to_dossier($id_inst, $val) === false) {
4190 return $this->end_treatment(__METHOD__, false);
4191 }
4192 //
4193 return $this->end_treatment(__METHOD__, true);
4194 }
4195 // L'appel de verifier() a déjà positionné correct à false
4196 // et défini un message d'erreur.
4197 $this->addToLog(sprintf($log_msg_error, $id_inst, $uid), DEBUG_MODE);
4198 return $this->end_treatment(__METHOD__, false);
4199 }
4200
4201 /**
4202 * Récupération du numéro de dossier d'instruction à ajouter aux métadonnées
4203 * @return string numéro de dossier d'instruction
4204 */
4205 protected function getDossier($champ = null) {
4206 if(empty($this->specificMetadata)) {
4207 $this->getSpecificMetadata();
4208 }
4209 return $this->specificMetadata->dossier;
4210 }
4211 /**
4212 * Récupération la version du dossier d'instruction à ajouter aux métadonnées
4213 * @return int Version
4214 */
4215 protected function getDossierVersion() {
4216 if(empty($this->specificMetadata)) {
4217 $this->getSpecificMetadata();
4218 }
4219 return $this->specificMetadata->version;
4220 }
4221 /**
4222 * Récupération du numéro de dossier d'autorisation à ajouter aux métadonnées
4223 * @return string numéro de dossier d'autorisation
4224 */
4225 protected function getNumDemandeAutor() {
4226 if(empty($this->specificMetadata)) {
4227 $this->getSpecificMetadata();
4228 }
4229 return $this->specificMetadata->dossier_autorisation;
4230 }
4231 /**
4232 * Récupération de la date de demande initiale du dossier à ajouter aux métadonnées
4233 * @return date de la demande initiale
4234 */
4235 protected function getAnneemoisDemandeAutor() {
4236 if(empty($this->specificMetadata)) {
4237 $this->getSpecificMetadata();
4238 }
4239 return $this->specificMetadata->date_demande_initiale;
4240 }
4241 /**
4242 * Récupération du type de dossier d'instruction à ajouter aux métadonnées
4243 * @return string type du dossier d'instruction
4244 */
4245 protected function getTypeInstruction() {
4246 if(empty($this->specificMetadata)) {
4247 $this->getSpecificMetadata();
4248 }
4249 return $this->specificMetadata->dossier_instruction_type;
4250 }
4251 /**
4252 * Récupération du statut du dossier d'autorisation à ajouter aux métadonnées
4253 * @return string avis
4254 */
4255 protected function getStatutAutorisation() {
4256 if(empty($this->specificMetadata)) {
4257 $this->getSpecificMetadata();
4258 }
4259 return $this->specificMetadata->statut;
4260 }
4261 /**
4262 * Récupération du type de dossier d'autorisation à ajouter aux métadonnées
4263 * @return string type du dossier d'autorisation
4264 */
4265 protected function getTypeAutorisation() {
4266 if(empty($this->specificMetadata)) {
4267 $this->getSpecificMetadata();
4268 }
4269 return $this->specificMetadata->dossier_autorisation_type;
4270 }
4271 /**
4272 * Récupération de la date d'ajout de document à ajouter aux métadonnées
4273 * @return date de l'évènement
4274 */
4275 protected function getDateEvenementDocument() {
4276 return date("Y-m-d");
4277 }
4278 /**
4279 * Récupération du groupe d'instruction à ajouter aux métadonnées
4280 * @return string Groupe d'instruction
4281 */
4282 protected function getGroupeInstruction() {
4283 if(empty($this->specificMetadata)) {
4284 $this->getSpecificMetadata();
4285 }
4286 return $this->specificMetadata->groupe_instruction;
4287 }
4288 /**
4289 * Récupération du libellé du type du document à ajouter aux métadonnées
4290 * @return string Groupe d'instruction
4291 */
4292 protected function getTitle() {
4293
4294 // Récupère le champ événement
4295 if (isset($this->valF["evenement"]) AND $this->valF["evenement"] != "") {
4296 $evenement = $this->valF["evenement"];
4297 } else {
4298 $evenement = $this->getVal("evenement");
4299 }
4300
4301 // Requête sql
4302 $sql = "SELECT libelle FROM ".DB_PREFIXE."evenement
4303 WHERE evenement=".$evenement;
4304 $evenement_libelle = $this->f->db->getOne($sql);
4305 $this->addToLog("getTitle(): db->getOne(\"".$sql."\");", VERBOSE_MODE);
4306 if (database::isError($evenement_libelle)) {
4307 die();
4308 }
4309
4310 // Retourne le libelle de l'événement
4311 return $evenement_libelle;
4312 }
4313
4314
4315 /**
4316 * Récupération du champ ERP du dossier d'instruction.
4317 *
4318 * @return boolean
4319 */
4320 public function get_concerne_erp() {
4321 //
4322 if(empty($this->specificMetadata)) {
4323 $this->getSpecificMetadata();
4324 }
4325 //
4326 return $this->specificMetadata->erp;
4327 }
4328
4329
4330 /**
4331 * Cette méthode permet de stocker en attribut toutes les métadonnées
4332 * nécessaire à l'ajout d'un document.
4333 */
4334 public function getSpecificMetadata() {
4335 if (isset($this->valF["dossier"]) AND $this->valF["dossier"] != "") {
4336 $dossier = $this->valF["dossier"];
4337 } else {
4338 $dossier = $this->getVal("dossier");
4339 }
4340 //Requête pour récupérer les informations essentiels sur le dossier d'instruction
4341 $sql = "SELECT dossier.dossier as dossier,
4342 dossier_autorisation.dossier_autorisation as dossier_autorisation,
4343 to_char(dossier.date_demande, 'YYYY/MM') as date_demande_initiale,
4344 dossier_instruction_type.code as dossier_instruction_type,
4345 etat_dossier_autorisation.libelle as statut,
4346 dossier_autorisation_type.code as dossier_autorisation_type,
4347 groupe.code as groupe_instruction,
4348 CASE WHEN dossier.erp IS TRUE
4349 THEN 'true'
4350 ELSE 'false'
4351 END as erp
4352 FROM ".DB_PREFIXE."dossier
4353 LEFT JOIN ".DB_PREFIXE."dossier_instruction_type
4354 ON dossier.dossier_instruction_type = dossier_instruction_type.dossier_instruction_type
4355 LEFT JOIN ".DB_PREFIXE."dossier_autorisation
4356 ON dossier.dossier_autorisation = dossier_autorisation.dossier_autorisation
4357 LEFT JOIN ".DB_PREFIXE."etat_dossier_autorisation
4358 ON dossier_autorisation.etat_dossier_autorisation = etat_dossier_autorisation.etat_dossier_autorisation
4359 LEFT JOIN ".DB_PREFIXE."dossier_autorisation_type_detaille
4360 ON dossier_autorisation.dossier_autorisation_type_detaille = dossier_autorisation_type_detaille.dossier_autorisation_type_detaille
4361 LEFT JOIN ".DB_PREFIXE."dossier_autorisation_type
4362 ON dossier_autorisation_type_detaille.dossier_autorisation_type = dossier_autorisation_type.dossier_autorisation_type
4363 LEFT JOIN ".DB_PREFIXE."groupe
4364 ON dossier_autorisation_type.groupe = groupe.groupe
4365 WHERE dossier.dossier = '".$dossier."'";
4366 $res = $this->f->db->query($sql);
4367 $this->f->addToLog("getSpecificMetadata() : db->query(".$sql.")", VERBOSE_MODE);
4368 if ( database::isError($res)){
4369 die();
4370 }
4371
4372 //Le résultat est récupéré dans un objet
4373 $row =& $res->fetchRow(DB_FETCHMODE_OBJECT);
4374
4375 //Si il y a un résultat
4376 if ($row !== null) {
4377
4378 // Instrance de la classe dossier
4379 $inst_dossier = $this->get_inst_dossier($dossier);
4380
4381 // Insère l'attribut version à l'objet
4382 $row->version = $inst_dossier->get_dossier_instruction_version();
4383
4384 //Alors on créé l'objet dossier_instruction
4385 $this->specificMetadata = $row;
4386
4387 }
4388 }
4389
4390 /**
4391 * Retourne le statut du dossier d'instruction
4392 * @param string $idx Identifiant du dossier d'instruction
4393 * @return string Le statut du dossier d'instruction
4394 */
4395 function getStatutAutorisationDossier($idx){
4396
4397 $statut = '';
4398
4399 //Si l'identifiant du dossier d'instruction fourni est correct
4400 if ( $idx != '' ){
4401
4402 //On récupère le statut de l'état du dossier à partir de l'identifiant du
4403 //dossier
4404 $sql = "SELECT etat.statut
4405 FROM ".DB_PREFIXE."dossier
4406 LEFT JOIN
4407 ".DB_PREFIXE."etat
4408 ON
4409 dossier.etat = etat.etat
4410 WHERE dossier ='".$idx."'";
4411 $statut = $this->f->db->getOne($sql);
4412 $this->f->addToLog("getStatutAutorisationDossier() : db->getOne(\"".$sql."\")", VERBOSE_MODE);
4413 if ( database::isError($statut)){
4414 die();
4415 }
4416 }
4417 return $statut;
4418 }
4419
4420 /**
4421 * Récupère les données du dossier
4422 * @return array
4423 */
4424 function get_dossier_actual() {
4425
4426 // Initialisation de la valeur de retour
4427 $return = array();
4428
4429 // Récupération de toutes les valeurs du dossier d'instruction en cours
4430 $sql = "SELECT * FROM ".DB_PREFIXE."dossier
4431 WHERE dossier='".$this->valF['dossier']."'";
4432 $res = $this->f->db->query($sql);
4433 $this->addToLog("get_dossier_actual(): db->query(\"".$sql."\");", VERBOSE_MODE);
4434 $this->f->isDatabaseError($res);
4435
4436 //
4437 while ($row=& $res->fetchRow(DB_FETCHMODE_ASSOC)) {
4438
4439 // Récupération de la valeur actuelle du délai, de l'accord tacite,
4440 // de l'état et de l'avis du dossier d'instruction
4441 $return['archive_delai'] = $row['delai'];
4442 $return['archive_accord_tacite'] = $row['accord_tacite'];
4443 $return['archive_etat'] = $row['etat'];
4444 $return['archive_avis'] = $row['avis_decision'];
4445 // Récupération de la valeur actuelle des dates du dossier
4446 // d'instruction
4447 $return['archive_date_complet'] = $row['date_complet'];
4448 $return['archive_date_dernier_depot'] = $row['date_dernier_depot'];
4449 $return['archive_date_rejet'] = $row['date_rejet'];
4450 $return['archive_date_limite'] = $row['date_limite'];
4451 $return['archive_date_notification_delai'] = $row['date_notification_delai'];
4452 $return['archive_date_decision'] = $row['date_decision'];
4453 $return['archive_date_validite'] = $row['date_validite'];
4454 $return['archive_date_achevement'] = $row['date_achevement'];
4455 $return['archive_date_chantier'] = $row['date_chantier'];
4456 $return['archive_date_conformite'] = $row['date_conformite'];
4457 $return['archive_incompletude'] = $row['incompletude'];
4458 $return['archive_incomplet_notifie'] = $row['incomplet_notifie'];
4459 $return['archive_evenement_suivant_tacite'] = $row['evenement_suivant_tacite'];
4460 $return['archive_evenement_suivant_tacite_incompletude'] = $row['evenement_suivant_tacite_incompletude'];
4461 $return['archive_etat_pendant_incompletude'] = $row['etat_pendant_incompletude'];
4462 $return['archive_date_limite_incompletude'] = $row['date_limite_incompletude'];
4463 $return['archive_delai_incompletude'] = $row['delai_incompletude'];
4464 $return['archive_autorite_competente'] = $row['autorite_competente'];
4465 $return['archive_dossier_instruction_type'] = $row['dossier_instruction_type'];
4466 $return['duree_validite'] = $row['duree_validite'];
4467 $return['date_depot'] = $row['date_depot'];
4468 $return['date_depot_mairie'] = $row['date_depot_mairie'];
4469 $return['archive_date_cloture_instruction'] = $row['date_cloture_instruction'];
4470 $return['archive_date_premiere_visite'] = $row['date_premiere_visite'];
4471 $return['archive_date_derniere_visite'] = $row['date_derniere_visite'];
4472 $return['archive_date_contradictoire'] = $row['date_contradictoire'];
4473 $return['archive_date_retour_contradictoire'] = $row['date_retour_contradictoire'];
4474 $return['archive_date_ait'] = $row['date_ait'];
4475 $return['archive_date_transmission_parquet'] = $row['date_transmission_parquet'];
4476 $return['archive_date_affichage'] = $row['date_affichage'];
4477 $return['archive_pec_metier'] = $row['pec_metier'];
4478 $return['archive_a_qualifier'] = $row['a_qualifier'];
4479 }
4480
4481 // Retour de la fonction
4482 return $return;
4483
4484 }
4485
4486 /**
4487 * Permet de vérifier qu'un événement est verrouillable
4488 * @param integer $idx Identifiant de l'instruction
4489 * @return boolean
4490 */
4491 function checkEvenementNonVerrouillable($idx) {
4492
4493 // Initialisation du résultat
4494 $non_verrouillable = false;
4495
4496 // Si la condition n'est pas vide
4497 if ($idx != "") {
4498
4499 // Requête SQL
4500 $sql = "SELECT evenement.non_verrouillable
4501 FROM ".DB_PREFIXE."evenement
4502 LEFT JOIN ".DB_PREFIXE."instruction
4503 ON instruction.evenement = evenement.evenement
4504 WHERE instruction.instruction = $idx";
4505 $this->f->addToLog("checkEvenementNonVerrouillable() : db->getOne(\"".$sql."\")", VERBOSE_MODE);
4506 $res = $this->f->db->getOne($sql);
4507 $this->f->isDatabaseError($res);
4508
4509 // Si le retour de la requête est true
4510 if ($res == 't') {
4511 //
4512 $non_verrouillable = true;
4513 }
4514 }
4515
4516 // Retourne résultat
4517 return $non_verrouillable;
4518 }
4519
4520 /**
4521 * Mise à jour des champs archive_*
4522 * @param mixed $row La ligne de données
4523 */
4524 public function updateArchiveData($row){
4525
4526 // Récupération de la valeur actuelle du délai, de l'accord tacite,
4527 // de l'état et de l'avis du dossier d'instruction
4528 $this->valF['archive_delai']=$row['delai'];
4529 $this->valF['archive_accord_tacite']=$row['accord_tacite'];
4530 $this->valF['archive_etat']=$row['etat'];
4531 $this->valF['archive_avis']=$row['avis_decision'];
4532 // Récupération de la valeur actuelle des 9 dates du dossier
4533 // d'instruction
4534 if ($row['date_complet'] != '') {
4535 $this->valF['archive_date_complet']=$row['date_complet'];
4536 }
4537 if ($row['date_dernier_depot'] != '') {
4538 $this->valF['archive_date_dernier_depot']=$row['date_dernier_depot'];
4539 }
4540 if ($row['date_rejet'] != '') {
4541 $this->valF['archive_date_rejet']= $row['date_rejet'];
4542 }
4543 if ($row['date_limite'] != '') {
4544 $this->valF['archive_date_limite']= $row['date_limite'];
4545 }
4546 if ($row['date_notification_delai'] != '') {
4547 $this->valF['archive_date_notification_delai']= $row['date_notification_delai'];
4548 }
4549 if ($row['date_decision'] != '') {
4550 $this->valF['archive_date_decision']= $row['date_decision'];
4551 }
4552 if ($row['date_validite'] != '') {
4553 $this->valF['archive_date_validite']= $row['date_validite'];
4554 }
4555 if ($row['date_achevement'] != '') {
4556 $this->valF['archive_date_achevement']= $row['date_achevement'];
4557 }
4558 if ($row['date_chantier'] != '') {
4559 $this->valF['archive_date_chantier']= $row['date_chantier'];
4560 }
4561 if ($row['date_conformite'] != '') {
4562 $this->valF['archive_date_conformite']= $row['date_conformite'];
4563 }
4564 if ($row['incompletude'] != '') {
4565 $this->valF['archive_incompletude']= $row['incompletude'];
4566 }
4567 if ($row['incomplet_notifie'] != '') {
4568 $this->valF['archive_incomplet_notifie']= $row['incomplet_notifie'];
4569 }
4570 if ($row['evenement_suivant_tacite'] != '') {
4571 $this->valF['archive_evenement_suivant_tacite']= $row['evenement_suivant_tacite'];
4572 }
4573 if ($row['evenement_suivant_tacite_incompletude'] != '') {
4574 $this->valF['archive_evenement_suivant_tacite_incompletude']= $row['evenement_suivant_tacite_incompletude'];
4575 }
4576 if ($row['etat_pendant_incompletude'] != '') {
4577 $this->valF['archive_etat_pendant_incompletude']= $row['etat_pendant_incompletude'];
4578 }
4579 if ($row['date_limite_incompletude'] != '') {
4580 $this->valF['archive_date_limite_incompletude']= $row['date_limite_incompletude'];
4581 }
4582 if ($row['delai_incompletude'] != '') {
4583 $this->valF['archive_delai_incompletude']= $row['delai_incompletude'];
4584 }
4585 if ($row['autorite_competente'] != '') {
4586 $this->valF['archive_autorite_competente']= $row['autorite_competente'];
4587 }
4588 if ($row['duree_validite'] != '') {
4589 $this->valF['duree_validite']= $row['duree_validite'];
4590 }
4591 if ($row['date_depot'] != '') {
4592 $this->valF['date_depot']= $row['date_depot'];
4593 }
4594 if ($row['date_depot_mairie'] != '') {
4595 $this->valF['date_depot_mairie']= $row['date_depot_mairie'];
4596 }
4597 // Dates concernant les dossiers contentieux
4598 if ($row['date_cloture_instruction'] != '') {
4599 $this->valF['archive_date_cloture_instruction']= $row['date_cloture_instruction'];
4600 }
4601 if ($row['date_premiere_visite'] != '') {
4602 $this->valF['archive_date_premiere_visite']= $row['date_premiere_visite'];
4603 }
4604 if ($row['date_derniere_visite'] != '') {
4605 $this->valF['archive_date_derniere_visite']= $row['date_derniere_visite'];
4606 }
4607 if ($row['date_contradictoire'] != '') {
4608 $this->valF['archive_date_contradictoire']= $row['date_contradictoire'];
4609 }
4610 if ($row['date_retour_contradictoire'] != '') {
4611 $this->valF['archive_date_retour_contradictoire']= $row['date_retour_contradictoire'];
4612 }
4613 if ($row['date_ait'] != '') {
4614 $this->valF['archive_date_ait']= $row['date_ait'];
4615 }
4616 if ($row['date_transmission_parquet'] != '') {
4617 $this->valF['archive_date_transmission_parquet']= $row['date_transmission_parquet'];
4618 }
4619 //
4620 if ($row['dossier_instruction_type'] != '') {
4621 $this->valF['archive_dossier_instruction_type']= $row['dossier_instruction_type'];
4622 }
4623 if ($row['date_affichage'] != '') {
4624 $this->valF['archive_date_affichage']= $row['date_affichage'];
4625 }
4626 if (isset($row['pec_metier']) === true && $row['pec_metier'] != '') {
4627 $this->valF['archive_pec_metier']= $row['pec_metier'];
4628 }
4629 if (isset($row['a_qualifier']) === true && $row['a_qualifier'] != '') {
4630 $this->valF['archive_a_qualifier']= $row['a_qualifier'];
4631 }
4632 }
4633
4634 // {{{
4635 // Méthodes de récupération des métadonnées arrêté
4636 /**
4637 * @return string Retourne le numéro d'arrêté
4638 */
4639 function getNumArrete() {
4640 return $this->getVal("numero_arrete");
4641 }
4642 /**
4643 * @return chaîne vide
4644 */
4645 function getReglementaireArrete() {
4646 return 'true';
4647 }
4648 /**
4649 * @return boolean de notification au pétitionnaire
4650 */
4651 function getNotificationArrete() {
4652 return 'true';
4653 }
4654 /**
4655 * @return date de notification au pétitionnaire
4656 */
4657 function getDateNotificationArrete() {
4658 if (empty($this->metadonneesArrete)) {
4659 $this->getArreteMetadata();
4660 }
4661 return $this->metadonneesArrete["datenotification"];
4662 }
4663 /**
4664 * @return boolean check si le document est passé au contrôle de légalité
4665 */
4666 function getControleLegalite() {
4667 return 'true';
4668 }
4669 /**
4670 * @return date de signature de l'arrêté
4671 */
4672 function getDateSignature() {
4673 if (empty($this->metadonneesArrete)) {
4674 $this->getArreteMetadata();
4675 }
4676 return $this->metadonneesArrete["datesignaturearrete"];
4677 }
4678 /**
4679 * @return string nom du signataire
4680 */
4681 function getNomSignataire() {
4682 if (empty($this->metadonneesArrete)) {
4683 $this->getArreteMetadata();
4684 }
4685 return $this->metadonneesArrete["nomsignataire"];
4686 }
4687 /**
4688 * @return string qualité du signataire
4689 */
4690 function getQualiteSignataire() {
4691 if (empty($this->metadonneesArrete)) {
4692 $this->getArreteMetadata();
4693 }
4694 return $this->metadonneesArrete["qualitesignataire"];
4695 }
4696 /**
4697 * @return string numéro du terrain
4698 */
4699 function getAp_numRue() {
4700 if (empty($this->metadonneesArrete)) {
4701 $this->getArreteMetadata();
4702 }
4703 return $this->metadonneesArrete["ap_numrue"];
4704 }
4705 /**
4706 * @return string nom de la rue du terrain
4707 */
4708 function getAp_nomDeLaVoie() {
4709 if (empty($this->metadonneesArrete)) {
4710 $this->getArreteMetadata();
4711 }
4712 return $this->metadonneesArrete["ap_nomdelavoie"];
4713 }
4714 /**
4715 * @return string code postal du terrain
4716 */
4717 function getAp_codePostal() {
4718 if (empty($this->metadonneesArrete)) {
4719 $this->getArreteMetadata();
4720 }
4721 return $this->metadonneesArrete["ap_codepostal"];
4722 }
4723 /**
4724 * @return string ville du terrain
4725 */
4726 function getAp_ville() {
4727 if (empty($this->metadonneesArrete)) {
4728 $this->getArreteMetadata();
4729 }
4730 return $this->metadonneesArrete["ap_ville"];
4731 }
4732 /**
4733 * @return string activité
4734 */
4735 function getActivite() {
4736 return "Droit du sol";
4737 }
4738 /**
4739 * @return string date du retour de controle légalité
4740 */
4741 function getDateControleLegalite() {
4742 if (empty($this->metadonneesArrete)) {
4743 $this->getArreteMetadata();
4744 }
4745 return $this->metadonneesArrete["datecontrolelegalite"];
4746 }
4747
4748 // Fin des méthodes de récupération des métadonnées
4749 // }}}
4750
4751 /**
4752 * Méthode de récupération des métadonnées arrêtés dans la base de données,
4753 * les données sont stockés dans l'attribut $this->metadonneesArrete
4754 */
4755 function getArreteMetadata() {
4756
4757 //Récupération de la dernière instruction dont l'événement est de type 'arrete'
4758 $this->metadonneesArrete = array("nomsignataire"=>"", "qualitesignataire"=>"",
4759 "decisionarrete"=>"", "datenotification"=>"", "datesignaturearrete"=>"",
4760 "datecontrolelegalite"=>"", "ap_numrue"=>"", "ap_nomdelavoie"=>"",
4761 "ap_codepostal"=>"", "ap_ville"=>"");
4762
4763 $sqlArrete = "SELECT
4764 signataire_arrete.prenom || ' ' ||signataire_arrete.nom as \"nomsignataire\",
4765 signataire_arrete.qualite as \"qualitesignataire\",
4766 instruction.etat as \"decisionarrete\",
4767 instruction.date_retour_rar as \"datenotification\",
4768 instruction.date_retour_signature as \"datesignaturearrete\",
4769 instruction.date_retour_controle_legalite as \"datecontrolelegalite\",
4770 dossier.terrain_adresse_voie_numero as \"ap_numrue\",
4771 dossier.terrain_adresse_voie as \"ap_nomdelavoie\",
4772 dossier.terrain_adresse_code_postal as \"ap_codepostal\",
4773 dossier.terrain_adresse_localite as \"ap_ville\"
4774 FROM ".DB_PREFIXE."instruction
4775 LEFT JOIN ".DB_PREFIXE."signataire_arrete ON
4776 instruction.signataire_arrete = signataire_arrete.signataire_arrete
4777 LEFT JOIN ".DB_PREFIXE."dossier ON
4778 instruction.dossier = dossier.dossier
4779 LEFT JOIN ".DB_PREFIXE."donnees_techniques ON
4780 donnees_techniques.dossier_instruction = dossier.dossier
4781 WHERE instruction.instruction = ".$this->getVal("instruction");
4782 $resArrete = $this->f->db->query($sqlArrete);
4783 $this->f->addToLog("getArreteMetadata(): db->query(\"".$sqlArrete."\");", VERBOSE_MODE);
4784 if ( database::isError($resArrete)){
4785 die();
4786 }
4787
4788 $this->metadonneesArrete = $resArrete->fetchRow(DB_FETCHMODE_ASSOC);
4789 }
4790
4791 /**
4792 * CONDITION - has_an_edition.
4793 *
4794 * Condition pour afficher le bouton de visualisation de l'édition.
4795 *
4796 * @return boolean
4797 */
4798 function has_an_edition() {
4799 // Récupère la valeur du champ lettretype
4800 $lettretype = $this->getVal("lettretype");
4801 // Si le champ est vide
4802 if ($lettretype !== '' && $lettretype !== null) {
4803 //
4804 return true;
4805 }
4806
4807 //
4808 return false;
4809 }
4810
4811 /**
4812 * CONDITION - is_modifiable.
4813 *
4814 * Controle si l'évenement est modifiable.
4815 *
4816 * @return boolean
4817 */
4818 function is_evenement_modifiable() {
4819 $evenement = $this->get_inst_evenement($this->getVal('evenement'));
4820 return ! $this->get_boolean_from_pgsql_value($evenement->getVal('non_modifiable'));
4821 }
4822
4823 /**
4824 * CONDITION - is_editable.
4825 *
4826 * Condition pour la modification.
4827 *
4828 * @return boolean
4829 */
4830 function is_editable() {
4831
4832 // XXX
4833 // 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é)
4834 // Si cette tâche identifiée est DONE alors la suppression/modification de cette intruction est impossible
4835
4836 // Contrôle si l'utilisateur possède un bypass
4837 $bypass = $this->f->isAccredited($this->get_absolute_class_name()."_modifier_bypass");
4838 //
4839 if ($bypass == true) {
4840 //
4841 return true;
4842 }
4843
4844 // Si l'utilisateur est un instructeur, que le dossier est cloturé et
4845 // que l'événement n'est pas identifié comme non verrouillable
4846 if ($this->f->isUserInstructeur()
4847 && $this->getStatutAutorisationDossier($this->getParameter("idxformulaire")) == "cloture"
4848 && $this->checkEvenementNonVerrouillable($this->getVal("instruction")) === false) {
4849 //
4850 return false;
4851 }
4852
4853 // Si l'utilisateur est un intructeur qui correspond à la division du
4854 // dossier
4855 if ($this->is_instructeur_from_division_dossier() === true) {
4856 //
4857 return true;
4858 }
4859
4860 // Si l'utilisateur est instructeur de la commune du dossier et que
4861 // l'instruction est créée par un instructeur de la commune
4862 if ($this->is_instructeur_from_collectivite_dossier() === true and
4863 $this->getVal('created_by_commune') === 't') {
4864 return true;
4865 }
4866
4867 //
4868 return false;
4869 }
4870
4871 /**
4872 * Vérifie si l'événement est supprimable ou pas.
4873 *
4874 * @return boolean
4875 */
4876 function is_evenement_supprimable() {
4877 // Controle si l'évenement est supprimable
4878 $evenement = $this->get_inst_evenement($this->getVal('evenement'));
4879 return ! $this->get_boolean_from_pgsql_value($evenement->getVal('non_supprimable'));
4880 }
4881
4882 /**
4883 * CONDITION - is_deletable.
4884 *
4885 * Condition pour la suppression.
4886 *
4887 * @return boolean
4888 */
4889 function is_deletable() {
4890
4891 // XXX
4892 // 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é)
4893 // Si cette tâche identifiée est DONE alors la suppression/modification de cette intruction est impossible
4894
4895 // Contrôle si l'utilisateur possède un bypass intégral
4896 $bypass = $this->f->isAccredited($this->get_absolute_class_name()."_supprimer_bypass");
4897 //
4898 if ($bypass == true) {
4899
4900 //
4901 return true;
4902 }
4903
4904 // Si l'utilisateur est un intructeur qui ne correspond pas à la
4905 // division du dossier et si l'utilisateur n'a pas la permission bypass
4906 // de la division
4907 if ($this->is_instructeur_from_division_dossier() === false
4908 && $this->f->isAccredited($this->get_absolute_class_name()."_supprimer_bypass_division") === false) {
4909
4910 //
4911 return false;
4912 }
4913
4914 // l'événement est-il le dernier ?
4915 $dernier_evenement = false;
4916 // instanciation dossier
4917 $dossier = $this->f->get_inst__om_dbform(array(
4918 "obj" => "dossier",
4919 "idx" => $this->getVal('dossier'),
4920 ));
4921 // récupération dernier événement
4922 $id_dernier_evenement = $dossier->get_dernier_evenement();
4923 if ($id_dernier_evenement == $this->getVal($this->clePrimaire)) {
4924 $dernier_evenement = true;
4925 }
4926
4927 // Si dossier cloturé ou si pas dernier événement
4928 // ou de type retour ou si une date est renseignée
4929 // ET utilisateur non administrateur
4930 if ($this->getStatutAutorisationDossier($this->getVal('dossier')) == 'cloture'
4931 || $dernier_evenement == false
4932 || $this->is_evenement_retour($this->getVal("evenement")) == true
4933 || $this->getVal('date_envoi_signature') != ''
4934 || $this->getVal('date_retour_signature') != ''
4935 || $this->getVal('date_envoi_rar') != ''
4936 || $this->getVal('date_retour_rar') != ''
4937 || $this->getVal('date_envoi_controle_legalite') != ''
4938 || $this->getVal('date_retour_controle_legalite') != '') {
4939 // pas le droit de supprimer
4940 return false;;
4941 }
4942
4943 //
4944 return true;
4945 }
4946
4947
4948 /**
4949 * Vérifie que l'utilisateur est instructeur et qu'il est de la division du
4950 * dossier.
4951 *
4952 * @return, boolean true/false
4953 */
4954 function is_instructeur_from_collectivite_dossier() {
4955 if ($this->f->isUserInstructeur() === true and
4956 $this->f->om_utilisateur["om_collectivite"] == $this->get_dossier_instruction_om_collectivite()) {
4957 return true;
4958 }
4959 return false;
4960 }
4961
4962 /**
4963 * CONDITION - is_addable.
4964 *
4965 * Condition pour afficher les boutons modifier et supprimer.
4966 *
4967 * @return boolean
4968 */
4969 function is_addable() {
4970 // Contrôle si l'utilisateur possède un bypass
4971 $bypass = $this->f->isAccredited($this->get_absolute_class_name()."_ajouter_bypass");
4972 //
4973 if ($bypass == true) {
4974
4975 //
4976 return true;
4977 }
4978 // Si l'utilisateur est un intructeur qui correspond à la
4979 // division du dossier ou qu'il peut changer la décision
4980 if ($this->is_instructeur_from_division_dossier() === true or
4981 $this->isInstrCanChangeDecision($this->getParameter('idxformulaire')) === true) {
4982 //
4983 return true;
4984 }
4985
4986 //
4987 return false;
4988 }
4989
4990 /**
4991 * CONDITION - is_finalizable.
4992 *
4993 * Condition pour afficher le bouton.
4994 *
4995 * @return boolean
4996 */
4997 function is_finalizable() {
4998 // Contrôle si l'utilisateur possède un bypass
4999 $bypass = $this->f->isAccredited($this->get_absolute_class_name()."_finaliser_bypass");
5000 //
5001 if ($bypass == true) {
5002 //
5003 return true;
5004 }
5005
5006 // Si l'utilisateur est un instructeur, que le dossier est cloturé et
5007 // que l'événement n'est pas identifié comme non verrouillable
5008 if ($this->f->isUserInstructeur()
5009 && $this->getStatutAutorisationDossier($this->getParameter("idxformulaire")) == "cloture"
5010 && $this->checkEvenementNonVerrouillable($this->getVal("instruction")) === false) {
5011 //
5012 return false;
5013 }
5014
5015 // Si l'utilisateur est un intructeur qui correspond à la division du
5016 // dossier
5017 if ($this->is_instructeur_from_division_dossier() === true) {
5018 //
5019 return true;
5020 }
5021
5022 // Si l'utilisateur est instructeur de la commune du dossier et que
5023 // l'instruction est créée par un instructeur de la commune
5024 if ($this->is_instructeur_from_collectivite_dossier() === true and
5025 $this->getVal('created_by_commune') === 't') {
5026 return true;
5027 }
5028
5029 //
5030 return false;
5031 }
5032
5033 /**
5034 * CONDITION - is_finalize_without_bypass.
5035 *
5036 * Condition pour afficher le bouton sans le bypass.
5037 *
5038 * @return boolean [description]
5039 */
5040 function is_finalizable_without_bypass() {
5041 // Récupère la valeur du champ finalisé
5042 $om_final_instruction = $this->getVal('om_final_instruction');
5043
5044 // Si le rapport n'est pas finalisé
5045 if (empty($om_final_instruction)
5046 || $om_final_instruction == 'f') {
5047 //
5048 return true;
5049 }
5050
5051 //
5052 return false;
5053 }
5054
5055 /**
5056 * CONDITION - is_unfinalizable.
5057 *
5058 * Condition pour afficher le bouton.
5059 *
5060 * @return boolean
5061 */
5062 function is_unfinalizable(){
5063 // Contrôle si l'utilisateur possède un bypass
5064 $bypass = $this->f->isAccredited($this->get_absolute_class_name()."_definaliser_bypass");
5065 //
5066 if ($bypass == true) {
5067 //
5068 return true;
5069 }
5070
5071 // Si l'utilisateur est un instructeur, que le dossier est cloturé et
5072 // que l'événement n'est pas identifié comme non verrouillable
5073 if ($this->f->isUserInstructeur()
5074 && $this->getStatutAutorisationDossier($this->getParameter("idxformulaire")) == "cloture"
5075 && $this->checkEvenementNonVerrouillable($this->getVal("instruction")) === false) {
5076 //
5077 return false;
5078 }
5079
5080 // Si l'utilisateur est un intructeur qui correspond à la division du
5081 // dossier
5082 if ($this->is_instructeur_from_division_dossier() === true) {
5083 //
5084 return true;
5085 }
5086
5087 // Si l'utilisateur est instructeur de la commune du dossier et que
5088 // l'instruction est créée par un instructeur de la commune
5089 if ($this->is_instructeur_from_collectivite_dossier() === true and
5090 $this->getVal('created_by_commune') === 't') {
5091 return true;
5092 }
5093
5094 //
5095 return false;
5096 }
5097
5098 /**
5099 * CONDITION - is_unfinalizable_without_bypass.
5100 *
5101 * Condition pour afficher le bouton sans le bypass.
5102 *
5103 * @return boolean
5104 */
5105 function is_unfinalizable_without_bypass() {
5106 // Récupère la valeur du champ finalisé
5107 $om_final_instruction = $this->getVal('om_final_instruction');
5108
5109 // Si l'instruction est finalisée
5110 if ($om_final_instruction == 't') {
5111 //
5112 return true;
5113 }
5114
5115 //
5116 return false;
5117 }
5118
5119
5120 /**
5121 * Permet de définir si un instructeur commune peut editer une instruction
5122 *
5123 * @return boolean true si il peut
5124 */
5125 function isInstrCanChangeDecision($idx) {
5126
5127 if ($this->f->isAccredited(array("instruction", "instruction_changer_decision"), "OR") !== true or
5128 $this->f->isUserInstructeur() !== true) {
5129 return false;
5130 }
5131
5132
5133
5134 // Sinon on vérifie l'éligibilité du dossier au changement de décision
5135 $sql =
5136 "SELECT
5137 dossier.dossier
5138 FROM
5139 ".DB_PREFIXE."dossier
5140 JOIN ".DB_PREFIXE."instruction ON instruction.instruction = (
5141 SELECT instruction
5142 FROM ".DB_PREFIXE."instruction
5143 JOIN ".DB_PREFIXE."evenement on instruction.evenement=evenement.evenement
5144 WHERE instruction.dossier = dossier.dossier
5145 AND evenement.retour IS FALSE
5146 ORDER BY date_evenement DESC, instruction DESC
5147 LIMIT 1
5148 )
5149 JOIN ".DB_PREFIXE."evenement ON instruction.evenement=evenement.evenement
5150 JOIN ".DB_PREFIXE."instructeur ON dossier.instructeur=instructeur.instructeur
5151 JOIN ".DB_PREFIXE."om_utilisateur ON instructeur.om_utilisateur=om_utilisateur.om_utilisateur
5152 JOIN ".DB_PREFIXE."om_collectivite ON om_collectivite.om_collectivite=om_utilisateur.om_collectivite
5153 JOIN ".DB_PREFIXE."etat ON dossier.etat = etat.etat
5154 WHERE
5155
5156 (
5157 evenement.type = 'arrete' AND
5158 (
5159 instruction.om_final_instruction IS TRUE
5160 OR instruction.created_by_commune IS TRUE
5161 ) OR
5162 evenement.type = 'changement_decision'
5163 )
5164 AND evenement.retour IS FALSE
5165 AND instruction.date_retour_signature IS NULL
5166 AND instruction.date_envoi_rar IS NULL
5167 AND instruction.date_retour_rar IS NULL
5168 AND instruction.date_envoi_controle_legalite IS NULL
5169 AND instruction.date_retour_controle_legalite IS NULL
5170 AND etat.statut = 'encours'
5171 AND dossier.dossier = '".$idx."'
5172 AND om_collectivite.niveau = '2'
5173 ";
5174
5175
5176 // Si collectivité de l'utilisateur niveau mono alors filtre sur celle-ci
5177 if ($this->f->isCollectiviteMono($_SESSION['collectivite']) === true) {
5178 $sql .= " AND dossier.om_collectivite=".$_SESSION['collectivite'];
5179 }
5180 $res = $this->f->db->getone($sql);
5181 if (database::isError($res)) {
5182 die();
5183 }
5184 // Si le dossier n'est pas sujet au changement de decision
5185 if($res == null) {
5186 return false;
5187 }
5188 return true;
5189 }
5190
5191
5192 /**
5193 * CONDITION - can_monitoring_dates.
5194 *
5195 * Condition pour afficher le bouton de suivi des dates.
5196 *
5197 * @return boolean
5198 */
5199 public function can_monitoring_dates() {
5200 // Récupère la valeur du champ finalisé
5201 $om_final_instruction = $this->getVal('om_final_instruction');
5202
5203 // Si l'instruction n'est pas finalisée
5204 if ($om_final_instruction !== 't') {
5205 //
5206 return false;
5207 }
5208
5209 // Contrôle si l'utilisateur possède un bypass
5210 $bypass = $this->f->isAccredited($this->get_absolute_class_name()."_modification_dates_bypass");
5211 if ($bypass === true) {
5212 return true;
5213 }
5214
5215 // Permission de modifier le suivi des dates sur un dossier cloturé pour
5216 // un utilisateur lié à un instructeur
5217 $perm_moni_dates_d_closed = $this->f->isAccredited($this->get_absolute_class_name()."_modification_dates_cloture");
5218
5219 // On vérifie en premier lieu que le DI n'est pas clôturé et que
5220 // l'utilisateur ne possède pas la permission de modifier le suivi des
5221 // dates sur un dossier clôturé
5222 $inst_dossier = $this->get_inst_dossier();
5223 if ($inst_dossier->getStatut() === 'cloture'
5224 && $perm_moni_dates_d_closed === false) {
5225 //
5226 return false;
5227 }
5228 // On récupère ses infos
5229 $coll_di = $inst_dossier->getVal('om_collectivite');
5230 $div_di = $this->getDivisionFromDossier();
5231 // et celles de son éventuel instructeur
5232 $instr_di = $inst_dossier->getVal('instructeur');
5233
5234 // Il faut disposer d'une entrée instructeur
5235 if ($this->f->isUserInstructeur() === false) {
5236 return false;
5237 }
5238
5239 // Par défaut on prétend que l'instructeur n'est pas multi
5240 $instr_di_coll_multi = false;
5241 // Si un instructeur est affecté au dossier
5242 if ($instr_di !== '' && $instr_di !== null) {
5243 // Vérifie si l'instructeur est de la collectivité de niveau 2
5244 $instr_di_coll = $this->get_instructeur_om_collectivite($instr_di);
5245 if ($this->f->isCollectiviteMono($instr_di_coll) === false) {
5246 //
5247 $instr_di_coll_multi = true;
5248 }
5249 }
5250
5251 // Il faut qu'il instruise le dossier ou soit de la même division
5252 if ($this->f->om_utilisateur['instructeur'] === $instr_di
5253 || $this->f->om_utilisateur['division'] === $div_di) {
5254 //
5255 return true;
5256 }
5257
5258 // On donne également le droit s'il est de la même collectivité que
5259 // le dossier ET si l'instruction est déléguée à la communauté
5260 if ($this->f->isCollectiviteMono($this->f->om_utilisateur['om_collectivite']) === true
5261 && $this->f->om_utilisateur['om_collectivite'] === $coll_di
5262 && $instr_di_coll_multi === true) {
5263 //
5264 return true;
5265 }
5266
5267 // Si l'instructeur ne rentre pas dans les deux cas précédents
5268 return false;
5269 }
5270
5271
5272 /**
5273 * TREATMENT - finalize.
5274 *
5275 * Permet de finaliser un enregistrement.
5276 *
5277 * @param array $val valeurs soumises par le formulaire
5278 *
5279 * @return boolean
5280 */
5281 function finalize($val = array()) {
5282
5283 // Cette méthode permet d'exécuter une routine en début des méthodes
5284 // dites de TREATMENT.
5285 $this->begin_treatment(__METHOD__);
5286 $message = '';
5287
5288 // Traitement de la finalisation
5289 $ret = $this->manage_finalizing("finalize", $val);
5290
5291 // Si le traitement retourne une erreur
5292 if ($ret !== true) {
5293
5294 // Termine le traitement
5295 return $this->end_treatment(__METHOD__, false);
5296 }
5297
5298 // Envoi des notifications aux demandeurs si la notification est automatique
5299 // et que la signature n'est pas requise
5300 $ev = $this->get_inst_evenement($this->getVal('evenement'));
5301 if ($ev->getVal('notification') === 'notification_automatique') {
5302 // Récupération de la catégorie et envoie des notifications au(x) demandeur(s)
5303 $collectivite_di = $this->get_dossier_instruction_om_collectivite($this->getVal('dossier'));
5304 // Récupération de la liste des demandeurs à notifier et de la catégorie
5305 $categorie = $this->f->get_param_option_notification($collectivite_di);
5306 $isPortal = $categorie == null || $categorie == '' || $categorie == 'portal' ? true : false;
5307 $demandeursANotifie = $this->get_demandeurs_notifiable(
5308 $this->getVal('dossier'),
5309 $isPortal
5310 );
5311
5312 // Création d'une notification et d'une tâche pour chaque demandeur à notifier
5313 if (count($demandeursANotifie) > 0) {
5314 foreach ($demandeursANotifie as $demandeur) {
5315 // Ajout de la notif et récupération de son id
5316 $idNotif = $this->ajouter_notification(
5317 $this->getVal($this->clePrimaire),
5318 $this->f->get_connected_user_login_name(),
5319 $demandeur,
5320 $collectivite_di,
5321 true
5322 );
5323 if ($idNotif === false) {
5324 // Termine le traitement
5325 return $this->end_treatment(__METHOD__, false);
5326 }
5327 $notification_by_task = $this->notification_by_task(
5328 $idNotif,
5329 $this->getVal('dossier'),
5330 $categorie
5331 );
5332 if ($notification_by_task === false) {
5333 $this->addToMessage(
5334 __("Erreur lors de la génération de la notification au(x) pétitionnaire(s).")
5335 );
5336 // Termine le traitement
5337 return $this->end_treatment(__METHOD__, false);
5338 }
5339 }
5340 $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.")));
5341 }
5342 }
5343
5344 // Termine le traitement
5345 return $this->end_treatment(__METHOD__, true);
5346 }
5347
5348 /**
5349 * TREATMENT - unfinalize.
5350 *
5351 * Permet de définaliser un enregistrement.
5352 *
5353 * @param array $val valeurs soumises par le formulaire
5354 *
5355 * @return boolean
5356 */
5357 function unfinalize($val = array()) {
5358
5359 // Cette méthode permet d'exécuter une routine en début des méthodes
5360 // dites de TREATMENT.
5361 $this->begin_treatment(__METHOD__);
5362
5363 // Traitement de la finalisation
5364 $ret = $this->manage_finalizing("unfinalize", $val);
5365
5366 // Si le traitement retourne une erreur
5367 if ($ret !== true) {
5368
5369 // Termine le traitement
5370 return $this->end_treatment(__METHOD__, false);
5371 }
5372
5373 // Termine le traitement
5374 return $this->end_treatment(__METHOD__, true);
5375 }
5376
5377 /**
5378 * VIEW - view_edition
5379 *
5380 * Edite l'édition de l'instruction ou affiche celle contenue dans le stockage.
5381 *
5382 * @return null Si l'action est incorrecte
5383 */
5384 function view_edition() {
5385
5386 // Si l'instruction est finalisée
5387 if($this->getVal("om_final_instruction") == 't'
5388 && $this->getVal("om_final_instruction") != null) {
5389
5390 // Ouvre le document
5391 $lien = '../app/index.php?module=form&snippet=file&obj='.$this->table.'&'.
5392 'champ=om_fichier_instruction&id='.$this->getVal($this->clePrimaire);
5393 //
5394 header("Location: ".$lien);
5395 } else {
5396
5397 // Récupère la collectivite du dossier d'instruction
5398 $dossier_instruction_om_collectivite = $this->get_dossier_instruction_om_collectivite();
5399
5400 //
5401 $collectivite = $this->f->getCollectivite($dossier_instruction_om_collectivite);
5402
5403 // Paramètre du PDF
5404 $params = array(
5405 "watermark" => true,
5406 "specific" => array(
5407 "mode" => "previsualisation",
5408 ),
5409 );
5410 // Si la rédaction libre est activée sur l'instruction
5411 if ($this->getVal("flag_edition_integrale") == 't') {
5412 $params["specific"]["corps"] = array(
5413 "mode" => "set",
5414 "value" => $this->getVal("corps_om_htmletatex"),
5415 );
5416 $params["specific"]["titre"] = array(
5417 "mode" => "set",
5418 "value" => $this->getVal("titre_om_htmletat"),
5419 );
5420 }
5421
5422 // Génération du PDF
5423 $result = $this->compute_pdf_output('lettretype', $this->getVal("lettretype"), $collectivite, null, $params);
5424 // Affichage du PDF
5425 $this->expose_pdf_output(
5426 $result['pdf_output'],
5427 $result['filename']
5428 );
5429 }
5430 }
5431
5432 /**
5433 * Récupère la collectivité du dossier d'instruction.
5434 *
5435 * @param string $dossier_instruction_id Identifiant du DI.
5436 *
5437 * @return integer
5438 */
5439 function get_dossier_instruction_om_collectivite($dossier_instruction_id = null) {
5440
5441 // Si l'identifiant n'est pas renseigné
5442 if ($dossier_instruction_id === null) {
5443 // Récupère la valeur
5444 if ($this->getVal('dossier') !== null && $this->getVal('dossier') !== '') {
5445 $dossier_instruction_id = $this->getVal('dossier');
5446 } elseif ($this->getParameter('idxformulaire') !== null
5447 && $this->getParameter('idxformulaire') !== '') {
5448 //
5449 $dossier_instruction_id = $this->getParameter('idxformulaire');
5450 } elseif ($this->f->get_submitted_get_value('idxformulaire') !== null
5451 && $this->f->get_submitted_get_value('idxformulaire') !== '') {
5452 //
5453 $dossier_instruction_id = $this->f->get_submitted_get_value('idxformulaire');
5454 }
5455 }
5456
5457 //
5458 $dossier_instruction = $this->f->get_inst__om_dbform(array(
5459 "obj" => "dossier_instruction",
5460 "idx" => $dossier_instruction_id,
5461 ));
5462
5463 //
5464 return $dossier_instruction->getVal('om_collectivite');
5465 }
5466
5467 /**
5468 * VIEW - view_bible
5469 *
5470 * Affiche la bible manuelle.
5471 *
5472 * @return void
5473 */
5474 function view_bible() {
5475 // Vérification de l'accessibilité sur l'élément
5476 $this->checkAccessibility();
5477
5478 /**
5479 * Affichage de la structure HTML
5480 */
5481 //
5482 if ($this->f->isAjaxRequest()) {
5483 //
5484 header("Content-type: text/html; charset=".HTTPCHARSET."");
5485 } else {
5486 //
5487 $this->f->setFlag("htmlonly");
5488 $this->f->display();
5489 }
5490 //
5491 $this->f->displayStartContent();
5492 //
5493 $this->f->setTitle(_("Liste des éléments de la bible en lien avec un evenement"));
5494 $this->f->displayTitle();
5495
5496 /**
5497 *
5498 */
5499 //
5500 ($this->f->get_submitted_get_value("ev") ? $evenement = $this->f->get_submitted_get_value("ev") : $evenement = "");
5501 $evenement = intval($evenement);
5502 //
5503 ($this->f->get_submitted_get_value("idx") ? $idx = $this->f->get_submitted_get_value("idx") : $idx = "");
5504 // Récupération du code du type de DA
5505 $code_da_type = '';
5506 if (preg_match('/[A-Za-z]{2,3}/', $idx, $matches) !== false) {
5507 $code_da_type = $matches[0];
5508 }
5509 //
5510 ($this->f->get_submitted_get_value("complement") ? $complement = $this->f->get_submitted_get_value("complement") : $complement = "1");
5511
5512 // Récupération de la collectivité du dossier
5513 $dossier = $this->f->get_inst__om_dbform(array(
5514 "obj" => "dossier",
5515 "idx" => $idx,
5516 ));
5517
5518 /**
5519 *
5520 */
5521 //
5522 $sql = "SELECT *, bible.libelle as bible_lib
5523 FROM ".DB_PREFIXE."bible
5524 LEFT OUTER JOIN ".DB_PREFIXE."dossier_autorisation_type
5525 ON bible.dossier_autorisation_type=dossier_autorisation_type.dossier_autorisation_type
5526 LEFT JOIN ".DB_PREFIXE."om_collectivite
5527 ON bible.om_collectivite = om_collectivite.om_collectivite
5528 WHERE (evenement=".$evenement." OR evenement IS NULL)
5529 AND (complement=".$complement." OR complement IS NULL)
5530 AND (bible.dossier_autorisation_type IS NULL
5531 OR dossier_autorisation_type.code ='".$code_da_type."')
5532 AND (om_collectivite.niveau = '2'
5533 OR bible.om_collectivite = ".$dossier->getVal("om_collectivite").")
5534 ORDER BY bible_lib ASC";
5535 $res = $this->f->db->query($sql);
5536 $this->f->addToLog(__METHOD__.": db->query(\"".$sql."\");", VERBOSE_MODE);
5537 $this->f->isDatabaseError($res);
5538 //
5539 echo "<form method=\"post\" name=\"f3\" action=\"#\">\n";
5540 //
5541 if ($res->numrows() > 0) {
5542 //
5543 echo "\t<table id='tab-bible' width='100%'>\n";
5544 //
5545 echo "\t\t<tr class=\"ui-tabs-nav ui-accordion ui-state-default tab-title\">";
5546 echo "<th>"._("Choisir")."</th>";
5547 echo "<th>"._("Libelle")."</th>";
5548 echo "</tr>\n";
5549 //
5550 $i = 0;
5551 //
5552 while ($row=& $res->fetchRow(DB_FETCHMODE_ASSOC)) {
5553 //
5554 echo "\t\t<tr";
5555 echo " class=\"".($i % 2 == 0 ? "odd" : "even")."\"";
5556 echo ">";
5557 //
5558 echo "<td class=\"center\"><input type=\"checkbox\" name=\"choix[]\" value=\"".$i."\" id=\"checkbox".$i."\" /></td>";
5559 // XXX utilisation de l'attribut titre pour afficher une infobulle
5560 echo "<td><span class=\"content\" title=\"".htmlentities($row['contenu'])."\" id=\"content".$i."\">".$row['bible_lib']."</span></td>";
5561 //
5562 echo "</tr>\n";
5563 //
5564 $i++;
5565 }
5566 echo "\t</table>\n";
5567 //
5568 echo "<div class=\"formControls\">\n";
5569 $this->f->layout->display_form_button(array(
5570 "value" => _("Valider"),
5571 "onclick" => "bible_return('f2', 'complement".($complement == "1" ? "" : $complement)."_om_html'); return false;",
5572 ));
5573 $this->f->displayLinkJsCloseWindow();
5574 echo "</div>\n";
5575
5576 } else {
5577 //
5578 $message_class = "error";
5579 $message = _("Aucun element dans la bible pour l'evenement")." : ".$evenement;
5580 $this->f->displayMessage($message_class, $message);
5581 //
5582 echo "<div class=\"formControls\">\n";
5583 $this->f->displayLinkJsCloseWindow();
5584 echo "</div>\n";
5585 }
5586 //
5587 echo "</form>\n";
5588
5589 /**
5590 * Affichage de la structure HTML
5591 */
5592 //
5593 $this->f->displayEndContent();
5594 }
5595
5596 /**
5597 * VIEW - view_bible_auto
5598 *
5599 * Renvoie les valeurs de la bible à placer dans les compléments de l'instruction.
5600 *
5601 * @return void
5602 */
5603 function view_bible_auto() {
5604 // Vérification de l'accessibilité sur l'élément
5605 $this->checkAccessibility();
5606 //
5607 $this->f->disableLog();
5608
5609 $formatDate="AAAA-MM-JJ";
5610
5611 // Récupération des paramètres
5612 $idx = $this->f->get_submitted_get_value('idx');
5613 $evenement = $this->f->get_submitted_get_value('ev');
5614
5615 // Initialisation de la variable de retour
5616 $retour['complement_om_html'] = '';
5617 $retour['complement2_om_html'] = '';
5618 $retour['complement3_om_html'] = '';
5619 $retour['complement4_om_html'] = '';
5620 // Vérification d'une consultation liée à l'événement
5621 $consultation = $this->f->db->getOne(
5622 "select consultation from ".DB_PREFIXE."evenement where evenement=".$evenement
5623 );
5624 $this->f->isDatabaseError($consultation);
5625 // Si consultation liée, récupération du retour d'avis
5626 if($consultation=='Oui'){
5627 $sql="select date_retour,avis_consultation.libelle as avis_consultation,
5628 service.libelle as service
5629 from ".DB_PREFIXE."consultation inner join ".DB_PREFIXE."service
5630 on consultation.service =service.service
5631 left join ".DB_PREFIXE."avis_consultation on
5632 consultation.avis_consultation = avis_consultation.avis_consultation
5633 where dossier ='".$idx."' and consultation.visible";
5634 $res = $this->f->db->query($sql);
5635 $this->f->isDatabaseError($res);
5636 // Récupération des consultations
5637 while ($row=& $res->fetchRow(DB_FETCHMODE_ASSOC)){
5638 $correct=false;
5639 // date retour
5640 if ($row['date_retour']<>""){
5641 if ($formatDate=="AAAA-MM-JJ"){
5642 $date = explode("-", $row['date_retour']);
5643 // controle de date
5644 if (count($date) == 3 and
5645 checkdate($date[1], $date[2], $date[0])) {
5646 $date_retour_f= $date[2]."/".$date[1]."/".$date[0];
5647 $correct=true;
5648 }else{
5649 $msg= $msg."<br>La date ".$row['date_retour']." n'est pas une date.";
5650 $correct=false;
5651 }
5652 }
5653 }
5654 //
5655 $temp="Vu l'avis ".$row['avis_consultation']." du service ".$row['service'];
5656 if($correct == true){
5657 $temp=$temp." du ".$date_retour_f;
5658 }
5659 // Concaténation des retours d'avis de consultation
5660 $retour['complement_om_html'] .= $temp . "<br/><br/>";
5661 } // while
5662
5663 } // consultation
5664 // Récupération des bibles automatiques pour le champ complement_om_html
5665 $retour['complement_om_html'] .= $this->getBible($evenement, $idx, '1');
5666 // Récupération des bibles automatiques pour le champ complement2_om_html
5667 $retour['complement2_om_html'] .= $this->getBible($evenement, $idx, '2');
5668 // Récupération des bibles automatiques pour le champ complement3_om_html
5669 $retour['complement3_om_html'] .= $this->getBible($evenement, $idx, '3');
5670 // Récupération des bibles automatiques pour le champ complement4_om_html
5671 $retour['complement4_om_html'] .= $this->getBible($evenement, $idx, '4');
5672
5673
5674
5675 echo json_encode($retour);
5676 }
5677
5678 /**
5679 * VIEW - view_pdf_temp
5680 *
5681 * @return void
5682 */
5683 function view_pdf_temp() {
5684 $this->checkAccessibility();
5685 // Utilisation de $_POST pour ne pas que les textes soient altérés.
5686 $this->f->set_submitted_value();
5687 $merge_fields = array();
5688 //
5689 if (array_key_exists('c1', $_POST) === true) {
5690 $merge_fields['[complement_instruction]'] = urldecode($_POST['c1']);
5691 $merge_fields['[complement1_instruction]'] = urldecode($_POST['c1']);
5692 }
5693 if (array_key_exists('c2', $_POST) === true) {
5694 $merge_fields['[complement2_instruction]'] = urldecode($_POST['c2']);
5695 }
5696 if (array_key_exists('c3', $_POST) === true) {
5697 $merge_fields['[complement3_instruction]'] = urldecode($_POST['c3']);
5698 }
5699 if (array_key_exists('c4', $_POST) === true) {
5700 $merge_fields['[complement4_instruction]'] = urldecode($_POST['c4']);
5701 }
5702 $params = array(
5703 "watermark" => true,
5704 "specific" => array(
5705 "merge_fields" => $merge_fields,
5706 ),
5707 );
5708 //
5709 if (array_key_exists('corps', $_POST) === true) {
5710 $params["specific"]["corps"] = array(
5711 "mode" => "set",
5712 "value" => urldecode($_POST['corps']),
5713 );
5714 }
5715 if (array_key_exists('titre', $_POST) === true) {
5716 $params["specific"]["titre"] = array(
5717 "mode" => "set",
5718 "value" => urldecode($_POST['titre']),
5719 );
5720 }
5721 $dossier_instruction_om_collectivite = $this->get_dossier_instruction_om_collectivite();
5722 $collectivite = $this->f->getCollectivite($dossier_instruction_om_collectivite);
5723 $result = $this->compute_pdf_output('lettretype', $this->getVal('lettretype'), $collectivite, null, $params);
5724 $retour = array(
5725 'base' => base64_encode($result['pdf_output']),
5726 );
5727 echo json_encode($retour);
5728 }
5729
5730 /**
5731 * Dans le contexte de prévisualisation des éditions, génère le rendu du
5732 * PDF sans prise en compte de la valeur des compléments et le retourne en
5733 * base 64.
5734 *
5735 * @return string Rendu PDF converti en base 64.
5736 */
5737 function init_pdf_temp() {
5738 $params = array(
5739 "watermark" => true,
5740 );
5741 // Si la rédaction libre est activée sur l'instruction
5742 if ($this->getVal("flag_edition_integrale") == 't') {
5743 $params["specific"]["corps"] = array(
5744 "mode" => "set",
5745 "value" => $this->getVal("corps_om_htmletatex"),
5746 );
5747 $params["specific"]["titre"] = array(
5748 "mode" => "set",
5749 "value" => $this->getVal("titre_om_htmletat"),
5750 );
5751 }
5752 $dossier_instruction_om_collectivite = $this->get_dossier_instruction_om_collectivite();
5753 $collectivite = $this->f->getCollectivite($dossier_instruction_om_collectivite);
5754 $result = $this->compute_pdf_output('lettretype', $this->getVal('lettretype'), $collectivite, null, $params);
5755
5756 return base64_encode($result['pdf_output']);
5757 }
5758
5759 /**
5760 * Récupération des éléments de bible.
5761 *
5762 * @param integer $event id de l'événement
5763 * @param string $idx id du dossier
5764 * @param integer $compnb numéro du champ complement
5765 *
5766 * @return string Chaîne de texte à insérer dans le champ complement
5767 */
5768 function getBible($event, $idx, $compnb) {
5769 // Récupération de la collectivité du dossier
5770 $dossier = $this->f->get_inst__om_dbform(array(
5771 "obj" => "dossier",
5772 "idx" => $idx,
5773 ));
5774 // Récupération du code du type de DA
5775 $code_da_type = '';
5776 if (preg_match('/[A-Za-z]{2,3}/', $idx, $matches) !== false) {
5777 $code_da_type = $matches[0];
5778 }
5779 //
5780 $sql = "SELECT * FROM ".DB_PREFIXE."bible
5781 LEFT OUTER JOIN ".DB_PREFIXE."dossier_autorisation_type
5782 ON bible.dossier_autorisation_type=
5783 dossier_autorisation_type.dossier_autorisation_type
5784 LEFT JOIN
5785 ".DB_PREFIXE."om_collectivite
5786 ON bible.om_collectivite = om_collectivite.om_collectivite
5787 WHERE (evenement =".$event." or evenement IS NULL) and
5788 (complement=".$compnb." OR complement IS NULL) and
5789 automatique='Oui' and
5790 (dossier_autorisation_type.code ='".$code_da_type."' or
5791 bible.dossier_autorisation_type IS NULL) and
5792 (om_collectivite.niveau = '2' OR bible.om_collectivite = ".$dossier->getVal("om_collectivite").")";
5793
5794 $res = $this->f->db->query($sql);
5795 $this->f->isDatabaseError($res);
5796 $temp = "";
5797 while ($row=& $res->fetchRow(DB_FETCHMODE_ASSOC)){
5798 // Remplacement des retours à la ligne par des br
5799 $temp .= preg_replace(
5800 '#(\\\r|\\\r\\\n|\\\n)#', '<br/>', $row['contenu']
5801 );
5802 // Ajout d'un saut de ligne entre chaque bible.
5803 $temp .= '<br/>';
5804 } // fin while
5805 return $temp;
5806 }
5807
5808 /**
5809 * VIEW - view_suivi_bordereaux.
5810 *
5811 * Formulaire de choix du bordereau de suivi, permettant de générer les 4 bordereaux.
5812 * Si l'utilisateur est d'une collectivité de niveau 2 il a le choix de la
5813 * collectivité des dossiers affichés.
5814 *
5815 * @return void
5816 */
5817 function view_suivi_bordereaux() {
5818 // Vérification de l'accessibilité sur l'élément
5819 $this->checkAccessibility();
5820
5821 /**
5822 * Validation du formulaire
5823 */
5824 // Si le formulaire a été validé
5825 if ($this->f->get_submitted_post_value("validation") !== null) {
5826 // Si un bordereau à été sélectionné
5827 if ($this->f->get_submitted_post_value("bordereau") !== null && $this->f->get_submitted_post_value("bordereau") == "" ) {
5828 // Si aucun bordereau n'a été sélectionné
5829 $message_class = "error";
5830 $message = _("Veuillez selectionner un bordereau.");
5831 }
5832 // Sinon si les dates ne sont pas valide
5833 elseif (($this->f->get_submitted_post_value("date_bordereau_debut") !== null
5834 && $this->f->get_submitted_post_value("date_bordereau_debut") == "")
5835 || ($this->f->get_submitted_post_value("date_bordereau_fin") !== null
5836 && $this->f->get_submitted_post_value("date_bordereau_fin") == "")) {
5837 // Si aucune date n'a été saisie
5838 $message_class = "error";
5839 $message = _("Veuillez saisir une date valide.");
5840 }
5841 // Sinon si les dates ne sont pas valides
5842 elseif ($this->f->get_submitted_post_value("bordereau") === "bordereau_avis_maire_prefet"
5843 && $this->f->getParameter("id_evenement_bordereau_avis_maire_prefet") == null) {
5844 // Si aucune date n'a été saisie
5845 $message_class = "error";
5846 $message = _("Erreur de parametrage. Contactez votre administrateur.");
5847 }
5848 // Affiche le message de validation
5849 else {
5850 // On récupère le libellé du bordereau pour l'afficher à l'utilisateur
5851 $sql = "SELECT om_etat.libelle
5852 FROM ".DB_PREFIXE."om_etat
5853 WHERE om_etat.id = '".$this->f->get_submitted_post_value("bordereau")."'";
5854 $res = $this->f->db->getone($sql);
5855 $this->f->addToLog(__METHOD__.": db->getone(\"".$sql."\")", VERBOSE_MODE);
5856 $this->f->isDatabaseError($res);
5857 //
5858 $message_class = "valid";
5859 $message = _("Cliquez sur le lien ci-dessous pour telecharger votre bordereau");
5860 $message .= " : <br/><br/>";
5861 $message .= "<a class='om-prev-icon pdf-16'";
5862 $message .= " title=\""._("Bordereau")."\"";
5863 $message .= "href='".OM_ROUTE_FORM."&obj=instruction";
5864 $message .= "&action=220";
5865 $message .= "&idx=0";
5866 $message .= "&type_bordereau=".$this->f->get_submitted_post_value("bordereau");
5867 $message .= "&date_bordereau_debut=".$this->f->get_submitted_post_value("date_bordereau_debut");
5868 $message .= "&date_bordereau_fin=".$this->f->get_submitted_post_value("date_bordereau_fin");
5869 // Si l'utilisateur est MULTI alors on ajoute le paramètre collectivite
5870 if ($this->f->get_submitted_post_value("om_collectivite") !== null) {
5871 $message .= "&collectivite=".$this->f->get_submitted_post_value("om_collectivite");
5872 }
5873 $message .= "'"." target='_blank'>";
5874 $message .= $res." "._("du")." ".$this->f->get_submitted_post_value("date_bordereau_debut")
5875 ." "._("au")." ".$this->f->get_submitted_post_value("date_bordereau_fin");
5876 $message .= "</a>";
5877 }
5878 }
5879
5880 /**
5881 * Affichage des messages et du formulaire
5882 */
5883 // Affichage du message de validation ou d'erreur
5884 if (isset($message) && isset($message_class) && $message != "") {
5885 $this->f->displayMessage($message_class, $message);
5886 }
5887 // Ouverture du formulaire
5888 printf("\t<form");
5889 printf(" method=\"post\"");
5890 printf(" id=\"suivi_bordereaux_form\"");
5891 printf(" action=\"\"");
5892 printf(">\n");
5893 // Paramétrage des champs du formulaire
5894 $champs = array("date_bordereau_debut", "date_bordereau_fin", "bordereau");
5895 // Si l'utilisateur est d'une collectivité de niveau 2 on affiche un select
5896 // collectivité dans le formulaire
5897 if ($_SESSION["niveau"] == 2) {
5898 array_push($champs, "om_collectivite");
5899 }
5900 // Création d'un nouvel objet de type formulaire
5901 $form = $this->f->get_inst__om_formulaire(array(
5902 "validation" => 0,
5903 "maj" => 0,
5904 "champs" => $champs,
5905 ));
5906 // Paramétrage du champ date_bordereau_debut
5907 $form->setLib("date_bordereau_debut", _("date_bordereau_debut"));
5908 $form->setType("date_bordereau_debut", "date");
5909 $form->setTaille("date_bordereau_debut", 12);
5910 $form->setMax("date_bordereau_debut", 12);
5911 $form->setRequired("date_bordereau_debut");
5912 $form->setOnchange("date_bordereau_debut", "fdate(this)");
5913 $form->setVal("date_bordereau_debut", date("d/m/Y"));
5914 // Paramétrage du champ date_bordereau_fin
5915 $form->setLib("date_bordereau_fin", _("date_bordereau_fin"));
5916 $form->setType("date_bordereau_fin", "date");
5917 $form->setTaille("date_bordereau_fin", 12);
5918 $form->setMax("date_bordereau_fin", 12);
5919 $form->setRequired("date_bordereau_fin");
5920 $form->setOnchange("date_bordereau_fin", "fdate(this)");
5921 $form->setVal("date_bordereau_fin", date("d/m/Y"));
5922 // Paramétrage du champ bordereau
5923 $form->setLib("bordereau", _("bordereau"));
5924 $form->setType("bordereau", "select");
5925 $form->setRequired("bordereau");
5926 // Valeurs des champs
5927 if ($this->f->get_submitted_post_value("validation") !== null) {
5928 $form->setVal("date_bordereau_debut", $this->f->get_submitted_post_value("date_bordereau_debut"));
5929 $form->setVal("date_bordereau_fin", $this->f->get_submitted_post_value("date_bordereau_fin"));
5930 $form->setVal("bordereau", $this->f->get_submitted_post_value("bordereau"));
5931 $form->setVal("om_collectivite", $this->f->get_submitted_post_value("om_collectivite"));
5932 }
5933 // Données du select - On récupère ici la liste de tous les états disponibles
5934 // dans la table om_etat qui ont un id qui commence par la cahine de caractères
5935 // 'bordereau_'
5936 $sql = "SELECT om_etat.id, om_etat.libelle
5937 FROM ".DB_PREFIXE."om_etat
5938 WHERE om_etat.id LIKE 'bordereau_%'
5939 ORDER BY om_etat.id";
5940 $res = $this->f->db->query($sql);
5941 $this->f->addToLog(__METHOD__.": db->query(\"".$sql."\")", VERBOSE_MODE);
5942 $this->f->isDatabaseError($res);
5943 // Données du select
5944 $contenu = array(
5945 0 => array("", ),
5946 1 => array(_("choisir bordereau")),
5947 );
5948 while ($row =& $res->fetchRow(DB_FETCHMODE_ASSOC)) {
5949 $contenu[0][] = $row['id'];
5950 $contenu[1][] = $row['libelle'];
5951 }
5952 $form->setSelect("bordereau", $contenu);
5953 //
5954 if ($_SESSION["niveau"] == 2) {
5955 $form->setLib("om_collectivite", _("collectivite"));
5956 $form->setType("om_collectivite", "select");
5957
5958 // Données du select - On récupère ici la liste de tous toutes les collectivités
5959 // de niveau 1
5960 $sql = "SELECT om_collectivite, libelle
5961 FROM ".DB_PREFIXE."om_collectivite
5962 WHERE niveau = '1' ORDER BY libelle";
5963 $res = $this->f->db->query($sql);
5964 $this->f->addToLog(__METHOD__.": db->query(\"".$sql."\")", VERBOSE_MODE);
5965 $this->f->isDatabaseError($res);
5966 // La valeur par défaut du select est Toutes
5967 $list_collectivites = array(
5968 0 => array("", ),
5969 1 => array(_("toutes"))
5970 );
5971
5972 $id_colls = "";
5973 // On stocke dans $id_colls l'id de toutes les collectivités de niveau 1 séparées
5974 // par des virgules, pour un traitement plus facile dans la requête de sous-état
5975 while ($row =& $res->fetchRow(DB_FETCHMODE_ASSOC)) {
5976 if ($id_colls != "") {
5977 $id_colls .= ",";
5978 }
5979 $id_colls .= $row['om_collectivite'];
5980 $list_collectivites[0][] = $row['om_collectivite'];
5981 $list_collectivites[1][] = $row['libelle'];
5982 }
5983 // On affecte la liste d'identifiants à l'option Toutes
5984 $list_collectivites[0][0] = $id_colls ;
5985 $form->setSelect("om_collectivite", $list_collectivites);
5986 }
5987 // Affichage du formulaire
5988 $form->entete();
5989 $form->afficher($champs, 0, false, false);
5990 $form->enpied();
5991 // Affichage du bouton
5992 printf("\t<div class=\"formControls\">\n");
5993 $this->f->layout->display_form_button(array("value" => _("Valider"), "name" => "validation"));
5994 printf("\t</div>\n");
5995 // Fermeture du formulaire
5996 printf("\t</form>\n");
5997 }
5998
5999
6000 /**
6001 * VIEW - view_generate_suivi_bordereaux.
6002 *
6003 * Génère et affiche les bordereaux de suivi.
6004 *
6005 * @return [void]
6006 */
6007 function view_generate_suivi_bordereaux() {
6008 // Vérification de l'accessibilité sur l'élément
6009 $this->checkAccessibility();
6010 // Récupération du type de bordereau
6011 $bordereau = $this->f->get_submitted_get_value('type_bordereau');
6012 // Génération du PDF
6013 $result = $this->compute_pdf_output('etat', $bordereau, null, $this->getVal($this->clePrimaire));
6014 // Affichage du PDF
6015 $this->expose_pdf_output(
6016 $result['pdf_output'],
6017 $result['filename']
6018 );
6019 }
6020
6021
6022 /**
6023 * VIEW - view_suivi_envoi_lettre_rar.
6024 *
6025 * Vue pour imprimer les AR.
6026 *
6027 * @return void
6028 */
6029 function view_suivi_envoi_lettre_rar() {
6030 // Vérification de l'accessibilité sur l'élément
6031 $this->checkAccessibility();
6032
6033 //
6034 if ($this->f->get_submitted_post_value("date") !== null) {
6035 $date = $this->f->get_submitted_post_value("date");
6036 } else {
6037 $date = "";
6038 }
6039 //
6040 if ($this->f->get_submitted_post_value("liste_code_barres_instruction") !== null) {
6041 $liste_code_barres_instruction = $this->f->get_submitted_post_value("liste_code_barres_instruction");
6042 } else {
6043 $liste_code_barres_instruction = "";
6044 }
6045
6046 // Compteur du nombre de page générées
6047 $nbLettres = 0;
6048 // Liste d'id des instructions
6049 $id4Gen = array();
6050 //
6051 $error = "";
6052
6053 // Initialisation du tableau qui va contenir les DI pour lister les liens
6054 $dossierTab = array();
6055 // On vérifie que l'utilisateur ait les droits pour afficher des consultations
6056 $isAccredited = $this->f->isAccredited(array("dossier_instruction","dossier_instruction_consulter"), "OR");
6057 $hasHidden = true;
6058 // S'il ne peut pas les consulter il aura des dossiers caché
6059 if ($isAccredited === true) {
6060 $hasHidden = false;
6061 }
6062
6063 /**
6064 * Validation du formulaire
6065 */
6066 // Si le formulaire a été validé
6067 if ($this->f->get_submitted_post_value('validation') !== null) {
6068 //
6069 if (empty($date) || empty($liste_code_barres_instruction)) {
6070 //
6071 $message_class = "error";
6072 $message = _("Tous les champs doivent etre remplis.");
6073 } else {
6074 // Création d'un tableau d'instruction
6075 $liste = explode("\r\n", $this->f->get_submitted_post_value("liste_code_barres_instruction"));
6076 //
6077 foreach ($liste as $code_barres) {
6078 // On enlève les éventuels espaces saisis
6079 $code_barres = trim($code_barres);
6080 // Vérification de l'existence de l'instruction
6081 if ($code_barres != "") {
6082 // Si la valeur transmise est numérique
6083 if (is_numeric($code_barres)) {
6084 //
6085 $sql = "SELECT count(*)
6086 FROM ".DB_PREFIXE."instruction
6087 INNER JOIN ".DB_PREFIXE."dossier
6088 ON dossier.dossier=instruction.dossier
6089 INNER JOIN ".DB_PREFIXE."dossier_instruction_type
6090 ON dossier.dossier_instruction_type = dossier_instruction_type.dossier_instruction_type
6091 INNER JOIN ".DB_PREFIXE."dossier_autorisation_type_detaille
6092 ON dossier_instruction_type.dossier_autorisation_type_detaille = dossier_autorisation_type_detaille.dossier_autorisation_type_detaille
6093 INNER JOIN ".DB_PREFIXE."dossier_autorisation_type
6094 ON dossier_autorisation_type_detaille.dossier_autorisation_type = dossier_autorisation_type.dossier_autorisation_type
6095 INNER JOIN ".DB_PREFIXE."groupe
6096 ON dossier_autorisation_type.groupe = groupe.groupe
6097 WHERE code_barres='".$this->f->db->escapesimple($code_barres)."'";
6098
6099 // Ajout d'un filtre sur les groupes auxquels l'utilisateur a accès
6100 $group_clause = array();
6101 foreach ($_SESSION["groupe"] as $key => $value) {
6102 $group_clause[$key] = "(groupe.code = '".$key."'";
6103 if($value["confidentiel"] !== true) {
6104 $group_clause[$key] .= " AND dossier_autorisation_type.confidentiel IS NOT TRUE";
6105 }
6106 $group_clause[$key] .= ")";
6107 }
6108 $conditions = implode(" OR ", $group_clause);
6109 $sql .= " AND (" . $conditions . ")";
6110
6111 $nbInstr = $this->f->db->getone($sql);
6112 $this->f->addToLog(__METHOD__.": db->getone(\"".$sql."\")", VERBOSE_MODE);
6113 $this->f->isDatabaseError($nbInstr);
6114 //
6115 if ($nbInstr == "1") {
6116 // Récupération de la date d'envoi de l'instruction bippé
6117 $sql = "SELECT to_char(date_envoi_rar,'DD/MM/YYYY') as date_envoi_rar, instruction FROM ".DB_PREFIXE."instruction WHERE code_barres='".$code_barres."'";
6118 $res = $this->f->db->query($sql);
6119 $this->f->addToLog(__METHOD__.": db->query(\"".$sql."\")", VERBOSE_MODE);
6120 $this->f->isDatabaseError($res);
6121 $row =& $res->fetchRow(DB_FETCHMODE_ASSOC);
6122 // Si pas de date ou correspond à la date du formulaire on
6123 // effectue le traitement
6124 if ($row["date_envoi_rar"] == "" || $row["date_envoi_rar"] == $date) {
6125 $instr = $this->f->get_inst__om_dbform(array(
6126 "obj" => "instruction",
6127 "idx" => $row['instruction'],
6128 ));
6129 $valF = array();
6130 foreach($instr->champs as $id => $champ) {
6131 $valF[$champ] = $instr->val[$id];
6132 }
6133
6134 # Si on peut consulter les dossiers et que le dossier n'existe pas déjà dans la liste
6135 if ($isAccredited === true
6136 && array_key_exists($instr->getVal("dossier"), $dossierTab) === false) {
6137 $dossier = $this->f->get_inst__om_dbform(array(
6138 "obj" => "dossier",
6139 "idx" => $instr->getVal("dossier"),
6140 ));
6141 if ($dossier->is_user_from_allowed_collectivite()){
6142 $dossierTab[$instr->getVal("dossier")] = $dossier;
6143 } else {
6144 $hasHidden = true;
6145 }
6146 }
6147
6148 $valF['date_evenement']=
6149 $instr->dateDBToForm($valF['date_evenement']);
6150 $valF['archive_date_complet']=
6151 $instr->dateDBToForm($valF['archive_date_complet']);
6152 $valF['archive_date_rejet']=
6153 $instr->dateDBToForm($valF['archive_date_rejet']);
6154 $valF['archive_date_limite']=
6155 $instr->dateDBToForm($valF['archive_date_limite']);
6156 $valF['archive_date_notification_delai']=
6157 $instr->dateDBToForm($valF['archive_date_notification_delai']);
6158 $valF['archive_date_decision']=
6159 $instr->dateDBToForm($valF['archive_date_decision']);
6160 $valF['archive_date_validite']=
6161 $instr->dateDBToForm($valF['archive_date_validite']);
6162 $valF['archive_date_achevement']=
6163 $instr->dateDBToForm($valF['archive_date_achevement']);
6164 $valF['archive_date_chantier']=
6165 $instr->dateDBToForm($valF['archive_date_chantier']);
6166 $valF['archive_date_conformite']=
6167 $instr->dateDBToForm($valF['archive_date_conformite']);
6168 $valF['archive_date_dernier_depot']=
6169 $instr->dateDBToForm($valF['archive_date_dernier_depot']);
6170 $valF['archive_date_limite_incompletude']=
6171 $instr->dateDBToForm($valF['archive_date_limite_incompletude']);
6172 $valF['date_finalisation_courrier']=
6173 $instr->dateDBToForm($valF['date_finalisation_courrier']);
6174 $valF['date_envoi_signature']=
6175 $instr->dateDBToForm($valF['date_envoi_signature']);
6176 $valF['date_retour_signature']=
6177 $instr->dateDBToForm($valF['date_retour_signature']);
6178 $valF['date_envoi_rar']=
6179 $instr->dateDBToForm($valF['date_envoi_rar']);
6180 $valF['date_retour_rar']=
6181 $instr->dateDBToForm($valF['date_retour_rar']);
6182 $valF['date_envoi_controle_legalite']=
6183 $instr->dateDBToForm($valF['date_envoi_controle_legalite']);
6184 $valF['date_retour_controle_legalite']=
6185 $instr->dateDBToForm($valF['date_retour_controle_legalite']);
6186 $valF['date_envoi_rar'] = $date;
6187
6188 // Vérification de la finalisation du document
6189 // correspondant au code barres
6190 if($instr->getVal("om_final_instruction") === 't') {
6191 $instr->setParameter('maj', 1);
6192 $instr->class_actions[1]["identifier"] =
6193 "envoi lettre RAR (depuis le menu suivi des pièces)";
6194 if ($instr->modifier($valF) == true) {
6195 $id4Gen[] = $code_barres;
6196 $nbLettres ++;
6197 } else {
6198 //
6199 if ($error != "") {
6200 $error .= "<br/>";
6201 }
6202 $error .= sprintf(_("Une erreur s'est produite lors de la modification de l'instruction %s."),
6203 $code_barres);
6204 $error .= " ";
6205 $error .= _("Veuillez contacter votre administrateur.");
6206 }
6207 } else {
6208 //
6209 if ($error != "") {
6210 $error .= "<br/>";
6211 }
6212 $error .= sprintf(_("Le document correspondant au
6213 code barres %s n'est pas finalise,
6214 le bordereau ne sera pas genere."),
6215 $code_barres);
6216 }
6217
6218 } else {
6219 //
6220 if ($error != "") {
6221 $error .= "<br/>";
6222 }
6223 $error .= _("Une lettre correspondante a l'instruction ayant pour code barres")." ".$code_barres." "._("a deja ete envoyee, le bordereau ne sera pas genere.");
6224 }
6225 } else {
6226 //
6227 if ($error != "") {
6228 $error .= "<br/>";
6229 }
6230 $error .= _("Le numero")." ".$code_barres." "._("ne correspond a aucun code barres d'instruction.");
6231 }
6232 } else {
6233 //
6234 if ($error != "") {
6235 $error .= "<br/>";
6236 }
6237 $error .= _("Le code barres d'instruction")." ".$code_barres." "._("n'est pas valide.");
6238 }
6239 }
6240 }
6241 }
6242 }
6243
6244 /**
6245 * Affichage des messages et du formulaire
6246 */
6247 // Affichage du message de validation ou d'erreur
6248 if (isset($message) && isset($message_class) && $message != "") {
6249 $this->f->displayMessage($message_class, $message);
6250 }
6251 // Affichage du message d'erreur
6252 if(!empty($error)) {
6253 $this->f->displayMessage("error", $error);
6254 }
6255 // Affichage du message de validation de la saisie
6256 if ($nbLettres > 0) {
6257 //
6258 echo "\n<div class=\"message ui-widget ui-corner-all ui-state-highlight ui-state-valid\" >";
6259 echo "\n<p>";
6260 echo "\n<span class=\"ui-icon ui-icon-info\"></span>";
6261 echo "\n<span class=\"text\">";
6262 echo _("Cliquez sur le lien ci-dessous pour telecharger votre document");
6263 echo " : \n<br/><br/>";
6264 echo "\n<a class='om-prev-icon pdf-16'";
6265 echo "\n title=\""._("imprimer les AR")."\"";
6266 echo "\n href=\"".OM_ROUTE_FORM."&obj=instruction&action=180&idx=0&liste=".implode(",",$id4Gen)."\"";
6267 echo "\n target='_blank'>";
6268 echo _("Telecharger le document pour")." ".$nbLettres." "._("AR");
6269 echo "\n</a>";
6270 echo "\n</span>";
6271 echo "\n</p>";
6272 echo "\n<br/>\n";
6273 if ($isAccredited === true) {
6274 echo '<fieldset id="fieldset-form-rar-lien_di" class="cadre ui-corner-all startClosed" style="background-color: inherite;">';
6275 echo "\n<legend class=\"ui-corner-all ui-widget-content ui-state-active\" style=\"background-color: transparent; color: inherit;\">\n";
6276 echo _('Dossiers concernés par ce traitement');
6277 echo "\n</legend>";
6278 echo "\n<div class=\"fieldsetContent\" style=\"display: none;background-color: inherite\">";
6279
6280 if ($hasHidden === true) {
6281 echo "\n<br/>";
6282 echo "\n<p>";
6283 echo "\n<span class='text'>";
6284 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.");
6285 echo "</span>";
6286 echo "\n</p>";
6287 echo "\n<br/>";
6288 }
6289 foreach ($dossierTab as $dossier) {
6290
6291 $inst_da = $this->get_inst_common("dossier_autorisation", $dossier->getVal('dossier_autorisation'));
6292 $inst_datd = $this->get_inst_common("dossier_autorisation_type_detaille", $inst_da->getVal('dossier_autorisation_type_detaille'));
6293 $code_datd = $inst_datd->getVal('code');
6294
6295 $obj = "dossier_instruction";
6296 if ($code_datd === 'REC' OR $code_datd === 'REG') {
6297 $obj = "dossier_contentieux_tous_recours";
6298 }
6299 if ($code_datd === 'IN') {
6300 $obj = "dossier_contentieux_toutes_infractions";
6301 }
6302
6303 echo "\n<div class=\"bloc group\">";
6304 echo "\n<div class=\"field field-type-text\">";
6305
6306 echo "\n<p>";
6307 echo "\n<span class='text'>";
6308 echo "\n<a class=\"om-icon om-icon-16 consult-16\" title=\"" . _('Consulter') . "\"";
6309 echo "\n href=\"".OM_ROUTE_FORM."&obj=dossier_instruction&action=3&idx=";
6310 echo $dossier->getVal("dossier");
6311 echo "\">";
6312 echo "\n</a>";
6313
6314 echo "\n<a title=\""._("Consulter")."\" style=\"vertical-align:middle;\"";
6315 echo " href=\"".OM_ROUTE_FORM."&obj=";
6316 echo $obj;
6317 echo "&action=3&idx=";
6318 echo $dossier->getVal("dossier");
6319 echo "\">";
6320 echo $dossier->getVal("dossier_libelle");
6321 echo "\n</a>";
6322 echo "\n</span>";
6323 echo "\n</p>";
6324
6325 echo "\n</div>";
6326 echo "\n</div>";
6327 }
6328 echo "\n</div>";
6329 echo "\n</fieldset>";
6330 }
6331 echo "\n</div>";
6332 echo "\n</div>";
6333 }
6334 // Ouverture du formulaire
6335 echo "\t<form";
6336 echo " method=\"post\"";
6337 echo " id=\"suivi_envoi_lettre_rar_form\"";
6338 echo " action=\"\"";
6339 echo ">\n";
6340 // Paramétrage des champs du formulaire
6341 $champs = array("date", "liste_code_barres_instruction");
6342 // Création d'un nouvel objet de type formulaire
6343 $form = $this->f->get_inst__om_formulaire(array(
6344 "validation" => 0,
6345 "maj" => 0,
6346 "champs" => $champs,
6347 ));
6348 // Paramétrage du champ date du formulaire
6349 $form->setLib("date", _("Date")."* :");
6350 $form->setType("date", "date");
6351 $form->setOnchange("date", "fdate(this)");
6352 $form->setVal("date", ($date == "" ? date("d/m/Y") : $date));
6353 $form->setTaille("date", 10);
6354 $form->setMax("date", 10);
6355 // Paramétrage du champ liste_code_barres_instruction du formulaire
6356 $form->setLib("liste_code_barres_instruction", _("Liste des codes barres d'instructions scannes")."* :");
6357 $form->setType("liste_code_barres_instruction", "textarea");
6358 $form->setVal("liste_code_barres_instruction", $liste_code_barres_instruction);
6359 $form->setTaille("liste_code_barres_instruction", 20);
6360 $form->setMax("liste_code_barres_instruction", 20);
6361 // Affichage du formulaire
6362 $form->entete();
6363 $form->afficher($champs, 0, false, false);
6364 $form->enpied();
6365 // Affichage du bouton
6366 echo "\t<div class=\"formControls\">\n";
6367 $this->f->layout->display_form_button(array("value" => _("Valider"), "name" => "validation"));
6368 echo "\t</div>\n";
6369 // Fermeture du formulaire
6370 echo "\t</form>\n";
6371 }
6372
6373 /**
6374 * VIEW - view_suivi_mise_a_jour_des_dates.
6375 *
6376 * Vu pour mettre à jour les dates de suivi de l'instruction.
6377 *
6378 * @return void
6379 */
6380 function view_suivi_mise_a_jour_des_dates() {
6381 // Vérification de l'accessibilité sur l'élément
6382 $this->checkAccessibility();
6383
6384 // Récupération des valeur passées en POST ou GET
6385 if($this->f->get_submitted_post_value("type_mise_a_jour") !== null) {
6386 $type_mise_a_jour = $this->f->get_submitted_post_value("type_mise_a_jour");
6387 } elseif($this->f->get_submitted_get_value('type_mise_a_jour') !== null) {
6388 $type_mise_a_jour = $this->f->get_submitted_get_value('type_mise_a_jour');
6389 } else {
6390 $type_mise_a_jour = "";
6391 }
6392 if($this->f->get_submitted_post_value('date') !== null) {
6393 $date = $this->f->get_submitted_post_value('date');
6394 } elseif($this->f->get_submitted_get_value('date') !== null) {
6395 $date = $this->f->get_submitted_get_value('date');
6396 } else {
6397 $date = "";
6398 }
6399 if($this->f->get_submitted_post_value('code_barres') !== null) {
6400 $code_barres = $this->f->get_submitted_post_value('code_barres');
6401 } elseif($this->f->get_submitted_get_value('code_barres') !== null) {
6402 $code_barres = $this->f->get_submitted_get_value('code_barres');
6403 } else {
6404 $code_barres = "";
6405 }
6406 // Booléen permettant de définir si un enregistrement à eu lieu
6407 $correct = false;
6408 // Booléen permettant de définir si les dates peuvent êtres enregistrées
6409 $date_error = false;
6410 // Champs date à mettre à jour
6411 $liste_champs=array();
6412
6413 // Si le formulaire a été validé
6414 if ($this->f->get_submitted_post_value('validation') !== null) {
6415 if(!empty($type_mise_a_jour) and !empty($date) and !empty($code_barres)) {
6416
6417 // Vérification de l'existence de l'instruction
6418 $sql = "SELECT instruction
6419 FROM ".DB_PREFIXE."instruction
6420 INNER JOIN ".DB_PREFIXE."dossier
6421 ON dossier.dossier=instruction.dossier
6422 INNER JOIN ".DB_PREFIXE."dossier_instruction_type
6423 ON dossier.dossier_instruction_type = dossier_instruction_type.dossier_instruction_type
6424 INNER JOIN ".DB_PREFIXE."dossier_autorisation_type_detaille
6425 ON dossier_instruction_type.dossier_autorisation_type_detaille = dossier_autorisation_type_detaille.dossier_autorisation_type_detaille
6426 INNER JOIN ".DB_PREFIXE."dossier_autorisation_type
6427 ON dossier_autorisation_type_detaille.dossier_autorisation_type = dossier_autorisation_type.dossier_autorisation_type
6428 INNER JOIN ".DB_PREFIXE."groupe
6429 ON dossier_autorisation_type.groupe = groupe.groupe
6430 WHERE code_barres='".$this->f->db->escapesimple($code_barres)."'";
6431
6432 // Ajout d'un filtre sur les groupes auxquels l'utilisateur a accès
6433 $group_clause = array();
6434 foreach ($_SESSION["groupe"] as $key => $value) {
6435 $group_clause[$key] = "(groupe.code = '".$key."'";
6436 if($value["confidentiel"] !== true) {
6437 $group_clause[$key] .= " AND dossier_autorisation_type.confidentiel IS NOT TRUE";
6438 }
6439 $group_clause[$key] .= ")";
6440 }
6441 $conditions = implode(" OR ", $group_clause);
6442 $sql .= " AND (" . $conditions . ")";
6443
6444
6445 $res = $this->f->db->query($sql);
6446 $this->f->addToLog(__METHOD__.": db->query(\"".$sql."\")", VERBOSE_MODE);
6447 $this->f->isDatabaseError($res);
6448
6449 if($res->numrows() == 1) {
6450 $liste_champs = explode(";", $type_mise_a_jour);
6451 $row =& $res->fetchRow(DB_FETCHMODE_ASSOC);
6452 $instr = $this->f->get_inst__om_dbform(array(
6453 "obj" => "instruction",
6454 "idx" => $row['instruction'],
6455 ));
6456 // Mise à jour des dates après l'écran de verification
6457 if($this->f->get_submitted_post_value('is_valid') !== null and $this->f->get_submitted_post_value('is_valid') == "true") {
6458 $valF = array();
6459 foreach($instr->champs as $id => $champ) {
6460 $valF[$champ] = $instr->val[$id];
6461 }
6462 $valF['date_evenement'] = $instr->dateDBToForm($valF['date_evenement']);
6463 $valF['archive_date_complet'] = $instr->dateDBToForm($valF['archive_date_complet']);
6464 $valF['archive_date_rejet'] = $instr->dateDBToForm($valF['archive_date_rejet']);
6465 $valF['archive_date_limite'] = $instr->dateDBToForm($valF['archive_date_limite']);
6466 $valF['archive_date_notification_delai'] = $instr->dateDBToForm($valF['archive_date_notification_delai']);
6467 $valF['archive_date_decision'] = $instr->dateDBToForm($valF['archive_date_decision']);
6468 $valF['archive_date_validite'] = $instr->dateDBToForm($valF['archive_date_validite']);
6469 $valF['archive_date_achevement'] = $instr->dateDBToForm($valF['archive_date_achevement']);
6470 $valF['archive_date_chantier'] = $instr->dateDBToForm($valF['archive_date_chantier']);
6471 $valF['archive_date_conformite'] = $instr->dateDBToForm($valF['archive_date_conformite']);
6472 $valF['archive_date_dernier_depot'] = $instr->dateDBToForm($valF['archive_date_dernier_depot']);
6473 $valF['archive_date_limite_incompletude'] = $instr->dateDBToForm($valF['archive_date_limite_incompletude']);
6474 $valF['date_finalisation_courrier'] = $instr->dateDBToForm($valF['date_finalisation_courrier']);
6475 $valF['date_envoi_signature'] = $instr->dateDBToForm($valF['date_envoi_signature']);
6476 $valF['date_retour_signature'] = $instr->dateDBToForm($valF['date_retour_signature']);
6477 $valF['date_envoi_rar'] = $instr->dateDBToForm($valF['date_envoi_rar']);
6478 $valF['date_retour_rar'] = $instr->dateDBToForm($valF['date_retour_rar']);
6479 $valF['date_envoi_controle_legalite'] = $instr->dateDBToForm($valF['date_envoi_controle_legalite']);
6480 $valF['date_retour_controle_legalite'] = $instr->dateDBToForm($valF['date_retour_controle_legalite']);
6481 $valF['archive_date_cloture_instruction'] = $instr->dateDBToForm($valF['archive_date_cloture_instruction']);
6482 $valF['archive_date_premiere_visite'] = $instr->dateDBToForm($valF['archive_date_premiere_visite']);
6483 $valF['archive_date_derniere_visite'] = $instr->dateDBToForm($valF['archive_date_derniere_visite']);
6484 $valF['archive_date_contradictoire'] = $instr->dateDBToForm($valF['archive_date_contradictoire']);
6485 $valF['archive_date_retour_contradictoire'] = $instr->dateDBToForm($valF['archive_date_retour_contradictoire']);
6486 $valF['archive_date_ait'] = $instr->dateDBToForm($valF['archive_date_ait']);
6487 $valF['archive_date_transmission_parquet'] = $instr->dateDBToForm($valF['archive_date_transmission_parquet']);
6488
6489 foreach(explode(";", $type_mise_a_jour) as $maj_date) {
6490 $valF[$maj_date]=$date;
6491 }
6492
6493 // Vérification de la finalisation du document
6494 // correspondant au code barres
6495 if($valF["om_final_instruction"] === 't' or
6496 $valF["lettretype"] == '') {
6497 $code_barres = "";
6498
6499 //Désactivation de l'autocommit
6500 $this->f->db->autoCommit(false);
6501
6502 //On modifie les valeurs de l'instruction
6503 $instr->setParameter('maj', 170);
6504 $instr->class_actions[170]["identifier"] =
6505 "mise à jour des dates (depuis le menu suivi des pièces)";
6506 $retour = $instr->modifier($valF);
6507
6508 //Si une erreur s'est produite, on défait les modifications
6509 //qui ont été faites
6510 if (!$retour){
6511 $instr->undoValidation();
6512 }
6513 //Sinon, on valide en base de données les modifications
6514 else {
6515 $this->f->db->commit();
6516 }
6517
6518 // Variable correct retourné depuis la classe instruction
6519 $correct = $instr->correct;
6520
6521 // Si la modification sur l'instruction a échoué
6522 if ($correct === false) {
6523
6524 // Message d'erreur de la classe instruction
6525 $error = $instr->msg;
6526 }
6527
6528 } else {
6529 // Indique que le traitement est en erreur
6530 $correct = false;
6531 // Message d'erreur
6532 $error = sprintf(_("Le document n'est pas finalise."),
6533 "<span class='bold'>".$code_barres."</span>");
6534 }
6535 } else {
6536 // Récupération des infos du dossier
6537 $sqlInfo = "SELECT dossier.dossier_libelle,
6538 evenement.libelle as evenement,
6539 autorite_competente.code as autorite_competente_code,
6540 autorite_competente.libelle as autorite_competente,
6541 evenement.type as evenement_type,
6542 to_char(date_envoi_signature,'DD/MM/YYYY') as date_envoi_signature,
6543 to_char(date_retour_signature,'DD/MM/YYYY') as date_retour_signature,
6544 to_char(date_envoi_controle_legalite,'DD/MM/YYYY') as date_envoi_controle_legalite,
6545 to_char(date_retour_controle_legalite,'DD/MM/YYYY') as date_retour_controle_legalite,
6546 to_char(date_envoi_rar,'DD/MM/YYYY') as date_envoi_rar,
6547 to_char(date_retour_rar,'DD/MM/YYYY') as date_retour_rar
6548 FROM ".DB_PREFIXE."instruction
6549 INNER JOIN ".DB_PREFIXE."dossier ON
6550 dossier.dossier=instruction.dossier
6551 LEFT JOIN ".DB_PREFIXE."autorite_competente ON
6552 dossier.autorite_competente=autorite_competente.autorite_competente
6553 INNER JOIN ".DB_PREFIXE."evenement ON
6554 instruction.evenement=evenement.evenement
6555 WHERE code_barres='".$code_barres."'";
6556 $resInfo = $this->f->db->query($sqlInfo);
6557 $this->f->isDatabaseError($resInfo);
6558 $infos = $resInfo->fetchRow(DB_FETCHMODE_ASSOC);
6559
6560 // Vérification de la non modification des dates de suivi
6561 foreach(explode(";", $type_mise_a_jour) as $champ) {
6562 if ($champ === 'date_envoi_controle_legalite') {
6563 if ($instr->is_sent_to_cl() === true) {
6564 $error = __("Les dates de suivis ne peuvent etre modifiees");
6565 $date_error = true;
6566 break;
6567 }
6568 }
6569 if($infos[$champ] != "" AND $infos[$champ] != $date) {
6570 $error = _("Les dates de suivis ne peuvent etre modifiees");
6571 $date_error = true;
6572 break;
6573 }
6574 }
6575 }
6576 } else {
6577 $error = _("Le numero saisi ne correspond a aucun code barres d'instruction.");
6578 }
6579
6580 } else {
6581 $error = _("Tous les champs doivent etre remplis.");
6582 }
6583 }
6584
6585 /**
6586 * Affichage des messages et du formulaire
6587 */
6588 // Affichage du message de validation ou d'erreur
6589 if (isset($message) && isset($message_class) && $message != "") {
6590 $this->f->displayMessage($message_class, $message);
6591 }
6592 // Affichage du message d'erreur
6593 if(!empty($error)) {
6594 $this->f->displayMessage("error", $error);
6595 }
6596
6597 // Affichage du message de validation de la saisie
6598 if($correct === true) {
6599 $this->f->displayMessage("ok", _("Saisie enregistree"));
6600 }
6601 // Ouverture du formulaire
6602 echo "\t<form";
6603 echo " method=\"post\"";
6604 echo " id=\"suivi_mise_a_jour_des_dates_form\"";
6605 echo " action=\"\"";
6606 echo ">\n";
6607 // Paramétrage des champs du formulaire
6608 if(isset($infos)) {
6609 $champs = array("type_mise_a_jour", "date", "code_barres", "dossier_libelle", "evenement"
6610 , "autorite_competente", "date_envoi_signature",
6611 "date_retour_signature", "date_envoi_controle_legalite",
6612 "date_retour_controle_legalite", "date_envoi_rar",
6613 "date_retour_rar", "is_valid");
6614 } else {
6615 $champs = array("type_mise_a_jour", "date", "code_barres");
6616 }
6617 // Création d'un nouvel objet de type formulaire
6618 $form = $this->f->get_inst__om_formulaire(array(
6619 "validation" => 0,
6620 "maj" => 0,
6621 "champs" => $champs,
6622 ));
6623 // Paramétrage des champs du formulaire
6624 // Parametrage du champ type_mise_a_jour
6625 $form->setLib("type_mise_a_jour", _("Date a mettre a jour")."* :");
6626 if(isset($infos)) {
6627 $form->setType("type_mise_a_jour", "selecthiddenstatic");
6628
6629 } else {
6630 $form->setType("type_mise_a_jour", "select");
6631
6632 }
6633 $form->setVal("type_mise_a_jour", $type_mise_a_jour);
6634 $contenu = array();
6635
6636 $contenu[0][0] = "date_envoi_signature";
6637 $contenu[1][0] = _("date d'envoi pour signature Mairie/Prefet");
6638
6639 $contenu[0][1] = "date_retour_signature";
6640 $contenu[1][1] = _("date de retour de signature Mairie/Prefet");
6641
6642 $contenu[0][2] = "date_retour_signature;date_envoi_controle_legalite";
6643 $contenu[1][2] = _("date de retour de signature + Envoi controle legalite");
6644
6645 $contenu[0][3] = "date_envoi_controle_legalite";
6646 $contenu[1][3] = _("date d'envoi au controle de legalite");
6647
6648 $contenu[0][4] = "date_retour_controle_legalite";
6649 $contenu[1][4] = _("date de retour de controle de legalite");
6650
6651 $contenu[0][5] = "date_retour_rar";
6652 $contenu[1][5] = __("date de notification du correspondant");
6653
6654 $form->setSelect("type_mise_a_jour", $contenu);
6655
6656 // Parametrage du champ date
6657 $form->setLib("date", _("Date")."* :");
6658 if(isset($infos)) {
6659 $form->setType("date", "hiddenstaticdate");
6660
6661 } else {
6662 $form->setType("date", "date");
6663 }
6664 $form->setVal("date", $date);
6665 $form->setTaille("date", 10);
6666 $form->setMax("date", 10);
6667
6668 // Parametrage du champ code_barres
6669 $form->setLib("code_barres", _("Code barres d'instruction")."* :");
6670 if(isset($infos)) {
6671 $form->setType("code_barres", "hiddenstatic");
6672 } else {
6673 $form->setType("code_barres", "text");
6674 }
6675 $form->setVal("code_barres", $code_barres);
6676 $form->setTaille("code_barres", 20);
6677 $form->setMax("code_barres", 20);
6678
6679 // Ajout des infos du dossier correspondantes à l'instruction séléctionnée
6680 if(isset($infos)) {
6681
6682 // Tous les champs sont défini par defaut à static
6683 foreach ($infos as $key => $value) {
6684 $form->setType($key, "static");
6685 if(in_array($key, $liste_champs)) {
6686 $form->setVal($key, $date);
6687 } else {
6688 $form->setVal($key, $value);
6689 }
6690 }
6691
6692 // Les champs dont on viens de définir la valeur sont en gras
6693 foreach ($liste_champs as $value) {
6694 $form->setBloc($value,'DF',"",'bold');
6695 }
6696
6697 // Parametrage du champ dossier
6698 $form->setLib("dossier_libelle", _("dossier_libelle")." :");
6699 $form->setType("dossier_libelle", "static");
6700 $form->setVal("dossier_libelle", $infos['dossier_libelle']);
6701
6702 // Parametrage du champ evenement
6703 $form->setLib("evenement", _("evenement")." :");
6704 $form->setType("evenement", "static");
6705 $form->setVal("evenement", $infos['evenement']);
6706
6707 // Parametrage du champ autorite_competente
6708 $form->setLib("autorite_competente", _("Autorite competente")." :");
6709 $form->setType("autorite_competente", "static");
6710 $form->setVal("autorite_competente", $infos['autorite_competente']);
6711
6712 // Parametrage des libellés d'envoi avec AR
6713 $form->setLib("date_envoi_rar", __("date_envoi_ar")." :");
6714 $form->setLib("date_retour_rar", __("date_notification")." :");
6715
6716 $form->setLib("date_envoi_signature", _("date_envoi_signature")." :");
6717 $form->setLib("date_retour_signature", _("date_retour_signature")." :");
6718 $form->setLib("date_envoi_controle_legalite", _("date_envoi_controle_legalite")." :");
6719 $form->setLib("date_retour_controle_legalite", _("date_retour_controle_legalite")." :");
6720 // Configuration des libellé en fonction de l'autorité compétente
6721 if($infos['autorite_competente_code'] == 'ETAT') {
6722 $form->setType("date_envoi_controle_legalite", "hiddendate");
6723 $form->setType("date_retour_controle_legalite", "hiddendate");
6724 }
6725
6726 // Ajout d'un champ hidden permettant de savoir que le formulaire précédant est celui de vérification
6727 $form->setLib("is_valid", _("Valide")." :");
6728 $form->setType("is_valid", "hidden");
6729 $form->setVal("is_valid", 'true');
6730
6731 $form->setFieldset('dossier_libelle','D',_('Synthese'));
6732 $form->setFieldset('is_valid','F');
6733
6734 }
6735
6736
6737 // Création du fieldset regroupant les champs permettant la mise à jour des date
6738 $form->setFieldset('type_mise_a_jour','D',_('Mise a jour'));
6739 $form->setFieldset('code_barres','F');
6740 // Affichage du formulaire
6741 $form->entete();
6742 $form->afficher($champs, 0, false, false);
6743 $form->enpied();
6744 // Affichage du bouton
6745 echo "\t<div class=\"formControls\">\n";
6746 //
6747 if(!$date_error) {
6748 $this->f->layout->display_form_button(array("value" => _("Valider"), "name" => "validation"));
6749 }
6750 // Si pas sur l'écran de validation
6751 if(isset($infos)) {
6752 echo "<a class=\"retour\" href=\"".OM_ROUTE_FORM."&obj=instruction_suivi_mise_a_jour_des_dates&action=170&idx=0";
6753 echo "&amp;type_mise_a_jour=".$type_mise_a_jour."&amp;date=".$date."&amp;code_barres=".$code_barres;
6754 echo "\">Retour</a>";
6755 }
6756 echo "\t</div>\n";
6757 // Fermeture du formulaire
6758 echo "\t</form>\n";
6759 }
6760
6761 /**
6762 * [view_pdf_lettre_rar description]
6763 *
6764 * @return [type] [description]
6765 */
6766 function view_pdf_lettre_rar() {
6767 // Vérification de l'accessibilité sur l'élément
6768 $this->checkAccessibility();
6769 //
6770 $this->f->disableLog();
6771
6772 if($this->f->get_submitted_get_value('liste') != null) {
6773 $listeCodeBarres = explode(',',$this->f->get_submitted_get_value('liste'));
6774
6775 // Classe permettant la mise en page de l'édition pdf
6776 require_once "../obj/pdf_lettre_rar.class.php";
6777 $pdf_lettre_rar = new pdf_lettre_rar('P', 'mm', 'A4');
6778 // Initialisation de la mise en page
6779 $pdf_lettre_rar->init($this->f);
6780
6781 foreach ($listeCodeBarres as $code_barres) {
6782
6783 // On récupère le dossier
6784 $sql = "SELECT dossier
6785 FROM " . DB_PREFIXE . "instruction
6786 WHERE code_barres = '" . $code_barres . "'";
6787 $dossier = $this->f->db->getOne($sql);
6788 $this->f->addToLog(__METHOD__."(): db->getOne(\"".$sql."\")", VERBOSE_MODE);
6789 $this->f->isDatabaseError($dossier);
6790 $inst_dossier = $this->f->get_inst__om_dbform(array(
6791 "obj" => "dossier",
6792 "idx" => $dossier,
6793 ));
6794
6795 // En fonction du type de dossier, on récupère un demandeur différent dans les requêtes
6796 $groupe = $inst_dossier->get_type_affichage_formulaire();
6797 switch ($groupe) {
6798 case 'CTX IN':
6799 $sql_demandeur = "(lien_dossier_demandeur.petitionnaire_principal IS TRUE AND demandeur.type_demandeur='plaignant')";
6800 break;
6801 case 'CTX RE':
6802 $sql_demandeur = "(lien_dossier_demandeur.petitionnaire_principal IS TRUE AND demandeur.type_demandeur='requerant')";
6803 break;
6804 case 'ADS':
6805 case 'DPC':
6806 case 'CONSULTATION ENTRANTE':
6807 default:
6808 $sql_demandeur = "((lien_dossier_demandeur.petitionnaire_principal IS TRUE AND demandeur.type_demandeur='petitionnaire') OR demandeur.type_demandeur='delegataire')";
6809 break;
6810 }
6811
6812 // Test si l'evenement est de type arrete et si un délégataire a été nommé
6813 $sql = "SELECT
6814 dossier.dossier_libelle,
6815 evenement.type,
6816 count(lien_dossier_demandeur) as nbdemandeur,
6817 CASE
6818 WHEN division.libelle IS NOT NULL AND phase.code IS NOT NULL
6819 THEN CONCAT(phase.code, ' - ', division.libelle)
6820 ELSE
6821 phase.code
6822 END AS code_phase
6823 FROM ".DB_PREFIXE."instruction
6824 LEFT JOIN ".DB_PREFIXE."dossier
6825 ON instruction.dossier = dossier.dossier
6826 LEFT JOIN ".DB_PREFIXE."division
6827 ON dossier.division = division.division
6828 INNER JOIN ".DB_PREFIXE."evenement ON
6829 instruction.evenement=evenement.evenement
6830 LEFT JOIN ".DB_PREFIXE."phase
6831 ON evenement.phase = phase.phase
6832 inner JOIN ".DB_PREFIXE."lien_dossier_demandeur ON
6833 instruction.dossier=lien_dossier_demandeur.dossier
6834 inner join ".DB_PREFIXE."demandeur on
6835 demandeur.demandeur=lien_dossier_demandeur.demandeur
6836 WHERE code_barres='".$code_barres."'
6837 AND " . $sql_demandeur . "
6838 GROUP BY dossier.dossier_libelle, evenement.type, phase.code, division.libelle";
6839
6840 $res = $this->f->db->query($sql);
6841 $this->f->addToLog(__METHOD__.": db->query(\"".$sql."\")", VERBOSE_MODE);
6842 $this->f->isDatabaseError($res);
6843 $testDemandeur = $res->fetchrow(DB_FETCHMODE_ASSOC);
6844
6845
6846 // Recuperation de l'adresse de destination
6847 $sqlAdresse = "SELECT
6848 CASE WHEN demandeur.qualite='particulier'
6849 THEN TRIM(CONCAT_WS(' ', pc.libelle, demandeur.particulier_nom, demandeur.particulier_prenom))
6850 ELSE TRIM(demandeur.personne_morale_denomination)
6851 END as ligne1,
6852 CASE WHEN demandeur.qualite='personne_morale'
6853 THEN TRIM(demandeur.personne_morale_raison_sociale)
6854 ELSE ''
6855 END as ligne1_1,
6856 CASE WHEN demandeur.qualite='personne_morale' AND (demandeur.personne_morale_nom IS NOT NULL OR demandeur.personne_morale_prenom IS NOT NULL)
6857 THEN TRIM(CONCAT_WS(' ', 'rep. par', demandeur.personne_morale_nom, demandeur.personne_morale_prenom))
6858 ELSE ''
6859 END as ligne1_2,
6860 trim(concat(demandeur.numero,' ',demandeur.voie)) as ligne2,
6861 CASE demandeur.complement
6862 WHEN null THEN ''
6863 ELSE trim(demandeur.complement)
6864 END as ligne3,
6865 CASE demandeur.lieu_dit
6866 WHEN null THEN ''
6867 ELSE trim(demandeur.lieu_dit)
6868 END as ligne4,
6869 CONCAT_WS(' ', demandeur.code_postal, demandeur.localite,
6870 (CASE WHEN demandeur.bp IS NOT NULL
6871 THEN CONCAT_WS(' ', 'BP', demandeur.bp)
6872 ELSE ''
6873 END),
6874 (CASE WHEN demandeur.cedex IS NOT NULL
6875 THEN CONCAT_WS(' ', 'CEDEX', demandeur.cedex)
6876 ELSE ''
6877 END))
6878 as ligne5,
6879 code_barres as code_barres
6880 FROM ".DB_PREFIXE."instruction
6881 INNER JOIN ".DB_PREFIXE."dossier ON dossier.dossier = instruction.dossier
6882 INNER JOIN ".DB_PREFIXE."lien_dossier_demandeur ON dossier.dossier = lien_dossier_demandeur.dossier
6883 INNER JOIN ".DB_PREFIXE."demandeur ON lien_dossier_demandeur.demandeur = demandeur.demandeur
6884 LEFT OUTER JOIN ".DB_PREFIXE."civilite as pc ON demandeur.particulier_civilite = pc.civilite OR demandeur.personne_morale_civilite = pc.civilite
6885 WHERE instruction.code_barres ='".$code_barres."'";
6886
6887 // Envoi pour delegataire ou petitionnaire principal selon le type d'evenement
6888 if($testDemandeur['type'] != 'arrete' AND $testDemandeur['nbdemandeur'] > 1) {
6889 $sqlAdresse .= " AND demandeur.type_demandeur='delegataire'";
6890 } else {
6891 $sqlAdresse .= " AND demandeur.type_demandeur='petitionnaire' AND lien_dossier_demandeur.petitionnaire_principal IS TRUE";
6892 }
6893
6894 $resAdresse = $this->f->db->query($sqlAdresse);
6895 $adresse_dest = $resAdresse->fetchrow(DB_FETCHMODE_ASSOC);
6896 $this->f->addToLog(__METHOD__.": db->query(\"".$sqlAdresse."\")", VERBOSE_MODE);
6897 $this->f->isDatabaseError($resAdresse);
6898
6899 // Création adresse destinataire sans ligne vide
6900 $adresse_destinataire = array();
6901 if (!empty($adresse_dest['ligne1'])) {
6902 $adresse_destinataire[] = $adresse_dest['ligne1'];
6903 }
6904 if (!empty($adresse_dest['ligne1_1'])) {
6905 $adresse_destinataire[] = $adresse_dest['ligne1_1'];
6906 }
6907 if (!empty($adresse_dest['ligne1_2'])) {
6908 $adresse_destinataire[] = $adresse_dest['ligne1_2'];
6909 }
6910 $adresse_destinataire[] = $adresse_dest['ligne2'];
6911 if (!empty($adresse_dest['ligne3'])) {
6912 $adresse_destinataire[] = $adresse_dest['ligne3'];
6913 }
6914 if (!empty($adresse_dest['ligne4'])) {
6915 $adresse_destinataire[] = $adresse_dest['ligne4'];
6916 }
6917 $adresse_destinataire[] = $adresse_dest['ligne5'];
6918
6919 // Création du champ specifique
6920 $specifique_content = array();
6921 $specifique_content[] = $adresse_dest['ligne1'];
6922 $specifique_content[] = $adresse_dest['ligne1_1'];
6923 $specifique_content[] = $adresse_dest['ligne1_2'];
6924 $specifique_content[] = $testDemandeur['dossier_libelle'];
6925 $specifique_content[] = "|||||".$adresse_dest['code_barres']."|||||";
6926 unset($adresse_dest['code_barres']);
6927 // Ajout d'une page aux pdf
6928 $pdf_lettre_rar->addLetter($adresse_destinataire, $specifique_content, $testDemandeur['code_phase']);
6929
6930 }
6931 $pdf_output = $pdf_lettre_rar->output("lettre_rar".date("dmYHis").".pdf","S");
6932 $om_edition = $this->f->get_inst__om_edition();
6933 $om_edition->expose_pdf_output($pdf_output, "lettre_rar".date("dmYHis").".pdf");
6934 }
6935 }
6936
6937 /**
6938 * VIEW - view_bordereau_envoi_maire.
6939 *
6940 * Formulaire demandant :
6941 * - le code-barres de l'événement d'instruction
6942 * - la date d'envoi du courrier pour signature par le maire
6943 *
6944 * Lors de la validation :
6945 * => met à jour cette date dans l'événement d'instruction
6946 * => crée un lien permettant de générer en PDF le bordereau
6947 *
6948 * @return void
6949 */
6950 function view_bordereau_envoi_maire() {
6951 // Vérification de l'accessibilité sur l'élément
6952 $this->checkAccessibility();
6953
6954 // Récupération des valeur passées en POST ou GET
6955 $code_barres = "";
6956 if($this->f->get_submitted_post_value('code_barres') !== null) {
6957 $code_barres = $this->f->get_submitted_post_value('code_barres');
6958 } elseif($this->f->get_submitted_get_value('code_barres')!==null) {
6959 $code_barres = $this->f->get_submitted_get_value('code_barres');
6960 }
6961 $date = "";
6962 if($this->f->get_submitted_post_value('date') !== null) {
6963 $date = $this->f->get_submitted_post_value('date');
6964 } elseif($this->f->get_submitted_get_value('date') !== null) {
6965 $date = $this->f->get_submitted_get_value('date');
6966 }
6967 $validation = 0;
6968 if($this->f->get_submitted_post_value('validation') !== null) {
6969 $validation = $this->f->get_submitted_post_value('validation');
6970 } elseif($this->f->get_submitted_get_value('validation') !== null) {
6971 $validation = $this->f->get_submitted_get_value('validation');
6972 }
6973
6974 // Si le formulaire a été validé
6975 if ($this->f->get_submitted_post_value('validation') !== null) {
6976 // Tous les champs doivent obligatoirement être remplis
6977 if (!empty($date) && !empty($code_barres)) {
6978 $date_en = $this->dateDB($date);
6979 // Si date valide
6980 if ($date_en != "") {
6981 $id_instruction = $this->get_instruction_by_barcode($code_barres);
6982 // Si un événement d'instruction a été trouvé pour ce code-barres
6983 if ($id_instruction !== null) {
6984 $ret = $this->update_date_envoi_signature($id_instruction, $date_en);
6985 // Si mise à jour réussie de la date d'envoi du courrier
6986 // pour signature par l'autorité compétente
6987 if($ret === true) {
6988 // Message de validation avec lien PDF
6989 $message_class = "valid";
6990 $message = '&bullet; '._("Veuillez cliquer sur le lien ci-dessous pour telecharger votre bordereau");
6991 $message .= " : <br/><br/>";
6992 $message .= "<a class='om-prev-icon pdf-16'";
6993 $message .= " id=\"generer_bordereau_envoi_maire\"";
6994 $message .= " title=\""._("Bordereau")."\"";
6995 $message .= " href='".OM_ROUTE_FORM."&obj=instruction";
6996 $message .= "&action=200";
6997 $message .= "&idx=".$id_instruction."'";
6998 $message .= " target='_blank'>";
6999 $message .= _("Bordereau d'envoi au maire");
7000 $message .= "</a><br/><br/>";
7001 $message .= '&bullet; '._("Rappel des informations saisies")." :<br/><br/>";
7002 $message .= _("Code du courrier")." : ".$code_barres."<br/>";
7003 $message .= _("Date d'envoi du courrier pour signature par le maire")." : ".$date;
7004
7005 } else {
7006 // Message d'erreur
7007 $message_class = "error";
7008 $message = sprintf(_("Erreur lors de la mise a jour de l'evenement d'instruction correspondant au code barres %s."),
7009 $code_barres);
7010 }
7011 }
7012 else {
7013 $message_class = "error";
7014 $message = _("Le numero saisi ne correspond a aucun code-barres d'evenement d'instruction.");
7015 }
7016 }
7017 else {
7018 $message_class = "error";
7019 $message = _("La date est invalide.");
7020 }
7021 } else {
7022 $message_class = "error";
7023 $message = _("Tous les champs doivent etre remplis.");
7024 }
7025 }
7026
7027 /**
7028 * Affichage des messages et du formulaire
7029 */
7030
7031 // Affichage du message de validation ou d'erreur
7032 if (isset($message) && isset($message_class) && $message != "") {
7033 $this->f->displayMessage($message_class, $message);
7034 }
7035
7036 // Ouverture du formulaire
7037 $datasubmit = $this->getDataSubmit();
7038 echo "\n<!-- ########## START DBFORM ########## -->\n";
7039 echo "<form";
7040 echo " id=\"bordereau_envoi_maire\"";
7041 echo " method=\"post\"";
7042 echo " name=\"f1\"";
7043 echo " action=\"";
7044 echo $datasubmit;
7045 echo "\"";
7046 echo ">\n";
7047
7048 // Paramétrage des champs du formulaire
7049 $champs = array("code_barres","date");
7050
7051 // Création d'un nouvel objet de type formulaire
7052 $form = $this->f->get_inst__om_formulaire(array(
7053 "validation" => 0,
7054 "maj" => 0,
7055 "champs" => $champs,
7056 ));
7057
7058 $template_required_label = '%s *';
7059 // Parametrage du champ code_barres
7060 $form->setLib("code_barres", sprintf($template_required_label,_("Code du courrier")));
7061 $form->setType("code_barres", "text");
7062 $form->setVal("code_barres", $code_barres);
7063 $form->setTaille("code_barres", 20);
7064 $form->setMax("code_barres", 20);
7065 // Parametrage du champ date
7066 $form->setLib("date", sprintf($template_required_label,_("Date d'envoi du courrier pour signature par le maire")));
7067 $form->setType("date", "date") ;
7068 if (empty($date)) {
7069 $date = date('d/m/Y');
7070 }
7071 $form->setVal("date", $date);
7072 $form->setTaille("date", 10);
7073 $form->setMax("date", 10);
7074
7075 // Création du bloc regroupant les champs
7076 $form->setBloc('code_barres','D');
7077 $form->setBloc('date','F');
7078 // Affichage du formulaire
7079 $form->entete();
7080 $form->afficher($champs, 0, false, false);
7081 $form->enpied();
7082 // Affichage du bouton
7083 printf("\t<div class=\"formControls\">\n");
7084 //
7085 $this->f->layout->display_form_button(array("value" => _("Valider"), "name" => "validation"));
7086 printf("\t</div>\n");
7087 // Fermeture du formulaire
7088 printf("\t</form>\n");
7089 }
7090
7091 /**
7092 * VIEW - view_bordereau_envoi_maire.
7093 *
7094 * PDF de bordereau d'envoi au maire pour l'événement d'instruction instancié
7095 *
7096 * @return [void]
7097 */
7098 function view_generate_bordereau_envoi_maire() {
7099 // Vérification de l'accessibilité sur l'élément
7100 $this->checkAccessibility();
7101 // Récupération de la collectivité du dossier d'instruction
7102 $collectivite_di = $this->get_dossier_instruction_om_collectivite();
7103 // Récupération de ses paramètres
7104 $collectivite = $this->f->getCollectivite($collectivite_di);
7105 // Génération du PDF
7106 $result = $this->compute_pdf_output('etat', 'communaute_bordereau_envoi_maire', $collectivite, $this->getVal(($this->clePrimaire)));
7107 // Affichage du PDF
7108 $this->expose_pdf_output(
7109 $result['pdf_output'],
7110 $result['filename']
7111 );
7112 }
7113
7114 /**
7115 * VIEW - view_rapport_instruction.
7116 *
7117 * Ouvre le sous-formulaire en ajaxIt dans un overlay.
7118 * Cette action est bindée pour utiliser la fonction popUpIt.
7119 *
7120 * @return void
7121 */
7122 function view_overlay_notification_manuelle() {
7123
7124 // Vérification de l'accessibilité sur l'élément
7125 $this->checkAccessibility();
7126
7127 printf(
7128 '<script type="text/javascript" >
7129 overlayIt(\'%1$s\',\'%2$s&objsf=%1$s&idxformulaire=%4$s&retourformulaire=dossier_instruction&obj=%1$s&action=411&idx=%3$s\', 1);
7130 </script>',
7131 'instruction_notification_manuelle',
7132 OM_ROUTE_SOUSFORM,
7133 $this->getVal($this->clePrimaire),
7134 $this->getVal('dossier')
7135 );
7136 }
7137
7138 /**
7139 * Retourne l'événement d'instruction dont on donne le code-barres, avec un filtre
7140 * pour exclure les dossiers du groupe contentieux.
7141 *
7142 * @param [string] $barcode numéro du code-barres
7143 * @return [mixed] ID de son instruction ou null si aucun code
7144 */
7145 function get_instruction_by_barcode($barcode) {
7146 // Begin
7147 $this->begin_treatment(__METHOD__);
7148 // Vérification de l'existence de l'événement d'instruction
7149 // pour le code-barres donné, en excluant les dossiers liés au groupe CTX
7150 $sql = "SELECT instruction
7151 FROM ".DB_PREFIXE."instruction
7152 INNER JOIN ".DB_PREFIXE."dossier
7153 ON dossier.dossier=instruction.dossier
7154 INNER JOIN ".DB_PREFIXE."dossier_instruction_type
7155 ON dossier.dossier_instruction_type = dossier_instruction_type.dossier_instruction_type
7156 INNER JOIN ".DB_PREFIXE."dossier_autorisation_type_detaille
7157 ON dossier_instruction_type.dossier_autorisation_type_detaille = dossier_autorisation_type_detaille.dossier_autorisation_type_detaille
7158 INNER JOIN ".DB_PREFIXE."dossier_autorisation_type
7159 ON dossier_autorisation_type_detaille.dossier_autorisation_type = dossier_autorisation_type.dossier_autorisation_type
7160 INNER JOIN ".DB_PREFIXE."groupe
7161 ON dossier_autorisation_type.groupe = groupe.groupe
7162 AND groupe.code != 'CTX'
7163 WHERE code_barres = '".$this->f->db->escapesimple($barcode)."'";
7164 $res = $this->f->db->getOne($sql);
7165 $this->f->addToLog(__METHOD__." : db->getOne(\"".$sql."\")", VERBOSE_MODE);
7166 $this->f->isDatabaseError($res);
7167 // Retourne résultat
7168 return $this->end_treatment(__METHOD__, $res);
7169 }
7170
7171 /**
7172 * Met à jour le champ date d'envoi signature
7173 * avec la date fournie et pour l'instruction donnée
7174 *
7175 * @param [string] $id ID de l'événement d'instruction
7176 * @param [string] $date date au format EN
7177 * @return [boolean] true si mise à jour avec succès
7178 */
7179 function update_date_envoi_signature($id, $date) {
7180 // Préparation du tableau
7181 $valF = array();
7182 $valF['date_envoi_signature'] = $date;
7183 // Begin
7184 $this->begin_treatment(__METHOD__);
7185 // Requête
7186 $res = $this->f->db->autoExecute(
7187 DB_PREFIXE.$this->table,
7188 $valF,
7189 DB_AUTOQUERY_UPDATE,
7190 $this->getCle($id)
7191 );
7192 // S'il y a eu une erreur
7193 if (database::isError($res, true)) {
7194 $this->end_treatment(__METHOD__, false);
7195 }
7196 //
7197 return $this->end_treatment(__METHOD__, true);
7198 }
7199
7200 /**
7201 * Méthode permettant de définir des valeurs à envoyer en base après
7202 * validation du formulaire d'ajout.
7203 * @param array $val tableau des valeurs retournées par le formulaire
7204 */
7205 function setValFAjout($val = array()) {
7206 // Mise à jour du flag created_by_commune lors d'un changement de décision
7207 // par un utilisateur de commune sur un dossier instruit par la comcom
7208 if ($this->isInstrCanChangeDecision($this->valF["dossier"])) {
7209 $this->valF['created_by_commune'] = true;
7210 }
7211
7212 //
7213 if ($this->evenement_has_an_edition($this->valF['evenement']) === false) {
7214 if (isset($this->valF['flag_edition_integrale']) === true) {
7215 unset($this->valF['flag_edition_integrale']);
7216 }
7217 if (isset($this->valF['signataire_arrete']) === true) {
7218 unset($this->valF['signataire_arrete']);
7219 }
7220 }
7221 }
7222
7223
7224 /**
7225 * Récupère l'instance d'un événement de workflow.
7226 *
7227 * @param mixed $evenement Identifiant de l'événement.
7228 *
7229 * @return object
7230 */
7231 function get_inst_evenement($evenement = null) {
7232 //
7233 return $this->get_inst_common("evenement", $evenement);
7234 }
7235
7236 /**
7237 * Logue l'action de l'instruction dans son DI.
7238 *
7239 * @param string $id Clé primaire de l'instruction.
7240 * @param array $val Valeurs de l'instruction.
7241 *
7242 * @return bool Vrai si traitement effectué avec succès
7243 */
7244 private function add_log_to_dossier($id, array $val) {
7245 $maj = $this->getParameter("maj");
7246 // Action = Trace par défaut
7247 $action = $this->get_backtrace();
7248 // Action = Identifant de l'action si contexte connu
7249 if (empty($maj) === false
7250 || (empty($maj) === true && $maj === 0)) {
7251 $action = $this->get_action_param($maj, 'identifier');
7252 if ($action === 'modifier_suivi') {
7253 $action = "modifier (via l'action suivi des dates)";
7254 }
7255 if ($action === 'notifier_commune'
7256 && isset($val['mails_destinataires']) === true) {
7257 $action = "notification de la commune (courriels : ";
7258 $action .= $val['mails_destinataires'].")";
7259 }
7260 }
7261 // Création du log
7262 $log = array(
7263 'date' => date('Y-m-d H:i:s'),
7264 'user' => $_SESSION['login'],
7265 'action' => $action,
7266 'values' => array(
7267 'date_evenement' => $this->dateDB($val['date_evenement']),
7268 'date_retour_rar' => $this->dateDB($val['date_retour_rar']),
7269 'date_retour_signature' => $this->dateDB($val['date_retour_signature']),
7270 'evenement' => $val['evenement'],
7271 'action' => $val['action'],
7272 'instruction' => $id,
7273 'etat' => $val['etat'],
7274 ),
7275 );
7276 // Ajout du log
7277 $di = $this->get_inst_dossier($val['dossier']);
7278 $ret = $di->add_log_instructions($log);
7279 if ($ret === false) {
7280 $this->correct = false;
7281 $this->msg = '';
7282 $this->addToMessage($di->msg);
7283 }
7284 return $ret;
7285 }
7286
7287
7288 /**
7289 * Retourne le contexte de déboguage formaté en HTML.
7290 *
7291 * @return string Une ligne par trace
7292 */
7293 private function get_backtrace() {
7294 $trace = debug_backtrace();
7295 $backtrace = '';
7296 $i = 1;
7297 foreach ($trace as $key => $value) {
7298 $func = $trace[$key]['function'];
7299 // On ne s'autolog pas
7300 if ($func === 'get_backtrace'
7301 || $func === 'add_log_to_dossier') {
7302 continue;
7303 }
7304 $backtrace .= $i.') ';
7305 // Si dans une classe
7306 if (isset($trace[$key]['class']) === true
7307 && empty($trace[$key]['class']) === false) {
7308 $backtrace .= $trace[$key]['class'].'->'.$func;
7309 }
7310 // Si procédural
7311 else {
7312 $file = $trace[$key]['file'];
7313 $line = $trace[$key]['line'];
7314 $truncated_file = $this->f->get_relative_path($file);
7315 if ($truncated_file !== false) {
7316 $file = $truncated_file;
7317 }
7318 $backtrace .= $func.' IN<br/>&nbsp;&nbsp;&nbsp;&nbsp; '.$file.':'.$line;
7319 }
7320 $backtrace .= '<br/>';
7321 $i++;
7322 }
7323 return $backtrace;
7324 }
7325
7326 /**
7327 * CONDITION - is_notifiable.
7328 *
7329 * Condition pour afficher l'action notifier_commune.
7330 *
7331 * @return boolean
7332 */
7333 public function is_notifiable() {
7334 // L'instruction doit être finalisée, ce qui revient à dire
7335 // définalisable sans bypass
7336 if ($this->is_unfinalizable_without_bypass() === false) {
7337 return false;
7338 }
7339 // La collectivité de l'utilisateur doit être de niveau multi
7340 if ($this->f->has_collectivite_multi() === false) {
7341 return false;
7342 }
7343 // Le paramètre multi de l'objet du courriel doit exister
7344 if ($this->f->getParameter('param_courriel_de_notification_commune_objet_depuis_instruction') === NULL) {
7345 return false;
7346 }
7347 // Le paramètre multi du modèle du courriel doit exister
7348 if ($this->f->getParameter('param_courriel_de_notification_commune_modele_depuis_instruction') === NULL) {
7349 return false;
7350 }
7351 // A ce stade toutes les conditions sont satisfaites
7352 return true;
7353 }
7354
7355 /**
7356 * TREATMENT - notifier_commune.
7357 *
7358 * Notifie aux communes et par courriel la finalisation d'une instruction.
7359 *
7360 * @return boolean
7361 */
7362 public function notifier_commune() {
7363 // Cette méthode permet d'exécuter une routine en début des méthodes
7364 // dites de TREATMENT.
7365 $this->begin_treatment(__METHOD__);
7366 // Définition des paramètres
7367 $p_objet = 'param_courriel_de_notification_commune_objet_depuis_instruction';
7368 $p_modele = 'param_courriel_de_notification_commune_modele_depuis_instruction';
7369 $p_courriel = 'param_courriel_de_notification_commune';
7370 // Définition des variables de substitution
7371 $id_di = $this->getVal('dossier');
7372 $id_inst = $this->getVal($this->clePrimaire);
7373 // Instanciation du DI
7374 $di = $this->get_inst_dossier($id_di);
7375 // Récupération du paramétrage de la collectivité du dossier
7376 $collectivite_di = $di->getVal('om_collectivite');
7377 $params_mono = $this->f->getCollectivite($collectivite_di);
7378 // Récupération du paramétrage de la collectivité multi
7379 $collectivite_multi = $this->f->get_idx_collectivite_multi();
7380 $params_multi = $this->f->getCollectivite($collectivite_multi);
7381 // Vérification de l'objet (obligatoirement multi)
7382 $objet = null;
7383 if (isset($params_multi[$p_objet]) === true
7384 && $params_multi[$p_objet] !== '') {
7385 $objet = $params_multi[$p_objet];
7386 }
7387 // Vérification du modèle mono en priorité
7388 $modele = null;
7389 if (isset($params_mono[$p_modele]) === true
7390 && $params_mono[$p_modele] !== '') {
7391 $modele = $params_mono[$p_modele];
7392
7393 }
7394 // Sinon vérification du modèle multi
7395 if ($modele === null
7396 && isset($params_multi[$p_modele]) === true
7397 && $params_multi[$p_modele] !== '') {
7398 $modele = $params_multi[$p_modele];
7399 }
7400 // Vérification des adresses de courriel mono
7401 $courriels_valides = array();
7402 $courriels_invalides = array();
7403 if (isset($params_mono[$p_courriel]) === true
7404 && $params_mono[$p_courriel] !== '') {
7405 // Un mail par ligne
7406 $adresses = explode("\n", $params_mono[$p_courriel]);
7407 // Vérification de la validité de chaque mail avec preg_match
7408 foreach ($adresses as $adresse) {
7409 $adresse = trim($adresse);
7410 if ($this->f->checkValidEmailAddress($adresse) === 1) {
7411 $courriels_valides[] = $adresse;
7412 } else {
7413 $courriels_invalides[] = $adresse;
7414 }
7415 }
7416 }
7417 // Vérification du paramétrage global :
7418 // on stoppe le traitement si au moins un paramètre est incorrect
7419 if ($objet === null
7420 || $modele === null
7421 || count($courriels_valides) === 0
7422 || count($courriels_invalides) > 0) {
7423 // On construit le message d'erreur adéquat
7424 $this->addToMessage(_('Erreur de paramétrage :'));
7425 if ($objet === null) {
7426 $this->addToMessage(_("* l'objet du courriel envoyé aux communes est vide"));
7427 }
7428 if ($modele === null) {
7429 $this->addToMessage(_("* le modèle du courriel envoyé aux communes est vide"));
7430 }
7431 if (count($courriels_valides) === 0) {
7432 $this->addToMessage(_("* aucun courriel valide de destinataire de la commune"));
7433 }
7434 if (count($courriels_invalides) > 0) {
7435 $courriels_invalides = implode(', ', $courriels_invalides);
7436 $this->addToMessage(_("* un ou plusieurs courriels des destinataires de la commune sont invalides : ").$courriels_invalides);
7437 }
7438 $this->addToMessage(_("Veuillez contacter votre administrateur."));
7439 return $this->end_treatment(__METHOD__, false);
7440 }
7441 // Remplacement des variables de substitution
7442 $objet = str_replace('<DOSSIER_INSTRUCTION>', $id_di, $objet);
7443 $modele = $this->formater_modele($modele, $id_di, $id_inst);
7444 // Exécution du traitement d'envoi du/des mail(s)
7445 $fails = array();
7446 foreach ($courriels_valides as $email) {
7447 if ($this->f->sendMail(
7448 iconv("UTF-8", "CP1252", $objet),
7449 iconv("UTF-8", "CP1252", $modele),
7450 iconv("UTF-8", "CP1252", $email)) === false) {
7451 $fails[] = $email;
7452 }
7453 }
7454 // Si échec message d'erreur et arrêt du traitement
7455 if (count($fails) > 0) {
7456 $fails = implode(', ', $fails);
7457 $this->addToMessage(_("Erreur lors de l'envoi du courriel aux destinataires : ").$fails);
7458 $this->addToMessage(_("Veuillez contacter votre administrateur."));
7459 return $this->end_treatment(__METHOD__, false);
7460 }
7461 // Ajout du log
7462 $this->setValFFromVal();
7463 $val_inst = $this->valF;
7464 $val_inst['mails_destinataires'] = implode(', ', $courriels_valides);
7465 if ($this->add_log_to_dossier($id_inst, $val_inst) === false) {
7466 $this->addToMessage(_("Erreur lors de la notification."));
7467 $this->addToMessage(_("Veuillez contacter votre administrateur."));
7468 return $this->end_treatment(__METHOD__, false);
7469 }
7470 // Message de validation
7471 $this->addToMessage(_('La commune a été notifiée.'));
7472 return $this->end_treatment(__METHOD__, true);
7473 }
7474
7475 /**
7476 * Formatte le corps du courriel notifié aux communes
7477 *
7478 * @param string $modele template du modèle du courriel
7479 * @param string $id_di clé primaire du DI
7480 * @param string $id_inst clé primaire de l'instruction
7481 * @return string corps du mail au format HTML
7482 */
7483 public function formater_modele($modele, $id_di, $id_inst) {
7484 // Création du lien d'accès direct à l'instruction
7485 $url_inst = PATH_BASE_URL.'app/index.php?module=form&direct_link=true&obj=dossier_instruction&action=3'.
7486 '&direct_field=dossier&direct_form=instruction&direct_action=3&direct_idx='.$id_inst;
7487 $url_inst = '<a href="'.$url_inst.'">'.$url_inst.'</a>';
7488 // Remplacement des champs de fusion
7489 $modele = str_replace('<DOSSIER_INSTRUCTION>', $id_di, $modele);
7490 $modele = str_replace('<URL_INSTRUCTION>', $url_inst, $modele);
7491 $modele = str_replace('<ID_INSTRUCTION>', $id_inst, $modele);
7492 // Encodage HTML des sauts de ligne
7493 $modele = preg_replace("/\r\n|\r|\n/",'<br/>',$modele);
7494 //
7495 return $modele;
7496 }
7497
7498
7499 /**
7500 * Récupère l'instance de l'instructeur
7501 *
7502 * @param integer $instructeur Identifiant de l'instructeur.
7503 *
7504 * @return object
7505 */
7506 protected function get_inst_instructeur($instructeur) {
7507 //
7508 return $this->get_inst_common("instructeur", $instructeur);
7509 }
7510
7511
7512 /**
7513 * Récupère l'instance de l'utilisateur
7514 *
7515 * @param integer $om_utilisateur Identifiant de l'utilisateur.
7516 *
7517 * @return object
7518 */
7519 protected function get_inst_om_utilisateur($om_utilisateur) {
7520 //
7521 return $this->get_inst_common("om_utilisateur", $om_utilisateur);
7522 }
7523
7524
7525 /**
7526 * Récupère l'instance de la division.
7527 *
7528 * @param integer $division Identifiant de la division.
7529 *
7530 * @return object
7531 */
7532 protected function get_inst_division($division) {
7533 //
7534 return $this->get_inst_common("division", $division);
7535 }
7536
7537
7538 /**
7539 * Récupère l'instance de la direction.
7540 *
7541 * @param integer $direction Identifiant de la direction.
7542 *
7543 * @return object
7544 */
7545 protected function get_inst_direction($direction) {
7546 //
7547 return $this->get_inst_common("direction", $direction);
7548 }
7549
7550
7551 /**
7552 * Récupère la collectivité d'un instructeur en passant par sa division puis
7553 * par sa direction.
7554 *
7555 * @param integer $instructeur Identifiant de l'instructeur.
7556 *
7557 * @return integer
7558 */
7559 protected function get_instructeur_om_collectivite($instructeur) {
7560 // Chemin vers la collectivité d'un instructeur
7561 $inst_instr = $this->get_inst_instructeur($instructeur);
7562 $inst_division = $this->get_inst_division($inst_instr->getVal('division'));
7563 $inst_direction = $this->get_inst_direction($inst_division->getVal('direction'));
7564
7565 // Collectivité
7566 $om_collectivite = $inst_direction->getVal('om_collectivite');
7567
7568 //
7569 return $om_collectivite;
7570 }
7571
7572 /*
7573 * CONDITION - can_user_access_dossier_contexte_ajout
7574 *
7575 * Vérifie que l'utilisateur a bien accès au dossier d'instruction passé dans le
7576 * formulaire d'ajout.
7577 * Cette méthode vérifie que l'utilisateur est lié au groupe du dossier, et si le
7578 * dossier est confidentiel qu'il a accès aux confidentiels de ce groupe.
7579 *
7580 */
7581 function can_user_access_dossier_contexte_ajout() {
7582
7583 ($this->f->get_submitted_get_value('idxformulaire') !== null ? $id_dossier =
7584 $this->f->get_submitted_get_value('idxformulaire') : $id_dossier = "");
7585 //
7586 if ($id_dossier !== "") {
7587 $dossier = $this->f->get_inst__om_dbform(array(
7588 "obj" => "dossier_instruction",
7589 "idx" => $id_dossier,
7590 ));
7591 //
7592 return $dossier->can_user_access_dossier();
7593 }
7594 return false;
7595 }
7596
7597 /*
7598 * CONDITION - can_user_access_dossier
7599 *
7600 * Vérifie que l'utilisateur a bien accès au dossier lié à l'instruction instanciée.
7601 * Cette méthode vérifie que l'utilisateur est lié au groupe du dossier, et si le
7602 * dossier est confidentiel qu'il a accès aux confidentiels de ce groupe.
7603 *
7604 */
7605 function can_user_access_dossier_contexte_modification() {
7606
7607 $id_dossier = $this->getVal('dossier');
7608 //
7609 if ($id_dossier !== "" && $id_dossier !== null) {
7610 $dossier = $this->f->get_inst__om_dbform(array(
7611 "obj" => "dossier_instruction",
7612 "idx" => $id_dossier,
7613 ));
7614 //
7615 return $dossier->can_user_access_dossier();
7616 }
7617 return false;
7618 }
7619
7620 /**
7621 * TREATMENT - envoyer_a_signature_sans_relecture
7622 *
7623 * Permet d'envoyer le document de l'instruction au parapheur pour signature sans relecture
7624 *
7625 * @return boolean true si l'envoi a été effectué avec succès false sinon
7626 */
7627 function envoyer_a_signature_sans_relecture() {
7628 return $this->envoyer_a_signature();
7629 }
7630
7631 /**
7632 * TREATMENT - envoyer_a_signature_avec_relecture
7633 *
7634 * Permet d'envoyer le document de l'instruction au parapheur pour signature avec relecture
7635 *
7636 * @return boolean true si l'envoi a été effectué avec succès false sinon
7637 */
7638 function envoyer_a_signature_avec_relecture() {
7639 $is_forced_view_files = true;
7640 return $this->envoyer_a_signature($is_forced_view_files);
7641 }
7642
7643 /**
7644 * TREATMENT - envoyer_a_signature
7645 *
7646 * Permet d'envoyer le document de l'instruction au parapheur pour signature
7647 *
7648 * @param boolean $is_forced_view_files Indique si il y a une relecture (true) ou non (false)
7649 *
7650 * @return boolean true si l'envoi a été effectué avec succès false sinon
7651 */
7652 function envoyer_a_signature($is_forced_view_files = false) {
7653 $this->begin_treatment(__METHOD__);
7654 $this->correct = true;
7655
7656 // Instanciation de l'objet signataire_arrete
7657 $inst_signataire_arrete = $this->f->get_inst__om_dbform(array(
7658 'obj' => 'signataire_arrete',
7659 'idx' => $this->getVal('signataire_arrete'),
7660 ));
7661
7662 // Instanciation de l'objet dossier
7663 $inst_dossier = $this->f->get_inst__om_dbform(array(
7664 'obj' => 'dossier',
7665 'idx' => $this->getVal('dossier'),
7666 ));
7667
7668 // Récupération du document à signer
7669 $file = $this->f->storage->get($this->getVal('om_fichier_instruction'));
7670 if ($file === OP_FAILURE) {
7671 $this->correct = false;
7672 $this->addToMessage(__("Une erreur est survenue lors de la récupération du contenu du document de l'instruction."));
7673 // Termine le traitement
7674 return $this->end_treatment(__METHOD__, false);
7675 }
7676
7677 // Initialisation des paramètre à passer pour l'envoi en signature
7678 $data = array(
7679 "om_utilisateur_email" => $this->f->om_utilisateur['email'],
7680 "om_utilisateur_nom" => $this->f->om_utilisateur['nom'],
7681 "signataire_arrete_email" => $inst_signataire_arrete->getVal('email'),
7682 "signataire_arrete_nom" => $inst_signataire_arrete->getVal('nom'),
7683 "signataire_arrete_prenom" => $inst_signataire_arrete->getVal('prenom'),
7684 "date_limite_instruction" => $inst_dossier->getVal('incomplet_notifie') === 't' ? $inst_dossier->getVal('date_limite_incompletude') : $inst_dossier->getVal('date_limite'),
7685 "dossier" => $this->getVal('dossier'),
7686 "is_forced_view_files" => $is_forced_view_files,
7687 'commentaire_signature' => $is_forced_view_files === true ? __('relecture demandee.') : null
7688 );
7689
7690 // Initialisation des métadonnées
7691 $metadonnee_dossier = $file['metadata'];
7692 // récupération de l'extension du fichier
7693 $extension = substr($metadonnee_dossier['filename'], strrpos($metadonnee_dossier['filename'], '.'));
7694 // Modification du libellé du document transmis au parapheur
7695 // pour le mettre sous la forme : instruction_xxx_libelle_lettretype.extension
7696 $metadonnee_dossier['filename'] = $this->getDocumentLibelle().$extension;
7697 $metadonnee_dossier['titre_document'] = $this->getDocumentTitre();
7698
7699 $metadonnee_dossier['url_di'] = sprintf(
7700 '%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',
7701 $this->f->get_param_base_path_metadata_url_di() !== null ? $this->f->get_param_base_path_metadata_url_di() : PATH_BASE_URL,
7702 $this->getVal($this->clePrimaire)
7703 );
7704
7705 $optional_data = null;
7706 // Si il y a des paramètres supplémentaire spécifié dans le signataire alors on les récupère
7707 if ($inst_signataire_arrete->getVal('parametre_parapheur') !== null && $inst_signataire_arrete->getVal('parametre_parapheur') !== '') {
7708 $optional_data = json_decode($inst_signataire_arrete->getVal('parametre_parapheur'), true);
7709 if (json_last_error() !== JSON_ERROR_NONE) {
7710 $this->correct = false;
7711 $this->addToMessage(__("Les paramètres supplémentaires envoyés au parapheur ne sont pas au bon format."));
7712 $this->addToLog(__METHOD__."(): ".
7713 __("Erreur lors du décodage du format json des paramètres supplémentaires envoyé au parapheur.
7714 Tableau : ").var_export($inst_signataire_arrete->getVal('parametre_parapheur'), true)
7715 );
7716 // Termine le traitement
7717 return $this->end_treatment(__METHOD__, false);
7718 }
7719 }
7720
7721 //Instanciation de la classe electronicsignature
7722 $inst_es = $this->get_electronicsignature_instance();
7723 if ($inst_es === false) {
7724 $this->correct = false;
7725 return $this->end_treatment(__METHOD__, false);
7726 }
7727
7728 // Appel de la méthode de l'abstracteur send_for_signature()
7729 // Cette méthode doit retourner un tableau de valeur
7730 try {
7731 $result = $inst_es->send_for_signature($data, $file['file_content'], $metadonnee_dossier, $optional_data);
7732 } catch (electronicsignature_exception $e) {
7733 $this->handle_electronicsignature_exception($e);
7734 return $this->end_treatment(__METHOD__, false);
7735 }
7736
7737 // Après avoir reçu le résultat du parapheur, il faut mettre à jour les champs
7738 $valF = array();
7739
7740 // Pour appeler la fonction modifier il faut traiter tous les champs de l'objet
7741 foreach($this->champs as $identifiant => $champ) {
7742 $valF[$champ] = $this->val[$identifiant];
7743 }
7744 // On fait ensuite nos modifications spécifiques
7745 $valF['id_parapheur_signature'] = $result['id_parapheur_signature'];
7746 $valF['statut_signature'] = $result['statut'];
7747 $valF['commentaire_signature'] = isset($result['commentaire_signature']) == true ? $result['commentaire_signature'] : null;
7748 $valF['date_envoi_signature'] = date("Y-m-d", strtotime($result['date_envoi_signature']));
7749 $valF['historique_signature'] = $this->get_updated_historique_signature($result);
7750
7751 $ret = $this->modifier($valF);
7752
7753 if ($ret === false) {
7754 $this->correct = false;
7755 $this->addToMessage(__("Une erreur est survenue lors de la mise à jour des champs."));
7756 // Termine le traitement
7757 return $this->end_treatment(__METHOD__, false);
7758 }
7759
7760 // Message
7761 $this->addToMessage(__("Le document a été envoyé pour signature dans le parapheur."));
7762 if (array_key_exists('signature_page_url', $result) === true) {
7763 $this->addToMessage(sprintf(
7764 '<br> > <a href="%1$s" title="%2$s" target="_blank">%2$s</a>',
7765 $result['signature_page_url'],
7766 __("Signez directement le document")
7767 ));
7768 }
7769
7770 // Tout s'est bien passé, on termine le traitement
7771 return $this->end_treatment(__METHOD__, true);
7772 }
7773
7774 /**
7775 * Permet de récupérer la traduction de la valeur de statut_signature
7776 *
7777 * @return string la valeur de statut_signature traduite | false
7778 */
7779 function get_trad_for_statut($value_to_trad){
7780 $statut_signature_tab = array(
7781 'waiting' => __('en préparation'),
7782 'in_progress' => __('en cours de signature'),
7783 'canceled' => __('signature annulée'),
7784 'expired' => __('délai de signature expiré'),
7785 'finished' => __('signé')
7786 );
7787 if (array_key_exists($value_to_trad, $statut_signature_tab) === true) {
7788 return $statut_signature_tab[$value_to_trad];
7789 }
7790
7791 return false;
7792 }
7793
7794 /**
7795 * Permet de mettre à jour le tableau json sotcké dans le champ historique_signature
7796 *
7797 * @return string (json) la valeur de historique_signature mis à jour | false
7798 */
7799 function get_updated_historique_signature($historique_signature_values) {
7800
7801 $historique_signature_value_tab = $this->get_historique_signature_decoded();
7802
7803 if ($historique_signature_value_tab === false) {
7804 $this->addToLog(__METHOD__."(): erreur historique signature", DEBUG_MODE);
7805 return false;
7806 }
7807
7808 $last_val_historique_signature = array();
7809
7810 // Si la tableau récupéré n'est pas vide alors
7811 // on récupère la dernière ligne du tableau
7812 if (empty($historique_signature_value_tab) === false) {
7813 $last_val_historique_signature = end($historique_signature_value_tab);
7814 }
7815
7816 $format_date = '';
7817 $format_date_hour = '';
7818 $date_converted=array();
7819
7820 $date_to_convert = array(
7821 'date_envoi_signature' => $historique_signature_values['date_envoi_signature'],
7822 'date_limite_instruction' => $historique_signature_values['date_limite_instruction'],
7823 'date_retour_signature' => $historique_signature_values['date_retour_signature']
7824 );
7825
7826 // Conversion des dates en fonction de leur format
7827 foreach ($date_to_convert as $key => $value) {
7828 $date_converted[$key] = null;
7829 if ($value != null) {
7830 $format_date = 'd/m/Y';
7831 $format_date_hour = 'd/m/Y H:i:s';
7832 $date_converted[$key] = empty(date_parse($value)['hour']) === false ? date($format_date_hour, strtotime($value)) : date($format_date, strtotime($value));
7833 }
7834 }
7835
7836 // Ce tableau permet de lister les colonnes de historique_signature et de les rendre traduisibles.
7837 // Il faut en effet mettre les gettext avec l'intitulé explicite au moins
7838 // une fois afin qu'il puisse être reconnu par le logiciel de traduction.
7839 $tab_for_columns_trad = array(
7840 __('entry_date'),
7841 __('id_parapheur_signature'),
7842 __('emetteur'),
7843 __('signataire'),
7844 __('date_envoi'),
7845 __('date_limite'),
7846 __('date_retour'),
7847 __('statut_signature'),
7848 __('commentaire_signature')
7849 );
7850
7851 array_push($historique_signature_value_tab, array(
7852 'entry_date' => date('d/m/Y H:i:s'),
7853 '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'],
7854 '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'],
7855 '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'],
7856 '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'],
7857 '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'],
7858 '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'],
7859 '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']),
7860 'commentaire_signature' => isset($historique_signature_values['commentaire_signature']) === false || $historique_signature_values['commentaire_signature'] == null ? null : $historique_signature_values['commentaire_signature'],
7861 ));
7862
7863 return json_encode($historique_signature_value_tab, JSON_HEX_APOS);
7864 }
7865
7866
7867 /**
7868 * Récupère le contenu du champ historique_signature et le converti en tableau
7869 *
7870 * @return array sinon false en cas d'erreur
7871 */
7872 protected function get_historique_signature_decoded() {
7873 $val = $this->getVal('historique_signature');
7874 if ($val === '') {
7875 $val = json_encode(array());
7876 }
7877 if($this->isJson($val) === false) {
7878 return false;
7879 }
7880 return json_decode($val, true);
7881 }
7882
7883 /**
7884 * Récupère les informations à afficher dans le tableau de suivi à l'aide
7885 * d'une requête sql. Stocke ces informations dans un tableau.
7886 * Converti le tableau au format json et renvoi le json obtenu
7887 *
7888 * @return json
7889 */
7890 protected function get_json_suivi_notification() {
7891 $valSuivi = array();
7892 // Liste des champs à afficher. Permet également la traduction des noms de colonnes.
7893 $listeChampsTrad = array(
7894 __('emetteur'),
7895 __('date_envoi'),
7896 __('destinataire'),
7897 __('date_premier_acces'),
7898 __('instruction'),
7899 __('statut'),
7900 __('commentaire')
7901 );
7902 $listeChamps = array(
7903 'emetteur',
7904 'date_envoi',
7905 'destinataire',
7906 'date_premier_acces',
7907 'instruction',
7908 'statut',
7909 'commentaire'
7910 );
7911
7912 // Récupération des infos nécessaires à l'affichage du tableau
7913 $sql = sprintf(
7914 'SELECT
7915 instruction_notification.instruction_notification,
7916 CASE WHEN instruction_notification.automatique = TRUE
7917 THEN TRIM(CONCAT(instruction_notification.emetteur, \' \', \'(automatique)\'))
7918 ELSE instruction_notification.emetteur
7919 END as emetteur,
7920 date_envoi,
7921 instruction_notification.destinataire,
7922 instruction_notification.date_premier_acces,
7923 evenement.libelle as instruction,
7924 instruction_notification.statut,
7925 instruction_notification.commentaire,
7926 instruction_notification_document.instruction as instruction_annexe
7927 FROM
7928 %1$sinstruction_notification
7929 LEFT JOIN %1$sinstruction
7930 ON instruction.instruction = instruction_notification.instruction
7931 LEFT JOIN %1$sevenement
7932 ON instruction.evenement = evenement.evenement
7933 LEFT JOIN %1$sinstruction_notification_document
7934 ON instruction_notification.instruction_notification = instruction_notification_document.instruction_notification
7935 AND instruction_notification_document.annexe = true
7936 WHERE
7937 instruction.instruction = %2$s
7938 ORDER BY
7939 date_envoi ASC, instruction_notification.destinataire ASC',
7940 DB_PREFIXE,
7941 $this->getVal('instruction')
7942 );
7943 $res = $this->f->db->query($sql);
7944 $this->f->addToLog(__METHOD__."(): db->query(\"".$sql."\")", VERBOSE_MODE);
7945 $this->f->isDatabaseError($res);
7946 // Stockage des infos de chaque notification dans un tableau
7947 while( $row =& $res->fetchrow(DB_FETCHMODE_ASSOC) ) {
7948 $valNotif = array();
7949 foreach($listeChamps as $champ) {
7950 $valNotif[$champ] = $row[$champ];
7951 if (($champ === 'date_envoi'
7952 || $champ === 'date_premier_acces')
7953 && $row[$champ] !== null
7954 && $row[$champ] !== '') {
7955 //
7956 $valNotif[$champ] = date('d/m/Y H:i:s', strtotime($row[$champ]));
7957 }
7958 }
7959 if ($row['instruction_annexe'] !== null && $row['instruction_annexe'] !== '') {
7960 $inst_instruction = $this->f->get_inst__om_dbform(array(
7961 "obj" => "instruction",
7962 "idx" => $row['instruction_annexe'],
7963 ));
7964 $inst_evenement = $inst_instruction->get_inst_evenement();
7965 $lienAnnexe = ' ('.$inst_evenement->getVal('libelle').')';
7966 $valNotif['instruction'] .= $lienAnnexe;
7967 }
7968 array_push($valSuivi, $valNotif);
7969 }
7970
7971 // Passage du tableau au format json
7972 return json_encode($valSuivi, JSON_HEX_APOS);
7973 }
7974
7975 /**
7976 * Traitement des erreurs retournées par l'abstracteur electronicsignature.
7977 *
7978 * @param electronicsignature_exception $exception Exception retournée par l'abstracteur.
7979 *
7980 * @return void
7981 */
7982 public function handle_electronicsignature_exception(electronicsignature_exception $exception) {
7983 $this->f->displayMessage('error', $exception->getMessage());
7984 }
7985
7986
7987 /**
7988 * Retourne une instance du connecteur electronicsignature, et la créer si elle n'existe pas.
7989 *
7990 * @param boolean $with_handle_error Flag pour afficher ou non le message d'erreur à l'utilisateur.
7991 * @return electronicsignature Instance de l'abstracteur.
7992 */
7993 public function get_electronicsignature_instance($with_handle_error = true) {
7994 if(isset($this->electronicsignature_instance)) {
7995 return $this->electronicsignature_instance;
7996 }
7997 // Instanciation du connecteur electronicsignature
7998 try {
7999 require_once "electronicsignature.class.php";
8000 $collectivites = array("collectivite_idx" => $this->get_dossier_instruction_om_collectivite(), "collectivite_multi_idx" => $this->f->get_idx_collectivite_multi());
8001 $this->electronicsignature_instance = new electronicsignature($collectivites);
8002 } catch (electronicsignature_exception $e) {
8003 if ($with_handle_error === true) {
8004 $this->handle_electronicsignature_exception($e);
8005 }
8006 return false;
8007 }
8008 return $this->electronicsignature_instance;
8009 }
8010
8011 /**
8012 * TREATMENT - envoyer_au_controle_de_legalite
8013 *
8014 * Ajoute la tâche envoi_CL.
8015 * C'est le traitement de la tâche qui mettra à jour la date d'envoi au contrôle de légalité.
8016 *
8017 * @return [type] [description]
8018 */
8019 function envoyer_au_controle_de_legalite() {
8020 $this->begin_treatment(__METHOD__);
8021 $this->correct = true;
8022
8023 //
8024 if ($this->can_be_sended_to_cl() === true) {
8025 // Création de la task 'envoi_CL'
8026 $inst_task = $this->f->get_inst__om_dbform(array(
8027 "obj" => "task",
8028 "idx" => 0,
8029 ));
8030 $task_val = array(
8031 'type' => 'envoi_CL',
8032 'object_id' => $this->getVal('instruction'),
8033 'dossier' => $this->getVal('dossier'),
8034 );
8035 // Change l'état de la tâche de notification en fonction de l'état de
8036 // transmission du dossier d'instruction
8037 $inst_di = $this->get_inst_dossier($this->getVal('dossier'));
8038 if ($this->f->is_option_mode_service_consulte_enabled() === false
8039 && ($inst_di->getVal('etat_transmission_platau') == 'non_transmissible'
8040 || $inst_di->getVal('etat_transmission_platau') == 'transmis_mais_non_transmissible')) {
8041 //
8042 $task_val['state'] = $inst_task::STATUS_DRAFT;
8043 }
8044 $add_task = $inst_task->add_task(array('val' => $task_val));
8045 if ($add_task === false) {
8046 $this->addToMessage(sprintf('%s %s',
8047 __("Une erreur s'est produite lors de la création tâche."),
8048 __("Veuillez contacter votre administrateur.")
8049 ));
8050 $this->correct = false;
8051 return $this->end_treatment(__METHOD__, false);
8052 }
8053 // Mise à jour du champs 'envoye_cl_platau'
8054 $instr_val = array(
8055 'envoye_cl_platau' => 't',
8056 );
8057 $res = $this->f->db->autoExecute(
8058 DB_PREFIXE.$this->table,
8059 $instr_val,
8060 DB_AUTOQUERY_UPDATE,
8061 $this->getCle($this->getVal($this->clePrimaire))
8062 );
8063 $this->addToLog(__METHOD__."(): db->autoexecute(\"".DB_PREFIXE.'.'.$this->table."\", ".print_r($instr_val, true).", DB_AUTOQUERY_UPDATE, \"".$this->getCle($this->clePrimaire)."\");", DEBUG_MODE);
8064 if ($this->f->isDatabaseError($res, true) === true) {
8065 $this->addToMessage(sprintf('%s %s',
8066 __("Une erreur s'est produite lors de la mise à jour de l'instruction."),
8067 __("Veuillez contacter votre administrateur.")
8068 ));
8069 $this->correct = false;
8070 return $this->end_treatment(__METHOD__, false);
8071 }
8072 // Message de validation à l'utilisateur
8073 $this->addToMessage(__('Votre demande de transfert au contrôle de légalité à bien été prise en compte.'));
8074 $this->addToMessage(__("La date d'envoi au contrôle de légalité sera mise à jour ultérieurement."));
8075 }
8076 //
8077 return $this->end_treatment(__METHOD__, true);
8078 }
8079
8080
8081 /**
8082 * Retourne le lien de retour (VIEW formulaire et VIEW sousformulaire).
8083 *
8084 * @param string $view Appel dans le contexte de la vue 'formulaire' ou de
8085 * la vue 'sousformulaire'.
8086 *
8087 * @return string
8088 */
8089 function get_back_link($view = "formulaire") {
8090 //
8091 $href = parent::get_back_link($view);
8092 //
8093 $crud = $this->get_action_crud();
8094
8095 // Redirection vers le formulaire de modification à la validation du
8096 // formulaire d'ajout si l'événement associé possède une lettre type
8097 if (($crud === 'create'
8098 || ($crud === null
8099 && $this->getParameter('maj') == 0))
8100 && $this->correct == true
8101 && $this->evenement_has_an_edition($this->valF['evenement']) === true) {
8102
8103 // On instancie l'instruction
8104 $inst_instruction = $this->f->get_inst__om_dbform(array(
8105 "obj" => "instruction",
8106 "idx" => $this->valF[$this->clePrimaire],
8107 ));
8108
8109 // Si l'instruction n'est pas finalisée automatiquement
8110 if ($inst_instruction->getVal('om_final_instruction') !== 't') {
8111 $href = str_replace("&action=3", "&action=1", $href);
8112 //
8113 if (strpos($href, "&retour=tab") !== false) {
8114 $href = str_replace("&retour=tab", "&retour= form", $href);
8115 } else {
8116 $href .= "&retour=form";
8117 }
8118 }
8119 }
8120
8121 //
8122 return $href;
8123 }
8124
8125 public function view_json_data() {
8126 $this->checkAccessibility();
8127 $this->f->disableLog();
8128 $view = $this->get_json_data();
8129 printf(json_encode($view));
8130 }
8131
8132 public function get_json_data() {
8133 $val = array_combine($this->champs, $this->val);
8134 foreach ($val as $key => $value) {
8135 $val[$key] = strip_tags($value);
8136 }
8137 $val['tacite'] = 'f';
8138 $inst_ad = $this->f->get_inst__om_dbform(array(
8139 "obj" => "avis_decision",
8140 "idx" => $val['avis_decision'],
8141 ));
8142 if (preg_match('/[tT]acite/', $inst_ad->getVal('libelle')) === 1) {
8143 $val['tacite'] = 't';
8144 }
8145 return $val;
8146 }
8147
8148 public function get_related_instructions_next($next_type = 'retour_signature', $instruction = null) {
8149 if (in_array($next_type, array('retour_signature', 'retour_ar', 'suivant_tacite', )) === false) {
8150 return false;
8151 }
8152 $result = array();
8153 $evenements = array();
8154 if ($instruction === null) {
8155 $instruction = $this->getVal($this->clePrimaire);
8156 $evenement = $this->getVal('evenement');
8157 $dossier = $this->getVal('dossier');
8158 } else {
8159 $inst = $this->f->get_inst__om_dbform(array(
8160 "obj" => "instruction",
8161 "idx" => $instruction,
8162 ));
8163 $evenement = $inst->getVal('evenement');
8164 $dossier = $inst->getVal('dossier');
8165 }
8166 //
8167 $query = sprintf('
8168 SELECT evenement_%3$s
8169 FROM %1$sevenement
8170 WHERE evenement = %2$s
8171 ',
8172 DB_PREFIXE,
8173 $evenement,
8174 $next_type
8175 );
8176 $res = $this->f->get_one_result_from_db_query($query, true);
8177 if ($res['code'] === 'KO') {
8178 return false;
8179 }
8180 $ev_next = $res['result'];
8181 //
8182 $query = sprintf('
8183 SELECT MAX(instruction.instruction) as instruction
8184 FROM %1$sinstruction
8185 WHERE dossier = \'%3$s\'
8186 AND evenement = %2$s
8187 ',
8188 DB_PREFIXE,
8189 $ev_next,
8190 $dossier
8191 );
8192 $res = $this->f->get_one_result_from_db_query($query, true);
8193 if ($res['code'] === 'KO') {
8194 return false;
8195 }
8196 //
8197 return $res['result'];
8198 }
8199
8200 public function get_related_instructions($instruction = null) {
8201 $result = array();
8202 $evenements = array();
8203 if ($instruction === null) {
8204 $instruction = $this->getVal($this->clePrimaire);
8205 $evenement = $this->getVal('evenement');
8206 $dossier = $this->getVal('dossier');
8207 } else {
8208 $inst = $this->f->get_inst__om_dbform(array(
8209 "obj" => "instruction",
8210 "idx" => $instruction,
8211 ));
8212 $evenement = $inst->getVal('evenement');
8213 $dossier = $inst->getVal('dossier');
8214 }
8215 //
8216 $query = sprintf('
8217 SELECT evenement
8218 FROM %1$sevenement
8219 WHERE evenement_retour_ar = %2$s
8220 OR evenement_retour_signature = %2$s
8221 ',
8222 DB_PREFIXE,
8223 $evenement
8224 );
8225 $res = $this->f->get_one_result_from_db_query($query, true);
8226 if ($res['code'] === 'KO') {
8227 return false;
8228 }
8229 $ev_parent = $res['result'];
8230 //
8231 $query = sprintf('
8232 SELECT MAX(instruction.instruction) as instruction
8233 FROM %1$sinstruction
8234 WHERE dossier = \'%3$s\'
8235 AND evenement = %2$s
8236 ',
8237 DB_PREFIXE,
8238 $ev_parent,
8239 $dossier
8240 );
8241 $res = $this->f->get_one_result_from_db_query($query, true);
8242 if ($res['code'] === 'KO') {
8243 return false;
8244 }
8245 $result[] = $res['result'];
8246 //
8247 $query = sprintf('
8248 SELECT evenement_retour_ar
8249 FROM %1$sevenement
8250 WHERE evenement = %2$s
8251 AND evenement_retour_ar != %3$s
8252 ',
8253 DB_PREFIXE,
8254 $ev_parent,
8255 $evenement
8256 );
8257 $res = $this->f->get_one_result_from_db_query($query, true);
8258 if ($res['code'] === 'KO') {
8259 return false;
8260 }
8261 $evenements[] = $res['result'];
8262 //
8263 $query = sprintf('
8264 SELECT evenement_retour_signature
8265 FROM %1$sevenement
8266 WHERE evenement = %2$s
8267 AND evenement_retour_signature != %3$s
8268 ',
8269 DB_PREFIXE,
8270 $ev_parent,
8271 $evenement
8272 );
8273 $res = $this->f->get_one_result_from_db_query($query, true);
8274 if ($res['code'] === 'KO') {
8275 return false;
8276 }
8277 $evenements[] = $res['result'];
8278 foreach ($evenements as $value) {
8279 if ($value !== null) {
8280 $query = sprintf('
8281 SELECT MAX(instruction.instruction) as instruction
8282 FROM %1$sinstruction
8283 WHERE dossier = \'%3$s\'
8284 AND evenement = %2$s
8285 ',
8286 DB_PREFIXE,
8287 $value,
8288 $dossier
8289 );
8290 $res = $this->f->get_one_result_from_db_query($query, true);
8291 if ($res['code'] === 'KO') {
8292 return false;
8293 }
8294 $result[] = $res['result'];
8295 }
8296 }
8297 return $result;
8298 }
8299
8300 protected function getDocumentType($champ = null) {
8301 $evenementId = $this->getVal('evenement');
8302 if (! empty($evenementId)) {
8303 $evenement = $this->f->findObjectById('evenement', $evenementId);
8304 if (! empty($evenement)) {
8305 return __("Instruction").':'.$evenement->getVal('libelle');
8306 }
8307 }
8308 return parent::getDocumentType();
8309 }
8310
8311 /**
8312 * Récupère à l'aide d'une requête sql la liste des demandeurs
8313 * pouvant être notifié. C'est à dire les demandeurs acceptant
8314 * les notifications et pour lesquels une adresse mail existe.
8315 *
8316 * Dans le cas, d'une notification pour le portail citoyen, seul
8317 * le pétitionnaire principal doit être notifier et uniquement si
8318 * il a une adress mail et qu'il accepte les notifications.
8319 *
8320 * @param string identifiant du dossier
8321 * @param boolean true si il faut récupérer la liste des demandeurs notifiable
8322 * pour une notification de categorie portail
8323 * @return array liste des demandeurs pouvant être notifié
8324 */
8325 protected function get_demandeurs_notifiable($idDossier = null, $portail = false) {
8326 if ($idDossier === null) {
8327 $idDossier = $this->getVal('dossier');
8328 }
8329 // Ajoute une condition sur le where pour ne récupérer que le pétitionnaire principal
8330 // pour une notification depuis le portail citoyen
8331 $sqlPetitionnairePrincipal = '';
8332 if ($portail === true) {
8333 $sqlPetitionnairePrincipal = 'AND lien_dossier_demandeur.petitionnaire_principal = true';
8334 }
8335
8336 $listeDemandeursNotifiable = array();
8337
8338 // Requête de récupération des demandeurs
8339 $sql = sprintf(
8340 'SELECT
8341 demandeur.demandeur,
8342 CASE
8343 WHEN demandeur.qualite=\'particulier\'
8344 THEN TRIM(CONCAT(demandeur.particulier_nom, \' \', demandeur.particulier_prenom, \' \', demandeur.courriel))
8345 ELSE
8346 TRIM(CONCAT(demandeur.personne_morale_raison_sociale, \' \', demandeur.personne_morale_denomination, \' \', demandeur.courriel))
8347 END AS destinataire,
8348 demandeur.courriel
8349 FROM
8350 %1$sdossier
8351 INNER JOIN %1$slien_dossier_demandeur
8352 ON dossier.dossier = lien_dossier_demandeur.dossier
8353 INNER JOIN %1$sdemandeur
8354 ON lien_dossier_demandeur.demandeur = demandeur.demandeur
8355 WHERE
8356 dossier.dossier = \'%2$s\' AND
8357 notification = \'t\' AND
8358 courriel IS NOT NULL
8359 %3$s',
8360 DB_PREFIXE,
8361 $idDossier,
8362 $sqlPetitionnairePrincipal
8363 );
8364 $res = $this->f->db->query($sql);
8365 $this->f->addToLog(__METHOD__."(): db->query(\"".$sql."\")", VERBOSE_MODE);
8366 $this->f->isDatabaseError($res);
8367 // Récupération des infos des demandeurs et stockage dans un tableau
8368 // ayant pour clé les id des demandeurs
8369 while($row = $res->fetchrow(DB_FETCHMODE_ASSOC)) {
8370 $listeDemandeursNotifiable[$row['demandeur']] = $row;
8371 }
8372
8373 return $listeDemandeursNotifiable;
8374 }
8375
8376 /**
8377 * Renvoie la liste des notifications liées à l'instruction
8378 *
8379 * @param integer id de l'instruction dont on cherche les notifications
8380 * @return array liste des instruction_notification liés à l'instruction
8381 */
8382 public function get_instruction_notification($id_instruction) {
8383 $listeInstrNotif = array();
8384 $sql = sprintf('
8385 SELECT
8386 instruction_notification.instruction_notification
8387 FROM
8388 %1$sinstruction_notification
8389 WHERE
8390 instruction = %2$s',
8391 DB_PREFIXE,
8392 $id_instruction
8393 );
8394 $res = $this->f->db->query($sql);
8395 $this->f->addToLog(__METHOD__."(): db->query(\"".$sql."\")", VERBOSE_MODE);
8396 $this->f->isDatabaseError($res);
8397 while ($row = $res->fetchrow(DB_FETCHMODE_ASSOC)) {
8398 $listeInstrNotif[] = $row['instruction_notification'];
8399 }
8400 return $listeInstrNotif;
8401 }
8402
8403 /**
8404 * Crée une clé d'accès unique permettant à un utilisateur
8405 * anonyme de récupérer le document.
8406 *
8407 * @return string clé d'accès du document
8408 */
8409 protected function getCleAccesDocument() {
8410 // Initialisation d'un tableau
8411 $number_list = array();
8412
8413 // Génération aléatoire d'un nombre sur 4 caractères, 4 fois
8414 for ($i = 0; $i < 4; $i++) {
8415 $number_list[] = str_pad(mt_rand(0, 9999), 4, 0, STR_PAD_LEFT);
8416 }
8417
8418 // Transformation en chaîne tout en séparant les nombres par un "-"
8419 $result = implode('-', $number_list);
8420
8421 // Vérifie si la clé existe déjà et si c'est le cas génére une nouvelle clé
8422 if ($this->getUidDocumentInstructionWithKey($result) != null) {
8423 return $this->getCleAccesDocument();
8424 }
8425
8426 //
8427 return $result;
8428 }
8429
8430 /**
8431 * Récupère une clé et renvoie l'uid du document liée à cette
8432 * clé. Si la clé n'existe pas renvoie null.
8433 *
8434 * @param string $cleGen clé dont on cherche l'instruction
8435 * @return integer|null
8436 */
8437 protected function getUidDocumentInstructionWithKey($cleGen) {
8438 $query = sprintf(
8439 'SELECT
8440 instruction.om_fichier_instruction
8441 FROM
8442 %1$sinstruction_notification_document
8443 LEFT JOIN %1$sinstruction ON instruction_notification_document.instruction = instruction.instruction
8444 WHERE
8445 instruction_notification_document.cle = \'%2$s\'',
8446 DB_PREFIXE,
8447 $this->f->db->escapeSimple($cleGen)
8448 );
8449
8450 $res = $this->f->db->getOne($query);
8451 $this->addToLog(__METHOD__.": db->getOne(\"".$query."\");", VERBOSE_MODE);
8452 $this->f->isDatabaseError($res);
8453 return $res;
8454 }
8455
8456 /**
8457 * Récupère une clé, fait une requête pour récupérer l'id de la notification liée a cette clé.
8458 * Récupère l'instance de instruction_notification dont l'id a été récupéré et la renvoie.
8459 *
8460 * @param string $cleGen
8461 * @return instruction_notification
8462 */
8463 protected function getInstanceNotificationWithKey($key) {
8464 $sql = sprintf(
8465 "SELECT
8466 instruction_notification
8467 FROM
8468 %1\$sinstruction_notification_document
8469 WHERE
8470 cle = '%2\$s'",
8471 DB_PREFIXE,
8472 $this->f->db->escapeSimple($key)
8473 );
8474 $res = $this->f->db->getOne($sql);
8475 $this->addToLog(__METHOD__.": db->getOne(\"".$sql."\");", VERBOSE_MODE);
8476 $this->f->isDatabaseError($res);
8477
8478 // Récupération de l'instance de notification
8479 $instNotif = $this->f->get_inst__om_dbform(array(
8480 "obj" => "instruction_notification",
8481 "idx" => $res,
8482 ));
8483 return $instNotif;
8484 }
8485
8486
8487 /**
8488 * Affiche la page de téléchargement du document de la notification.
8489 *
8490 * @param boolean $content_only Affiche le contenu seulement.
8491 *
8492 * @return void
8493 */
8494 public function view_telecharger_document_anonym() {
8495 // Par défaut on considère qu'on va afficher le formulaire
8496 $idx = 0;
8497 // Flag d'erreur
8498 $error = false;
8499 // Message d'erreur
8500 $message = '';
8501
8502 // Paramètres GET : récupération de la clé d'accès
8503 $cle_acces_document = $this->f->get_submitted_get_value('key');
8504 $cle_acces_document = $this->f->db->escapeSimple($cle_acces_document);
8505 // Vérification de l'existence de la clé et récupération de l'uid du fichier
8506 $uidFichier = $this->getUidDocumentInstructionWithKey($cle_acces_document);
8507 if ($uidFichier != null) {
8508 // Récupération du document
8509 $file = $this->f->storage->get($uidFichier);
8510
8511 // Headers
8512 header("Cache-Control: no-cache, must-revalidate"); // HTTP/1.1
8513 header("Expires: Sat, 26 Jul 1997 05:00:00 GMT"); // Date dans le passé
8514 header("Content-Type: ".$file['metadata']['mimetype']);
8515 header("Accept-Ranges: bytes");
8516 header("Content-Disposition: inline; filename=\"".$file['metadata']['filename']."\";" );
8517 // Affichage du document
8518 echo $file['file_content'];
8519
8520 // Récupération de la date de premier accès et maj du suivi uniquement
8521 // si la date de 1er accès n'a pas encore été remplis
8522 $inst_notif = $this->getInstanceNotificationWithKey($cle_acces_document);
8523 if ($inst_notif->getVal('date_premier_acces') == null ||
8524 $inst_notif->getVal('date_premier_acces') == '') {
8525 $notif_val = array();
8526 foreach ($inst_notif->champs as $champ) {
8527 $notif_val[$champ] = $inst_notif->getVal($champ);
8528 }
8529 $notif_val['date_premier_acces'] = date("d/m/Y H:i:s");
8530 $notif_val['statut'] = 'vu';
8531 $notif_val['commentaire'] = 'Le document a été vu';
8532 $suivi_notif = $inst_notif->modifier($notif_val);
8533 }
8534
8535 } else {
8536 // Page vide 404
8537 printf('Ressource inexistante');
8538 header('HTTP/1.0 404 Not Found');
8539 }
8540 }
8541
8542 /**
8543 * Récupère le titre du document envoyé au parapheur
8544 */
8545 protected function getDocumentTitre($champ = null) {
8546 $title = $this->getTitle();
8547 $dossier = $this->getDossier();
8548 return $dossier.' '.$title;
8549 }
8550
8551 /**
8552 * Compose le nom du document à transmettre au parapheur.
8553 * Le nom ets composé de cette manière :
8554 * instruction_xxx_libelle_de_la_lettre_type_associee
8555 * ou xxx correspond au numéro de l'instruction
8556 */
8557 protected function getDocumentLibelle() {
8558 // Récupère le champ instruction
8559 $instruction = $this->getVal("instruction");
8560
8561 // Requête sql servant à récupérer le titre du document
8562 // TO_CHAR() introduit un espace avant l'affichage du nombre
8563 // comme les espaces sont remplacé par des '_' dans le retour de la fonction
8564 // il n'est pas nécessaire de mettre un '_' après le mot instruction.
8565 $sql = sprintf(
8566 'SELECT
8567 CONCAT(
8568 \'instruction\',
8569 TO_CHAR(instruction.instruction, \'000\'),
8570 \'_\',
8571 LOWER(om_lettretype.libelle)
8572 ) as nom_fichier
8573 FROM
8574 %1$sinstruction
8575 LEFT JOIN %1$som_lettretype ON om_lettretype.id = instruction.lettretype
8576 WHERE
8577 instruction = %2$s',
8578 DB_PREFIXE,
8579 $instruction
8580 );
8581 $documentLibelle = $this->f->db->getOne($sql);
8582 $this->addToLog("getDocumentTitre(): db->getOne(\"".$sql."\");", VERBOSE_MODE);
8583 if (database::isError($documentLibelle)) {
8584 die();
8585 }
8586
8587 // Transforamtion des ' ' en '_', des accents en lettres sans accents et des
8588 // caractères spéciaux en '_'
8589 // La méthode normalize_string est utilisé pour gérer les accents
8590 $documentLibelle = $this->f->normalize_string($documentLibelle);
8591 // TODO : comparer cette liste et celle de la méthode normalize_string
8592 // pour éviter les doublons + vérifier qu'il n'y a pas de doublons dans cette
8593 // liste
8594 $invalid = array('Œ'=>'oe', 'œ'=>'oe', 'Ÿ'=>'y', 'ü'=>'u',
8595 '¢' => '_', 'ß' => '_', '¥' => '_', '£' => '_', '™' => '_', '©' => '_',
8596 '®' => '_', 'ª' => '_', '×' => '_', '÷' => '_', '±' => '_', '²' => '_',
8597 '³' => '_', '¼' => '_', '½' => '_', '¾' => '_', 'µ' => '_', '¿' => '_',
8598 '¶' => '_', '·' => '_', '¸' => '_', 'º' => '_', '°' => '_', '¯' => '_',
8599 '§' => '_', '…' => '_', '¤' => '_', '¦' => '_', '≠' => '_', '¬' => '_',
8600 'ˆ' => '_', '¨' => '_', '‰' => '_', '¤' => '_', '€' => '_', '$' => '_',
8601 '«' => '_', '»' => '_', '‹' => '_', '›' => '_', 'ƒ' => '_', '¥' => '_',
8602 '‘‘' => '_', '‚' => '_', '!' => '_', '¡' => '_', '¢' => '_', '£' => '_',
8603 '?' => '_', '[' => '_', ']' => '_', '´' => '_', '`' => '_', '^' => '_',
8604 '~' => '_', '˜' => '_', '#' => '_', '*' => '_', '.' => '_', ':' => '_',
8605 ';' => '_', '•' => '_', '¯' => '_', '‾' => '_', '–' => '_', '–' => '_',
8606 '—' => '_', '_' => '_', '|' => '_', '¦‌' => '_', '‡' => '_', '§' => '_',
8607 '¶' => '_', '©' => '_', '®' => '_', '™' => '_', '&' => '_', '@' => '_',
8608 '/' => '_', '\\' => '_', '◊' => '_', '♠' => '_', '♣' => '_', '♥' => '_',
8609 '♦' => '_', '←' => '_', '↑' => '_', '→' => '_', '↓' => '_', '↔' => '_',
8610 '°' => '_', 'µ' => '_', '<' => '_', '>' => '_', '≤' => '_', '≥' => '_',
8611 '=' => '_', '≈' => '_', '≠' => '_', '≡' => '_', '±' => '_', '−' => '_',
8612 '+' => '_', '×' => '_', '÷' => '_', '⁄' => '_', '%' => '_', '‰' => '_',
8613 '¼' => '_', '½' => '_', '¾' => '_', '¹' => '_', '²' => '_', '³' => '_',
8614 '' => '_', 'º' => '_', 'ª' => '_', 'ƒ' => '_', '′' => '_', '″' => '_',
8615 '∂' => '_', '∏' => '_', '∑' => '_', '√' => '_', '∞' => '_', '¬' => '_',
8616 '∩' => '_', '∫' => '_', 'α' => '_', 'Α' => '_', 'β' => '_', 'Β' => '_',
8617 'γ' => '_', 'Γ' => '_', 'δ' => '_', 'Δ' => '_', 'ε' => '_', 'Ε' => '_',
8618 'ζ' => '_', 'Ζ' => '_', 'η' => '_', 'Η' => '_', 'θ' => '_', 'Θ' => '_',
8619 'ι' => '_', 'Ι' => '_', 'κ' => '_', 'Κ' => '_', 'λ' => '_', 'Λ' => '_',
8620 'μ' => '_', 'Μ' => '_', 'ν' => '_', 'Ν' => '_', 'ξ' => '_', 'Ξ' => '_',
8621 'ο' => '_', 'Ο' => '_', 'π' => '_', 'Π' => '_', 'ρ' => '_', 'Ρ' => '_',
8622 'σ' => '_', 'ς' => '_', 'Σ' => '_', 'τ' => '_', 'Τ' => '_', 'υ' => '_',
8623 'Υ' => '_', 'φ' => '_', 'Φ' => '_', 'χ' => '_', 'Χ' => '_', 'ψ' => '_',
8624 'Ψ' => '_', 'ω' => '_', 'Ω' => '_', ',' => '_', ' ' => '_'
8625 );
8626
8627 return str_replace(array_keys($invalid), array_values($invalid), $documentLibelle);
8628 }
8629
8630 /**
8631 * Surcharge permettant de ne pas afficher le fil d'Ariane dans
8632 * l'overlay de notification des demandeurs.
8633 */
8634 function getSubFormTitle($ent) {
8635 if ($this->getParameter('maj') == '411') {
8636 return '';
8637 }
8638 return parent::getSubFormTitle($ent);
8639 }
8640 }// fin classe

Properties

Name Value
svn:keywords "Id"

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26