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

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

Parent Directory Parent Directory | Revision Log Revision Log


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

Properties

Name Value
svn:keywords "Id"

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26