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

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

Parent Directory Parent Directory | Revision Log Revision Log


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

Properties

Name Value
svn:keywords "Id"

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26