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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 12433 - (hide annotations)
Thu Jun 23 17:40:44 2022 UTC (2 years, 7 months ago) by softime
File size: 435853 byte(s)
* Fusion de la branche d'intégration 5.11.0-develop vers le trunk

1 mbroquet 3730 <?php
2     /**
3 softime 7996 * DBFORM - 'instruction' - Surcharge gen.
4     *
5 mbroquet 3730 * 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 softime 7996 *
18 mbroquet 3730 * @package openfoncier
19 nhaye 5254 * @version SVN : $Id$
20 mbroquet 3730 */
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 softime 8989
33 mbroquet 3730 var $valEvenement;
34     var $restriction_valid = null;
35     // Tableau contenant une partie des métadonnées arrêtés
36     var $metadonneesArrete;
37    
38 fmichon 3892 /**
39     * Instance de la classe dossier
40     *
41     * @var mixed
42     */
43     var $inst_dossier = null;
44    
45 softime 5169 /**
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 mbroquet 3730 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 softime 6272 'concerneERP' => 'get_concerne_erp',
72 softime 10573
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 softime 10808 'collectivite' => 'getDossierServiceOrCollectivite',
83 mbroquet 3730 ),
84     "arrete" => array(
85     "numArrete" => "getNumArrete",
86     "ReglementaireArrete" => "getReglementaireArrete",
87     "NotificationArrete" => "getNotificationArrete",
88     "dateNotificationArrete" => "getDateNotificationArrete",
89     "controleLegalite" => "getControleLegalite",
90     "dateSignature" => "getDateSignature",
91     "nomSignataire" => "getNomSignataire",
92     "qualiteSignataire" => "getQualiteSignataire",
93     "ap_numRue" => "getAp_numRue",
94     "ap_nomDeLaVoie" => "getAp_nomDeLaVoie",
95     "ap_codePostal" => "getAp_codePostal",
96     "ap_ville" => "getAp_ville",
97     "activite" => "getActivite",
98     "dateControleLegalite" => "getDateControleLegalite",
99 softime 10573 )
100 mbroquet 3730 );
101    
102 softime 9245 /**
103     * Flag pour identifier la reprise de l'instruction d'un dossier.
104     * Le statut de l'état passe de "cloture" à "encours".
105     *
106     * @var boolean
107     */
108     var $di_reopened = null;
109    
110 mbroquet 3730 // {{{ Gestion de la confidentialité des données spécifiques
111    
112     /**
113     * Définition des actions disponibles sur la classe.
114     *
115     * @return void
116     */
117     function init_class_actions() {
118    
119     parent::init_class_actions();
120    
121     // ACTION - 000 - ajouter
122     // Modifie la condition d'affichage du bouton ajouter
123 softime 6565 $this->class_actions[0]["condition"] = array("is_addable", "can_user_access_dossier_contexte_ajout");
124 mbroquet 3730
125     // ACTION - 001 - modifier
126     // Modifie la condition et le libellé du bouton modifier
127 softime 6565 $this->class_actions[1]["condition"] = array(
128     "is_editable",
129     "is_finalizable_without_bypass",
130     "can_user_access_dossier_contexte_modification",
131 softime 10573 "is_evenement_modifiable",
132 softime 6565 );
133 mbroquet 3730 $this->class_actions[1]["portlet"]["libelle"] = _("Modifier");
134    
135     // ACTION - 002 - supprimer
136     // Modifie la condition et le libellé du bouton supprimer
137 softime 6565 $this->class_actions[2]["condition"] = array(
138     "is_deletable",
139     "is_finalizable_without_bypass",
140 softime 10573 "can_user_access_dossier_contexte_modification",
141     "is_evenement_supprimable",
142 softime 6565 );
143 mbroquet 3730 $this->class_actions[2]["portlet"]["libelle"] = _("Supprimer");
144    
145 softime 6565 // ACTION - 003 - consulter
146     //
147     $this->class_actions[3]["condition"] = "can_user_access_dossier_contexte_modification";
148    
149 mbroquet 3730 // ACTION - 100 - finaliser
150     // Finalise l'enregistrement
151     $this->class_actions[100] = array(
152     "identifier" => "finaliser",
153     "portlet" => array(
154     "type" => "action-direct",
155     "libelle" => _("Finaliser le document"),
156     "order" => 110,
157     "class" => "finalise",
158     ),
159     "view" => "formulaire",
160     "method" => "finalize",
161     "button" => "finaliser",
162     "permission_suffix" => "finaliser",
163 softime 6565 "condition" => array(
164     "is_finalizable",
165     "is_finalizable_without_bypass",
166     "has_an_edition",
167     "can_user_access_dossier_contexte_modification",
168     ),
169 mbroquet 3730 );
170    
171     // ACTION - 110 - definaliser
172     // Finalise l'enregistrement
173     $this->class_actions[110] = array(
174     "identifier" => "definaliser",
175     "portlet" => array(
176     "type" => "action-direct",
177     "libelle" => _("Reprendre la redaction du document"),
178     "order" => 110,
179     "class" => "definalise",
180     ),
181     "view" => "formulaire",
182     "method" => "unfinalize",
183     "button" => "definaliser",
184     "permission_suffix" => "definaliser",
185 softime 6565 "condition" => array(
186     "is_unfinalizable",
187     "is_unfinalizable_without_bypass",
188     "can_user_access_dossier_contexte_modification",
189 softime 10573 "is_not_sent_for_signature",
190 softime 6565 ),
191 mbroquet 3730 );
192    
193     // ACTION - 120 - edition
194     // Affiche l'édition
195     $this->class_actions[120] = array(
196     "identifier" => "edition",
197     "portlet" => array(
198     "type" => "action-blank",
199     "libelle" => _("Edition"),
200     "order" => 100,
201     "class" => "pdf-16",
202     ),
203     "view" => "view_edition",
204 softime 6565 "condition" => array("has_an_edition", "can_user_access_dossier_contexte_modification"),
205 mbroquet 3730 "permission_suffix" => "om_fichier_instruction_telecharger",
206     );
207    
208     // ACTION - 125 - modifier_suivi
209     // Suivi des dates
210     $this->class_actions[125] = array(
211     "identifier" => "modifier_suivi",
212     "portlet" => array(
213     "type" => "action-self",
214     "libelle" => _("Suivi des dates"),
215     "order" => 125,
216     "class" => "suivi-dates-16",
217     ),
218     "crud" => "update",
219 softime 6565 "condition" => array("can_monitoring_dates", "can_user_access_dossier_contexte_modification"),
220 mbroquet 3730 "permission_suffix" => "modification_dates",
221     );
222    
223     // ACTION - 130 - bible
224     // Affiche la bible
225     $this->class_actions[130] = array(
226     "identifier" => "bible",
227     "view" => "view_bible",
228     "permission_suffix" => "modifier",
229     );
230    
231     // ACTION - 140 - bible_auto
232     // Active la bible automatique
233     $this->class_actions[140] = array(
234     "identifier" => "bible_auto",
235     "view" => "view_bible_auto",
236     "permission_suffix" => "modifier",
237     );
238    
239     // ACTION - 150 - suivi_bordereaux
240     // Imprimer un bordereau d'envoi
241     $this->class_actions[150] = array(
242     "identifier" => "suivi_bordereaux",
243     "view" => "view_suivi_bordereaux",
244     "permission_suffix" => "consulter",
245     );
246    
247     // ACTION - 160 - suivi_envoi_lettre_rar
248     // Imprimer un bordereau d'envoi
249     $this->class_actions[160] = array(
250     "identifier" => "suivi_envoi_lettre_rar",
251     "view" => "view_suivi_envoi_lettre_rar",
252     "permission_suffix" => "consulter",
253     );
254    
255     // ACTION - 170 - suivi_mise_a_jour_des_dates
256     // Mettre à jour les dates de l'instruction
257     $this->class_actions[170] = array(
258     "identifier" => "suivi_mise_a_jour_des_dates",
259     "view" => "view_suivi_mise_a_jour_des_dates",
260     "permission_suffix" => "consulter",
261     );
262    
263     // ACTION - 180 - pdf_lettre_rar
264 softime 8989 // Génère PDF sur bordereaux de lettres AR
265 mbroquet 3730 $this->class_actions[180] = array(
266     "identifier" => "pdf_lettre_rar",
267     "view" => "view_pdf_lettre_rar",
268     "permission_suffix" => "consulter",
269     );
270    
271     // ACTION - 190 - bordereau_envoi_maire
272     // Formulaire pour générer le bordereau d'envoi au maire
273     // Met à jour la date d'envoi à signature du maire
274     $this->class_actions[190] = array(
275     "identifier" => "bordereau_envoi_maire",
276     "view" => "view_bordereau_envoi_maire",
277     "permission_suffix" => "bordereau_envoi_maire",
278     );
279    
280     // ACTION - 200 - generate_bordereau_envoi_maire
281     // Génère PDF bordereau d'envoi au maire
282     $this->class_actions[200] = array(
283     "identifier" => "generate_bordereau_envoi_maire",
284     "view" => "view_generate_bordereau_envoi_maire",
285     "permission_suffix" => "bordereau_envoi_maire",
286     );
287 nmeucci 4108
288     // ACTION - 210 - notifier_commune
289     // Notifie la commune par mail d'un évément d'instruction finalisé
290     $this->class_actions[210] = array(
291     "identifier" => "notifier_commune",
292     "portlet" => array(
293     "type" => "action-direct-with-confirmation",
294     "libelle" => _("Notifier la commune par courriel"),
295     "order" => 210,
296     "class" => "notifier_commune-16",
297     ),
298     "view" => "formulaire",
299     "method" => "notifier_commune",
300     "permission_suffix" => "notifier_commune",
301 softime 6565 "condition" => array("is_notifiable", "can_user_access_dossier_contexte_modification"),
302 nmeucci 4108 );
303 nmeucci 4317
304     // ACTION - 220 - generate_suivi_bordereaux
305     // GénÚre PDF bordereaux
306     $this->class_actions[220] = array(
307     "identifier" => "generate_suivi_bordereaux",
308     "view" => "view_generate_suivi_bordereaux",
309 softime 6565 "permission_suffix" => "consulter",
310     );
311 softime 7521
312     // ACTION - 777 - pdf_temp
313     // Crée un PDF temporaire et affiche son contenu en base64
314     $this->class_actions[777] = array(
315     "identifier" => "pdf_temp",
316     "view" => "view_pdf_temp",
317     "permission_suffix" => "modifier",
318     "condition" => array("can_user_access_dossier_contexte_modification"),
319     );
320 softime 8593
321     // ACTION - 701
322     $this->class_actions[701] = array(
323     "identifier" => "enable-edition-integrale",
324     "portlet" => array(
325     "type" => "action-direct-with-confirmation",
326     "libelle" => _("Rédaction libre"),
327     "order" => 50,
328     "class" => "redac-libre-16",
329     ),
330     "view" => "formulaire",
331     "method" => "enable_edition_integrale",
332     "permission_suffix" => "modifier",
333     "condition" => array(
334     "is_editable",
335     "is_finalizable_without_bypass",
336     "can_user_access_dossier_contexte_modification",
337     "is_edition_integrale_not_enabled",
338     "is_option_redaction_libre_enabled",
339     "has_an_edition",
340     ),
341     );
342     // ACTION - 702
343     $this->class_actions[702] = array(
344     "identifier" => "disable-edition-integrale",
345     "portlet" => array(
346     "type" => "action-direct-with-confirmation",
347     "libelle" => _("Rédaction par compléments"),
348     "order" => 50,
349     "class" => "redac-complement-16",
350     ),
351     "view" => "formulaire",
352     "method" => "disable_edition_integrale",
353     "permission_suffix" => "modifier",
354     "condition" => array(
355     "is_editable",
356     "is_finalizable_without_bypass",
357     "can_user_access_dossier_contexte_modification",
358     "is_edition_integrale_enabled",
359     "is_option_redaction_libre_enabled",
360     "has_an_edition",
361     ),
362     );
363     // ACTION - 300 - evenement_has_an_edition_json
364     //
365     $this->class_actions[300] = array(
366     "identifier" => "evenement_has_an_edition_json",
367     "view" => "view_evenement_has_an_edition_json",
368     "permission_suffix" => "consulter",
369     );
370 softime 10573
371     // ACTION - 301 - evenement_has_a_commentaire
372     //
373     $this->class_actions[301] = array(
374     "identifier" => "evenement_has_a_commentaire_json",
375     "view" => "view_evenement_has_a_commentaire_json",
376     "permission_suffix" => "consulter",
377     );
378    
379     // ACTION - 400 - Envoyer en signature
380     // Cet évenement permet d'envoyer le document au parapheur pour signature
381     $this->class_actions[400] = array(
382     "identifier" => "envoyer_a_signature",
383     "portlet" => array(
384     "libelle" => _("Envoyer à signature"),
385     "type" => "action-direct-with-confirmation",
386     "class" => "envoyer_a_signature-16",
387     ),
388     "view" => "formulaire",
389 softime 10713 "method" => "envoyer_a_signature_sans_relecture",
390 softime 10573 "condition" => array(
391     "can_be_signed",
392     ),
393     "permission_suffix" => "envoyer_a_signature",
394     );
395    
396 softime 10713 // ACTION - 402 - Envoyer en signature avec relecture
397     // Cet évenement permet d'envoyer le document au parapheur pour signature
398     $this->class_actions[402] = array(
399     "identifier" => "envoyer_a_signature_relecture",
400     "portlet" => array(
401     "libelle" => __("Envoyer à signature avec relecture"),
402     "type" => "action-direct-with-confirmation",
403     "class" => "envoyer_a_signature-16",
404     ),
405     "view" => "formulaire",
406     "method" => "envoyer_a_signature_avec_relecture",
407     "condition" => array(
408     "can_be_signed",
409 softime 10808 "is_parapheur_relecture_parameter_enabled"
410 softime 10713 ),
411     "permission_suffix" => "envoyer_a_signature",
412     );
413    
414 softime 11876 // ACTION - 404 - Annuler l'envoi en signature
415     // Cet évenement permet d'annuler l'envoi en signature du document au parapheur
416     $this->class_actions[404] = array(
417     "identifier" => "annuler_envoi_signature",
418     "portlet" => array(
419     "libelle" => __("Annuler l'envoi en signature"),
420     "type" => "action-direct-with-confirmation",
421     "class" => "annuler_envoi_signature-16",
422     ),
423     "view" => "formulaire",
424     "method" => "annuler_envoi_en_signature",
425     "condition" => array(
426 softime 12124 "is_sent_for_signature",
427 softime 11876 "is_parapheur_annulation_parameter_enabled"
428     ),
429     "permission_suffix" => "envoyer_a_signature",
430     );
431    
432 softime 10573 //
433     $this->class_actions[401] = array(
434     "identifier" => "preview_edition",
435     "view" => "formulaire",
436     "permission_suffix" => "tab",
437     );
438    
439 softime 10808 // ACTION - 410 - Notifier les pétitionnaires (mail ou autre)
440     $this->class_actions[410] = array(
441     "identifier" => "overlay_notification_manuelle",
442     "portlet" => array(
443     "libelle" => __("Notifier les pétitionnaires"),
444     "type" => "action-self",
445     "class" => "notifier_commune-16",
446     ),
447     "condition" => array(
448     "is_notifiable_by_task_manual",
449 softime 10869 "is_not_portail_notification_sans_annexe"
450 softime 10808 ),
451     "view" => "view_overlay_notification_manuelle",
452     "permission_suffix" => "modifier",
453     );
454    
455 softime 11585 // ACTION - 411 - Notifier les pétitionnaires (portail citoyen)
456 softime 10808 $this->class_actions[411] = array(
457     "identifier" => "notification_manuelle_portal",
458     "portlet" => array(
459     "libelle" => __("Notifier les pétitionnaires"),
460     "type" => "action-direct-with-confirmation",
461     "class" => "notifier_commune-16",
462     ),
463     "condition" => array(
464     "is_notifiable_by_task_manual",
465 softime 10869 "is_portail_notification_sans_annexe"
466 softime 10808 ),
467     "method" => "notifier_demandeur_principal",
468     "permission_suffix" => "modifier",
469     );
470    
471 softime 11585 // ACTION - 420 - Notifier les services consultés (mail)
472     $this->class_actions[420] = array(
473     "identifier" => "overlay_notification_service_consulte",
474     "portlet" => array(
475     "libelle" => __("Notifier les services consultés"),
476     "type" => "action-self",
477     "class" => "notifier_commune-16",
478     ),
479     "condition" => array(
480     "is_service_notifiable"
481     ),
482     "view" => "view_overlay_notification_service_consulte",
483     "permission_suffix" => "tab",
484     );
485    
486     // ACTION - 430 - Notifier les tiers consultés (mail)
487     $this->class_actions[430] = array(
488     "identifier" => "overlay_notification_tiers_consulte",
489     "portlet" => array(
490     "libelle" => __("Notifier les tiers consultés"),
491     "type" => "action-self",
492     "class" => "notifier_commune-16",
493     ),
494     "condition" => array(
495     "is_tiers_notifiable"
496     ),
497     "view" => "view_overlay_notification_tiers_consulte",
498     "permission_suffix" => "tab",
499     );
500    
501 softime 10573 //
502 softime 11418 $this->class_actions[403] = array(
503     "identifier" => "envoyer_au_controle_de_legalite",
504     "portlet" => array(
505     "libelle" => __("Envoyer au contrôle de légalité"),
506     "type" => "action-direct-with-confirmation",
507     "class" => "envoyer_au_controle_de_legalite-16",
508     ),
509     "view" => "formulaire",
510     "method" => "envoyer_au_controle_de_legalite",
511     "condition" => array(
512     "can_be_sended_to_cl"
513     ),
514     "permission_suffix" => "envoyer_au_controle_de_legalite",
515     );
516    
517     //
518 softime 10573 $this->class_actions[998] = array(
519     "identifier" => "json_data",
520     "view" => "view_json_data",
521     "permission_suffix" => "consulter",
522     );
523 mbroquet 3730 }
524    
525 softime 8593 /**
526 softime 8989 * Clause select pour la requête de sélection des données de l'enregistrement.
527     *
528     * @return array
529     */
530     function get_var_sql_forminc__champs() {
531     return array(
532     "instruction",
533     "destinataire",
534     "instruction.evenement",
535 softime 10573 "instruction.commentaire",
536 softime 8989 "date_evenement",
537     "instruction.lettretype",
538     "signataire_arrete",
539     "flag_edition_integrale",
540     "om_final_instruction_utilisateur",
541     "date_finalisation_courrier",
542     "date_envoi_signature",
543     "date_envoi_rar",
544     "date_envoi_controle_legalite",
545    
546     "date_retour_signature",
547     "date_retour_rar",
548     "date_retour_controle_legalite",
549    
550     "numero_arrete",
551    
552     "complement_om_html",
553     "'' as bible_auto",
554     "'' as bible",
555     "complement2_om_html",
556     "'' as bible2",
557     "complement3_om_html",
558     "'' as bible3",
559     "complement4_om_html",
560     "'' as bible4",
561    
562     "titre_om_htmletat",
563     "corps_om_htmletatex",
564    
565     "'' as btn_preview",
566     "'' as btn_redaction",
567    
568     "'' as btn_refresh",
569     "'' as live_preview",
570    
571     "dossier",
572     "instruction.action",
573     "instruction.delai",
574     "instruction.etat",
575     "instruction.autorite_competente",
576     "instruction.accord_tacite",
577     "instruction.delai_notification",
578     "instruction.avis_decision",
579     "archive_delai",
580     "archive_accord_tacite",
581     "archive_etat",
582     "archive_avis",
583     "archive_date_complet",
584     "archive_date_rejet",
585     "archive_date_limite",
586     "archive_date_notification_delai",
587     "archive_date_decision",
588     "archive_date_validite",
589     "archive_date_achevement",
590     "archive_date_conformite",
591     "archive_date_chantier",
592     "archive_date_dernier_depot",
593     "date_depot",
594 softime 10573 "date_depot_mairie",
595 softime 8989 "complement5_om_html",
596     "'' as bible5",
597     "complement6_om_html",
598     "'' as bible6",
599     "complement7_om_html",
600     "'' as bible7",
601     "complement8_om_html",
602     "'' as bible8",
603     "complement9_om_html",
604     "'' as bible9",
605     "complement10_om_html",
606     "'' as bible10",
607     "complement11_om_html",
608     "'' as bible11",
609     "complement12_om_html",
610     "complement13_om_html",
611     "complement14_om_html",
612     "complement15_om_html",
613     "archive_incompletude",
614     "archive_incomplet_notifie",
615     "archive_evenement_suivant_tacite",
616     "archive_evenement_suivant_tacite_incompletude",
617     "archive_etat_pendant_incompletude",
618     "archive_date_limite_incompletude",
619     "archive_delai_incompletude",
620     "archive_autorite_competente",
621     "code_barres",
622     "om_fichier_instruction",
623     "om_final_instruction",
624     "om_fichier_instruction_dossier_final",
625     "document_numerise",
626     "duree_validite_parametrage",
627     "duree_validite",
628     "created_by_commune",
629     "archive_date_cloture_instruction",
630     "archive_date_premiere_visite",
631     "archive_date_derniere_visite",
632     "archive_date_contradictoire",
633     "archive_date_retour_contradictoire",
634     "archive_date_ait",
635     "archive_date_transmission_parquet",
636     "archive_dossier_instruction_type",
637     "archive_date_affichage",
638 softime 10573 "pec_metier",
639     "archive_pec_metier",
640     "archive_a_qualifier",
641     "id_parapheur_signature",
642     "statut_signature",
643     "commentaire_signature",
644     "historique_signature",
645 softime 10808 "'' as suivi_notification",
646 softime 11585 "'' as suivi_notification_service",
647     "'' as suivi_notification_tiers",
648 softime 10573
649     "'' as preview_edition",
650 softime 11418 "envoye_cl_platau",
651 softime 12124 "'' as log_instruction"
652 softime 8989 );
653     }
654    
655     /**
656 softime 8593 * CONDITION - is_edition_integrale_enabled
657     *
658     * Vérifie que la rédaction libre est activée sur l'instruction en cours.
659     *
660     * @return boolean
661     */
662     function is_edition_integrale_enabled() {
663     if ($this->getVal("flag_edition_integrale") == 't') {
664     return true;
665     }
666     return false;
667     }
668 mbroquet 3730
669     /**
670 softime 8593 * CONDITION - is_edition_integrale_not_enabled
671     *
672     * Vérifie que la rédaction libre est désactivée sur l'instruction en cours.
673     *
674     * @return boolean
675     */
676     function is_edition_integrale_not_enabled() {
677     return !$this->is_edition_integrale_enabled();
678     }
679    
680     /**
681     * CONDITION - is_option_redaction_libre_enabled
682     *
683     * Vérifie que l'option de rédaction libre est activée.
684     *
685     * @return boolean
686     */
687     function is_option_redaction_libre_enabled() {
688     $collectivite_di = $this->get_dossier_instruction_om_collectivite();
689     return $this->f->is_option_redaction_libre_enabled($collectivite_di);
690     }
691    
692     /**
693 softime 10713 * CONDITION - is_option_parapheur_relecture_enabled
694     *
695     * Vérifie que l'option de relecture lors de l'envoi en signature est activée.
696     *
697     * @return boolean
698     */
699 softime 10808 function is_parapheur_relecture_parameter_enabled() {
700     //Instanciation de la classe electronicsignature
701     $inst_es = $this->get_electronicsignature_instance();
702     if ($inst_es === false) {
703     return false;
704     }
705    
706     if ($inst_es->get_conf('is_forced_view_files') !== 'true' && $inst_es->get_conf('is_forced_view_files') !== true) {
707     return false;
708     }
709    
710     return true;
711 softime 10713 }
712    
713 softime 11876 /**
714     * CONDITION - is_parapheur_annulation_parameter_enabled
715     *
716     * Vérifie que l'option d'annulation de l'envoi en signature est activée.
717     *
718     * @return boolean
719     */
720     function is_parapheur_annulation_parameter_enabled() {
721     //Instanciation de la classe electronicsignature
722     $inst_es = $this->get_electronicsignature_instance();
723     if ($inst_es === false) {
724     return false;
725     }
726 softime 10713
727 softime 11876 if ($inst_es->get_conf('cancel_send') !== 'true' && $inst_es->get_conf('cancel_send') !== true) {
728     return false;
729     }
730    
731     return true;
732     }
733    
734    
735 softime 10713 /**
736 softime 10573 * CONDITION - is_sent_for_signature
737     *
738     * Vérifie que l'instruction a été envoyé à signature
739     *
740     * @return boolean
741     */
742     function is_sent_for_signature() {
743     // Si un parapheur a été configuré
744     // et que le champ id_parapheur_signature n'est pas vide
745     // que le status est différent de "canceled" ou "expired"
746     // alors l'évènement a été envoyé en signature
747     if ($this->has_connector_electronicsignature() === true
748     && empty($this->getVal("id_parapheur_signature")) === false
749     && ($this->getVal("statut_signature") != "canceled"
750 softime 12124 && $this->getVal("statut_signature") != "expired"
751     && $this->getVal("statut_signature") != "finished")) {
752 softime 10573 //
753     return true;
754     }
755    
756     return false;
757     }
758    
759     /**
760     * CONDITION - is_not_sent_for_signature
761     *
762     * Vérifie que l'instruction n'a pas été envoyé à signature
763     *
764     * @return boolean
765     */
766     function is_not_sent_for_signature() {
767 softime 10968 // Contrôle si l'utilisateur possède un bypass
768     $bypass = $this->f->isAccredited($this->get_absolute_class_name()."_definaliser_bypass");
769     if ($bypass == true) {
770     return true;
771     }
772    
773 softime 10573 return !$this->is_sent_for_signature();
774     }
775    
776    
777     /**
778     * CONDITION - is_signed
779     *
780     * Vérifie que l'instruction a été signé
781     *
782     * @return boolean
783     */
784     function is_signed() {
785     // Si un parapheur a été configuré
786     // et que le champ id_parapheur_signature n'est pas vide
787     // et que le statut est égal à "finished"
788     // alors le document de l'instruciton à été signé
789     if ($this->has_connector_electronicsignature() === true
790     && empty($this->getVal("id_parapheur_signature")) === false
791     && $this->getVal("statut_signature") == "finished") {
792     //
793     return true;
794     }
795    
796     return false;
797     }
798    
799 softime 11876
800 softime 12433 /**
801     * is_sent_to_cl
802     *
803     * Vérifie que l'instruction a été envoyé au contrôle de légalité
804     *
805     * @return boolean
806     */
807 softime 11418 function is_sent_to_cl() {
808 softime 12433 // Si la case à cocher de l'instruction envoye_cl_platau est à "t"
809     if ($this->getVal('envoye_cl_platau') === 't') {
810     //
811     return true;
812 softime 11418 }
813     //
814     return false;
815     }
816    
817 softime 10808 /**
818     * CONDITION - is_portail_notification
819     *
820     * Vérifie si la notification est une notification de catégorie portail
821     *
822     * @return boolean
823     */
824 softime 10869 function is_portail_notification_sans_annexe() {
825 softime 10808 $collectiviteDi = $this->get_dossier_instruction_om_collectivite();
826 softime 10869 $ev = $this->get_inst_evenement($this->getVal('evenement'));
827     if (($this->f->get_param_option_notification($collectiviteDi) === null ||
828     $this->f->get_param_option_notification($collectiviteDi) === 'portal')
829     && $ev->getVal('notification') != 'notification_manuelle_annexe'
830     && $ev->getVal('notification') != 'notification_manuelle_annexe_signature_requise'
831     ) {
832 softime 10808 return true;
833     }
834     return false;
835     }
836 softime 10573
837     /**
838 softime 10808 * CONDITION - is_not_portail_notification
839     *
840     * Vérifie si la notification n'est pas une notification de catégorie portail
841     *
842     * @return boolean
843     */
844 softime 10869 function is_not_portail_notification_sans_annexe() {
845     return (! $this->is_portail_notification_sans_annexe());
846 softime 10808 }
847    
848     /**
849 softime 10573 * CONDITION - can_be_signed
850     *
851     * Vérifie que le document de l'instruction peut être envoyé au parapheur pour signature
852     *
853     * @return boolean
854     */
855     function can_be_signed() {
856     // Instanciation de l'objet signataire_arrete
857     $inst_signataire_arrete = $this->f->get_inst__om_dbform(array(
858     "obj" => "signataire_arrete",
859     "idx" => $this->getVal("signataire_arrete"),
860     ));
861     // Si un parapheur a été configuré, que le document est finalisé, que le signataire
862     // possède une adresse email, on vérifie le champ id_parapheur_signature
863     // S'il est vide l'évènement peut être envoyé en signature
864     // S'il ne l'est pas, alors on vérifie le champ statut_signature
865     // Si la valeur de ce champ est égal à "canceled" ou "expired"
866     // alors l'évènement peut être envoyé en signature
867     if ($this->has_connector_electronicsignature() === true
868     && $this->getVal("om_final_instruction") == 't'
869     && empty($inst_signataire_arrete->getVal('email')) === false) {
870     //
871     if (empty($this->getVal("id_parapheur_signature")) === true
872     || $this->getVal("statut_signature") == "canceled"
873     || $this->getVal("statut_signature") == "expired") {
874     //
875     return true;
876     }
877     }
878    
879     $this->addToLog(__METHOD__."() has_connector_electronicsignature: ".var_export($this->has_connector_electronicsignature(), true), EXTRA_VERBOSE_MODE);
880     $this->addToLog(__METHOD__."() om_final_instruction: ".var_export($this->getVal("om_final_instruction"), true), EXTRA_VERBOSE_MODE);
881     $this->addToLog(__METHOD__."() email: ".var_export($inst_signataire_arrete->getVal('email'), true), EXTRA_VERBOSE_MODE);
882     $this->addToLog(__METHOD__."() id_parapheur_signature: ".var_export($this->getVal("id_parapheur_signature"), true), EXTRA_VERBOSE_MODE);
883     $this->addToLog(__METHOD__."() statut_signature: ".var_export($this->getVal("statut_signature"), true), EXTRA_VERBOSE_MODE);
884    
885     return false;
886     }
887    
888     /**
889     * CONDITION - has_connector_electronicsignature
890     *
891     * Vérifie qu'un parapheur est paramétré
892     *
893     * @return boolean
894     */
895     function has_connector_electronicsignature() {
896     $inst_es = $this->get_electronicsignature_instance(false);
897     if ($inst_es === false) {
898     return false;
899     }
900     return true;
901     }
902    
903     /**
904     * CONDITION - can_display_parapheur
905     *
906     * Vérifie que le fieldset "Suivi Parapheur" soit affichable
907     *
908     * @return boolean
909     */
910     function can_display_parapheur() {
911     $evenement_id = $this->getVal("evenement");
912     $inst_evenement = $this->get_inst_evenement($evenement_id);
913     if ($this->has_connector_electronicsignature() === true
914     && $inst_evenement->getVal('lettretype') !== ''
915     && $inst_evenement->getVal('lettretype') !== null
916     && (empty($this->getVal("id_parapheur_signature")) === false
917     || empty($this->getVal("historique_signature")) === false)) {
918     //
919     return true;
920     }
921    
922     return false;
923     }
924    
925     /**
926 softime 10808 * CONDITION - can_display_notification
927     *
928 softime 11585 * Vérifie que le champs "Suivi notification" est affichable
929 softime 10808 *
930     * @return boolean
931     */
932 softime 11585 function can_display_notification_demandeur() {
933 softime 10808 // Le suivi des notification est affiché si l'événement est notifiable
934     // et si des notifications ont été envoyées
935     $evenement_id = $this->getVal("evenement");
936     $inst_evenement = $this->get_inst_evenement($evenement_id);
937     if ($inst_evenement->getVal('notification') != null &&
938     $inst_evenement->getVal('notification') != '') {
939     // Des notifications ont été envoyé si il existe au moins une notification
940     // liées à l'instruction
941 softime 11585 $idsNotifs = $this->get_instruction_notification(
942     $this->getVal($this->clePrimaire),
943     array(
944     'notification_recepisse',
945     'notification_instruction',
946     'notification_decision',
947 softime 12124 ),
948     true
949 softime 11585 );
950 softime 10808 if (isset($idsNotifs) && $idsNotifs !== array()) {
951     return true;
952     }
953     }
954     return false;
955     }
956    
957     /**
958 softime 11585 * CONDITION - can_display_notification
959     *
960     * Vérifie que le champs "suivi_notification_service" est affichable
961     *
962     * @return boolean
963     */
964     function can_display_notification_service() {
965     // Le suivi des notification est affiché si l'événement est notifiable
966     // et si des notifications ont été envoyées
967     $evenement_id = $this->getVal("evenement");
968     $inst_evenement = $this->get_inst_evenement($evenement_id);
969     if ($this->get_boolean_from_pgsql_value($inst_evenement->getVal('notification_service')) == true) {
970     // Des notifications ont été envoyé si il existe au moins une notification
971     // de type notification_service_consulte liées à l'instruction
972     $idsNotifs = $this->get_instruction_notification(
973     $this->getVal($this->clePrimaire),
974     'notification_service_consulte'
975     );
976     if (isset($idsNotifs) && $idsNotifs !== array()) {
977     return true;
978     }
979     }
980     return false;
981     }
982    
983    
984     /**
985     * CONDITION - can_display_notification_tiers
986     *
987     * Vérifie que le champs "suivi_notification_tiers" est affichable
988     *
989     * @return boolean
990     */
991     function can_display_notification_tiers() {
992     // Le suivi des notification est affiché si l'événement est notifiable
993     // et si des notifications ont été envoyées
994     $evenement_id = $this->getVal("evenement");
995     $inst_evenement = $this->get_inst_evenement($evenement_id);
996     if ($this->get_boolean_from_pgsql_value($inst_evenement->getVal('notification_tiers')) == true) {
997     // Des notifications ont été envoyé si il existe au moins une notification
998     // de type notification_tiers_consulte liées à l'instruction
999     $idsNotifs = $this->get_instruction_notification(
1000     $this->getVal($this->clePrimaire),
1001     'notification_tiers_consulte'
1002     );
1003     if (isset($idsNotifs) && $idsNotifs !== array()) {
1004     return true;
1005     }
1006     }
1007     return false;
1008     }
1009    
1010     /**
1011 softime 8593 * TREATMENT - disable_edition_integrale.
1012     *
1013     * Cette methode permet de passer la consultation en "lu"
1014     *
1015     * @return boolean true si maj effectué false sinon
1016     */
1017     function disable_edition_integrale() {
1018     // Cette méthode permet d'exécuter une routine en début des méthodes
1019     // dites de TREATMENT.
1020     $this->begin_treatment(__METHOD__);
1021     $this->correct = true;
1022     $valF = array(
1023     "flag_edition_integrale" => false,
1024     "titre_om_htmletat" => null,
1025     "corps_om_htmletatex" => null,
1026     );
1027     $res = $this->f->db->autoExecute(
1028     DB_PREFIXE.$this->table,
1029     $valF,
1030     DB_AUTOQUERY_UPDATE,
1031     $this->clePrimaire."=".$this->getVal($this->clePrimaire)
1032     );
1033     if ($this->f->isDatabaseError($res, true)) {
1034     // Appel de la methode de recuperation des erreurs
1035     $this->erreur_db($res->getDebugInfo(), $res->getMessage(), '');
1036     $this->correct = false;
1037     // Termine le traitement
1038     return $this->end_treatment(__METHOD__, false);
1039     } else {
1040     $this->addToMessage(_("Rédaction par compléments activé."));
1041     return $this->end_treatment(__METHOD__, true);
1042     }
1043    
1044     // Termine le traitement
1045     return $this->end_treatment(__METHOD__, false);
1046     }
1047    
1048     /**
1049     * TREATMENT - enable_edition_integrale.
1050     *
1051     * Cette methode permet de passer la consultation en "lu"
1052     *
1053     * @return boolean true si maj effectué false sinon
1054     */
1055     function enable_edition_integrale() {
1056     // Cette méthode permet d'exécuter une routine en début des méthodes
1057     // dites de TREATMENT.
1058     $this->begin_treatment(__METHOD__);
1059     $this->correct = true;
1060    
1061     // Récupère la collectivite du dossier d'instruction
1062     $dossier_instruction_om_collectivite = $this->get_dossier_instruction_om_collectivite();
1063     $collectivite = $this->f->getCollectivite($dossier_instruction_om_collectivite);
1064     //
1065     $params = array(
1066     "specific" => array(
1067     "corps" => array(
1068     "mode" => "get",
1069     )
1070     ),
1071     );
1072     $result = $this->compute_pdf_output('lettretype', $this->getVal('lettretype'), $collectivite, null, $params);
1073     $corps = $result['pdf_output'];
1074     //
1075     $params = array(
1076     "specific" => array(
1077     "titre" => array(
1078     "mode" => "get",
1079     )
1080     ),
1081     );
1082     $result = $this->compute_pdf_output('lettretype', $this->getVal('lettretype'), $collectivite, null, $params);
1083     $titre = $result['pdf_output'];
1084     //
1085     $valF = array(
1086     "flag_edition_integrale" => true,
1087     "titre_om_htmletat" => $titre,
1088     "corps_om_htmletatex" => $corps,
1089     );
1090     $res = $this->f->db->autoExecute(
1091     DB_PREFIXE.$this->table,
1092     $valF,
1093     DB_AUTOQUERY_UPDATE,
1094     $this->clePrimaire."=".$this->getVal($this->clePrimaire)
1095     );
1096     if ($this->f->isDatabaseError($res, true)) {
1097     // Appel de la methode de recuperation des erreurs
1098     $this->erreur_db($res->getDebugInfo(), $res->getMessage(), '');
1099     $this->correct = false;
1100     // Termine le traitement
1101     return $this->end_treatment(__METHOD__, false);
1102     } else {
1103     $this->addToMessage(_("Rédaction libre activé."));
1104     return $this->end_treatment(__METHOD__, true);
1105     }
1106    
1107     // Termine le traitement
1108     return $this->end_treatment(__METHOD__, false);
1109     }
1110    
1111     /**
1112 mbroquet 3730 * Cette méthode permet de récupérer le dossier d'autorisation d'un dossier
1113     */
1114     function getNumDemandeAutorFromDossier($id) {
1115     //
1116     if (!isset($id)) {
1117     return NULL;
1118     }
1119     //
1120     $sql = "select dossier_autorisation from ".DB_PREFIXE."dossier ";
1121     $sql .= " where dossier='".$id."'";
1122     //
1123 softime 8989 $dossier_autorisation = $this->f->db->getOne($sql);
1124 mbroquet 3730 $this->addToLog("getNumDemandeAutorFromDossier(): db->getone(\"".$sql."\")", VERBOSE_MODE);
1125     database::isError($dossier_autorisation);
1126     //
1127     return $dossier_autorisation;
1128     }
1129    
1130     // }}}
1131    
1132     function setType(&$form, $maj) {
1133 softime 8593 // Récupération du mode de l'action
1134     $crud = $this->get_action_crud($maj);
1135     // Récupère la collectivité du dossier d'instruction
1136     $collectivite_di = $this->get_dossier_instruction_om_collectivite();
1137 mbroquet 3730
1138 softime 8593 // Cache tous les champs
1139     foreach ($this->champs as $value) {
1140     $form->setType($value, 'hidden');
1141     }
1142 softime 6565
1143 softime 10573 // Les champs historique_signature et statut_signature ne sont pas saisissable dans tous les cas
1144 softime 11228 if ($this->can_display_parapheur() === true && $maj == 3) {
1145 softime 10573 $form->setType('statut_signature', 'selectstatic');
1146     $form->setType('historique_signature', 'jsontotab');
1147     if ($this->getVal('commentaire_signature') == null) {
1148     $form->setType('commentaire_signature', 'hidden');
1149     } else {
1150     $form->setType('commentaire_signature', 'hiddenstatic');
1151     }
1152     }
1153    
1154 softime 11585 // Le champ de suivi des notifications des demandeurs n'est pas affichable dans tous les cas
1155     if ($this->can_display_notification_demandeur() === true && $maj == 3) {
1156 softime 10808 $form->setType('suivi_notification', 'jsontotab');
1157     }
1158 softime 11585 // Le champ de suivi des notifications des services n'est pas affichable dans tous les cas
1159     if ($this->can_display_notification_service() === true && $maj == 3) {
1160     $form->setType('suivi_notification_service', 'jsontotab');
1161     }
1162     // Le champ de suivi des notifications des tiers n'est pas affichable dans tous les cas
1163     if ($this->can_display_notification_tiers() === true && $maj == 3) {
1164     $form->setType('suivi_notification_tiers', 'jsontotab');
1165     }
1166 softime 10808
1167 softime 8593 // MODE AJOUTER
1168     if ($this->getParameter('maj') == 0) {
1169 softime 10573 $form->setType('commentaire', 'textareahidden');
1170     // Si l'option est active passage du champ date en lecture seule
1171     if ($this->f->is_option_date_evenement_instruction_lecture_seule($collectivite_di) === true) {
1172     $form->setType("date_evenement", "hiddenstaticdate");
1173     } else {
1174     $form->setType("date_evenement", "date");
1175     }
1176 softime 8989 if ($this->is_in_context_of_foreign_key("evenement", $this->getParameter("retourformulaire"))) {
1177 softime 8593 $form->setType("evenement", "selecthiddenstatic");
1178     } else {
1179     $form->setType("evenement", "select");
1180     }
1181 softime 8989 if ($this->is_in_context_of_foreign_key("signataire_arrete", $this->getParameter("retourformulaire"))) {
1182 softime 8593 $form->setType("signataire_arrete", "selecthiddenstatic");
1183     } else {
1184     $form->setType("signataire_arrete", "select");
1185     }
1186     if ($this->is_option_redaction_libre_enabled() === true) {
1187     $form->setType("flag_edition_integrale", "select");
1188     }
1189 mbroquet 3730 }
1190    
1191 softime 8593 // MODE MODIFIER
1192     if ($this->getParameter('maj') == 1) {
1193 softime 10573 // Si l'option est active passage du champ date en lecture seule
1194     if ($this->f->is_option_date_evenement_instruction_lecture_seule($collectivite_di) === true) {
1195     $form->setType("date_evenement", "hiddenstaticdate");
1196     } else {
1197     $form->setType("date_evenement", "date");
1198     }
1199 softime 8593 $form->setType("evenement", "selecthiddenstatic");
1200     if ($this->has_an_edition() === true) {
1201     $form->setType('lettretype', 'hiddenstatic');
1202 softime 8989 if ($this->is_in_context_of_foreign_key("signataire_arrete", $this->getParameter("retourformulaire"))) {
1203 softime 8593 $form->setType("signataire_arrete", "selecthiddenstatic");
1204     } else {
1205     $form->setType("signataire_arrete", "select");
1206     }
1207     if ($this->getVal("flag_edition_integrale") == "t") {
1208     $form->setType("titre_om_htmletat", "htmlEtat");
1209     $form->setType("corps_om_htmletatex", "htmlEtatEx");
1210     } else {
1211     $form->setType("complement_om_html", "html");
1212     $form->setType("complement2_om_html", "html");
1213     $form->setType("complement3_om_html", "html");
1214     $form->setType("complement4_om_html", "html");
1215     $form->setType('bible_auto', 'httpclick');
1216     $form->setType('bible', 'httpclick');
1217     $form->setType('bible2', 'httpclick');
1218     $form->setType('bible3', 'httpclick');
1219     $form->setType('bible4', 'httpclick');
1220     }
1221     if ($this->f->is_option_preview_pdf_enabled($collectivite_di) === true) {
1222     //
1223     $form->setType('btn_refresh', 'httpclickbutton');
1224     $form->setType('btn_preview', 'httpclickbutton');
1225     $form->setType('btn_redaction', 'httpclickbutton');
1226 softime 11876 // /!\ le type du champs est utilisé dans un selecteur dans le jscript.js
1227     // pour identifiant le champ de prévisualisation et régler sa taille à
1228     // l'affichage du champ. En cas de modification, le selecteur doit également
1229     // être mis à jour
1230 softime 11418 $form->setType('live_preview', 'previsualiser_pdf');
1231 softime 7521 }
1232 softime 8593
1233 mbroquet 3730 // necessaire pour calcul de date en modification
1234     //$form->setType('delai', 'hiddenstatic');
1235     // les administrateurs technique et fonctionnel peuvent
1236     // modifier tous les champs de date
1237     // si l'instruction a déjà été finalisée au moins une fois
1238 softime 7996 if (($this->f->isAccredited(array($this->get_absolute_class_name(), $this->get_absolute_class_name()."modification_dates"), "OR")
1239 softime 6565 || $this->f->isAccredited(array('instruction', 'instruction_modification_dates'), "OR"))
1240 mbroquet 3730 && $this->getVal("date_finalisation_courrier") != '') {
1241 softime 8593 //
1242 mbroquet 3730 $form->setType('date_envoi_signature', 'date');
1243     $form->setType('date_retour_signature', 'date');
1244 softime 10573 if ($this->is_sent_for_signature() === true
1245     && $this->is_signed() === true) {
1246     //
1247     $form->setType("date_envoi_signature", "datereadonly");
1248     $form->setType("date_retour_signature", "datereadonly");
1249     }
1250 mbroquet 3730 $form->setType('date_envoi_rar', 'date');
1251     $form->setType('date_retour_rar', 'date');
1252     $form->setType('date_envoi_controle_legalite', 'date');
1253 softime 11418 if ($this->is_sent_to_cl() === true) {
1254 softime 12124 $form->setType("date_envoi_controle_legalite", "datedisabled");
1255 softime 11418 }
1256 mbroquet 3730 $form->setType('date_retour_controle_legalite', 'date');
1257     $form->setType('date_finalisation_courrier', 'date');
1258     }
1259     }
1260     }
1261    
1262 softime 10808 // MODE CONSULTER + SUPPRIMER + SUIVI DES DATES 125 + NOTIFICATION MANUELLE
1263 softime 8593 if ($this->getParameter('maj') == 3
1264     || $this->getParameter('maj') == 2
1265 softime 10808 || $this->getParameter('maj') == 125
1266     || $this->getParameter('maj') == 410) {
1267 softime 8593 //
1268     $form->setType("date_evenement", "datestatic");
1269     $form->setType("evenement", "selecthiddenstatic");
1270     if ($this->has_an_edition() === true) {
1271     $form->setType('lettretype', 'hiddenstatic');
1272     $form->setType("signataire_arrete", "selecthiddenstatic");
1273     if ($this->getVal("om_final_instruction") == 't') {
1274     $form->setType('om_final_instruction_utilisateur', 'textareastatic');
1275     } else {
1276     $form->setType('om_final_instruction_utilisateur', 'hidden');
1277     }
1278     }
1279 softime 10573 if ($this->evenement_has_a_commentaire($this->getVal('evenement')) === true ) {
1280     $form->setType('commentaire', 'textareastatic');
1281     }
1282 mbroquet 3730 }
1283    
1284 softime 10808 // MODE CONSULTER + SUPPRIMER + NOTIFICATION MANUELLE
1285     if ($this->getParameter('maj') == 3
1286     || $this->getParameter('maj') == 2
1287     || $this->getParameter('maj') == 410) {
1288 softime 10573 // Si il n'y a pas de lettre type (edition) associé à l'événement
1289     // les dates de suivi ne sont pas affichée
1290 softime 8593 if ($this->has_an_edition() === true) {
1291 softime 10573 $form->setType('date_envoi_signature', 'datestatic');
1292     $form->setType('date_retour_signature', 'datestatic');
1293     $form->setType('date_envoi_rar', 'datestatic');
1294     $form->setType('date_retour_rar', 'datestatic');
1295     $form->setType('date_envoi_controle_legalite', 'datestatic');
1296     $form->setType('date_retour_controle_legalite', 'datestatic');
1297     $form->setType('date_finalisation_courrier', 'datestatic');
1298 softime 8593 if ($this->getVal("flag_edition_integrale") == "t") {
1299     $form->setType("titre_om_htmletat", "htmlstatic");
1300     $form->setType("corps_om_htmletatex", "htmlstatic");
1301     } else {
1302     $form->setType("complement_om_html", "htmlstatic");
1303     $form->setType("complement2_om_html", "htmlstatic");
1304     $form->setType("complement3_om_html", "htmlstatic");
1305     $form->setType("complement4_om_html", "htmlstatic");
1306     }
1307 mbroquet 3730 }
1308     }
1309 softime 8593
1310     // MODE SUIVI DES DATES 125
1311     if ($this->getParameter('maj') == 125) {
1312     $form->setType("date_evenement", "hiddenstaticdate");
1313     $form->setType('om_final_instruction_utilisateur', 'hiddenstatic');
1314     $form->setType('date_envoi_signature', 'date');
1315     $form->setType('date_retour_signature', 'date');
1316 softime 10573 if ($this->is_sent_for_signature() === true
1317     || $this->is_signed() === true) {
1318     //
1319     $form->setType("date_envoi_signature", "datereadonly");
1320     $form->setType("date_retour_signature", "datereadonly");
1321     }
1322 softime 8593 $form->setType('date_envoi_rar', 'date');
1323     $form->setType('date_retour_rar', 'date');
1324     $form->setType('date_envoi_controle_legalite', 'date');
1325 softime 11418 if ($this->is_sent_to_cl() === true) {
1326 softime 12124 $form->setType("date_envoi_controle_legalite", "datedisabled");
1327 softime 11418 }
1328 softime 8593 $form->setType('date_retour_controle_legalite', 'date');
1329     $form->setType('date_finalisation_courrier', 'date');
1330     }
1331 softime 10573
1332     if ($maj == 401) {
1333     foreach ($this->champs as $champ) {
1334     $form->setType($champ, 'hidden');
1335     }
1336 softime 11418 $form->setType('preview_edition', 'previsualiser');
1337 softime 10573 }
1338 softime 12124
1339     // Si l'instruction a été envoyé au contrôle de légalité et que la
1340     // tâche envoi_cl lié n'a pas encore été traité il faut indiquer à
1341     // l'utilisateur que l'envoi au cl est en cours de traitement.
1342     if ($this->is_sent_to_cl() === true
1343     && empty($this->getVal('date_envoi_controle_legalite'))
1344     && $maj == 3) {
1345     $form->setType("date_envoi_controle_legalite", "hiddenstatic");
1346     }
1347 mbroquet 3730 }
1348    
1349 softime 8593 function setOnchange(&$form,$maj){
1350     parent::setOnchange($form,$maj);
1351    
1352     // MODE AJOUTER
1353     if ($this->getParameter('maj') == 0) {
1354 softime 10573 $form->setOnchange(
1355     "evenement",
1356     "manage_instruction_evenement_lettretype(this.value, '".addslashes($this->getParameter('idxformulaire'))."');
1357     manage_instruction_evenement_commentaire(this.value, '".addslashes($this->getParameter('idxformulaire'))."');"
1358     );
1359 softime 8593 }
1360     }
1361    
1362     function evenement_has_an_edition($evenement_id) {
1363     $evenement = $this->get_inst_evenement($evenement_id);
1364     $lettretype = $evenement->getVal('lettretype');
1365     if ($lettretype !== '' && $lettretype !== null) {
1366     return true;
1367     }
1368     return false;
1369     }
1370    
1371     function view_evenement_has_an_edition_json() {
1372     $json_return = array(
1373     "lettretype" => $this->evenement_has_an_edition($this->f->get_submitted_get_value('evenement_id')),
1374     "option_redaction_libre_enabled" => $this->is_option_redaction_libre_enabled(),
1375     );
1376     echo json_encode($json_return);
1377     }
1378    
1379 softime 10573 function evenement_has_a_commentaire($evenement_id) {
1380     $evenement = $this->get_inst_evenement($evenement_id);
1381     return $this->get_boolean_from_pgsql_value($evenement->getVal('commentaire'));
1382     }
1383    
1384     function view_evenement_has_a_commentaire_json() {
1385     $json_return = array(
1386     "commentaire" => $this->evenement_has_a_commentaire($this->f->get_submitted_get_value('evenement_id'))
1387     );
1388     echo json_encode($json_return);
1389     }
1390    
1391 softime 11418
1392 softime 8989 /**
1393 softime 11418 * CONDITION - can_be_sended_to_cl
1394 softime 8989 *
1395 softime 11418 * Vérifie que le contrôle de légalité est disponible
1396     *
1397     * @return boolean
1398     */
1399     function can_be_sended_to_cl() {
1400     // Si l'instruction a une édition
1401     // et que l'événement est paramétré pour envoyer le contrôle de légalité
1402     // par Plat'AU
1403     // et que la date de retour signature est renseignée
1404     // et que la date d'envoi au contrôle légalité n'est pas renseignée
1405     // et qu'il n'existe pas de task envoi_CL en cours (!= done ou canceled)
1406     if ($this->has_an_edition() === true) {
1407     $inst_di = $this->get_inst_dossier($this->getVal('dossier'));
1408     $inst_evenement = $this->get_inst_evenement($this->getVal('evenement'));
1409     if ($inst_evenement->getVal('envoi_cl_platau') === 't'
1410     && empty($this->getVal('date_retour_signature')) === false
1411     && empty($this->getVal('date_envoi_controle_legalite')) === true
1412     && $this->getVal('envoye_cl_platau') === 'f'
1413     && $this->f->is_type_dossier_platau($inst_di->getVal('dossier_autorisation')) === true
1414     && $inst_di->getVal('etat_transmission_platau') !== 'jamais_transmissible') {
1415     //
1416     return true;
1417     }
1418     }
1419     //
1420     return false;
1421     }
1422    
1423     /**
1424     *
1425 softime 8989 * @return string
1426     */
1427     function get_var_sql_forminc__sql_signataire_arrete() {
1428 softime 11585 return sprintf(
1429     "SELECT
1430     signataire_arrete.signataire_arrete,
1431     CONCAT_WS(
1432     ' - ',
1433     CONCAT_WS(' ', signataire_arrete.prenom, signataire_arrete.nom),
1434     signataire_habilitation.libelle,
1435     signataire_arrete.description
1436     )
1437     FROM
1438     %1\$ssignataire_arrete
1439     LEFT JOIN %1\$ssignataire_habilitation
1440     ON signataire_arrete.signataire_habilitation = signataire_habilitation.signataire_habilitation
1441     WHERE
1442     ((signataire_arrete.om_validite_debut IS NULL
1443     AND (signataire_arrete.om_validite_fin IS NULL
1444     OR signataire_arrete.om_validite_fin > CURRENT_DATE))
1445     OR (signataire_arrete.om_validite_debut <= CURRENT_DATE
1446     AND (signataire_arrete.om_validite_fin IS NULL
1447     OR signataire_arrete.om_validite_fin > CURRENT_DATE)))
1448     ORDER BY
1449     signataire_arrete.prenom,
1450     signataire_arrete.nom",
1451     DB_PREFIXE
1452     );
1453 softime 8989 }
1454    
1455     /**
1456     *
1457     * @return string
1458     */
1459     function get_var_sql_forminc__sql_signataire_arrete_by_id() {
1460 softime 11585 return sprintf(
1461     "SELECT
1462     signataire_arrete.signataire_arrete,
1463     CONCAT_WS(
1464     ' - ',
1465     CONCAT_WS(' ', signataire_arrete.prenom, signataire_arrete.nom),
1466     signataire_habilitation.libelle,
1467     signataire_arrete.description
1468     )
1469     FROM
1470     %1\$ssignataire_arrete
1471     LEFT JOIN %1\$ssignataire_habilitation
1472     ON signataire_arrete.signataire_habilitation = signataire_habilitation.signataire_habilitation
1473     WHERE
1474     signataire_arrete.signataire_arrete = <idx>",
1475     DB_PREFIXE
1476     );
1477 softime 8989 }
1478    
1479     /**
1480     *
1481     * @return string
1482     */
1483     function get_var_sql_forminc__sql_signataire_arrete_by_di() {
1484 softime 11585 return sprintf(
1485     "SELECT
1486     signataire_arrete.signataire_arrete,
1487     CONCAT_WS(
1488     ' - ',
1489     CONCAT_WS(' ', signataire_arrete.prenom, signataire_arrete.nom),
1490     signataire_habilitation.libelle,
1491     signataire_arrete.description
1492     )
1493     FROM
1494     %1\$ssignataire_arrete
1495     LEFT JOIN %1\$som_collectivite
1496     ON signataire_arrete.om_collectivite = om_collectivite.om_collectivite
1497     LEFT JOIN %1\$ssignataire_habilitation
1498     ON signataire_arrete.signataire_habilitation = signataire_habilitation.signataire_habilitation
1499     WHERE
1500     ((signataire_arrete.om_validite_debut IS NULL
1501     AND (signataire_arrete.om_validite_fin IS NULL
1502     OR signataire_arrete.om_validite_fin > CURRENT_DATE))
1503     OR (signataire_arrete.om_validite_debut <= CURRENT_DATE
1504     AND (signataire_arrete.om_validite_fin IS NULL
1505     OR signataire_arrete.om_validite_fin > CURRENT_DATE)))
1506     AND (om_collectivite.niveau = '2'
1507     OR signataire_arrete.om_collectivite = <collectivite_di>)
1508     ORDER BY
1509     signataire_arrete.prenom, signataire_arrete.nom",
1510     DB_PREFIXE
1511     );
1512 softime 8989 }
1513    
1514     /**
1515     *
1516     * @return string
1517     */
1518     function get_var_sql_forminc__sql_signataire_arrete_defaut() {
1519 softime 11585 return sprintf(
1520     "SELECT
1521     signataire_arrete.signataire_arrete,
1522     CONCAT_WS(
1523     ' - ',
1524     CONCAT_WS(' ', signataire_arrete.prenom, signataire_arrete.nom),
1525     signataire_habilitation.libelle,
1526     signataire_arrete.description
1527     )
1528     FROM
1529     %1\$ssignataire_arrete
1530     LEFT JOIN %1\$ssignataire_habilitation
1531     ON signataire_arrete.signataire_habilitation = signataire_habilitation.signataire_habilitation
1532     WHERE
1533     ((signataire_arrete.om_validite_debut IS NULL
1534     AND (signataire_arrete.om_validite_fin IS NULL
1535     OR signataire_arrete.om_validite_fin > CURRENT_DATE))
1536     OR (signataire_arrete.om_validite_debut <= CURRENT_DATE
1537     AND (signataire_arrete.om_validite_fin IS NULL
1538     OR signataire_arrete.om_validite_fin > CURRENT_DATE)))
1539     AND signataire_arrete.defaut IS TRUE
1540     ORDER BY
1541     signataire_arrete.prenom, signataire_arrete.nom",
1542     DB_PREFIXE
1543     );
1544 softime 8989 }
1545    
1546     /**
1547     *
1548     * @return string
1549     */
1550     function get_var_sql_forminc__sql_signataire_arrete_defaut_by_di() {
1551 softime 11585 return sprintf(
1552     "SELECT
1553     signataire_arrete.signataire_arrete,
1554     CONCAT_WS(
1555     ' - ',
1556     CONCAT_WS(' ', signataire_arrete.prenom, signataire_arrete.nom),
1557     signataire_habilitation.libelle,
1558     signataire_arrete.description
1559     )
1560     FROM
1561     %1\$ssignataire_arrete
1562     LEFT JOIN %1\$ssignataire_habilitation
1563     ON signataire_arrete.signataire_habilitation = signataire_habilitation.signataire_habilitation
1564     LEFT JOIN %1\$som_collectivite
1565     ON signataire_arrete.om_collectivite = om_collectivite.om_collectivite
1566     WHERE
1567     ((signataire_arrete.om_validite_debut IS NULL
1568     AND (signataire_arrete.om_validite_fin IS NULL
1569     OR signataire_arrete.om_validite_fin > CURRENT_DATE))
1570     OR (signataire_arrete.om_validite_debut <= CURRENT_DATE
1571     AND (signataire_arrete.om_validite_fin IS NULL
1572     OR signataire_arrete.om_validite_fin > CURRENT_DATE)))
1573     AND signataire_arrete.defaut IS TRUE
1574     AND (om_collectivite.niveau = '2'
1575     OR signataire_arrete.om_collectivite = <collectivite_di>)
1576     ORDER BY
1577     signataire_arrete.prenom,
1578     signataire_arrete.nom",
1579     DB_PREFIXE
1580     );
1581 softime 8989 }
1582    
1583     /**
1584     * SETTER_FORM - setSelect.
1585     *
1586     * @return void
1587     */
1588     function setSelect(&$form, $maj, &$dnu1 = null, $dnu2 = null) {
1589     //parent::setSelect($form, $maj);
1590 mbroquet 3730 /**
1591     * On ne surcharge pas la méthode parent car une requête sur la table
1592     * dossier est mauvaise pour les performances, car la requête qui
1593     * concerne evenement est plus complexe que celle générée et car les
1594     * champs action, avis_decision et etat ne sont pas utilisés comme des
1595     * select
1596     */
1597     //// action
1598 softime 8989 //$this->init_select($form, $this->f->db, $maj, null, "action",
1599 mbroquet 3730 // $sql_action, $sql_action_by_id, false);
1600    
1601     //// avis_decision
1602 softime 8989 //$this->init_select($form, $this->f->db, $maj, null, "avis_decision",
1603 mbroquet 3730 // $sql_avis_decision, $sql_avis_decision_by_id, false);
1604    
1605     //// dossier
1606 softime 8989 //$this->init_select($form, $this->f->db, $maj, null, "dossier",
1607 mbroquet 3730 // $sql_dossier, $sql_dossier_by_id, false);
1608    
1609     //// etat
1610 softime 8989 //$this->init_select($form, $this->f->db, $maj, null, "etat",
1611 mbroquet 3730 // $sql_etat, $sql_etat_by_id, false);
1612    
1613     //// evenement
1614 softime 8989 //$this->init_select($form, $this->f->db, $maj, null, "evenement",
1615 mbroquet 3730 // $sql_evenement, $sql_evenement_by_id, false);
1616    
1617     // signataire_arrete
1618     // si contexte DI
1619     if ($this->getParameter("retourformulaire") == "dossier"
1620     || $this->getParameter("retourformulaire") == "dossier_instruction"
1621     || $this->getParameter("retourformulaire") == "dossier_instruction_mes_encours"
1622     || $this->getParameter("retourformulaire") == "dossier_instruction_tous_encours"
1623     || $this->getParameter("retourformulaire") == "dossier_instruction_mes_clotures"
1624 softime 6565 || $this->getParameter("retourformulaire") == "dossier_instruction_tous_clotures"
1625     || $this->getParameter("retourformulaire") == "dossier_contentieux_mes_infractions"
1626     || $this->getParameter("retourformulaire") == "dossier_contentieux_toutes_infractions"
1627     || $this->getParameter("retourformulaire") == "dossier_contentieux_mes_recours"
1628     || $this->getParameter("retourformulaire") == "dossier_contentieux_tous_recours") {
1629 mbroquet 3730 // on recupère les signataires de la multicollectivité et de celle du DI
1630 softime 7996 $di = $this->f->get_inst__om_dbform(array(
1631     "obj" => "dossier_instruction",
1632     "idx" => $this->getParameter('idxformulaire'),
1633     ));
1634 softime 8989 $sql_signataire_arrete_by_di = str_replace(
1635     '<collectivite_di>',
1636     $di->getVal("om_collectivite"),
1637     $this->get_var_sql_forminc__sql("signataire_arrete_by_di")
1638     );
1639     $this->init_select(
1640     $form,
1641     $this->f->db,
1642     $maj,
1643     null,
1644     "signataire_arrete",
1645     $sql_signataire_arrete_by_di,
1646     $this->get_var_sql_forminc__sql("signataire_arrete_by_id"),
1647     true
1648     );
1649 mbroquet 3730 } else {
1650 softime 8989 $this->init_select(
1651     $form,
1652     $this->f->db,
1653     $maj,
1654     null,
1655     "signataire_arrete",
1656     $this->get_var_sql_forminc__sql("signataire_arrete"),
1657     $this->get_var_sql_forminc__sql("signataire_arrete_by_id"),
1658     true
1659     );
1660 mbroquet 3730 }
1661    
1662     /**
1663     * Gestion du filtre sur les événements de workflow disponibles
1664     * On récupère ici en fonction de l'état du dossier d'instruction en
1665     * cours et du type du dossier d'instruction en cours la liste
1666     * événements disponibles.
1667     */
1668     if ($maj == 0) {
1669     // Récupération des événements par une jointure entre la table dossier
1670     // et la table transition et la table evenement et la table
1671     // lien_dossier_instruction_type_evenement en fonction de l'identifiant
1672     // du dossier d'instruction en cours
1673     $sql = "SELECT
1674     evenement.evenement,
1675     evenement.libelle as lib
1676     FROM ".DB_PREFIXE."dossier
1677     INNER JOIN ".DB_PREFIXE."lien_dossier_instruction_type_evenement
1678     ON dossier.dossier_instruction_type=lien_dossier_instruction_type_evenement.dossier_instruction_type
1679     INNER JOIN ".DB_PREFIXE."evenement
1680     ON evenement.evenement=lien_dossier_instruction_type_evenement.evenement
1681     INNER JOIN ".DB_PREFIXE."transition
1682     ON evenement.evenement = transition.evenement
1683     AND dossier.etat=transition.etat
1684 softime 8989 WHERE dossier.dossier='".$this->getParameter("idxformulaire")."' ";
1685 mbroquet 3730
1686     // Si changement de décision par instructeur commune
1687     if($this->f->isUserInstructeur() === true
1688 softime 8989 && $this->getDivisionFromDossier($this->getParameter("idxformulaire")) != $_SESSION["division"]
1689     && $this->isInstrCanChangeDecision($this->getParameter("idxformulaire")) === true) {
1690 mbroquet 3730 $sql .= "AND evenement.type IN ('arrete', 'changement_decision') ";
1691     }
1692     $sql .= "ORDER BY evenement.libelle, evenement.action";
1693 softime 8989 $res = $this->f->db->query($sql);
1694 mbroquet 3730 $this->addToLog("setSelect(): db->query(\"".$sql."\");", VERBOSE_MODE);
1695     if (database::isError($res)) {
1696     die($res->getMessage());
1697     }
1698     // Remplissage du tableau du select
1699     $contenu = array(
1700     0 => array("",),
1701     1 => array(_('choisir')." "._('evenement'),)
1702     );
1703     while ($row=& $res->fetchRow()) {
1704     $contenu[0][] = $row[0];
1705     $contenu[1][] = $row[1];
1706     }
1707     $form->setSelect("evenement", $contenu);
1708 softime 8593
1709 mbroquet 3730 } else {
1710     $sql = "SELECT
1711     evenement.libelle as lib
1712     FROM ".DB_PREFIXE."evenement
1713     WHERE evenement.evenement=".$this->getVal("evenement")."";
1714 softime 8989 $res = $this->f->db->getone($sql);
1715 mbroquet 3730 $this->addToLog("setSelect(): db->getone(\"".$sql."\");", VERBOSE_MODE);
1716     if (database::isError($res)) {
1717     die($res->getMessage());
1718     }
1719     //
1720     $contenu = array(
1721     0 => array($this->getVal("evenement"),),
1722     1 => array($res,)
1723     );
1724     $form->setSelect("evenement", $contenu);
1725     }
1726    
1727     /**
1728     * Gesion des liens vers la bible
1729     */
1730     // lien bible_auto
1731     $contenu = array(_("automatique"));
1732     $form->setSelect("bible_auto",$contenu);
1733     // lien bible1
1734     $contenu = array(_("bible"));
1735     $form->setSelect("bible",$contenu);
1736     // lien bible2
1737     $contenu = array(_("bible"));
1738     $form->setSelect("bible2",$contenu);
1739     // lien bible3
1740     $contenu = array(_("bible"));
1741     $form->setSelect("bible3",$contenu);
1742     // lien bible4
1743     $contenu = array(_("bible"));
1744     $form->setSelect("bible4",$contenu);
1745 softime 7521
1746     if ($maj == 1) {
1747     $base64 = $this->init_pdf_temp();
1748     $form->setSelect('live_preview', array('base64'=>$base64));
1749 softime 8593 $form->setSelect("btn_refresh", array(_('Prévisualiser')));
1750     $form->setSelect("btn_preview", array(_('Prévisualiser >>')));
1751     $form->setSelect("btn_redaction", array(_('<< Rédiger')));
1752 softime 7521 }
1753 softime 8593
1754     // Selection du type de rédaction à l'ajout
1755     $content = array(
1756     0 => array('f', 't', ),
1757     1 => array(_('Rédaction par compléments'), _('Rédaction libre'), ),
1758     );
1759     $form->setSelect('flag_edition_integrale', $content);
1760 softime 10573
1761     $contenu = array();
1762     foreach(array('waiting', 'in_progress', 'canceled', 'expired', 'finished') as $value) {
1763     $contenu[0][] = $value;
1764     $contenu[1][] = $this->get_trad_for_statut($value);
1765     }
1766     $form->setSelect('statut_signature', $contenu);
1767    
1768    
1769     if ($maj == 401) {
1770     $file = $this->f->storage->get($this->getVal('om_fichier_instruction'));
1771 softime 11418 $form->setSelect('preview_edition', array(
1772     'base64' => base64_encode($file['file_content']),
1773     'mimetype' => $file['metadata']['mimetype'],
1774     'label' => 'instruction_'.$this->getVal($this->clePrimaire),
1775     'href' => sprintf(
1776     '../app/index.php?module=form&snippet=file&obj=instruction&champ=om_fichier_instruction&id=%1$s',
1777     $this->getVal($this->clePrimaire)
1778     )
1779     ));
1780 softime 10573 }
1781 mbroquet 3730 }
1782    
1783 softime 8989 function cleSecondaire($id, &$dnu1 = null, $val = array(), $dnu2 = null) {
1784 mbroquet 3730 //
1785 softime 11228 // Vérifie uniquementla cle secondaire : demande
1786     $this->rechercheTable($this->f->db, "demande", "instruction_recepisse", $id);
1787 mbroquet 3730
1788     $id = $this->getVal($this->clePrimaire);
1789    
1790    
1791     //Requête de vérification que cet événement d'instruction n'est pas lié
1792     //à la création d'un dossier d'instruction
1793     $sql = "SELECT demande_type.dossier_instruction_type
1794     FROM ".DB_PREFIXE."demande_type
1795     LEFT JOIN ".DB_PREFIXE."demande
1796     ON demande.demande_type = demande_type.demande_type
1797     WHERE demande.instruction_recepisse = ".$id;
1798 softime 8989 $res = $this->f->db->getOne($sql);
1799 mbroquet 3730 $this->addToLog("cleSecondaire(): db->getone(\"".$sql."\");", VERBOSE_MODE);
1800     if (database::isError($res)) {
1801     die($res->getMessage());
1802     }
1803    
1804     // Aucune clé secondaire n'a été trouvée ou c'est un événement sans
1805     //création de dossier d'instruction, l'événement d'instruction peut être
1806     //supprimé
1807     if ( $this->correct !== false || $res == null || $res == ""){
1808    
1809     // Requête de vérification que cet événement d'instruction est lié
1810     // à une demande
1811     $sql = "SELECT demande
1812     FROM ".DB_PREFIXE."demande
1813     WHERE instruction_recepisse = ".$id;
1814 softime 8989 $res = $this->f->db->getOne($sql);
1815 mbroquet 3730 $this->addToLog("cleSecondaire(): db->getone(\"".$sql."\");", VERBOSE_MODE);
1816     if (database::isError($res)) {
1817     die($res->getMessage());
1818     }
1819    
1820     //Si c'est un événement d'instruction lié à une demande
1821     if ($res != null || $res != ""){
1822 softime 7996 $demande = $this->f->get_inst__om_dbform(array(
1823     "obj" => "demande",
1824     "idx" => $res,
1825     ));
1826 mbroquet 3730
1827     //On met à jour la demande en supprimant la liaison vers
1828     //l'événement d'instruction
1829     $demande->setParameter("maj", 1);
1830     $valF = array();
1831     foreach($demande->champs as $identifiant => $champ) {
1832     $valF[$champ] = $demande->val[$identifiant];
1833     }
1834     $valF['date_demande']=$demande->dateDBToForm($valF['date_demande']);
1835     $valF['instruction_recepisse']=NULL;
1836 softime 8989 $ret = $demande->modifier($valF);
1837 mbroquet 3730 }
1838    
1839     /**
1840     * Vérification que l'élément supprimé est le dernier pour pouvoir
1841     * remodifier les données de manière itérative.
1842     */
1843     // Initialisation
1844     $dernierevenement = "";
1845     // Récupération du dernier élément de la table d'instruction qui
1846     // concerne le dossier en cours
1847     $sql = "SELECT max(instruction)
1848     FROM ".DB_PREFIXE."instruction
1849 softime 8989 WHERE dossier ='".$this->getParameter("idxformulaire")."'";
1850     $dernierevenement = $this->f->db->getOne($sql);
1851 mbroquet 3730 $this->addToLog("setSelect(): db->getone(\"".$sql."\");", VERBOSE_MODE);
1852     if (database::isError($dernierevenement)) {
1853     die($dernierevenement->getMessage());
1854     }
1855     // Si on se trouve effectivement sur le dernier evenement d'instruction
1856     if ($dernierevenement == $id) {
1857     // Alors on valide la suppression
1858     $this->correct = true;
1859     $this->addToMessage(_('Destruction_chronologique'));
1860     } else {
1861     // Alors on annule la suppression
1862     $this->correct = false;
1863     $this->addToMessage(_("Seul le dernier evenement d'instruction peut etre supprime."));
1864     }
1865     }
1866     }
1867    
1868     /**
1869     * Vérification de la possibilité ou non de modifier des dates de suivi
1870     * @param string $champ champ date à vérifier
1871     */
1872     function updateDate($champ) {
1873    
1874     //Si le retourformulaire est "dossier_instruction"
1875     if ($this->getParameter("retourformulaire") == "dossier"
1876     || $this->getParameter("retourformulaire") == "dossier_instruction"
1877     || $this->getParameter("retourformulaire") == "dossier_instruction_mes_encours"
1878     || $this->getParameter("retourformulaire") == "dossier_instruction_tous_encours"
1879     || $this->getParameter("retourformulaire") == "dossier_instruction_mes_clotures"
1880 softime 6565 || $this->getParameter("retourformulaire") == "dossier_instruction_tous_clotures"
1881     || $this->getParameter("retourformulaire") == "dossier_contentieux_mes_infractions"
1882     || $this->getParameter("retourformulaire") == "dossier_contentieux_toutes_infractions"
1883     || $this->getParameter("retourformulaire") == "dossier_contentieux_mes_recours"
1884     || $this->getParameter("retourformulaire") == "dossier_contentieux_tous_recours") {
1885 mbroquet 3730
1886     // Vérification de la possibilité de modifier les dates si déjà éditées
1887     if($this->valF[$champ] != "" AND !$this->f->user_is_admin) {
1888     // si l'utilisateur n'est pas un admin
1889     if($this->getVal($champ) != "" AND $this->getVal($champ) != $this->valF[$champ]) {
1890     $this->correct = false;
1891     $this->addToMessage(_("Les dates de suivis ne peuvent etre modifiees"));
1892     }
1893     }
1894     }
1895    
1896     //
1897     return true;
1898     }
1899    
1900 softime 8989 /**
1901     * SETTER_FORM - setValsousformulaire (setVal).
1902     *
1903     * @return void
1904     */
1905     function setValsousformulaire(&$form, $maj, $validation, $idxformulaire, $retourformulaire, $typeformulaire, &$dnu1 = null, $dnu2 = null) {
1906     // parent::setValsousformulaire($form, $maj, $validation, $idxformulaire, $retourformulaire, $typeformulaire);
1907 mbroquet 3730 //
1908 softime 8989 $this->retourformulaire = $retourformulaire;
1909     //
1910 mbroquet 3730 if ($maj == 0) {
1911 softime 8989 $form->setVal("destinataire", $this->getParameter("idxformulaire"));
1912     $form->setVal("dossier", $this->getParameter("idxformulaire"));
1913 mbroquet 3730 }
1914 softime 12124
1915     // Si l'instruction a été envoyé au contrôle de légalité et que la
1916     // tâche envoi_cl lié n'a pas encore été traité il faut indiquer à
1917     // l'utilisateur que l'envoi au cl est en cours de traitement.
1918     if ($this->is_sent_to_cl() === true
1919     && empty($this->getVal('date_envoi_controle_legalite'))
1920     && $maj == 3) {
1921     $form->setVal("date_envoi_controle_legalite", __("En cours de traitement."));
1922     }
1923 mbroquet 3730 //
1924     $this->set_form_default_values($form, $maj, $validation);
1925     }
1926    
1927     /**
1928 softime 8989 * SETTER_FORM - set_form_default_values (setVal).
1929     *
1930     * @return void
1931 mbroquet 3730 */
1932     function set_form_default_values(&$form, $maj, $validation) {
1933 softime 8989 //
1934 mbroquet 3730 if ($maj == 0) {
1935     // si contexte DI
1936     if ($this->getParameter("retourformulaire") == "dossier"
1937     || $this->getParameter("retourformulaire") == "dossier_instruction"
1938     || $this->getParameter("retourformulaire") == "dossier_instruction_mes_encours"
1939     || $this->getParameter("retourformulaire") == "dossier_instruction_tous_encours"
1940     || $this->getParameter("retourformulaire") == "dossier_instruction_mes_clotures"
1941 softime 6565 || $this->getParameter("retourformulaire") == "dossier_instruction_tous_clotures"
1942     || $this->getParameter("retourformulaire") == "dossier_contentieux_mes_infractions"
1943     || $this->getParameter("retourformulaire") == "dossier_contentieux_toutes_infractions"
1944     || $this->getParameter("retourformulaire") == "dossier_contentieux_mes_recours"
1945     || $this->getParameter("retourformulaire") == "dossier_contentieux_tous_recours") {
1946 mbroquet 3730 // on recupère les signataires de la multicollectivité et de celle du DI
1947 softime 7996 $di = $this->f->get_inst__om_dbform(array(
1948     "obj" => "dossier_instruction",
1949 softime 8989 "idx" => $this->getParameter("idxformulaire"),
1950 softime 7996 ));
1951 softime 8989 $sql = str_replace(
1952     "<collectivite_di>",
1953     $di->getVal("om_collectivite"),
1954     $this->get_var_sql_forminc__sql("signataire_arrete_defaut_by_di")
1955     );
1956 mbroquet 3730 } else {
1957 softime 8989 $sql = $this->get_var_sql_forminc__sql("signataire_arrete_defaut");
1958 mbroquet 3730 }
1959     $res = $this->f->db->query($sql);
1960 softime 8989 $this->f->addToLog(__METHOD__."(): db->query(\"".$sql."\")", VERBOSE_MODE);
1961     $this->f->isDatabaseError($res);
1962 mbroquet 3730 $row = $res->fetchrow(DB_FETCHMODE_ASSOC);
1963 softime 8989 if (isset($row["signataire_arrete"])
1964     && is_numeric($row["signataire_arrete"])) {
1965     //
1966     $form->setVal("signataire_arrete", $row["signataire_arrete"]);
1967 mbroquet 3730 }
1968 softime 8989 // Date du jour
1969     $form->setVal("date_evenement", date("Y-m-d"));
1970 mbroquet 3730 }
1971 softime 8989 //
1972 mbroquet 3730 if ($maj == 0 || $maj == 1 || $maj == 125) {
1973 softime 8989 $form->setVal("bible_auto", "bible_auto()");
1974     $form->setVal("bible", "bible(1)");
1975     $form->setVal("bible2", "bible(2)");
1976     $form->setVal("bible3", "bible(3)");
1977     $form->setVal("bible4", "bible(4)");
1978 mbroquet 3730 }
1979 softime 8989 //
1980 softime 7521 $collectivite_di = $this->get_dossier_instruction_om_collectivite();
1981 softime 8989 if ($maj == 1
1982     && $this->f->is_option_preview_pdf_enabled($collectivite_di) === true
1983 softime 7521 && $this->has_an_edition() === true) {
1984 softime 8989 //
1985     $form->setVal("live_preview", $this->getVal($this->clePrimaire));
1986     $form->setVal("btn_refresh", "reload_pdf_viewer()");
1987     $form->setVal("btn_preview", "show_instr_preview()");
1988     $form->setVal("btn_redaction", "show_instr_redaction()");
1989 softime 7521 }
1990 softime 10808
1991     if ($maj == 3
1992 softime 11585 && $this->can_display_notification_demandeur()
1993 softime 10808 ) {
1994 softime 11585 $typeNotification = array(
1995     'notification_recepisse',
1996     'notification_instruction',
1997     'notification_decision',
1998     );
1999 softime 12124 $form->setVal("suivi_notification", $this->get_json_suivi_notification($typeNotification, true));
2000 softime 10808 }
2001 softime 11585 if ($maj == 3
2002     && $this->can_display_notification_service()
2003     ) {
2004     $form->setVal("suivi_notification_service", $this->get_json_suivi_notification(array('notification_service_consulte')));
2005     }
2006     if ($maj == 3
2007     && $this->can_display_notification_tiers()
2008     ) {
2009     $form->setVal("suivi_notification_tiers", $this->get_json_suivi_notification(array('notification_tiers_consulte')));
2010     }
2011 mbroquet 3730 }
2012    
2013     function setLayout(&$form, $maj){
2014 softime 12124 // En consultation, pour les dossiers qui n'ont pas été transmis par le portail
2015     // citoyen, si la notification des demandeurs est activée sur l'évenement
2016     // d'instruction et que le paramétrage du demandeur principal n'est pas
2017     // correct alors un message a destination de l'instructeur est affiché.
2018     if ($maj == 3) {
2019     // Si le dossier n'a pas été déposé sur le portail citoyen ou si
2020     // la requête permettant de savoir le type de demande à échouée, on
2021     // vérifie si il y a des erreurs de paramétrage et si c'est le cas
2022     // on affiche un message d'information
2023     if ($this->dossier_depose_sur_portail() == null ||
2024     ! $this->dossier_depose_sur_portail()) {
2025     $erreurParam = $this->get_info_notification_fail();
2026     // Récupération de l'évenement d'instruction
2027     $instEV = $this->get_inst_evenement();
2028     if (! empty($instEV->getVal('notification')) && $erreurParam != array()) {
2029     $class = 'text-info ui-state-highlight ui-state-info';
2030     $message = __("Attention l'envoi de notification automatique n'est pas possible.");
2031     $this->f->display_panel_information(
2032     $class,
2033     $message,
2034     $erreurParam,
2035     __('Veuillez corriger les informations suivantes.'),
2036     'erreur_param_notif'
2037     );
2038     }
2039     }
2040     }
2041 softime 8593 $form->setBloc('evenement','D',"","sousform-instruction-action-".$maj);
2042 mbroquet 3730
2043 softime 8593 $form->setFieldset('evenement','D',_('Evenement'));
2044     $form->setFieldset('om_final_instruction_utilisateur','F','');
2045    
2046     $form->setBloc('om_final_instruction_utilisateur','F');
2047 mbroquet 3730
2048 softime 8593 $form->setBloc('date_finalisation_courrier','D',"","");
2049 mbroquet 3730
2050 softime 8593 $form->setFieldset('date_finalisation_courrier','D',_('Dates'));
2051     $form->setBloc('date_finalisation_courrier','D',"","col_6");
2052     $form->setBloc('date_envoi_controle_legalite','F');
2053 mbroquet 3730
2054 softime 8593 $form->setBloc('date_retour_signature','D',"","col_6");
2055     $form->setBloc('date_retour_controle_legalite','F');
2056     $form->setFieldset('date_retour_controle_legalite','F','');
2057    
2058     $form->setBloc('date_retour_controle_legalite','F');
2059 mbroquet 3730
2060 softime 10573 $form->setBloc('statut_signature','D');
2061     $form->setFieldset('statut_signature','D','Suivi Parapheur');
2062     $form->setBloc('commentaire_signature','F');
2063     $form->setBloc('historique_signature','D');
2064     $form->setFieldset('historique_signature', 'DF', __("Historique"), "collapsible, startClosed");
2065     $form->setBloc('historique_signature','F');
2066     $form->setFieldset('historique_signature','F');
2067    
2068 softime 10808 $form->setFieldset('suivi_notification', 'D', __("Suivi notification"), "collapsible");
2069     $form->setFieldset('suivi_notification','F');
2070 softime 11585 $form->setFieldset('suivi_notification_service', 'D', __("Suivi notification service"), "collapsible");
2071     $form->setFieldset('suivi_notification_service','F');
2072     $form->setFieldset('suivi_notification_tiers', 'D', __("Suivi notification tiers"), "collapsible");
2073     $form->setFieldset('suivi_notification_tiers','F');
2074 softime 10808
2075 softime 8593 if ($maj == 1) {
2076     // Récupère la collectivité du dossier d'instruction
2077     $collectivite_di = $this->get_dossier_instruction_om_collectivite();
2078 mbroquet 3730
2079 softime 8593 //
2080     if ($this->f->is_option_preview_pdf_enabled($collectivite_di) === true
2081     && $this->has_an_edition() === true) {
2082 softime 7521 //
2083 softime 8593 $form->setBloc('complement_om_html','D',"","container_instr_edition");
2084     $form->setBloc('complement_om_html','D',"","hidelabel box_instr_edition redaction_instr_edition");
2085     $form->setBloc('complement_om_html','D',"","box_instr_edition_main");
2086     $form->setFieldset('complement_om_html','D',_('Complement'));
2087     $form->setFieldset('bible','F','');
2088     $form->setFieldset('complement2_om_html','D',_('Complement 2'));
2089     $form->setFieldset('bible2','F','');
2090     $form->setFieldset('complement3_om_html','D',_('Complement 3'));
2091     $form->setFieldset('bible3','F','');
2092     $form->setFieldset('complement4_om_html','D',_('Complement 4'));
2093     $form->setFieldset('bible4','F','');
2094     $form->setFieldset('titre_om_htmletat','DF',_('Titre'), 'startClosed');
2095     $form->setFieldset('corps_om_htmletatex','DF',_('Corps'));
2096     $form->setBloc('corps_om_htmletatex','F');
2097     $form->setBloc('btn_preview','DF',"","box_instr_edition_btn");
2098     $form->setBloc('btn_preview','F');
2099     $form->setBloc('btn_redaction','D', '',"hidelabel box_instr_edition preview_instr_edition");
2100     $form->setBloc('btn_redaction','DF',"","box_instr_edition_btn");
2101     $form->setFieldset('btn_refresh','D',_('Prévisualisation'), "box_instr_edition_main");
2102     $form->setFieldset('live_preview','F');
2103     $form->setBloc('live_preview','F');
2104     $form->setBloc('live_preview','F');
2105 softime 7521 } else {
2106 softime 8593 $form->setBloc('complement_om_html','D',"","hidelabel");
2107 softime 7521 $form->setFieldset('complement_om_html','D',_('Complement'));
2108     $form->setFieldset('bible','F','');
2109     $form->setFieldset('complement2_om_html','D',_('Complement 2'));
2110     $form->setFieldset('bible2','F','');
2111     $form->setFieldset('complement3_om_html','D',_('Complement 3'));
2112     $form->setFieldset('bible3','F','');
2113     $form->setFieldset('complement4_om_html','D',_('Complement 4'));
2114     $form->setFieldset('bible4','F','');
2115 softime 8593 $form->setFieldset('titre_om_htmletat','DF',_('Titre'), 'startClosed');
2116     $form->setFieldset('corps_om_htmletatex','DF',_('Corps'));
2117     $form->setBloc('corps_om_htmletatex','F');
2118 softime 7521 }
2119 softime 8593 } else {
2120     $form->setBloc('complement_om_html','D',"","hidelabel");
2121     $form->setFieldset('complement_om_html','D',_('Complement'));
2122     $form->setFieldset('bible','F','');
2123     $form->setFieldset('complement2_om_html','D',_('Complement 2'));
2124     $form->setFieldset('bible2','F','');
2125     $form->setFieldset('complement3_om_html','D',_('Complement 3'));
2126     $form->setFieldset('bible3','F','');
2127     $form->setFieldset('complement4_om_html','D',_('Complement 4'));
2128     $form->setFieldset('bible4','F','');
2129     $form->setFieldset('titre_om_htmletat','DF',_('Titre'), 'startClosed');
2130     $form->setFieldset('corps_om_htmletatex','DF',_('Corps'));
2131     $form->setBloc('corps_om_htmletatex','F');
2132 mbroquet 3730 }
2133     }
2134    
2135     function setLib(&$form, $maj) {
2136     //
2137     parent::setLib($form, $maj);
2138     //
2139     $form->setLib('bible_auto', "");
2140     $form->setLib('bible', "");
2141     $form->setLib('bible2', "");
2142     $form->setLib('bible3', "");
2143     $form->setLib('bible4', "");
2144 softime 7521 $form->setLib('btn_refresh', "");
2145 softime 8593 $form->setLib('btn_preview', "");
2146     $form->setLib('btn_redaction', "");
2147 softime 7521 $form->setLib('live_preview', "");
2148 mbroquet 3730 $form->setLib('om_final_instruction_utilisateur', _("finalise par"));
2149 softime 8989 $form->setLib('date_envoi_rar', __("date_envoi_ar"));
2150     $form->setLib('date_retour_rar', __("date_notification"));
2151 softime 10573 $form->setLib('statut_signature', __("statut"));
2152     $form->setLib('commentaire_signature', __("commentaire"));
2153     $form->setLib('historique_signature', '');
2154 softime 10808 $form->setLib('suivi_notification', '');
2155 softime 11585 $form->setLib('suivi_notification_service', '');
2156     $form->setLib('suivi_notification_tiers', '');
2157 softime 10573 $form->setLib('preview_edition', "");
2158 softime 8593
2159     // Ajout d'une infobulle d'aide lorsque le formulaire est en mode
2160     // ajout et que l'option de rédaction libre est activée sur la
2161     // collectivité du dossier
2162     if ($maj === '0' && $this->is_option_redaction_libre_enabled() === true) {
2163     //
2164     $help_text_template = '%s <span class="info-16" title="%s"></span>';
2165     $help_text = _("Attention: le passage du mode 'Rédaction libre' à celui de 'Rédaction par compléments' fait perdre toute la rédaction manuelle effectuée.");
2166     $form->setLib('flag_edition_integrale', sprintf($help_text_template, _("Type de rédaction"), $help_text));
2167     }
2168     else {
2169     $form->setLib('flag_edition_integrale', _("Type de rédaction"));
2170     }
2171    
2172     // Ajout d'une infobulle d'aide lorsque le formulaire est en mode
2173     // modification et que l'option de prévisualisation de l'édition est
2174     // activée sur la collectivité du dossier
2175     if ($maj === '1'
2176     && $this->f->is_option_preview_pdf_enabled($this->get_dossier_instruction_om_collectivite()) === true) {
2177     //
2178     $help_text_template = '%s <span class="info-16" title="%s"></span>';
2179     $help_text = _("Attention la modification de la valeur de ce champ n'est pas prise en compte dans la prévisualisation. Pour que cette valeur soit mise à jour, il suffit de valider le formulaire.");
2180     $form->setLib('date_evenement', sprintf($help_text_template, _('date_evenement'), $help_text));
2181     $form->setLib('signataire_arrete', sprintf($help_text_template, _('signataire_arrete'), $help_text));
2182     }
2183 mbroquet 3730 }
2184    
2185 softime 8989 /**
2186     * TRIGGER - triggerajouter.
2187     *
2188     * @return boolean
2189     */
2190     function triggerajouter($id, &$dnu1 = null, $val = array(), $dnu2 = null) {
2191     $this->addToLog(__METHOD__."(): start", EXTRA_VERBOSE_MODE);
2192 mbroquet 3730 /**
2193     * Le code suivant permet de récupérer des valeurs des tables evenement
2194     * et dossier pour les stocker dans l'instruction :
2195     * DEPUIS L'EVENEMENT
2196     * - action
2197     * - delai
2198     * - accord_tacite
2199     * - etat
2200     * - avis_decision
2201     * - delai_notification
2202     * - lettretype
2203     * - autorite_competente
2204 softime 10573 * - pec_metier
2205 softime 6565 * - complement_om_html
2206     * - complement2_om_html
2207     * - complement3_om_html
2208     * - complement4_om_html
2209     * - complement5_om_html
2210 mbroquet 3730 * DEPUIS LE DOSSIER D'INSTRUCTION
2211     * - archive_delai
2212     * - archive_accord_tacite
2213     * - archive_etat
2214     * - archive_avis
2215     * - date_complet
2216     * - date_rejet
2217     * - date_limite
2218     * - date_notification_delai
2219     * - date_decision
2220     * - date_validite
2221     * - date_achevement
2222     * - date_chantier
2223     * - date_conformite
2224     * - avis_decision
2225     */
2226     // Récupération de tous les paramètres de l'événement sélectionné
2227     $sql = "SELECT * FROM ".DB_PREFIXE."evenement
2228     WHERE evenement=".$this->valF['evenement'];
2229 softime 8989 $res = $this->f->db->query($sql);
2230     $this->addToLog(__METHOD__."(): db->query(\"".$sql."\");", VERBOSE_MODE);
2231 mbroquet 3730 if (database::isError($res)) {
2232     die($res->getMessage());
2233     }
2234     while ($row=& $res->fetchRow(DB_FETCHMODE_ASSOC)) {
2235     // Récupération de l'identifiant de l'action
2236     // si une action est paramétrée dans l'événement
2237     $this->valF['action'] = NULL;
2238     if (isset($row['action']) and !empty($row['action'])) {
2239     $this->valF['action']=$row['action'];
2240     }
2241     // Récupération de la valeur du délai
2242     $this->valF['delai'] = $row['delai'];
2243     // Récupération de l'identifiant de l'état
2244     // si un état est paramétré dans l'événement
2245     $this->valF['etat']=NULL;
2246     if (isset($row['etat']) and !empty($row['etat'])) {
2247     $this->valF['etat']=$row['etat'];
2248     }
2249     // Récupération de la valeur d'accord tacite
2250     $this->valF['accord_tacite']=$row['accord_tacite'];
2251     // Récupération de la valeur du délai de notification
2252     $this->valF['delai_notification']=$row['delai_notification'];
2253     // Récupération de l'identifiant de l'avis
2254     // si un avis est paramétré dans l'événement
2255     $this->valF['avis_decision'] = NULL;
2256     if(isset($row['avis_decision']) and !empty($row['avis_decision'])) {
2257     $this->valF['avis_decision']=$row['avis_decision'];
2258     }
2259     // Récupération de la valeur de l'autorité compétente
2260     // si l'autorité compétente est paramétré dans l'événement
2261     $this->valF['autorite_competente'] = NULL;
2262     if(isset($row['autorite_competente']) and !empty($row['autorite_competente'])) {
2263     $this->valF['autorite_competente']=$row['autorite_competente'];
2264     }
2265     // Récupération de la valeur de la lettre type
2266     $this->valF['lettretype']=$row['lettretype'];
2267 softime 10573 // Récupération de la valeur de la prise en compte métier
2268     // si la prise en compte métier est paramétrée dans l'événement
2269     $this->valF['pec_metier'] = NULL;
2270     if(isset($row['pec_metier']) === true and empty($row['pec_metier']) === false) {
2271     $this->valF['pec_metier'] = $row['pec_metier'];
2272     }
2273 mbroquet 3730 }
2274     // Récupération de toutes les valeurs du dossier d'instruction en cours
2275     $sql = "SELECT * FROM ".DB_PREFIXE."dossier
2276     WHERE dossier='".$this->valF['dossier']."'";
2277 softime 8989 $res = $this->f->db->query($sql);
2278     $this->addToLog(__METHOD__."(): db->query(\"".$sql."\");", VERBOSE_MODE);
2279 mbroquet 3730 if (database::isError($res)) {
2280     die($res->getMessage());
2281     }
2282     $row=& $res->fetchRow(DB_FETCHMODE_ASSOC);
2283     $this->updateArchiveData($row);
2284    
2285     // Récupération de la duree de validite du dossier d'autorisation
2286     $sql = "SELECT duree_validite_parametrage
2287     FROM ".DB_PREFIXE."dossier_autorisation_type_detaille
2288     LEFT JOIN ".DB_PREFIXE."dossier_autorisation
2289     ON dossier_autorisation.dossier_autorisation_type_detaille = dossier_autorisation_type_detaille.dossier_autorisation_type_detaille
2290     LEFT JOIN ".DB_PREFIXE."dossier
2291     ON dossier.dossier_autorisation = dossier_autorisation.dossier_autorisation
2292     WHERE dossier.dossier='".$this->valF['dossier']."'";
2293 softime 8989 $duree_validite_parametrage = $this->f->db->getOne($sql);
2294     $this->addToLog(__METHOD__."(): db->getOne(\"".$sql."\");", VERBOSE_MODE);
2295 mbroquet 3730 database::isError($duree_validite_parametrage);
2296     if ($duree_validite_parametrage != '') {
2297     $this->valF['duree_validite_parametrage']= $duree_validite_parametrage;
2298     }
2299    
2300     // Identifiant du type de courrier
2301     $idTypeCourrier = '11';
2302     $idCourrier = str_pad($this->valF["instruction"], 10, "0", STR_PAD_LEFT);
2303     // Code barres
2304     $this->valF["code_barres"] = $idTypeCourrier . $idCourrier;
2305     }
2306    
2307 softime 12124 /**
2308     * Test si une restriction est valide.
2309     *
2310     * @return boolean
2311     */
2312 mbroquet 3730 function restrictionIsValid($restriction){
2313     if($this->restriction_valid != null) {
2314     return $this->restriction_valid;
2315     }
2316     if(empty($restriction)) {
2317     $this->restriction_valid = true;
2318     return $this->restriction_valid;
2319     }
2320 nmeucci 3873 // Liste des opérateurs possibles sans espace
2321     $operateurs = array(">=", "<=", "+", "-", "&&", "||", "==", "!=");
2322     // Liste identique mais avec le marqueur §
2323     $mark = "§";
2324     $operateurs_marked = array();
2325     foreach ($operateurs as $operateur) {
2326     $operateurs_marked[] = $mark.$operateur.$mark;
2327     }
2328 mbroquet 3730
2329     // Supprime tous les espaces de la chaîne de caractère
2330 nmeucci 3873 $restriction = preg_replace('/\s+/', '', $restriction);
2331 mbroquet 3730
2332 nmeucci 3873 // Met un marqueur avant et après les opérateurs
2333     // puis transforme la chaine en un tableau
2334     $restriction = str_replace($operateurs, $operateurs_marked,
2335 mbroquet 3730 $restriction);
2336    
2337 nmeucci 3873 // Pour chaque opérateur logique
2338     foreach (array('&&', '||') as $operator) {
2339    
2340     // S'il est absent on ne fait aucun traitement
2341     if (strpos($restriction, $mark.$operator.$mark) === false) {
2342     continue;
2343     }
2344     // Sinon on vérifie les deux conditions avec le OU/ET logique
2345     $restrictions = explode($mark.$operator.$mark, $restriction);
2346     $restrictions[0] = explode($mark, $restrictions[0]);
2347     $restrictions[1] = explode($mark, $restrictions[1]);
2348     $res_bool = false;
2349     if ($operator == '&&') {
2350     if ($this->is_restriction_satisfied($restrictions[0], $operateurs)
2351     && $this->is_restriction_satisfied($restrictions[1], $operateurs)) {
2352     $res_bool = true;
2353     }
2354     }
2355     if ($operator == '||') {
2356     if ($this->is_restriction_satisfied($restrictions[0], $operateurs)
2357     || $this->is_restriction_satisfied($restrictions[1], $operateurs)) {
2358     $res_bool = true;
2359     }
2360     }
2361     return $res_bool;
2362     }
2363     $tabRestriction = explode($mark, $restriction);
2364     return $this->is_restriction_satisfied($tabRestriction, $operateurs);
2365    
2366     }
2367    
2368     function is_restriction_satisfied($restriction, $operateurs) {
2369 mbroquet 3730 // Tableau comprenant les résultat
2370     $res = array();
2371     // Compteur pour les résultat
2372     // commence à 1 car le 0 doit rester inchangé tout au long du traitement
2373     $j = 1;
2374     // Comparateur du calcul
2375     $comparateur = '';
2376     // Booléen retourné
2377     $res_bool = true;
2378    
2379     // S'il y a un comparateur
2380 nmeucci 3873 if (in_array(">=", $restriction)
2381     || in_array("<=", $restriction)
2382     || in_array("==", $restriction)
2383     || in_array("!=", $restriction)) {
2384 mbroquet 3730
2385     // Si le tableau n'est pas vide
2386 nmeucci 3873 if (count($restriction) > 0) {
2387 mbroquet 3730
2388     // Boucle dans le tableau pour récupérer seulement les valeurs
2389 nmeucci 3873 foreach ($restriction as $key => $value) {
2390 mbroquet 3730 //
2391     if (!in_array($value, $operateurs)) {
2392     if ($this->getRestrictionValue($value) != false) {
2393     $res[] = $this->getRestrictionValue($value);
2394     } else {
2395     // Message d'erreur
2396     $error_message = sprintf(_("Le champ %s de l'instruction %s est vide"), "<span class='bold'>".$value."</span>", "<span class='bold'>".$this->valF["instruction"]."</span>");
2397     $this->addToMessage($error_message);
2398     // Arrête le traitement
2399     return false;
2400     }
2401     }
2402     }
2403    
2404     // Boucle dans le tableau
2405     // commence à 1 car le 0 doit rester inchangé tout au long du
2406     // traitement
2407 nmeucci 3873 for ($i = 1; $i<count($restriction); $i++) {
2408 mbroquet 3730
2409     // Récupère le comparateur
2410 nmeucci 3873 if ($restriction[$i] === ">="
2411     || $restriction[$i] === "<="
2412     || $restriction[$i] === "=="
2413     || $restriction[$i] === "!=") {
2414     $comparateur = $restriction[$i];
2415 mbroquet 3730 }
2416    
2417     // Si l'opérateur qui suit est un "+"
2418 nmeucci 3873 if ($restriction[$i] === "+") {
2419 mbroquet 3730 $dateDep = $res[$j];
2420     unset($res[$j]);$j++;
2421     $duree = $res[$j];
2422     unset($res[$j]);
2423     $res[$j] = $this->f->mois_date($dateDep, $duree, "+");
2424     }
2425    
2426     // Si l'opérateur qui suit est un "-"
2427 nmeucci 3873 if ($restriction[$i] === "-") {
2428 mbroquet 3730 $dateDep = $res[$j];
2429     unset($res[$j]);$j++;
2430     $duree = $res[$j];
2431     unset($res[$j]);
2432     $res[$j] = $this->f->mois_date($dateDep, $duree, "-");
2433     }
2434     }
2435    
2436     }
2437    
2438     // Si les tableau des résultats n'est pas vide
2439     if (count($res) > 0) {
2440     //
2441     $res_bool = false;
2442     // Effectue le test
2443     if ($comparateur === ">=") {
2444     //
2445     if (strtotime($res[0]) >= strtotime($res[$j])) {
2446     $res_bool = true;
2447     }
2448     }
2449     if ($comparateur === "<=") {
2450 nmeucci 3873 //
2451 mbroquet 3730 if (strtotime($res[0]) <= strtotime($res[$j])) {
2452     $res_bool = true;
2453     }
2454     }
2455 nmeucci 3873 if ($comparateur === "==") {
2456     //
2457     if (strtotime($res[0]) == strtotime($res[$j])) {
2458     $res_bool = true;
2459     }
2460     }
2461     if ($comparateur === "!=") {
2462     //
2463     if (strtotime($res[0]) != strtotime($res[$j])) {
2464     $res_bool = true;
2465     }
2466     }
2467 mbroquet 3730 }
2468     // Sinon une erreur s'affiche
2469     } else {
2470    
2471     // Message d'erreur
2472     $error_message = _("Mauvais parametrage de la restriction.")." ".
2473     _("Contactez votre administrateur");
2474     $this->addToMessage($error_message);
2475     // Arrête le traitement
2476     return false;
2477     }
2478    
2479     return $res_bool;
2480    
2481     }
2482    
2483     /**
2484     * Permet de définir si l'événement passé en paramètre est un événement retour.
2485     * @param integer $evenement événement à tester
2486     *
2487     * @return boolean retourne true si événement retour sinon false
2488     */
2489     function is_evenement_retour($evenement) {
2490     if(empty($evenement) || !is_numeric($evenement)) {
2491     return "";
2492     }
2493     $sql = "SELECT retour
2494     FROM ".DB_PREFIXE."evenement
2495     WHERE evenement = ".$evenement;
2496 softime 8989 $retour = $this->f->db->getOne($sql);
2497 mbroquet 3730 $this->addToLog("verifier(): db->query(\"".$sql."\");", VERBOSE_MODE);
2498     if (database::isError($retour)) {
2499     die($retour->getMessage());
2500     }
2501     if ($retour == 't') {
2502     return true;
2503     } else {
2504     return false;
2505     }
2506     }
2507    
2508     /**
2509     * Retourne le champ restriction de l'événement passé en paramètre.
2510     *
2511     * @param integer $evenement id de l'événement sur lequel récupérer la restriction
2512     *
2513     * @return string contenu du champ restriction
2514     */
2515     function get_restriction($evenement) {
2516     if(empty($evenement) || !is_numeric($evenement)) {
2517     return "";
2518     }
2519     //Récupère la restriction
2520     $sql= "SELECT
2521     restriction
2522     FROM
2523     ".DB_PREFIXE."evenement
2524     WHERE
2525     evenement =".$evenement;
2526    
2527 softime 8989 $restriction = $this->f->db->getOne($sql);
2528 mbroquet 3730 $this->addToLog("verifier(): db->query(\"".$sql."\");", VERBOSE_MODE);
2529     if (database::isError($restriction)) {
2530     die($restriction->getMessage());
2531     }
2532     return $restriction;
2533     }
2534    
2535     /**
2536     * Récupère la valeur du champ dans la restriction
2537     * @param string $restrictionValue Nom du champ
2538     * @return mixed Valeur du champ
2539     */
2540     function getRestrictionValue($restrictionValue){
2541    
2542     // Initialisation de la valeur de retour
2543     $return = false;
2544    
2545     // Récupére les valeurs du dossier
2546     $value_dossier = $this->get_dossier_actual();
2547    
2548     //
2549     if (is_numeric($restrictionValue)) {
2550     $return = $restrictionValue;
2551     }elseif (isset($value_dossier[$restrictionValue])) {
2552     $return = $value_dossier[$restrictionValue];
2553     }elseif (isset($this->valF[$restrictionValue])) {
2554     $return = $this->valF[$restrictionValue];
2555     }
2556    
2557     // Retourne la valeur du champ
2558     return $return;
2559     }
2560    
2561 softime 6565
2562 mbroquet 3730 /**
2563 softime 6565 * Calcul des règle d'action selon leur type.
2564     *
2565     * Types de règle :
2566     * - date
2567     * - numeric
2568     * - text
2569     * - bool
2570     * - specific
2571     * - technical_data
2572 mbroquet 3730 *
2573 softime 6565 * @param string $rule Règle d'action.
2574     * @param string $rule_name Nom de la règle.
2575     * @param string $type Type de la règle.
2576     *
2577 mbroquet 3730 * @return mixed Résultat de la règle
2578     */
2579 softime 6565 public function regle($rule, $rule_name, $type = null) {
2580 mbroquet 3730
2581     // Supprime tous les espaces de la chaîne de caractère
2582     $rule = str_replace(' ', '', $rule);
2583     // Coupe la chaîne au niveau de l'opérateur
2584     $operands = explode ("+", $rule);
2585     // Nombre d'opérande
2586     $nb_operands = count($operands);
2587    
2588     // Règle à null
2589     if ($rule == "null") {
2590     return null;
2591     }
2592    
2593     // Tableau des champs de type date
2594     $rule_type_date = array(
2595     "regle_date_limite",
2596     "regle_date_notification_delai",
2597     "regle_date_complet",
2598     "regle_date_validite",
2599     "regle_date_decision",
2600     "regle_date_chantier",
2601     "regle_date_achevement",
2602     "regle_date_conformite",
2603     "regle_date_rejet",
2604     "regle_date_dernier_depot",
2605     "regle_date_limite_incompletude",
2606 softime 6565 "regle_date_cloture_instruction",
2607     "regle_date_premiere_visite",
2608     "regle_date_derniere_visite",
2609     "regle_date_contradictoire",
2610     "regle_date_retour_contradictoire",
2611     "regle_date_ait",
2612     "regle_date_transmission_parquet",
2613 softime 8989 "regle_date_affichage",
2614 mbroquet 3730 );
2615     // Tableau des champs de type numérique
2616     $rule_type_numeric = array(
2617     "regle_delai",
2618     "regle_delai_incompletude",
2619     );
2620 softime 6565 // Tableau des champs de type text
2621     $rule_type_text = array(
2622     );
2623     // Tableau des champs de type booléen
2624     $rule_type_bool = array(
2625 softime 10573 "regle_a_qualifier",
2626     "regle_incompletude",
2627     "regle_incomplet_notifie",
2628     "regle_evenement_suivant_tacite_incompletude",
2629 softime 6565 );
2630     // Tableau des champs spécifiques
2631     $rule_type_specific = array(
2632     "regle_autorite_competente",
2633     "regle_etat",
2634     "regle_accord_tacite",
2635     "regle_avis",
2636 softime 10573 "regle_pec_metier",
2637     "regle_etat_pendant_incompletude",
2638 softime 6565 );
2639     // Tableau des champs de données techniques
2640     $rule_type_technical_data = array(
2641     'regle_donnees_techniques1',
2642     'regle_donnees_techniques2',
2643     'regle_donnees_techniques3',
2644     'regle_donnees_techniques4',
2645     'regle_donnees_techniques5',
2646     );
2647 softime 8593 // Tableau des champs simple
2648     $rule_type_simple = array(
2649     "regle_dossier_instruction_type",
2650     );
2651 mbroquet 3730
2652     // Définit le type du champ
2653     if (in_array($rule_name, $rule_type_date) == true) {
2654     $type = "date";
2655     }
2656     if (in_array($rule_name, $rule_type_numeric) == true) {
2657     $type = "numeric";
2658     }
2659 softime 6565 if (in_array($rule_name, $rule_type_text) === true) {
2660     $type = "text";
2661     }
2662     if (in_array($rule_name, $rule_type_bool) === true) {
2663     $type = "bool";
2664     }
2665     if (in_array($rule_name, $rule_type_specific) === true) {
2666     $type = "specific";
2667     }
2668     if (in_array($rule_name, $rule_type_technical_data) === true) {
2669     $type = 'text';
2670     }
2671 softime 8593 if (in_array($rule_name, $rule_type_simple) === true) {
2672     $type = 'simple';
2673     }
2674 mbroquet 3730
2675 softime 6565 // Si c'est un type spécifique ou booléen alors il n'a qu'un opérande
2676     // Récupère directement la valeur de l'opérande
2677 softime 10573 if ($type === 'specific') {
2678 softime 6565 //
2679     return $this->get_value_for_rule($rule);
2680     }
2681    
2682 mbroquet 3730 // Initialisation des variables
2683     $key_date = 0;
2684     $total_numeric = 0;
2685 softime 6565 $res_text = '';
2686 mbroquet 3730
2687     // Pour chaque opérande
2688     foreach ($operands as $key => $operand) {
2689    
2690     // Si c'est une règle de type date
2691     if ($type == 'date') {
2692     // Vérifie si au moins une des opérandes est une date
2693 softime 6565 if (is_numeric($operand) === false
2694     && $this->get_value_for_rule($operand) !== null
2695     && $this->f->check_date($this->get_value_for_rule($operand)) == true) {
2696 mbroquet 3730 // Récupère la position de la date
2697     $key_date = $key;
2698     }
2699     // Les autres opérandes doivent être que des numériques
2700     if (is_numeric($operand) == true) {
2701     // Ajoute l'opérande au total
2702     $total_numeric += $operand;
2703     }
2704 softime 6565 if (is_numeric($operand) === false
2705     && $this->get_value_for_rule($operand) !== null
2706     && is_numeric($this->get_value_for_rule($operand)) == true) {
2707 mbroquet 3730 // Ajoute l'opérande au total
2708 softime 6565 $total_numeric += $this->get_value_for_rule($operand);
2709 mbroquet 3730 }
2710     }
2711    
2712     // Si c'est une règle de type numérique
2713     if ($type == 'numeric') {
2714     // Les opérandes doivent être que des numériques
2715     if (is_numeric($operand) == true) {
2716     // Ajoute l'opérande au total
2717     $total_numeric += $operand;
2718     }
2719 softime 6565 if (is_numeric($operand) === false
2720     && $this->get_value_for_rule($operand) !== null
2721     && is_numeric($this->get_value_for_rule($operand)) == true) {
2722 mbroquet 3730 // Ajoute l'opérande au total
2723 softime 6565 $total_numeric += $this->get_value_for_rule($operand);
2724 mbroquet 3730 }
2725     }
2726 softime 6565
2727     // Si c'est une règle de type text
2728     if ($type === 'text') {
2729     // Concatène toutes les chaînes de caractère
2730     $res_text .= $this->get_value_for_rule($operand);
2731     }
2732 mbroquet 3730 }
2733    
2734     // Résultat pour une règle de type date
2735     if ($type == 'date') {
2736     // Retourne le calcul de la date
2737     return $this->f->mois_date($this->valF[$operands[$key_date]],
2738     $total_numeric, "+");
2739     }
2740    
2741     // Résultat pour une règle de type numérique
2742     if ($type == 'numeric') {
2743     // Retourne le calcul
2744     return $total_numeric;
2745     }
2746 softime 6565
2747     // Résultat pour une règle de type text
2748     if ($type === 'text') {
2749     // Retourne la chaîne de caractère
2750     return $res_text;
2751     }
2752 softime 10573 if ($type === 'simple' || $type === 'bool') {
2753 softime 8593 // Retourne la valeur du champs rule
2754     return $rule;
2755     }
2756 softime 6565 }
2757    
2758    
2759     /**
2760     * Récupère la valeur du champs dans l'instruction ou dans les données
2761     * techniques.
2762     * Spécifique au calcul des règles.
2763     *
2764     * @param string $field Champ
2765     *
2766     * @return mixed Valeur du champ
2767     */
2768     private function get_value_for_rule($field) {
2769     // Si le champ n'existe pas dans la table instruction
2770     if (array_key_exists($field, $this->valF) === false) {
2771     // Récupère l'instance de la classe donnees_techniques
2772     $inst_donnees_techniques = $this->get_inst_donnees_techniques();
2773     // Retourne la valeur de la donnée technique
2774     return $inst_donnees_techniques->getVal($field);
2775     }
2776    
2777     //
2778     return $this->valF[$field];
2779     }
2780    
2781    
2782     /**
2783     * [get_inst_donnees_techniques description]
2784     *
2785     * @param [type] $donnees_techniques [description]
2786     *
2787     * @return [type] [description]
2788     */
2789     function get_inst_donnees_techniques($donnees_techniques = null) {
2790     //
2791     if (isset($this->inst_donnees_techniques) === false or
2792     $this->inst_donnees_techniques === null) {
2793     //
2794     if (is_null($donnees_techniques)) {
2795     $donnees_techniques = $this->getDonneesTechniques();
2796     }
2797     //
2798 softime 7996 $this->inst_donnees_techniques = $this->f->get_inst__om_dbform(array(
2799     "obj" => "donnees_techniques",
2800     "idx" => $donnees_techniques,
2801     ));
2802 softime 6565 }
2803     //
2804     return $this->inst_donnees_techniques;
2805     }
2806    
2807    
2808     /**
2809     * Retourne l'identifiant des données techniques liées du dossier
2810     * @return string L'identifiant des données techniques liées du dossier
2811     */
2812     function getDonneesTechniques() {
2813 mbroquet 3730
2814 softime 6565 $donnees_techniques = '';
2815    
2816     $sql = "SELECT donnees_techniques
2817     FROM ".DB_PREFIXE."donnees_techniques
2818     WHERE dossier_instruction ='".$this->valF["dossier"]."'";
2819 softime 8989 $donnees_techniques = $this->f->db->getOne($sql);
2820 softime 6565 $this->f->addToLog("getStatut() : db->getOne(\"".$sql."\")", VERBOSE_MODE);
2821     if ( database::isError($donnees_techniques)){
2822     die();
2823     }
2824    
2825     return $donnees_techniques;
2826 mbroquet 3730 }
2827    
2828 fmichon 4708 /**
2829     * TRIGGER - triggerajouterapres.
2830     *
2831     * - Mise à jour des informations liées au workflow sur le dossier
2832     * - Interface avec le référentiel ERP [105][111]
2833     * - Mise à jour du DA
2834     * - Historisation de la vie du DI
2835     *
2836     * @return boolean
2837     */
2838 softime 8989 function triggerajouterapres($id, &$dnu1 = null, $val = array(), $dnu2 = null) {
2839     $this->addToLog(__METHOD__."(): start", EXTRA_VERBOSE_MODE);
2840 fmichon 4708
2841     // On a besoin de l'instance du dossier lié à l'événement d'instruction
2842     $inst_di = $this->get_inst_dossier($this->valF['dossier']);
2843     // Instance de la classe evenement
2844     $inst_evenement = $this->get_inst_evenement($this->valF['evenement']);
2845 softime 9245 // Instance de l'état courant du dossier d'instruction
2846     $inst_current_etat = $this->f->get_inst__om_dbform(array(
2847     "obj" => "etat",
2848     "idx" => $inst_di->get_id_etat(),
2849     ));
2850 fmichon 4708
2851 mbroquet 3730 /**
2852     * Mise à jour des valeurs du dossier en fonction des valeurs calculées
2853     * par l'action
2854     */
2855 fmichon 4708 // état de complétude actuel du dossier
2856     $incompletude = ($inst_di->getVal('incompletude') == 't' ? true : false);
2857 softime 10573 // L'événement suivant tacite paramétré est destiné à la gestion de l'incomplétude
2858     $ev_suiv_tacite_incompletude = false;
2859 mbroquet 3730 // Initialisation
2860 softime 9245 $valF = array();
2861     $valF_dt = array();
2862 fmichon 4708 //
2863 mbroquet 3730 // Récupération des paramètres de l'action
2864     $sql = "SELECT * FROM ".DB_PREFIXE."action
2865     WHERE action='".$this->valF['action']."'";
2866 softime 8989 $res = $this->f->db->query($sql);
2867     $this->addToLog(__METHOD__."(): db->query(\"".$sql."\");", VERBOSE_MODE);
2868 mbroquet 3730 if (database::isError($res)) {
2869     die($res->getMessage());
2870     }
2871     while ($row=& $res->fetchRow(DB_FETCHMODE_ASSOC)) {
2872    
2873     // pour chacune des regles, on applique la regle
2874 softime 6565 if ($row['regle_delai'] != '') {
2875 mbroquet 3730 $valF['delai'] = $this->regle($row['regle_delai'], 'regle_delai');
2876     }
2877 softime 6565 if ($row['regle_accord_tacite'] != '') {
2878 mbroquet 3730 $valF['accord_tacite'] = $this->regle($row['regle_accord_tacite'], 'regle_accord_tacite');
2879     }
2880 softime 6565 if ($row['regle_avis'] != '') {
2881 mbroquet 3730 $valF['avis_decision'] = $this->regle($row['regle_avis'], 'regle_avis');
2882     }
2883 softime 6565 if ($row['regle_date_limite'] != '') {
2884     $valF['date_limite'] = $this->regle($row['regle_date_limite'], 'regle_date_limite');
2885 mbroquet 3730 }
2886 softime 6565 if ($row['regle_date_complet'] != '') {
2887     $valF['date_complet'] = $this->regle($row['regle_date_complet'], 'regle_date_complet');
2888 mbroquet 3730 }
2889 softime 6565 if ($row['regle_date_dernier_depot'] != '') {
2890     $valF['date_dernier_depot'] = $this->regle($row['regle_date_dernier_depot'], 'regle_date_dernier_depot');
2891 mbroquet 3730 }
2892 softime 6565 if ($row['regle_date_notification_delai'] != '') {
2893     $valF['date_notification_delai'] = $this->regle($row['regle_date_notification_delai'], 'regle_date_notification_delai');
2894 mbroquet 3730 }
2895 softime 6565 if ($row['regle_date_decision'] != '') {
2896     $valF['date_decision'] = $this->regle($row['regle_date_decision'], 'regle_date_decision');
2897 mbroquet 3730 }
2898 softime 6565 if ($row['regle_date_rejet'] != '') {
2899     $valF['date_rejet'] = $this->regle($row['regle_date_rejet'], 'regle_date_rejet');
2900 mbroquet 3730 }
2901 softime 6565 if ($row['regle_date_validite'] != '') {
2902     $valF['date_validite'] = $this->regle($row['regle_date_validite'], 'regle_date_validite');
2903 mbroquet 3730 }
2904 softime 6565 if ($row['regle_date_chantier'] != '') {
2905     $valF['date_chantier'] = $this->regle($row['regle_date_chantier'], 'regle_date_chantier');
2906 mbroquet 3730 }
2907 softime 6565 if ($row['regle_date_achevement'] != '') {
2908     $valF['date_achevement'] = $this->regle($row['regle_date_achevement'], 'regle_date_achevement');
2909 mbroquet 3730 }
2910 softime 6565 if ($row['regle_date_conformite'] != '') {
2911     $valF['date_conformite'] = $this->regle($row['regle_date_conformite'], 'regle_date_conformite');
2912 mbroquet 3730 }
2913 softime 6565 if ($row['regle_date_limite_incompletude'] != '') {
2914     $valF['date_limite_incompletude'] = $this->regle($row['regle_date_limite_incompletude'], 'regle_date_limite_incompletude');
2915 mbroquet 3730 }
2916 softime 6565 if ($row['regle_delai_incompletude'] != '') {
2917     $valF['delai_incompletude'] = $this->regle($row['regle_delai_incompletude'], 'regle_delai_incompletude');
2918 mbroquet 3730 }
2919 softime 6565 if ($row['regle_autorite_competente'] != '') {
2920     $valF['autorite_competente'] = $this->regle($row['regle_autorite_competente'], 'regle_autorite_competente');
2921 mbroquet 3730 }
2922 softime 6565 if ($row['regle_etat'] != '') {
2923 softime 10573 $valF['etat'] = $this->regle($row['regle_etat'], 'regle_etat');
2924 mbroquet 3730 }
2925 softime 6565 if ($row['regle_date_cloture_instruction'] !== '') {
2926     $valF['date_cloture_instruction'] = $this->regle($row['regle_date_cloture_instruction'], 'regle_date_cloture_instruction');
2927     }
2928     if ($row['regle_date_premiere_visite'] !== '') {
2929     $valF['date_premiere_visite'] = $this->regle($row['regle_date_premiere_visite'], 'regle_date_premiere_visite');
2930     }
2931     if ($row['regle_date_derniere_visite'] !== '') {
2932     $valF['date_derniere_visite'] = $this->regle($row['regle_date_derniere_visite'], 'regle_date_derniere_visite');
2933     }
2934     if ($row['regle_date_contradictoire'] !== '') {
2935     $valF['date_contradictoire'] = $this->regle($row['regle_date_contradictoire'], 'regle_date_contradictoire');
2936     }
2937     if ($row['regle_date_retour_contradictoire'] !== '') {
2938     $valF['date_retour_contradictoire'] = $this->regle($row['regle_date_retour_contradictoire'], 'regle_date_retour_contradictoire');
2939     }
2940     if ($row['regle_date_ait'] !== '') {
2941     $valF['date_ait'] = $this->regle($row['regle_date_ait'], 'regle_date_ait');
2942     }
2943     if ($row['regle_donnees_techniques1'] !== '') {
2944     $valF_dt[$row['cible_regle_donnees_techniques1']] = $this->regle($row['regle_donnees_techniques1'], 'regle_donnees_techniques1');
2945     }
2946     if ($row['regle_donnees_techniques2'] !== '') {
2947     $valF_dt[$row['cible_regle_donnees_techniques2']] = $this->regle($row['regle_donnees_techniques2'], 'regle_donnees_techniques2');
2948     }
2949     if ($row['regle_donnees_techniques3'] !== '') {
2950     $valF_dt[$row['cible_regle_donnees_techniques3']] = $this->regle($row['regle_donnees_techniques3'], 'regle_donnees_techniques3');
2951     }
2952     if ($row['regle_donnees_techniques4'] !== '') {
2953     $valF_dt[$row['cible_regle_donnees_techniques4']] = $this->regle($row['regle_donnees_techniques4'], 'regle_donnees_techniques4');
2954     }
2955     if ($row['regle_donnees_techniques5'] !== '') {
2956     $valF_dt[$row['cible_regle_donnees_techniques5']] = $this->regle($row['regle_donnees_techniques5'], 'regle_donnees_techniques5');
2957     }
2958     if ($row['regle_date_transmission_parquet'] !== '') {
2959     $valF['date_transmission_parquet'] = $this->regle($row['regle_date_transmission_parquet'], 'regle_date_transmission_parquet');
2960     }
2961 softime 8593 if ($row['regle_dossier_instruction_type'] !== '') {
2962     $valF['dossier_instruction_type'] = $this->regle($row['regle_dossier_instruction_type'], 'regle_dossier_instruction_type');
2963     }
2964 softime 8989 // La date d'affichage est modifiée seulement si le champ n'est pas
2965     // renseigné
2966     if ($row['regle_date_affichage'] !== ''
2967     && ($inst_di->getVal('date_affichage') === ''
2968     || $inst_di->getVal('date_affichage') === null)) {
2969     //
2970     $valF['date_affichage'] = $this->regle($row['regle_date_affichage'], 'regle_date_affichage');
2971     }
2972 softime 10573 //
2973     if ($row['regle_pec_metier'] != '') {
2974     $valF['pec_metier'] = $this->regle($row['regle_pec_metier'], 'regle_pec_metier');
2975     }
2976     if ($row['regle_a_qualifier'] != '') {
2977     $valF['a_qualifier'] = $this->regle($row['regle_a_qualifier'], 'regle_a_qualifier');
2978     }
2979     //
2980     if ($row['regle_incompletude'] != '') {
2981     $valF['incompletude'] = $this->regle($row['regle_incompletude'], 'regle_incompletude');
2982     }
2983     if ($row['regle_incomplet_notifie'] != '') {
2984     $valF['incomplet_notifie'] = $this->regle($row['regle_incomplet_notifie'], 'regle_incomplet_notifie');
2985     }
2986     if ($row['regle_etat_pendant_incompletude'] != '') {
2987     $valF['etat_pendant_incompletude'] = $this->regle($row['regle_etat_pendant_incompletude'], 'regle_etat_pendant_incompletude');
2988     }
2989     if ($row['regle_evenement_suivant_tacite_incompletude'] != '') {
2990     $resti = $this->regle($row['regle_evenement_suivant_tacite_incompletude'], 'regle_evenement_suivant_tacite_incompletude');
2991     if (strtolower($resti) === 't' || strtolower($resti) === 'true') {
2992     $ev_suiv_tacite_incompletude = true;
2993     }
2994     }
2995 mbroquet 3730 }
2996 softime 6063
2997     // Si l'événement a un événement suivant tacite
2998     if($inst_evenement->getVal('evenement_suivant_tacite') != '') {
2999 softime 10573 // En fonction de l'action de l'événement, l'événement suivant tacite ne sera
3000     // pas associé de le même façon au dossier d'instruction
3001     if ($ev_suiv_tacite_incompletude === false) {
3002 softime 6063 $valF['evenement_suivant_tacite'] = $inst_evenement->getVal('evenement_suivant_tacite');
3003 softime 10573 }
3004     if ($ev_suiv_tacite_incompletude === true) {
3005 softime 6063 $valF['evenement_suivant_tacite_incompletude'] = $inst_evenement->getVal('evenement_suivant_tacite');
3006 nhaye 5254 }
3007 mbroquet 3730 }
3008 softime 6565 // Si des valeurs de données techniques ont été calculées alors on met à jour l'enregistrement
3009 softime 9245 if (count($valF_dt) > 0) {
3010 softime 6565 $dt_id = $this->getDonneesTechniques();
3011     // On met à jour le dossier
3012     $cle = " donnees_techniques='".$dt_id."'";
3013 softime 8989 $res1 = $this->f->db->autoExecute(DB_PREFIXE.'donnees_techniques', $valF_dt, DB_AUTOQUERY_UPDATE, $cle);
3014     $this->addToLog(__METHOD__."(): db->autoexecute(\"".DB_PREFIXE."donnees_techniques\", ".print_r($valF_dt, true).", DB_AUTOQUERY_UPDATE, \"".$cle."\");", VERBOSE_MODE);
3015 softime 6565 if (database::isError($res1)) {
3016     die($res->getMessage());
3017     }
3018     // Affichage d'informations à l'utilisateur
3019 softime 8989 $this->addToMessage(_('enregistrement')." ".$this->valF['dossier']." "._('table')." dossier [".$this->f->db->affectedRows()." "._('enregistrement')." "._('mis_a_jour')."]");
3020 softime 6565 }
3021 mbroquet 3730 // Si des valeurs ont été calculées alors on met à jour l'enregistrement
3022 softime 9245 if (count($valF) > 0) {
3023 softime 10573 //
3024     $inst_dossier = $this->f->get_inst__om_dbform(array(
3025     "obj" => "dossier",
3026     "idx" => $this->valF['dossier'],
3027     ));
3028     $valF['instruction'] = $id;
3029 softime 10968 $valF['crud'] = 'create';
3030 softime 10573 $update_by_instruction = $inst_dossier->update_by_instruction($valF);
3031     if ($update_by_instruction === false) {
3032     $this->cleanMessage();
3033     $this->addToMessage(sprintf('%s %s', __("Une erreur s'est produite lors de la mise à jour du dossier d'instruction."), __("Veuillez contacter votre administrateur.")));
3034     return false;
3035 mbroquet 3730 }
3036     // Affichage d'informations à l'utilisateur
3037 softime 8989 $this->addToMessage(_('enregistrement')." ".$this->valF['dossier']." "._('table')." dossier [".$this->f->db->affectedRows()." "._('enregistrement')." "._('mis_a_jour')."]");
3038 mbroquet 3730 }
3039    
3040     /**
3041 fmichon 4708 * Interface avec le référentiel ERP.
3042     *
3043     * (WS->ERP)[105] Arrêté d'un dossier PC effectué -> PC qui concerne un ERP
3044     * (WS->ERP)[111] Décision de conformité effectuée -> PC qui concerne un ERP
3045     * Déclencheur :
3046     * - L'option ERP est activée
3047     * - Le dossier est marqué comme "connecté au référentiel ERP"
3048     * - Le dossier est de type PC
3049     * - Le formulaire d'ajout d'un événement d'instruction est validé
3050     * avec un événement pour lequel les services ERP doivent être
3051     * informé
3052 mbroquet 3730 */
3053 fmichon 4708 //
3054 softime 7521 if ($this->f->is_option_referentiel_erp_enabled() === true
3055 fmichon 4708 && $inst_di->is_connected_to_referentiel_erp() === true
3056     && $this->f->getDATCode($this->valF['dossier']) == $this->f->getParameter('erp__dossier__nature__pc')
3057     && in_array($inst_evenement->getVal($inst_evenement->clePrimaire), explode(";", $this->f->getParameter('erp__evenements__decision__pc')))) {
3058 mbroquet 3730 //
3059 fmichon 4708 $infos = array(
3060     "dossier_instruction" => $this->valF['dossier'],
3061     "decision" => $inst_evenement->getVal("libelle"),
3062     );
3063 mbroquet 3730 //
3064 fmichon 4708 $ret = $this->f->send_message_to_referentiel_erp(105, $infos);
3065     if ($ret !== true) {
3066     $this->cleanMessage();
3067     $this->addToMessage(_("Une erreur s'est produite lors de la notification (105) du référentiel ERP. Contactez votre administrateur."));
3068     return false;
3069 mbroquet 3730 }
3070 fmichon 4708 $this->addToMessage(_("Notification (105) du référentiel ERP OK."));
3071     }
3072 mbroquet 3730
3073 softime 8989 // Si le mode en rédaction intégrale est activé
3074     if (isset($this->valF['flag_edition_integrale']) === true
3075     && $this->valF['flag_edition_integrale'] === true) {
3076     $redactionIntegraleValF = array();
3077    
3078     // Récupère la collectivite du dossier d'instruction
3079     $dossier_instruction_om_collectivite = $this->get_dossier_instruction_om_collectivite();
3080     $collectivite = $this->f->getCollectivite($dossier_instruction_om_collectivite);
3081     // Récupère le corps de la lettre type
3082     $params = array(
3083     "specific" => array(
3084     "corps" => array(
3085     "mode" => "get",
3086     )
3087     ),
3088     );
3089     $result = $this->compute_pdf_output('lettretype', $this->valF['lettretype'], $collectivite, $id, $params);
3090     $redactionIntegraleValF['corps_om_htmletatex'] = $result['pdf_output'];
3091     // Récupère le titre de la lettre type
3092     $params = array(
3093     "specific" => array(
3094     "titre" => array(
3095     "mode" => "get",
3096     )
3097     ),
3098     );
3099     $result = $this->compute_pdf_output('lettretype', $this->valF['lettretype'], $collectivite, $id, $params);
3100     $redactionIntegraleValF['titre_om_htmletat'] = $result['pdf_output'];
3101    
3102     // mise à jour en base de données
3103     $res = $this->f->db->autoExecute(
3104     DB_PREFIXE.$this->table,
3105     $redactionIntegraleValF,
3106     DB_AUTOQUERY_UPDATE,
3107     $this->clePrimaire."=".$id
3108     );
3109     $this->addToLog(__METHOD__."(): db->autoexecute(\"".DB_PREFIXE.'.'.$this->table."\", ".print_r($redactionIntegraleValF, true).", DB_AUTOQUERY_UPDATE, \"".$this->clePrimaire."=".$id."\");", VERBOSE_MODE);
3110     if ($this->f->isDatabaseError($res, true) === true) {
3111     return false;
3112     }
3113     }
3114    
3115 fmichon 4708 /**
3116 softime 7996 * Finalisation automatique de l'instruction si le paramétrage de l'événement l'autorise
3117     */
3118     // Si la finalisation automatique de l'événement est activée
3119     // ET si l'instruction n'a pas déjà été finalisée
3120     // ET s'il existe une lettre type associée
3121     if ($inst_evenement->getVal('finaliser_automatiquement') === 't'
3122     && $inst_evenement->getVal('om_final_instruction') !== 't'
3123     && $inst_evenement->getVal('lettretype') !== ''
3124     && $inst_evenement->getVal('lettretype') !== null) {
3125    
3126     // On instancie l'instruction
3127     $inst_instruction = $this->f->get_inst__om_dbform(array(
3128     "obj" => "instruction",
3129     "idx" => $this->valF[$this->clePrimaire],
3130     ));
3131    
3132     // On finalise l'instruction dans le contexte de finalisation : action 100
3133     $inst_instruction->setParameter('maj', 100);
3134     $finalize = $inst_instruction->finalize($inst_instruction->valF);
3135    
3136     // Une erreur de finalisation renvoie 'false' : ajout dans les logs
3137     // et dans le message d'erreur
3138     if ($finalize === false) {
3139     $this->f->addToLog(__METHOD__."() : ERROR - Impossible de finaliser l'instruction.", DEBUG_MODE);
3140     $this->addToMessage(_("Erreur lors de la finalisation de l'instruction. Contactez votre administrateur."));
3141     return false;
3142     }
3143     }
3144    
3145     /**
3146 softime 7521 * Finalisation automatique des instructions tacites ou retours.
3147     */
3148 softime 7685 // Si l'option de finalisation automatique des instructions tacites ou
3149     // retours est activée et l'événement d'instruction a une lettre type
3150     // associée
3151     $collectivite_di = $this->get_dossier_instruction_om_collectivite($val['dossier']);
3152     if ($this->f->is_option_finalisation_auto_enabled($collectivite_di) === true
3153     && $inst_evenement->getVal('lettretype') !== ''
3154 softime 7521 && $inst_evenement->getVal('lettretype') !== null) {
3155    
3156     // Rècupère l'identifiant de l'événement
3157     $evenement_id = $inst_evenement->getVal($inst_evenement->clePrimaire);
3158    
3159     // Si l'événement d'instruction est identifié comme un événement
3160     // retour
3161     // OU l'événement d'instruction est l'événement suivant tacite du
3162     // dossier d'instruction (incomplétude prise en compte)
3163 softime 7996 // ET l'événement d'instruction n'a pas déjà été finalisé
3164     if (($inst_evenement->getVal("retour") === 't'
3165 softime 7521 || ($inst_di->getVal('evenement_suivant_tacite_incompletude') === $evenement_id
3166 softime 7996 || $inst_di->getVal('evenement_suivant_tacite') === $evenement_id))
3167     && ($inst_evenement->getVal('om_final_instruction') !== 't')) {
3168 softime 7521
3169     // Finalise l'instruction
3170 softime 7996 $inst_instruction = $this->f->get_inst__om_dbform(array(
3171     "obj" => "instruction",
3172     "idx" => $this->valF[$this->clePrimaire],
3173     ));
3174 softime 7521 $inst_instruction->setParameter('maj', 100);
3175     $finalize = $inst_instruction->finalize($inst_instruction->valF);
3176     if ($finalize === false) {
3177     //
3178     return false;
3179     }
3180     }
3181     }
3182    
3183     /**
3184 softime 9245 * Mise à jour de la version de clôture *version_clos* du dossier si et
3185     * seulement si l'instruction met à jour l'état du dossier.
3186     */
3187     if (isset($valF['etat']) === true
3188     && $valF['etat'] !== null
3189     && $valF['etat'] !== '') {
3190     // Instanciation de l'état appliqué sur le dossier par l'instruction
3191     $inst_etat = $this->f->get_inst__om_dbform(array(
3192     "obj" => "etat",
3193     "idx" => $valF['etat'],
3194     ));
3195     //
3196     $update_version_clos = null;
3197     // En cas d'instruction qui clôture le dossier
3198     if ($inst_etat->getVal('statut') === 'cloture') {
3199     $update_version_clos = $inst_di->update_version_clos('up');
3200     }
3201     // En cas d'instruction qui rouvre le dossier
3202     if ($inst_current_etat->getVal('statut') === 'cloture'
3203     && $inst_etat->getVal('statut') !== 'cloture') {
3204     //
3205     $update_version_clos = $inst_di->update_version_clos('down');
3206     //
3207     $params = array(
3208     'di_reopened' => true,
3209     );
3210     }
3211     //
3212     if ($update_version_clos === false) {
3213     $this->f->addToLog(sprintf(
3214     "%s() : ERREUR - %s %s",
3215     __METHOD__,
3216     sprintf(
3217     __("Impossible de mettre à jour la version de clôture du dossier d'instruction %s."),
3218     $inst_di->getVal($inst_di->clePrimaire)
3219     ),
3220     sprintf(
3221     __("L'instruction tente d'appliquer l'état %s."),
3222     $inst_etat->getVal($inst_etat->clePrimaire)
3223     )
3224     ));
3225     $this->addToMessage(sprintf(
3226     "%s %s",
3227     __("Erreur lors de la mise à jour de la version de clôture du dossier d'instruction."),
3228     __("Veuillez contacter votre administrateur.")
3229     ));
3230     return false;
3231     }
3232     }
3233    
3234     /**
3235 softime 10808 * Notification automatique
3236     */
3237     // Notification automatique à l'ajout de l'instruction si la notification
3238     // automatique est choisie et qu'il n'y a pas de lettretype associée à l'événement
3239     if ($inst_evenement->getVal('notification') === 'notification_automatique' &&
3240     ($inst_evenement->getVal('lettretype') === null ||
3241     $inst_evenement->getVal('lettretype') === '')) {
3242     // Récupération de la liste des demandeurs à notifier et de la catégorie
3243     $categorie = $this->f->get_param_option_notification($collectivite_di);
3244 softime 10869 $isPortal = $categorie == null || $categorie == '' || $categorie == 'portal' ? true : false;
3245     $demandeursANotifie = $this->get_demandeurs_notifiable(
3246     $this->valF['dossier'],
3247     $isPortal
3248     );
3249 softime 10808
3250     // Création d'une notification et d'une tâche pour chaque demandeur à notifier
3251 softime 12124 $demandeurPrincipalNotifie = false;
3252 softime 10808 foreach ($demandeursANotifie as $demandeur) {
3253 softime 12124 // Identifie si le demandeur principal a été notifié ou pas
3254     // et récupère ses informations
3255     if ($demandeur['petitionnaire_principal'] == 't') {
3256     $demandeurPrincipalNotifie = true;
3257     // Si le demandeur principal est notifiable mais qu'il y a des erreurs dans
3258     // son paramétrage, on effectue pas le traitement et on passe à l'itération
3259     // suivante. On le considère également comme non notifié pour gérer l'envoie
3260     // des messages d'erreurs
3261     // Si la demande a été déposée via le portail alors le paramétrage n'a pas
3262     // d'impact sur la notification
3263     $erreursParam = $this->get_info_notification_fail($val['dossier']);
3264     if (! $this->dossier_depose_sur_portail($val['dossier']) && $erreursParam != array()) {
3265     $demandeurPrincipalNotifie = false;
3266     continue;
3267     }
3268     }
3269 softime 10808 // Ajout de la notif et récupération de son id
3270     $idNotif = $this->ajouter_notification(
3271     $this->valF[$this->clePrimaire],
3272     $this->f->get_connected_user_login_name(),
3273 softime 10968 $demandeur,
3274     $collectivite_di,
3275 softime 12433 array(),
3276 softime 10968 true
3277 softime 10808 );
3278     if ($idNotif === false) {
3279     return false;
3280     }
3281     // Création de la tache en lui donnant l'id de la notification
3282     $notification_by_task = $this->notification_by_task(
3283     $idNotif,
3284     $this->valF['dossier'],
3285     $categorie
3286     );
3287     if ($notification_by_task === false) {
3288     $this->addToMessage(
3289     __("Erreur lors de la génération de la notification au(x) pétitionnaire(s).")
3290     );
3291     return false;
3292     }
3293     }
3294 softime 12124 // Si le demandeur principal n'est pas notifiable, on créé une nouvelle notification
3295     // en erreur avec en commentaire la raison pour laquelle le demandeur principal
3296     // n'a pas pu être notifié
3297     if (! $demandeurPrincipalNotifie) {
3298     // Analyse pour savoir pourquoi le demandeur principal n'est pas notifiable
3299     $erreursParam = $this->get_info_notification_fail($val['dossier']);
3300     $demandeurPrincipal = $this->get_info_petitionnaire_principal_dossier($val['dossier']);
3301     // Ajout de la notif et récupération de son id
3302     $idNotif = $this->ajouter_notification(
3303     $this->valF[$this->clePrimaire],
3304     $this->f->get_connected_user_login_name(),
3305     $demandeurPrincipal,
3306     $collectivite_di,
3307 softime 12433 array(),
3308 softime 12124 true,
3309     'Echec',
3310     implode(' ', $erreursParam)
3311     );
3312     if ($idNotif === false) {
3313     $this->addToMessage(
3314     __('Erreur : la création de la notification a échouée.').
3315     __("Veuillez contacter votre administrateur.")
3316     );
3317     return false;
3318     }
3319     // Prépare un message d'alerte à destination de l'instructeur pour l'informer
3320     // de l'échec de la notification
3321     $dossier_message = $this->get_inst_dossier_message(0);
3322     $dossier_message_val = array(
3323     'dossier' => $val['dossier'],
3324     'type' => _('erreur expedition'),
3325     'emetteur' => $this->f->get_connected_user_login_name().' (automatique)',
3326     'login' => $_SESSION['login'],
3327     'date_emission' => date('Y-m-d H:i:s'),
3328     'contenu' => _('Échec lors de la notification de l\'instruction ').
3329     $inst_evenement->getVal('libelle').
3330     '.<br>'.
3331     implode("\n", $erreursParam).
3332     '<br>'.
3333     _('Veuillez corriger ces informations avant de renvoyer la notification.')
3334     );
3335     $add = $dossier_message->add_notification_message($dossier_message_val, true);
3336     // Si une erreur se produit pendant l'ajout
3337     if ($add !== true) {
3338     $this->addToLog(__METHOD__."(): Le message d'alerte concernant l'echec de l'envoi de la notification n'a pas pu être envoyé.", DEBUG_MODE);
3339     return false;
3340     }
3341     }
3342 softime 10808 $this->addToMessage($message = sprintf('%s<br/>%s', __("La notification a été générée."), __("Le suivi de la notification est disponible depuis l'instruction.")));
3343     }
3344    
3345     /**
3346 softime 7996 * Mise à jour de la date de dernière modification du dossier
3347     */
3348     $inst_di->update_last_modification_date();
3349    
3350     /**
3351 softime 8640 * Mise à jour des données du DA.
3352     */
3353     $inst_da = $inst_di->get_inst_dossier_autorisation();
3354 softime 9245 $params['di_id'] = $this->valF['dossier'];
3355 softime 8640 if ($inst_da->majDossierAutorisation($params) === false) {
3356     $this->addToMessage(_("Erreur lors de la mise a jour des donnees du dossier d'autorisation. Contactez votre administrateur."));
3357     $this->correct = false;
3358     return false;
3359     }
3360    
3361     /**
3362 fmichon 4708 * Historisation de la vie du DI.
3363     */
3364     //
3365 nmeucci 3963 return $this->add_log_to_dossier($id, array_merge($val, $this->valF));
3366 nmeucci 3876 }
3367 mbroquet 3730
3368 softime 12124 /**
3369     * Cette méthode vérifie si toutes les conditions de l'envoi de la notification
3370     * sont remplies.
3371     * Les conditions vérifiées sont les suivantes :
3372     * - Le petitionnaire principal doit accepter les notifications
3373     * - Le pétitionnaire principal doit avoir une adresse mail renseignée
3374     * - Le pétitionnaire principal doit avoir une adresse mail correcte
3375     * Pour chaque vérification effectué un message d'erreur est ajouté si la
3376     * condition n'est pas remplie.
3377     * Renvoie le message d'erreur en sortie.
3378     *
3379     * @param string identifiant du dossier sur lequel les notifications ont échouée
3380     * @return string
3381     */
3382     protected function get_info_notification_fail($dossier = null) {
3383     // Utilise l'identifiant du dossier passé en paramètre et si aucun dossier n'a été récupéré
3384     // utilise celui associé à l'instruction
3385     if ($dossier == null) {
3386     $dossier = $this->getVal('dossier');
3387     }
3388     // Tableau contenant la liste des messages d'erreur
3389     $errorMessage = array();
3390     // Récupère les informations du demandeurs principal
3391     $infoPetitionnaire = $this->get_info_petitionnaire_principal_dossier($dossier);
3392     // Vérifie si le pétitionnaire principal à bien la case "accepte les notification" cochée
3393     if (isset($infoPetitionnaire['notification']) && $infoPetitionnaire['notification'] != 't') {
3394     $errorMessage[] = __('Le pétitionnaire principal n\'accepte pas les notifications.');
3395     }
3396     // Vérifie si l'adresse mail du pétitionnaire principale est renseignée
3397     if (isset($infoPetitionnaire['courriel']) && ! empty($infoPetitionnaire['courriel'])) {
3398     // Vérifie si le format de l'adresse mail est pas correct et, si ce n'est pas le cas, informe l'utilisateur
3399     // qu'il doit le corriger avant de pouvoir ajouter l'nstruction
3400     if (! $this->f->checkValidEmailAddress($infoPetitionnaire['courriel'])) {
3401     $errorMessage[] = __('Le courriel du pétitionnaire principal n\'est pas correct : ').
3402     $infoPetitionnaire['courriel'].
3403     '.';
3404     }
3405     } else {
3406     // Si le courriel du pétitionnaire principal
3407     $errorMessage[] = __('Le courriel du pétitionnaire principal n\'est pas renseigné.');
3408     }
3409 softime 11585
3410 softime 12124 return $errorMessage;
3411     }
3412    
3413     /**
3414     * Méthode servant à vérifier si un dossier a été déposé sur
3415     * le portail citoyen ou pas.
3416     * La verification se fait via une requête sql dans laquelle
3417     * on va chercher un dossier ayant pour id l'identifiant de
3418     * dossier associé à l'instruction et pour lequel la demande
3419     * associée la plus ancienne est une demande de création de
3420     * dossier via portail
3421     *
3422     * @param string identifiant du dossier. Si non renseigné c'est le dossier
3423     * associé à l'instruction qui est utilisé
3424     * @return boolean|void true : dossier déposé via portail, false : dossier
3425     * non déposé via portail et null : erreur de base de données.
3426     */
3427     protected function dossier_depose_sur_portail($dossier = null) {
3428     if (empty($dossier)) {
3429     $dossier = $this->getVal('dossier');
3430     }
3431     $sql = sprintf(
3432     'SELECT
3433     dossier
3434     FROM
3435     %1$sdossier
3436     -- Récuperation de la première demande associée au dossier
3437     LEFT JOIN (
3438     SELECT
3439     demande,
3440     dossier_instruction,
3441     source_depot
3442     FROM
3443     %1$sdemande
3444     WHERE
3445     dossier_instruction = \'%2$s\'
3446     ORDER BY
3447     demande ASC
3448     LIMIT 1
3449     ) as demande ON dossier.dossier = demande.dossier_instruction
3450     WHERE
3451     dossier.dossier = \'%2$s\'
3452     AND demande.source_depot = \'portal\'',
3453     DB_PREFIXE,
3454     $dossier
3455     );
3456     $res = $this->f->get_one_result_from_db_query($sql, true);
3457     if ($res['code'] === 'KO') {
3458     $this->addToMessage(__('Erreur : La vérification du mode de dépôt du dossier à échoué'));
3459     return;
3460     }
3461     // Si on a un résultat c'est que le dossier a été déposé via le portail
3462     return ! empty($res['result']);
3463     }
3464    
3465 softime 11585 public function is_service_notifiable() {
3466     $evenement = $this->get_inst_evenement($this->getVal('evenement'));
3467    
3468     // Si l'instruction a une édition non finalisé quel que soit
3469     // le type de notification, il n'est pas notifiable
3470     if ($this->has_an_edition() === true) {
3471     if ($this->is_unfinalizable_without_bypass() === false) {
3472     return false;
3473     }
3474     }
3475     // Vérifie si la notification des tiers est active pour l'évènement
3476     return $this->get_boolean_from_pgsql_value($evenement->getVal('notification_service'));
3477     }
3478    
3479     public function is_tiers_notifiable() {
3480     $evenement = $this->get_inst_evenement($this->getVal('evenement'));
3481    
3482     // Si l'instruction a une édition non finalisé quel que soit
3483     // le type de notification, il n'est pas notifiable
3484     if ($this->has_an_edition() === true) {
3485     if ($this->is_unfinalizable_without_bypass() === false) {
3486     return false;
3487     }
3488     }
3489     // Vérifie si la notification des tiers est active pour l'évènement
3490     return $this->get_boolean_from_pgsql_value($evenement->getVal('notification_tiers'));
3491     }
3492    
3493 softime 12124 /**
3494     * Méthode permettant de savoir si une instruction peut
3495     * être notifiée manuellement selon les différents types
3496     * de notification.
3497     *
3498     * Si l'instruction a une édition non finalisée alors elle n'est pas
3499     * manuellement notifiable.
3500     * Si l'instruction est associé à un événement de notification pour
3501     * lequel un retour signature est recquis, elle n'est notifiable que
3502     * si la date de retour de signature est remplie.
3503     * Par défaut si le type de notification n'est pas connu alors l'instruction
3504     * n'est pas notifiable.
3505     * Pour tous les autres cas l'instruction est manuellement notifiable.
3506     *
3507     * @return boolean true : notifiable | false : non notifiable
3508     */
3509 softime 10808 public function is_notifiable_by_task_manual() {
3510     $ev = $this->get_inst_evenement($this->getVal('evenement'));
3511    
3512     // Si l'instruction a une édition non finalisé quel que soit
3513     // le type de notification, il n'est pas notifiable
3514     if ($this->has_an_edition() === true) {
3515     if ($this->is_unfinalizable_without_bypass() === false) {
3516     return false;
3517     }
3518     }
3519    
3520     // Gestion des différents cas selon la valeur du champs notification
3521 softime 12124 if ($ev->getVal('notification') == 'notification_manuelle' ||
3522     $ev->getVal('notification') == 'notification_manuelle_annexe' ||
3523     $ev->getVal('notification') == 'notification_automatique'
3524     ) {
3525     return true;
3526     } elseif (($ev->getVal('notification') == 'notification_auto_signature_requise' ||
3527     $ev->getVal('notification') == 'notification_manuelle_signature_requise' ||
3528     $ev->getVal('notification') == 'notification_manuelle_annexe_signature_requise') &&
3529     $this->getVal('date_retour_signature') != null &&
3530     $this->getVal('date_retour_signature') != ''
3531     ) {
3532     return true ;
3533 softime 10808 }
3534 softime 12124 return false;
3535 softime 10808 }
3536    
3537 softime 8989 /**
3538 softime 10808 * Crée une instance et une tache de notification pour le demandeur
3539     * principal.
3540     *
3541     * @return boolean true si le traitement à réussi
3542     */
3543     protected function notifier_demandeur_principal() {
3544     $this->begin_treatment(__METHOD__);
3545     $message = '';
3546     // Récupération des informations concernant le demandeur
3547     $dossier = $this->getVal('dossier');
3548 softime 10968 $collectivite_di = $this->get_dossier_instruction_om_collectivite($dossier);
3549 softime 10808 $demandeur = $this->get_demandeurs_notifiable(
3550     $dossier,
3551     true
3552     );
3553     if ($demandeur !== array()) {
3554 softime 10869 $destinataire = array_values($demandeur);
3555 softime 10808 // Ajout de la notif et récupération de son id
3556     $idNotification = $this->ajouter_notification(
3557     $this->getVal($this->clePrimaire),
3558     $this->f->get_connected_user_login_name(),
3559 softime 10968 $destinataire[0],
3560     $collectivite_di,
3561 softime 12433 array(),
3562 softime 10968 true
3563 softime 10808 );
3564     if ($idNotification === false) {
3565     return $this->end_treatment(__METHOD__, false);
3566     }
3567     // Création de la tâche en lui donnant l'id de la notification
3568     $notification_by_task = $this->notification_by_task($idNotification, $dossier);
3569     if ($notification_by_task === false) {
3570     $this->addToMessage(
3571     __("Erreur lors de la génération de la notification au(x) pétitionnaire(s).")
3572     );
3573     return $this->end_treatment(__METHOD__, false);
3574     }
3575     $this->addToMessage($message .= sprintf('%s<br/>%s', __("La notification a été générée."), __("Le suivi de la notification est disponible depuis l'instruction.")));
3576     return $this->end_treatment(__METHOD__, true);
3577     }
3578     $this->addToMessage( __("Le demandeur principal n'est pas notifiable."));
3579 softime 12124 return $this->end_treatment(__METHOD__, false);
3580 softime 10808 }
3581    
3582     public function notification_by_task($object_id, $dossier, $category = null, $type = null) {
3583     // Par défaut le type est portal
3584     if ($category === null) {
3585     $category = 'portal';
3586     }
3587     // Si le type n'est pas correctement spécifié, alors il est calculé
3588 softime 11585 if ($type !== 'notification_recepisse'
3589     && $type !== 'notification_instruction'
3590     && $type !== 'notification_decision'
3591     && $type !== 'notification_service_consulte'
3592     && $type !== 'notification_tiers_consulte') {
3593 softime 10808 //
3594     $type = 'notification_instruction';
3595     // Vérifie si l'instruction est un récépissé
3596 softime 10968 $trace = debug_backtrace();
3597     foreach ($trace as $key => $value) {
3598     if (isset($trace[$key]['class']) === true
3599     && empty($trace[$key]['class']) === false) {
3600     //
3601     if (strtolower($trace[$key]['class']) === 'demande') {
3602     $type = 'notification_recepisse';
3603     }
3604     }
3605 softime 10808 }
3606     // Vérifie si l'instruction est une décision
3607     if ($type !== 'notification_recepisse') {
3608     $avis_decision = $this->getVal('avis_decision') !== null ? $this->getVal('avis_decision') : $this->valF['avis_decision'];
3609     if ($avis_decision !== null && $avis_decision !== '') {
3610     $type = 'notification_decision';
3611     }
3612     }
3613     }
3614     // Préparation de la tache de notification
3615     $inst_task = $this->f->get_inst__om_dbform(array(
3616     "obj" => "task",
3617     "idx" => 0,
3618     ));
3619     $task_val = array(
3620     'type' => $type,
3621     'object_id' => $object_id,
3622     'dossier' => $dossier,
3623     'category' => $category,
3624     );
3625    
3626     $add_task = $inst_task->add_task(array('val' => $task_val));
3627     if ($add_task === false) {
3628     return false;
3629     }
3630    
3631     return true;
3632     }
3633    
3634 softime 10968 /**
3635     * A partir des informations passée en argument ajoute un nouvel élément
3636     * dans la table instruction_notification.
3637     * Avant l'ajout vérifie en utilisant l'id de la collectivité passée en
3638     * paramètre si le paramétrage attendus est ok.
3639     * Ajoute également un nouvel élement dans instruction_notification_document
3640     * si l'instruction possède une lettretype.
3641     * Si un identifiant d'une instruction annexe est donnée ajoute un deuxième
3642     * élement dans la table instruction_notification_document qui correspondra
3643     * à l'annexe de la notification.
3644     *
3645     * @param integer identifiant de l'instruction notifiée
3646     * @param string information concernant l'emetteur
3647     * @param array tableau contenant 2 entrées
3648     * - destinatire : nom, prenom ou raison sociale, dénomination et courriel
3649     * - courriel : adresse mail de la personne à notifier
3650     * @param integer identifiant de la collectivité permettant de récupèrer les
3651     * paramètres à valider
3652     * @param boolean indique si la notification est automatique ou manuelle
3653     * @param integer identifiant d'une instruction dont l'édition sera annexé
3654     * à la notification
3655     *
3656     * @return integer|boolean identifiant de la notification créée si le traitement
3657     * a réussie, false sinon.
3658     */
3659 softime 10869 protected function ajouter_notification(
3660     $idInstruction,
3661     $emetteur,
3662     $destinataire,
3663 softime 10968 $collectiviteId,
3664 softime 12433 $annexes = array(),
3665 softime 10968 $demandeAuto = false,
3666 softime 12124 $statut = 'en cours d\'envoi',
3667 softime 12433 $commentaire = 'Notification en cours de traitement'
3668 softime 10869 ) {
3669 softime 10968 // Vérification que les paramètres nécessaires à l'envoi de la notification existe avant
3670     // de créer la notification
3671     if (! $this->is_parametrage_notification_correct($collectiviteId)) {
3672     $this->addToMessage(__("Erreur de paramétrage. L'url d'accès au(x) document(s) notifié(s) n'est pas paramétrée."));
3673     return false;
3674     }
3675 softime 10808 // Préparation de la notification
3676     $inst_notif = $this->f->get_inst__om_dbform(array(
3677     "obj" => "instruction_notification",
3678     "idx" => "]",
3679     ));
3680     $notif_val = array(
3681     'instruction_notification' => null,
3682     'instruction' => $idInstruction,
3683     'automatique' => $demandeAuto,
3684     'emetteur' => $emetteur,
3685     'date_envoi' => null,
3686 softime 10869 'destinataire' => $destinataire['destinataire'],
3687     'courriel' => $destinataire['courriel'],
3688 softime 10808 'date_premier_acces' => null,
3689 softime 12124 'statut' => $statut,
3690     'commentaire' => $commentaire
3691 softime 10808 );
3692    
3693     // Création de la notification
3694     $add_notif = $inst_notif->ajouter($notif_val);
3695     if ($add_notif === false) {
3696 softime 10968 $this->addToMessage(__("Erreur lors de la génération de la notification au(x) pétitionnaire(s)."));
3697 softime 10808 return false;
3698     }
3699    
3700 softime 10869 // Si il y a une lettretype finalisé stockage de la clé d'accès au documents
3701     if ($this->evenement_has_an_edition($this->getVal('evenement')) === true) {
3702 softime 12433 $add_notif_doc = $this->ajouter_notification_document(
3703     $inst_notif->getVal($inst_notif->clePrimaire),
3704 softime 10869 $this->getVal($this->clePrimaire),
3705 softime 12433 'instruction'
3706 softime 10808 );
3707     if ($add_notif_doc === false) {
3708 softime 10968 $this->addToMessage(__("Erreur lors de la génération de la notification du document."));
3709 softime 10808 return false;
3710     }
3711 softime 10869 }
3712     // Si une annexe a été choisie stockage de la clé d'accès à l'annexe
3713 softime 12433 if (! empty($annexes) && is_array($annexes)) {
3714     $add_notif_annexe = $this->ajouter_notification_document_multiple(
3715 softime 10869 $inst_notif->getVal($inst_notif->clePrimaire),
3716 softime 12433 $annexes
3717 softime 10869 );
3718     if ($add_notif_annexe === false) {
3719 softime 10968 $this->addToMessage(__("Erreur lors de la génération de la notification de l'annexe."));
3720 softime 10869 return false;
3721     }
3722     }
3723 softime 10808
3724     // Renvoie l'id de la nouvelle instance de instruction_notification
3725     return $inst_notif->getVal($inst_notif->clePrimaire);
3726     }
3727    
3728     /**
3729 softime 11585 * Pour chaque élément du tableau passé en paramètre ajoute une nouvelle
3730     * instance dans la table instruction_notification_document lié a la
3731     * notification dont l'id est passé en paramètre.
3732     *
3733     * @param array tableau contenant les informations nécessaires pour créer les annexes
3734     *
3735     * @return integer|boolean identifiant de la notification créée si le traitement
3736     * a réussie, false sinon.
3737     */
3738     protected function ajouter_notification_document_multiple($idNotification, $listeDocument) {
3739 softime 12433 foreach ($listeDocument as $paramDoc) {
3740     if (! $this->ajouter_notification_document($idNotification, $paramDoc['id'], $paramDoc['tableDocument'], $paramDoc['isAnnexe'])) {
3741 softime 11585 $this->addToMessage(__("Erreur lors de la génération des documents à notifier."));
3742     return false;
3743     }
3744     }
3745     return true;
3746     }
3747    
3748     /**
3749     * Ajoute un élément dans la table instruction_notification_document en utilisant
3750     * les éléments fourni en paramètre
3751     *
3752     * @param integer $idNotification : id de la notification à laquelle on associe le document
3753     * @param integer $idDocument : id de l'objet auquel est rattaché le document
3754     * @param string $tableDocument : nom de la table a laquelle est rattaché le document
3755     * @param boolean $isAnnexe : indique si le document est une annexe ou pas
3756     *
3757     * @return boolean indique si le traitement a réussi
3758     */
3759     protected function ajouter_notification_document($idNotification, $idDocument, $tableDocument, $isAnnexe = false) {
3760     $inst_notif_doc = $this->f->get_inst__om_dbform(array(
3761     "obj" => "instruction_notification_document",
3762     "idx" => "]",
3763     ));
3764     // l'attribut instruction doit obligatoirement être renseigné
3765     // pour éviter toutes confusion avec d'autres instruction l'id
3766     // 0 est donné au document n'appartenant pas aux instructions
3767     $notif_doc_val = array(
3768     'instruction_notification_document' => null,
3769     'instruction_notification' => $idNotification,
3770     'instruction' => $tableDocument == 'instruction' ? $idDocument : 0,
3771     'document_type' => $tableDocument,
3772     'document_id' => $idDocument,
3773     'cle' => $this->getCleAccesDocument(),
3774     'annexe' => $isAnnexe
3775     );
3776    
3777     $add_notif_doc = $inst_notif_doc->ajouter($notif_doc_val);
3778     if ($add_notif_doc === false) {
3779     return false;
3780     }
3781     return true;
3782     }
3783    
3784     /**
3785 softime 10968 * Vérifie si le paramétrage de la notification des demandeurs est correct.
3786     *
3787     * @param integer identifiant de la collectivité
3788     * @return boolean
3789     */
3790     protected function is_parametrage_notification_correct($collectiviteId) {
3791     $categorie = $this->f->get_param_option_notification($collectiviteId);
3792     $urlAccesNotif = $this->f->get_parametre_notification_url_acces($collectiviteId);
3793     if ($categorie == 'mail' && $urlAccesNotif == null) {
3794     return false;
3795     }
3796     return true;
3797     }
3798    
3799     /**
3800 softime 8989 * TRIGGER - triggermodifierapres.
3801     *
3802     * @return boolean
3803     */
3804     function triggermodifierapres($id, &$dnu1 = null, $val = array(), $dnu2 = null) {
3805     $this->addToLog(__METHOD__."(): start", EXTRA_VERBOSE_MODE);
3806 softime 10808 $collectivite_di = $this->get_dossier_instruction_om_collectivite($val['dossier']);
3807     $message = '';
3808 mbroquet 3730 /**
3809     * L'objectif ici est d'effectuer les recalculs de date dans le dossier
3810     * si la date de l'evenement est modifiee
3811     */
3812     // Initialisation
3813 softime 9245 $valF = array();
3814     $valF_dt = array();
3815 mbroquet 3730 // Initialisation du type d'événement
3816     $type_evmt = "";
3817     // Récupération de l'action correspondante à l'événement
3818     $sql = "SELECT action
3819     FROM ".DB_PREFIXE."evenement
3820     WHERE evenement=".$this->valF['evenement'];
3821 softime 8989 $action = $this->f->db->getOne($sql);
3822     $this->addToLog(__METHOD__."(): db->getone(\"".$sql."\");", VERBOSE_MODE);
3823 mbroquet 3730 if (database::isError($action)) {
3824     die($action->getMessage());
3825     }
3826    
3827     // Récupération des paramètres de l'action
3828     $sql = "SELECT * FROM ".DB_PREFIXE."action
3829     WHERE action='".$action."'";
3830 softime 8989 $res = $this->f->db->query($sql);
3831     $this->addToLog(__METHOD__."(): db->query(\"".$sql."\");", VERBOSE_MODE);
3832 mbroquet 3730 if (database::isError($res)) {
3833     die($res->getMessage());
3834     }
3835     while ($row=& $res->fetchRow(DB_FETCHMODE_ASSOC)){
3836     // application des regles sur le courrier + delai
3837     if(preg_match("/date_evenement/",$row['regle_date_limite'])){
3838     $valF['date_limite']= $this->regle($row['regle_date_limite'], 'regle_date_limite');
3839     }
3840     if(preg_match("/date_evenement/",$row['regle_date_complet'])){
3841     $valF['date_complet']= $this->regle($row['regle_date_complet'], 'regle_date_complet');
3842     }
3843     if(preg_match("/date_evenement/",$row['regle_date_dernier_depot'])){
3844     $valF['date_dernier_depot']= $this->regle($row['regle_date_dernier_depot'], 'regle_date_dernier_depot');
3845     }
3846     if(preg_match("/date_evenement/",$row['regle_date_notification_delai'])){
3847     $valF['date_notification_delai']= $this->regle($row['regle_date_notification_delai'], 'regle_date_notification_delai');
3848     }
3849     if(preg_match("/date_evenement/",$row['regle_date_decision'])){
3850     $valF['date_decision']= $this->regle($row['regle_date_decision'], 'regle_date_decision');
3851     }
3852     if(preg_match("/date_evenement/",$row['regle_date_rejet'])){
3853     $valF['date_rejet']= $this->regle($row['regle_date_rejet'], 'regle_date_rejet');
3854     }
3855     if(preg_match("/date_evenement/",$row['regle_date_validite'])){
3856     $valF['date_validite']= $this->regle($row['regle_date_validite'], 'regle_date_validite');
3857     }
3858     if(preg_match("/date_evenement/",$row['regle_date_chantier'])){
3859     $valF['date_chantier']= $this->regle($row['regle_date_chantier'], 'regle_date_chantier');
3860     }
3861     if(preg_match("/date_evenement/",$row['regle_date_achevement'])){
3862     $valF['date_achevement']= $this->regle($row['regle_date_achevement'], 'regle_date_achevement');
3863     }
3864     if(preg_match("/date_evenement/",$row['regle_date_conformite'])){
3865     $valF['date_conformite']= $this->regle($row['regle_date_conformite'], 'regle_date_conformite');
3866     }
3867 softime 6565 if(preg_match("/date_evenement/",$row['regle_date_cloture_instruction'])){
3868     $valF['date_cloture_instruction']= $this->regle($row['regle_date_cloture_instruction'], 'regle_date_cloture_instruction');
3869     }
3870     if(preg_match("/date_evenement/",$row['regle_date_premiere_visite'])){
3871     $valF['date_premiere_visite']= $this->regle($row['regle_date_premiere_visite'], 'regle_date_premiere_visite');
3872     }
3873     if(preg_match("/date_evenement/",$row['regle_date_derniere_visite'])){
3874     $valF['date_derniere_visite']= $this->regle($row['regle_date_derniere_visite'], 'regle_date_derniere_visite');
3875     }
3876     if(preg_match("/date_evenement/",$row['regle_date_contradictoire'])){
3877     $valF['date_contradictoire']= $this->regle($row['regle_date_contradictoire'], 'regle_date_contradictoire');
3878     }
3879     if(preg_match("/date_evenement/",$row['regle_date_retour_contradictoire'])){
3880     $valF['date_retour_contradictoire']= $this->regle($row['regle_date_retour_contradictoire'], 'regle_date_retour_contradictoire');
3881     }
3882     if(preg_match("/date_evenement/",$row['regle_date_ait'])){
3883     $valF['date_ait']= $this->regle($row['regle_date_ait'], 'regle_date_ait');
3884     }
3885     if(preg_match("/date_evenement/",$row['regle_date_transmission_parquet'])){
3886     $valF['date_transmission_parquet']= $this->regle($row['regle_date_transmission_parquet'], 'regle_date_transmission_parquet');
3887     }
3888     if ($row['regle_donnees_techniques1'] !== '') {
3889     $valF_dt[$row['cible_regle_donnees_techniques1']] = $this->regle($row['regle_donnees_techniques1'], 'regle_donnees_techniques1');
3890     }
3891     if ($row['regle_donnees_techniques2'] !== '') {
3892     $valF_dt[$row['cible_regle_donnees_techniques2']] = $this->regle($row['regle_donnees_techniques2'], 'regle_donnees_techniques2');
3893     }
3894     if ($row['regle_donnees_techniques3'] !== '') {
3895     $valF_dt[$row['cible_regle_donnees_techniques3']] = $this->regle($row['regle_donnees_techniques3'], 'regle_donnees_techniques3');
3896     }
3897     if ($row['regle_donnees_techniques4'] !== '') {
3898     $valF_dt[$row['cible_regle_donnees_techniques4']] = $this->regle($row['regle_donnees_techniques4'], 'regle_donnees_techniques4');
3899     }
3900     if ($row['regle_donnees_techniques5'] !== '') {
3901     $valF_dt[$row['cible_regle_donnees_techniques5']] = $this->regle($row['regle_donnees_techniques5'], 'regle_donnees_techniques5');
3902     }
3903 softime 8593 if ($row['regle_dossier_instruction_type'] !== '') {
3904     $valF['dossier_instruction_type'] = $this->regle($row['regle_dossier_instruction_type'], 'regle_dossier_instruction_type');
3905     }
3906 mbroquet 3730 }
3907 softime 6565 // Si des valeurs de données techniques ont été calculées alors on met à jour l'enregistrement
3908 softime 9245 if (count($valF_dt) > 0) {
3909 softime 6565 $dt_id = $this->getDonneesTechniques();
3910     // On met à jour le dossier
3911     $cle = " donnees_techniques='".$dt_id."'";
3912 softime 8989 $res1 = $this->f->db->autoExecute(DB_PREFIXE.'donnees_techniques', $valF_dt, DB_AUTOQUERY_UPDATE, $cle);
3913     $this->addToLog(__METHOD__."(): db->autoexecute(\"".DB_PREFIXE."donnees_techniques\", ".print_r($valF_dt, true).", DB_AUTOQUERY_UPDATE, \"".$cle."\");", VERBOSE_MODE);
3914 softime 6565 if (database::isError($res1)) {
3915     die($res->getMessage());
3916     }
3917     // Affichage d'informations à l'utilisateur
3918 softime 8989 $this->addToMessage(_('enregistrement')." ".$this->valF['dossier']." "._('table')." dossier [".$this->f->db->affectedRows()." "._('enregistrement')." "._('mis_a_jour')."]");
3919 softime 6565 }
3920 mbroquet 3730 // Si des valeurs ont été calculées alors on met à jour l'enregistrement
3921 softime 9245 if (count($valF) > 0) {
3922 softime 10573 //
3923     $inst_dossier = $this->f->get_inst__om_dbform(array(
3924     "obj" => "dossier",
3925     "idx" => $this->valF['dossier'],
3926     ));
3927     $valF['instruction'] = $id;
3928 softime 10968 $valF['crud'] = 'update';
3929 softime 10573 $update_by_instruction = $inst_dossier->update_by_instruction($valF);
3930     if ($update_by_instruction === false) {
3931     $this->cleanMessage();
3932     $this->addToMessage(sprintf('%s %s', __("Une erreur s'est produite lors de la mise à jour du dossier d'instruction."), __("Veuillez contacter votre administrateur.")));
3933     return false;
3934 mbroquet 3730 }
3935     // Affichage d'informations à l'utilisateur
3936 softime 8989 $this->addToMessage(_('enregistrement')." ".$this->valF['dossier']." "._('table')." dossier [".$this->f->db->affectedRows()." "._('enregistrement')." "._('mis_a_jour')."]");
3937 mbroquet 3730 }
3938    
3939     $restriction = $this->get_restriction($val['evenement']);
3940     $this->restriction_valid = $this->restrictionIsValid($restriction);
3941    
3942     if($restriction == "" || $this->restriction_valid ){
3943     // Récupération de tous les paramètres de l'événement sélectionné
3944     $sql = "SELECT * FROM ".DB_PREFIXE."evenement
3945     WHERE evenement=".$this->valF['evenement'];
3946 softime 8989 $res = $this->f->db->query($sql);
3947     $this->addToLog(__METHOD__."(): db->query(\"".$sql."\");", VERBOSE_MODE);
3948 mbroquet 3730 if (database::isError($res)) {
3949     die($res->getMessage());
3950     }
3951 nmeucci 3965 $current_id = $this->getVal($this->clePrimaire);
3952 mbroquet 3730 while ($row=& $res->fetchRow(DB_FETCHMODE_ASSOC)) {
3953     // Si la date de retour signature est éditée on vérifie si il existe un événement automatique
3954     if ($this->getVal('date_retour_signature') == "" AND
3955     $this->valF['date_retour_signature'] != "" AND
3956     $row['evenement_retour_signature'] != "") {
3957 softime 7996 $new_instruction = $this->f->get_inst__om_dbform(array(
3958     "obj" => "instruction",
3959     "idx" => "]",
3960     ));
3961 mbroquet 3730 // Création d'un tableau avec la liste des champs de l'instruction
3962     foreach($new_instruction->champs as $champ) {
3963     $valNewInstr[$champ] = "";
3964     }
3965     // Définition des valeurs de la nouvelle instruction
3966     $valNewInstr["evenement"] = $row['evenement_retour_signature'];
3967     $valNewInstr["destinataire"] = $this->valF['destinataire'];
3968     $valNewInstr["dossier"] = $this->valF['dossier'];
3969     $valNewInstr["date_evenement"] = $this->f->formatDate($this->valF['date_retour_signature']);
3970     $valNewInstr["date_envoi_signature"] = $this->f->formatDate($this->valF['date_envoi_signature']);
3971     $valNewInstr["date_retour_signature"] = $this->f->formatDate($this->valF['date_retour_signature']);
3972     $valNewInstr["date_envoi_rar"] = $this->f->formatDate($this->valF['date_envoi_rar']);
3973     $valNewInstr["date_retour_rar"] = $this->f->formatDate($this->valF['date_retour_rar']);
3974     $valNewInstr["date_envoi_controle_legalite"] = $this->f->formatDate($this->valF['date_envoi_controle_legalite']);
3975     $valNewInstr["date_retour_controle_legalite"] = $this->f->formatDate($this->valF['date_retour_controle_legalite']);
3976 nmeucci 3965 $new_instruction->setParameter("maj", 0);
3977     $new_instruction->class_actions[0]["identifier"] =
3978     "retour signature de l'instruction $current_id";
3979 softime 8989 $retour = $new_instruction->ajouter($valNewInstr);
3980 mbroquet 3730
3981     //Si une erreur s'est produite et qu'il s'agit d'un problème
3982     //de restriction
3983     if ($retour == false && !$new_instruction->restriction_valid){
3984     $error_message = $this->get_restriction_error_message($restriction);
3985     $this->f->displayMessage("error", $error_message);
3986 softime 8989 $this->addToLog(__METHOD__."(): evenement retour ".
3987 mbroquet 3730 "instruction ".$this->valF[$this->clePrimaire]." : ".
3988     $new_instruction->msg);
3989     }
3990     //Si une erreur s'est produite après le test de la restriction
3991     elseif ($retour == false && $new_instruction->restriction_valid){
3992     $this->correct = false ;
3993     $this->msg .= $new_instruction->msg;
3994     return false;
3995     }
3996     }
3997     // Si la date de retour AR est éditée on vérifie si il existe un événement automatique
3998     if ($this->getVal('date_retour_rar') == "" AND
3999     $this->valF['date_retour_rar'] != "") {
4000    
4001     if($row['evenement_retour_ar'] != "") {
4002 softime 7996 $new_instruction = $this->f->get_inst__om_dbform(array(
4003     "obj" => "instruction",
4004     "idx" => "]",
4005     ));
4006 mbroquet 3730 // Création d'un tableau avec la liste des champs de l'instruction
4007     foreach($new_instruction->champs as $champ) {
4008     $valNewInstr[$champ] = "";
4009     }
4010     // Définition des valeurs de la nouvelle instruction
4011     $valNewInstr["evenement"] = $row['evenement_retour_ar'];
4012     $valNewInstr["destinataire"] = $this->valF['destinataire'];
4013     $valNewInstr["dossier"] = $this->valF['dossier'];
4014     $valNewInstr["date_evenement"] = $this->f->formatDate($this->valF['date_retour_rar']);
4015     $valNewInstr["date_envoi_signature"] = $this->f->formatDate($this->valF['date_envoi_signature']);
4016     $valNewInstr["date_retour_signature"] = $this->f->formatDate($this->valF['date_retour_signature']);
4017     $valNewInstr["date_envoi_rar"] = $this->f->formatDate($this->valF['date_envoi_rar']);
4018     $valNewInstr["date_retour_rar"] = $this->f->formatDate($this->valF['date_retour_rar']);
4019     $valNewInstr["date_envoi_controle_legalite"] = $this->f->formatDate($this->valF['date_envoi_controle_legalite']);
4020     $valNewInstr["date_retour_controle_legalite"] = $this->f->formatDate($this->valF['date_retour_controle_legalite']);
4021 nmeucci 3965 $new_instruction->setParameter("maj", 0);
4022     $new_instruction->class_actions[0]["identifier"] =
4023 softime 8989 "notification de l'instruction $current_id";
4024     $retour = $new_instruction->ajouter($valNewInstr);
4025 mbroquet 3730
4026     //Si une erreur s'est produite et qu'il s'agit d'un problème
4027     //de restriction
4028     if ($retour == false && !$new_instruction->restriction_valid) {
4029     $error_message = $this->get_restriction_error_message($restriction);
4030     $this->f->displayMessage("error", $error_message);
4031     $this->addToLog(
4032 softime 8989 __METHOD__."(): evenement retour instruction ".
4033 mbroquet 3730 $this->valF[$this->clePrimaire]." : ".
4034     $new_instruction->msg
4035     );
4036     }
4037     //Si une erreur s'est produite après le test de la restriction
4038     elseif ($retour == false && $new_instruction->restriction_valid){
4039     $this->correct = false ;
4040     $this->msg .= $new_instruction->msg;
4041     return false;
4042     }
4043     }
4044     }
4045     }
4046     }
4047    
4048 softime 8640 /**
4049     * Mise à jour de la date de dernière modification du dossier
4050     * d'instruction
4051     */
4052     $inst_di = $this->get_inst_dossier($this->getVal('dossier'));
4053     $inst_di->update_last_modification_date();
4054    
4055 mbroquet 3730 // Mise à jour des données du dossier d'autorisation
4056 softime 7996 $da = $this->f->get_inst__om_dbform(array(
4057     "obj" => "dossier_autorisation",
4058     "idx" => $this->getNumDemandeAutorFromDossier($this->valF['dossier']),
4059     ));
4060 softime 8640 $params = array(
4061     'di_id' => $this->getVal('dossier'),
4062     );
4063     if($da->majDossierAutorisation($params) === false) {
4064 mbroquet 3730 $this->addToMessage(_("Erreur lors de la mise a jour des donnees du dossier d'autorisation. Contactez votre administrateur."));
4065     $this->correct = false;
4066     return false;
4067     }
4068 softime 7996
4069 softime 10573 // mise à jour des métadonnées issues des dates de suivi
4070     $dateRetourSignatureModified = ($this->valF['date_retour_signature'] != $this->getVal('date_retour_signature'));
4071     $dateRetourRARModified = ($this->valF['date_retour_rar'] != $this->getVal('date_retour_rar'));
4072     if ($dateRetourSignatureModified || $dateRetourRARModified) {
4073    
4074     // Calculs des nouvelles métadonnées
4075     $metadata = $this->getMetadata("om_fichier_instruction");
4076    
4077     // On vérifie si l'instruction à finaliser a un événement de type arrete
4078     $sql = "SELECT type FROM ".DB_PREFIXE."evenement WHERE evenement = ".$this->getVal("evenement");
4079     $typeEvenement = $this->f->db->getOne($sql);
4080     $this->addToLog(__METHOD__."(): db->getOne(\"".$sql."\");", VERBOSE_MODE);
4081     if ($this->f->isDatabaseError($typeEvenement, true) === true) {
4082     $this->correct = false;
4083     $this->addToMessage(__("Erreur de traitement de fichier."));
4084     $this->addToLog(__METHOD__."() erreur BDD: ".var_export($typeEvenement->getMessage(), true), DEBUG_MODE);
4085     return false;
4086     }
4087    
4088     // Si l'événement est de type arrete, on ajoute les métadonnées spécifiques
4089     if ($typeEvenement == 'arrete'){
4090     $metadata = array_merge($metadata, $this->getMetadata("arrete"));
4091     }
4092    
4093     // Filtre pour conserver uniquement les métadonnées liées aux dates
4094     $metadataToKeep = array(
4095     "statutAutorisation",
4096     "dateEvenementDocument",
4097     'date_cloture_metier',
4098     "NotificationArrete",
4099     "dateNotificationArrete",
4100     "controleLegalite",
4101     "dateSignature",
4102     "nomSignataire",
4103     "qualiteSignataire",
4104     "dateControleLegalite",
4105     );
4106     $metadata = array_filter(
4107     $metadata,
4108     function($key) use ($metadataToKeep) { return in_array($key, $metadataToKeep); },
4109     ARRAY_FILTER_USE_KEY
4110     );
4111    
4112     // Mise à jour des métadonnées du document en GED
4113     $docUid = $this->getVal("om_fichier_instruction");
4114     $operationOrUID = $this->f->storage->update_metadata($docUid, $metadata);
4115     if ($operationOrUID == 'OP_FAILURE') {
4116     $this->correct = false;
4117     $this->addToMessage(__("Erreur de traitement de fichier."));
4118     $this->addToLog(__METHOD__."() failed to update metadata: ".var_export($operationOrUID, true), DEBUG_MODE);
4119     return false;
4120     }
4121    
4122     // mise à jour de l'UID du document en BDD
4123     else {
4124     $valF = array('om_fichier_instruction' => $operationOrUID);
4125     $res = $this->f->db->autoExecute(DB_PREFIXE.$this->table, $valF, DB_AUTOQUERY_UPDATE, $this->getCle($id));
4126     $this->addToLog(__METHOD__.'() : db->autoExecute("'.DB_PREFIXE.$this->table.'", '.print_r($valF, true).', DB_AUTOQUERY_UPDATE, "'.$this->getCle($id).'")', VERBOSE_MODE);
4127     if ($this->f->isDatabaseError($res, true) === true) {
4128     $this->correct = false;
4129     $this->addToMessage(__("Erreur de traitement de fichier."));
4130     $this->addToLog(__METHOD__."() erreur BDD: ".var_export($res->getMessage(), true), DEBUG_MODE);
4131     return false;
4132     }
4133     $this->addToMessage(__("La mise a jour du document s'est effectuee avec succes."));
4134     }
4135     }
4136    
4137 softime 10808 // Notification auto des demandeurs
4138     if ($dateRetourSignatureModified === true
4139     && $this->valF['date_retour_signature'] !== ''
4140     && $this->valF['date_retour_signature'] !== null) {
4141     //
4142     $ev = $this->get_inst_evenement($this->valF['evenement']);
4143     if ($ev->getVal('notification') === 'notification_auto_signature_requise') {
4144     // Récupération de la liste des demandeurs à notifier et de la catégorie
4145     $categorie = $this->f->get_param_option_notification($collectivite_di);
4146 softime 10869 $isPortal = $categorie == null || $categorie == '' || $categorie == 'portal' ? true : false;
4147     $demandeursANotifie = $this->get_demandeurs_notifiable(
4148     $this->valF['dossier'],
4149     $isPortal
4150     );
4151 softime 10808
4152     // Création d'une notification et d'une tâche pour chaque demandeur à notifier
4153 softime 12124 $demandeurPrincipalNotifie = false;
4154 softime 10808 foreach ($demandeursANotifie as $demandeur) {
4155 softime 12124 // Identifie si le demandeur principal a été notifié ou pas
4156     // et récupère ses informations
4157     if ($demandeur['petitionnaire_principal'] == 't') {
4158     $demandeurPrincipalNotifie = true;
4159     // Si le demandeur principal est notifiable mais qu'il y a des erreurs dans
4160     // son paramétrage, on effectue pas le traitement et on passe à l'itération
4161     // suivante. On le considère également comme non notifié pour gérer l'envoie
4162     // des messages d'erreurs
4163     // Si la demande a été déposée via le portail alors le paramétrage n'a pas
4164     // d'impact sur la notification
4165     $erreursParam = $this->get_info_notification_fail();
4166     if (! $this->dossier_depose_sur_portail() && $erreursParam != array()) {
4167     $demandeurPrincipalNotifie = false;
4168     continue;
4169     }
4170     }
4171 softime 10808 // Ajout de la notif et récupération de son id
4172     $idNotif = $this->ajouter_notification(
4173     $this->valF[$this->clePrimaire],
4174     $this->f->get_connected_user_login_name(),
4175 softime 10968 $demandeur,
4176     $collectivite_di,
4177 softime 12433 array(),
4178 softime 10968 true
4179 softime 10808 );
4180     if ($idNotif === false) {
4181     return false;
4182     }
4183     // Création de la tache en lui donnant l'id de la notification
4184     $notification_by_task = $this->notification_by_task(
4185     $idNotif,
4186     $this->valF['dossier'],
4187     $categorie
4188     );
4189     if ($notification_by_task === false) {
4190     $this->addToMessage(
4191     __("Erreur lors de la génération de la notification au(x) pétitionnaire(s).")
4192     );
4193     return false;
4194     }
4195     }
4196 softime 12124 // Si le demandeur principal n'est pas notifiable, on créé une nouvelle notification
4197     // en erreur avec en commentaire la raison pour laquelle le demandeur principal
4198     // n'a pas pu être notifié
4199     if (! $demandeurPrincipalNotifie) {
4200     // Analyse pour savoir pourquoi le demandeur principal n'est pas notifiable
4201     $erreursParam = $this->get_info_notification_fail();
4202     $demandeurPrincipal = $this->get_info_petitionnaire_principal_dossier($this->getVal('dossier'));
4203     // Ajout de la notif et récupération de son id
4204     $idNotif = $this->ajouter_notification(
4205     $this->valF[$this->clePrimaire],
4206     $this->f->get_connected_user_login_name(),
4207     $demandeurPrincipal,
4208     $collectivite_di,
4209 softime 12433 array(),
4210 softime 12124 true,
4211     'Echec',
4212     implode(' ', $erreursParam)
4213     );
4214     if ($idNotif === false) {
4215     $this->addToMessage(
4216     __('Erreur : la création de la notification a échouée.').
4217     __("Veuillez contacter votre administrateur.")
4218     );
4219     return false;
4220     }
4221     // Prépare un message d'alerte à destination de l'instructeur pour l'informer
4222     // de l'échec de la notification
4223     $dossier_message = $this->get_inst_dossier_message(0);
4224     $dossier_message_val = array(
4225     'dossier' => $this->getVal('dossier'),
4226     'type' => _('erreur expedition'),
4227     'emetteur' => $this->f->get_connected_user_login_name(),
4228     'login' => $_SESSION['login'],
4229     'date_emission' => date('Y-m-d H:i:s'),
4230     'contenu' => _('Échec lors de la notification de l\'instruction ').
4231     $ev->getVal('libelle').
4232     '.<br>'.
4233     implode("\n", $erreursParam).
4234     '<br>'.
4235     _('Veuillez corriger ces informations avant de renvoyer la notification.')
4236     );
4237     $add = $dossier_message->add_notification_message($dossier_message_val, true);
4238     // Si une erreur se produit pendant l'ajout
4239     if ($add !== true) {
4240     $this->addToLog(__METHOD__."(): Le message d'alerte concernant l'echec de l'envoi de la notification n'a pas pu être envoyé.", DEBUG_MODE);
4241     return false;
4242     }
4243     }
4244 softime 10808 $this->addToMessage($message .= sprintf('%s<br/>%s', __("La notification a été générée."), __("Le suivi de la notification est disponible depuis l'instruction.")));
4245     }
4246     }
4247    
4248 nmeucci 3933 return $this->add_log_to_dossier($id, $val);
4249 fmichon 4708 }
4250 mbroquet 3730
4251 softime 8989 /**
4252     * TRIGGER - triggersupprimer.
4253     *
4254     * @return boolean
4255     */
4256     function triggersupprimer($id, &$dnu1 = null, $val = array(), $dnu2 = null) {
4257     $this->addToLog(__METHOD__."(): start", EXTRA_VERBOSE_MODE);
4258 mbroquet 3730 /**
4259     * L'objectif ici est de repositionner les valeurs récupérées en
4260     * archive dans le dossier d'instruction avant de supprimer l'événement
4261 softime 10573 * d'instruction si les valeurs du dossier sont différentes
4262 mbroquet 3730 */
4263 softime 10573 $valF = array();
4264     $inst_di = $this->get_inst_dossier($this->getVal('dossier'));
4265     foreach ($inst_di->champs as $key => $champ) {
4266     // Si le champ du DI à une archive dans l'instruction
4267     if (isset($val[sprintf('archive_%s', $champ)]) === true) {
4268     // Si la valeur entre le champ du DI et son archive dans instruction
4269     // est différente
4270     if ($inst_di->getVal($champ) !== $val[sprintf('archive_%s', $champ)]) {
4271     $val[sprintf('archive_%s', $champ)] === '' ? $valF[$champ] = null : $valF[$champ] = $val[sprintf('archive_%s', $champ)];
4272     }
4273     }
4274 softime 5024 }
4275 softime 10573 // Spécificité du champ avis_decision dont le champ archive est nommé
4276     // différemment
4277     if ($inst_di->getVal('avis_decision') !== $val['archive_avis']) {
4278     $val['archive_avis'] === '' ? $valF['avis_decision'] = null : $valF['avis_decision'] = $val['archive_avis'];
4279 softime 5024 }
4280 softime 10573 // Spécificité de la date d'affichage dont la valeur n'ai jamais modifiée
4281     // par l'archive
4282     unset($valF['date_affichage']);
4283 softime 6565
4284 softime 9245 /**
4285     * Mise à jour de la version de clôture *version_clos* du dossier si et
4286     * seulement si l'instruction met à jour l'état du dossier.
4287     */
4288 softime 10573 if (isset($valF['etat']) === true
4289     && $valF['etat'] !== null
4290 softime 9245 && $valF['etat'] !== '') {
4291 softime 10573 // Récupère l'état actuel du dossier d'instruction
4292     $inst_current_etat = $this->f->get_inst__om_dbform(array(
4293     "obj" => "etat",
4294     "idx" => $inst_di->get_id_etat(),
4295     ));
4296 softime 9245 // Instanciation de l'état archivé appliqué sur le dossier
4297     $inst_etat = $this->f->get_inst__om_dbform(array(
4298     "obj" => "etat",
4299     "idx" => $valF['etat'],
4300     ));
4301     //
4302     $update_version_clos = null;
4303     // En cas de clôture du dossier par l'état archivé
4304     if ($inst_etat->getVal('statut') === 'cloture') {
4305     $update_version_clos = $inst_di->update_version_clos('up');
4306     }
4307     // En cas de réouverture du dossier par l'état archivé
4308     if ($inst_current_etat->getVal('statut') === 'cloture'
4309     && $inst_etat->getVal('statut') !== 'cloture') {
4310     //
4311     $update_version_clos = $inst_di->update_version_clos('down');
4312     //
4313     $this->set_att_di_reopened(true);
4314     }
4315     //
4316     if ($update_version_clos === false) {
4317     $this->f->addToLog(sprintf(
4318     "%s() : ERREUR - %s %s",
4319     __METHOD__,
4320     sprintf(
4321     __("Impossible de mettre à jour la version de clôture du dossier d'instruction %s."),
4322     $inst_di->getVal($inst_di->clePrimaire)
4323     ),
4324     sprintf(
4325     __("L'instruction tente d'appliquer l'état %s."),
4326     $inst_etat->getVal($inst_etat->clePrimaire)
4327     )
4328     ));
4329     $this->addToMessage(sprintf(
4330     "%s %s",
4331     __("Erreur lors de la mise à jour de la version de clôture du dossier d'instruction."),
4332     __("Veuillez contacter votre administrateur.")
4333     ));
4334     return false;
4335     }
4336     }
4337 softime 10808 // On supprime toutes les notications liées à l'instruction
4338     $notifASupprimer = $this->get_instruction_notification($this->getVal($this->clePrimaire));
4339     foreach ($notifASupprimer as $idNotif) {
4340     $inst_notif = $this->f->get_inst__om_dbform(array(
4341     "obj" => "instruction_notification",
4342     "idx" => $idNotif,
4343     ));
4344     $val_notif = array();
4345     foreach ($inst_notif->champs as $champ) {
4346     $val_notif[$champ] = $inst_notif->getVal($champ);
4347     }
4348     // La suppression des notifications entrainera la suppression des tâches qui y sont
4349     // liées
4350     $supprNotif = $inst_notif->supprimer($val_notif);
4351     if ($supprNotif == false) {
4352     $this->addToMessage(sprintf(
4353     "%s %s",
4354     __("Erreur lors de la suppression des notifications de l'instruction."),
4355     __("Veuillez contacter votre administrateur.")
4356     ));
4357     return false;
4358     }
4359     }
4360 softime 9245
4361 softime 10573 // On met à jour le dossier
4362     $valF['instruction'] = $id;
4363 softime 10968 $valF['crud'] = 'delete';
4364 softime 10573 $update_by_instruction = $inst_di->update_by_instruction($valF);
4365     if ($update_by_instruction === false) {
4366     $this->cleanMessage();
4367     $this->addToMessage(sprintf('%s %s', __("Une erreur s'est produite lors de la mise à jour du dossier d'instruction."), __("Veuillez contacter votre administrateur.")));
4368     return false;
4369     }
4370    
4371 softime 5024 // Affichage d'informations à l'utilisateur
4372 softime 8989 $this->addToMessage(_("Suppression de l'instruction")." [".$this->f->db->affectedRows()." "._('enregistrement')." "._('mis_a_jour')."]");
4373 softime 5024
4374     // Mise à jour de la demande si un récépissé d'instruction correspond à l'instruction à supprimer
4375 mbroquet 3730 }
4376    
4377 softime 8989 /**
4378     * TRIGGER - triggersupprimerapres.
4379     *
4380     * @return boolean
4381     */
4382     function triggersupprimerapres($id, &$dnu1 = null, $val = array(), $dnu2 = null) {
4383     $this->addToLog(__METHOD__."(): start", EXTRA_VERBOSE_MODE);
4384 softime 8640 /**
4385     * Mise à jour de la date de dernière modification du dossier
4386     * d'instruction
4387     */
4388     $inst_di = $this->get_inst_dossier($this->getVal('dossier'));
4389     $inst_di->update_last_modification_date();
4390    
4391     /**
4392     * Mise à jour des données du dossier d'autorisation
4393     */
4394 softime 7996 $da = $this->f->get_inst__om_dbform(array(
4395     "obj" => "dossier_autorisation",
4396     "idx" => $this->getNumDemandeAutorFromDossier($val["dossier"]),
4397     ));
4398 softime 8640 $params = array(
4399     'di_id' => $this->getVal('dossier'),
4400 softime 9245 'di_reopened' => $this->get_att_di_reopened(),
4401 softime 8640 );
4402     if($da->majDossierAutorisation($params) === false) {
4403 mbroquet 3730 $this->addToMessage(_("Erreur lors de la mise a jour des donnees du dossier d'autorisation. Contactez votre administrateur."));
4404     $this->correct = false;
4405     return false;
4406     }
4407 softime 7996
4408 softime 10573 /**
4409     * Gestion des tâches pour la dématérialisation
4410     */
4411     $inst_task_empty = $this->f->get_inst__om_dbform(array(
4412     "obj" => "task",
4413     "idx" => 0,
4414     ));
4415     foreach ($inst_di->task_types as $task_type) {
4416     $task_exists = $inst_task_empty->task_exists($task_type, $id);
4417     if ($task_exists !== false) {
4418     $inst_task = $this->f->get_inst__om_dbform(array(
4419     "obj" => "task",
4420     "idx" => $task_exists,
4421     ));
4422     if ($inst_task->getVal('state') === $inst_task::STATUS_NEW || $inst_task->getVal('state') === $inst_task::STATUS_DRAFT) {
4423     $task_val = array(
4424     'state' => $inst_task::STATUS_CANCELED,
4425     );
4426     $update_task = $inst_task->update_task(array('val' => $task_val));
4427     if ($update_task === false) {
4428     $this->addToMessage(sprintf('%s %s',
4429     sprintf(__("Une erreur s'est produite lors de la modification de la tâche %."), $inst_task->getVal($inst_task->clePrimaire)),
4430     __("Veuillez contacter votre administrateur.")
4431     ));
4432     $this->correct = false;
4433     return false;
4434     }
4435     }
4436     }
4437     }
4438    
4439 softime 7996 //
4440 softime 8640 $val['evenement'] = $this->getVal('evenement');
4441 nmeucci 3933 return $this->add_log_to_dossier($id, $val);
4442 mbroquet 3730 }
4443    
4444     /**
4445 softime 9245 * Permet de mettre la valeur passée en paramètre dans l'attribut de classe
4446     * "di_reopened".
4447     *
4448     * @param boolean $val
4449     */
4450     function set_att_di_reopened($val) {
4451     $this->di_reopened = $val;
4452     }
4453    
4454     /**
4455     * Permet de récupérer la valeur de l'attribut de classe "di_reopened".
4456     *
4457     * @return boolean
4458     */
4459     function get_att_di_reopened() {
4460     return $this->di_reopened;
4461     }
4462    
4463     /**
4464 mbroquet 3730 * Permet de composer un message d'erreur sur restriction non valide en
4465     * fonction du contexte.
4466     *
4467     * @param string $restriction formule de la restriction
4468     *
4469     * @return string message d'erreur
4470     */
4471     function get_restriction_error_message($restriction) {
4472     // Affichage du message si la restriction s'applique
4473     // Contexte du suivi des dates (message simple)
4474     $message_restrict = _("Probleme de dates :");
4475     // Split restriction
4476     $champs_restrict = preg_split(
4477     '/(\W+)/',
4478     $restriction,
4479     null,
4480     PREG_SPLIT_NO_EMPTY|PREG_SPLIT_DELIM_CAPTURE
4481     );
4482     $formated_restrict = "";
4483     // Ajout des chaînes à traduire
4484     foreach ($champs_restrict as $value) {
4485     $formated_restrict .= _($value)." ";
4486     }
4487     $formated_restrict = substr($formated_restrict, 0, -1);
4488     // Message d'erreur dans le contexte du suivi des dates
4489     if($this->getParameter("maj") == 170) {
4490     $message_restrict .= " "._("contactez l'instructeur du dossier");
4491     $message_restrict .= "<br/>(".$formated_restrict.")";
4492     } else {
4493     // Affichage du message si la restriction s'applique
4494     // Contexte instruction
4495     $message_restrict .= "<br/>".$formated_restrict;
4496     }
4497    
4498     return $message_restrict;
4499     }
4500    
4501     /**
4502 softime 12124 * Surcharge de la méthode verifier() de la classe om_dbform pour y ajouter
4503     * les vérifications suivantes :
4504     * - Si l'instruction à un événement associé et que cet événement à des restrictions :
4505     * 1. vérifie si la restriction est valide, si ce n'est pas le cas récupère et affiche
4506     * le message d'erreur associé à la restriction
4507     * 2. vérifie si les restrictions sont respectées. Si ce n'est pas le cas bloque l'ajout
4508     * et / ou la modification et affiche un message d'erreur
4509     * -
4510     * -
4511     * -
4512     * -
4513     * -
4514     * -
4515     *
4516     * @param array val : tableau contenant les valeurs issues du formulaire.
4517     * @param - dnu1 : Paramètre déprécié et non utilisé.
4518     * @param - dnu2 : Paramètre déprécié et non utilisé.
4519     *
4520 softime 8989 * @return void
4521 mbroquet 3730 */
4522 softime 8989 function verifier($val = array(), &$dnu1 = null, $dnu2 = null) {
4523     parent::verifier($val);
4524     //
4525 mbroquet 3730 if ( isset($val['evenement']) && is_numeric($val['evenement'])){
4526     $restriction = $this->get_restriction($val['evenement']);
4527    
4528     //Test qu'une restriction est présente
4529     if ($restriction != "" ){
4530    
4531     //Test si la restriction est valide
4532     $this->restriction_valid = $this->restrictionIsValid($restriction);
4533     if ( !$this->restriction_valid ){
4534    
4535     // Affichage du message si la restriction s'applique
4536     $this->addToMessage(
4537     $this->get_restriction_error_message($restriction)
4538     );
4539     $this->correct=false;
4540     return false;
4541     }
4542    
4543     // Liste des opérateurs possible
4544 nmeucci 3873 $operateurs = array(">=", "<=", "+", "-", "&&", "||", "==", "!=");
4545 mbroquet 3730 // Supprime tous les espaces de la chaîne de caractère
4546     $restriction = str_replace(' ', '', $restriction);
4547    
4548     // Met des espace avant et après les opérateurs puis transforme la
4549     // chaine en un tableau
4550     $tabRestriction = str_replace($operateurs, " ", $restriction);
4551     // Tableau des champ
4552     $tabRestriction = explode(" ", $tabRestriction);
4553     // Supprime les numériques du tableau
4554     foreach ($tabRestriction as $key => $value) {
4555     if (is_numeric($value)) {
4556     unset($tabRestriction[$key]);
4557     }
4558     }
4559    
4560     // Vérifie les champs utilisés pour la restriction
4561     $check_field_exist = $this->f->check_field_exist($tabRestriction, 'instruction');
4562     if ($check_field_exist !== true) {
4563    
4564     // Liste des champs en erreur
4565     $string_error_fields = implode(", ", $check_field_exist);
4566    
4567     // Message d'erreur
4568     $error_message = _("Le champ %s n'est pas utilisable pour le champ %s");
4569     if (count($check_field_exist) > 1) {
4570     $error_message = _("Les champs %s ne sont pas utilisable pour le champ %s");
4571     }
4572    
4573     // Affiche l'erreur
4574     $this->correct=false;
4575     $this->addToMessage(sprintf($error_message, $string_error_fields, _("restriction")));
4576     $this->addToMessage(_("Veuillez contacter votre administrateur."));
4577     }
4578     }
4579    
4580     }
4581     if(!$this->updateDate("date_envoi_signature")) {
4582     return false;
4583     }
4584     if(!$this->updateDate("date_retour_signature")) {
4585     return false;
4586     }
4587     if(!$this->updateDate("date_envoi_rar")) {
4588     return false;
4589     }
4590     if(!$this->updateDate("date_retour_rar")) {
4591     return false;
4592     }
4593     if(!$this->updateDate("date_envoi_controle_legalite")) {
4594     return false;
4595     }
4596     if(!$this->updateDate("date_retour_controle_legalite")) {
4597     return false;
4598     }
4599    
4600     }
4601 softime 12124
4602     /**
4603     * Récupère et stocket dans un tableau toutes les infos du pétitionnaire
4604     * principal du dossier auquel appartiens l'instruction.
4605     * Renvoie un tableau contenant les informations du pétitionnaire principal.
4606     *
4607     * Si l'identifiant de l'instruction n'a pas pu etre récupéré renvoie false
4608     * et affiche un message dans les logs.
4609     * En cas d'erreur de base de donnée renvoie false et affiche un message d'erreur.
4610     *
4611     * @param string identifiant du dossier
4612     * @return array|boolean
4613     */
4614     protected function get_info_petitionnaire_principal_dossier($dossier = null) {
4615     // Si l'identifiant de l'instruction n'a pas été fournit on récupère celui de
4616     // l'objet courant
4617     if (empty($dossier)) {
4618     $dossier = $this->getVal('dossier');
4619     // Si la récupération de l'identifiant de l'instruction a échoué la méthode renvoie
4620     // false et on affiche un message d'erreur dans les logs
4621     if (empty($dossier)) {
4622     $this->addToLog(__METHOD__.' : L\'identifiant du dossier n\'a pas pu être récupéré');
4623     return false;
4624     }
4625     }
4626    
4627     // Requête sql servant à récupérer toutes les informations relatives au demandeurs
4628     // principal
4629     $sql = sprintf(
4630     'SELECT
4631     -- Récupère toutes les informations du demandeur principal
4632     demandeur.*,
4633     CASE
4634     WHEN demandeur.qualite=\'particulier\'
4635     THEN TRIM(CONCAT(demandeur.particulier_nom, \' \', demandeur.particulier_prenom, \' \', demandeur.courriel))
4636     ELSE
4637     TRIM(CONCAT(demandeur.personne_morale_raison_sociale, \' \', demandeur.personne_morale_denomination, \' \', demandeur.courriel))
4638     END AS destinataire
4639     FROM
4640     %1$sdossier
4641     LEFT JOIN %1$slien_dossier_demandeur
4642     ON lien_dossier_demandeur.dossier = dossier.dossier
4643     LEFT JOIN %1$sdemandeur
4644     ON demandeur.demandeur = lien_dossier_demandeur.demandeur
4645     WHERE
4646     dossier.dossier = \'%2$s\'
4647     AND lien_dossier_demandeur.petitionnaire_principal IS TRUE',
4648     DB_PREFIXE,
4649     $dossier
4650     );
4651    
4652     $res = $this->f->get_one_row_result_from_db_query($sql);
4653     if ($res['code'] === 'KO') {
4654     return false;
4655     }
4656     return $res['result'];
4657     }
4658    
4659    
4660 mbroquet 3730
4661     /**
4662     * Finalisation des documents.
4663     * @param string $champ champ du fichier à finaliser
4664     * @param booleen $status permet de définir si on finalise ou définalise
4665     * @param string $sousform permet de savoir si se trouve dans un sousformulaire (passé au javascript)
4666     */
4667     function manage_finalizing($mode = null, $val = array()) {
4668 softime 5024 //
4669     $this->begin_treatment(__METHOD__);
4670 mbroquet 3730
4671 softime 5024 //
4672     $id_inst = $this->getVal($this->clePrimaire);
4673 mbroquet 3730
4674 softime 5024 //
4675     $admin_msg_error = _("Veuillez contacter votre administrateur.");
4676     $file_msg_error = _("Erreur de traitement de fichier.")
4677     ." ".$admin_msg_error;
4678     $bdd_msg_error = _("Erreur de base de données.")
4679     ." ".$admin_msg_error;
4680 softime 5169 $log_msg_error = "Finalisation non enregistrée - id instruction = %s - uid fichier = %s";
4681 mbroquet 3730
4682     // Si on finalise le document
4683     if ($mode == "finalize"){
4684 softime 5024 //
4685     $etat = _('finalisation');
4686 mbroquet 3730
4687     // Récupère la collectivite du dossier d'instruction
4688     $dossier_instruction_om_collectivite = $this->get_dossier_instruction_om_collectivite();
4689    
4690     //
4691     $collectivite = $this->f->getCollectivite($dossier_instruction_om_collectivite);
4692 softime 8593
4693     //
4694     $params = array(
4695     "specific" => array(),
4696     );
4697     // Si la rédaction libre est activée sur l'instruction
4698     if ($this->getVal("flag_edition_integrale") == 't') {
4699     $params["specific"]["corps"] = array(
4700     "mode" => "set",
4701     "value" => $this->getVal("corps_om_htmletatex"),
4702     );
4703     $params["specific"]["titre"] = array(
4704     "mode" => "set",
4705     "value" => $this->getVal("titre_om_htmletat"),
4706     );
4707     }
4708 mbroquet 3730 // Génération du PDF
4709 softime 8593 $result = $this->compute_pdf_output('lettretype', $this->getVal('lettretype'), $collectivite, null, $params);
4710 mbroquet 3730 $pdf_output = $result['pdf_output'];
4711 softime 10573
4712 mbroquet 3730 //Métadonnées du document
4713     $metadata = array(
4714 softime 5024 'filename' => 'instruction_'.$id_inst.'.pdf',
4715 mbroquet 3730 'mimetype' => 'application/pdf',
4716     'size' => strlen($pdf_output)
4717     );
4718    
4719     // Récupération des métadonnées calculées après validation
4720     $spe_metadata = $this->getMetadata("om_fichier_instruction");
4721    
4722     //On vérifie si l'instruction à finaliser a un événement de type arrete
4723     $sql = "SELECT type
4724     FROM ".DB_PREFIXE."evenement
4725     WHERE evenement = ".$this->getVal("evenement");
4726 softime 8989 $typeEvenement = $this->f->db->getOne($sql);
4727 mbroquet 3730 $this->addToLog(__METHOD__."(): db->getOne(\"".$sql."\");", VERBOSE_MODE);
4728 softime 5024 if ($this->f->isDatabaseError($typeEvenement, true) === true) {
4729     $this->correct = false;
4730     $this->addToMessage($bdd_msg_error);
4731     return $this->end_treatment(__METHOD__, false);
4732 mbroquet 3730 }
4733    
4734     //Initialisation de la variable
4735     $arrete_metadata = array();
4736     // Si l'événement est de type arrete, on ajoute les métadonnées spécifiques
4737     if ( $typeEvenement === 'arrete' ){
4738     $arrete_metadata = $this->getMetadata("arrete");
4739     }
4740    
4741     $metadata = array_merge($metadata, $spe_metadata, $arrete_metadata);
4742    
4743 softime 10573 /*
4744     // transforme le tableau de métadonnées en objet
4745     $mdf = new MetadataFactory();
4746     $md = $mdf->build('Instruction', $metadata);
4747     */
4748    
4749 softime 5024 // Si le document a déjà été finalisé on le met à jour
4750     // en conservant son UID
4751 mbroquet 3730 if ($this->getVal("om_fichier_instruction") != ''){
4752     $uid = $this->f->storage->update(
4753     $this->getVal("om_fichier_instruction"), $pdf_output, $metadata);
4754     }
4755 softime 5024 // Sinon on crée un nouveau document et dont on récupère l'UID
4756 mbroquet 3730 else {
4757 softime 10573 $uid = $this->f->storage->create($pdf_output, $metadata, "from_content", $this->table.".om_fichier_instruction");
4758 mbroquet 3730 }
4759     }
4760    
4761 softime 5024 // Si on définalise le document
4762 mbroquet 3730 if ($mode == "unfinalize") {
4763 softime 5024 //
4764     $etat = _('définalisation');
4765 mbroquet 3730 // Récupération de l'uid du document finalisé
4766     $uid = $this->getVal("om_fichier_instruction");
4767     }
4768 softime 5024
4769     // Si on définalise l'UID doit être défini
4770     // Si on finalise la création/modification du fichier doit avoir réussi
4771 mbroquet 3730 if ($uid == '' || $uid == 'OP_FAILURE' ) {
4772 softime 5024 $this->correct = false;
4773     $this->addToMessage($file_msg_error);
4774 softime 8989 $this->addToLog(sprintf($log_msg_error, $id_inst, $uid), DEBUG_MODE);
4775 softime 5024 return $this->end_treatment(__METHOD__, false);
4776 mbroquet 3730 }
4777    
4778     //
4779     foreach ($this->champs as $key => $champ) {
4780     //
4781     $val[$champ] = $this->val[$key];
4782     }
4783    
4784     //
4785 softime 6565 $val['date_evenement'] = $this->dateDBToForm($val['date_evenement']);
4786     $val['archive_date_complet'] = $this->dateDBToForm($val['archive_date_complet']);
4787     $val['archive_date_rejet'] = $this->dateDBToForm($val['archive_date_rejet']);
4788     $val['archive_date_limite'] = $this->dateDBToForm($val['archive_date_limite']);
4789     $val['archive_date_notification_delai'] = $this->dateDBToForm($val['archive_date_notification_delai']);
4790     $val['archive_date_decision'] = $this->dateDBToForm($val['archive_date_decision']);
4791     $val['archive_date_validite'] = $this->dateDBToForm($val['archive_date_validite']);
4792     $val['archive_date_achevement'] = $this->dateDBToForm($val['archive_date_achevement']);
4793     $val['archive_date_chantier'] = $this->dateDBToForm($val['archive_date_chantier']);
4794     $val['archive_date_conformite'] = $this->dateDBToForm($val['archive_date_conformite']);
4795     $val['archive_date_dernier_depot'] = $this->dateDBToForm($val['archive_date_dernier_depot']);
4796     $val['archive_date_limite_incompletude'] = $this->dateDBToForm($val['archive_date_limite_incompletude']);
4797     $val['date_finalisation_courrier'] = $this->dateDBToForm($val['date_finalisation_courrier']);
4798     $val['date_envoi_signature'] = $this->dateDBToForm($val['date_envoi_signature']);
4799     $val['date_retour_signature'] = $this->dateDBToForm($val['date_retour_signature']);
4800     $val['date_envoi_rar'] = $this->dateDBToForm($val['date_envoi_rar']);
4801     $val['date_retour_rar'] = $this->dateDBToForm($val['date_retour_rar']);
4802     $val['date_envoi_controle_legalite'] = $this->dateDBToForm($val['date_envoi_controle_legalite']);
4803     $val['date_retour_controle_legalite'] = $this->dateDBToForm($val['date_retour_controle_legalite']);
4804     $val['archive_date_cloture_instruction'] = $this->dateDBToForm($val['archive_date_cloture_instruction']);
4805     $val['archive_date_premiere_visite'] = $this->dateDBToForm($val['archive_date_premiere_visite']);
4806     $val['archive_date_derniere_visite'] = $this->dateDBToForm($val['archive_date_derniere_visite']);
4807     $val['archive_date_contradictoire'] = $this->dateDBToForm($val['archive_date_contradictoire']);
4808     $val['archive_date_retour_contradictoire'] = $this->dateDBToForm($val['archive_date_retour_contradictoire']);
4809     $val['archive_date_ait'] = $this->dateDBToForm($val['archive_date_ait']);
4810     $val['archive_date_transmission_parquet'] = $this->dateDBToForm($val['archive_date_transmission_parquet']);
4811 softime 8989 $val['archive_date_affichage'] = $this->dateDBToForm($val['archive_date_affichage']);
4812 mbroquet 3730 $this->setvalF($val);
4813    
4814     // Verification de la validite des donnees
4815 softime 8989 $this->verifier($this->val);
4816 mbroquet 3730 // Si les verifications precedentes sont correctes, on procede a
4817     // la modification, sinon on ne fait rien et on retourne une erreur
4818 softime 5024 if ($this->correct === true) {
4819 mbroquet 3730 //
4820     $valF = array(
4821     "om_fichier_instruction" => $uid,
4822     "date_finalisation_courrier" => date('Y-m-d')
4823     );
4824     //
4825     if($mode=="finalize") {
4826     // état finalisé vrai
4827 softime 5024 $valF["om_final_instruction"] = true;
4828 mbroquet 3730 // ajout log utilisateur
4829     $login = $_SESSION['login'];
4830     $nom = "";
4831     $this->f->getUserInfos();
4832     if (isset($this->f->om_utilisateur["nom"])
4833     && !empty($this->f->om_utilisateur["nom"])) {
4834     $nom = $this->f->om_utilisateur["nom"];
4835     }
4836     $valF["om_final_instruction_utilisateur"] = $_SESSION['login'];
4837     if ($nom != "") {
4838     $valF["om_final_instruction_utilisateur"] .= " (".$nom.")";
4839     }
4840     } else {
4841     // état finalisé faux
4842 softime 5024 $valF["om_final_instruction"] = false;
4843 mbroquet 3730 // suppression log utilisateur
4844     $valF["om_final_instruction_utilisateur"] = '';
4845     }
4846    
4847     // Execution de la requête de modification des donnees de l'attribut
4848     // valF de l'objet dans l'attribut table de l'objet
4849 softime 8989 $res = $this->f->db->autoExecute(DB_PREFIXE.$this->table, $valF,
4850 softime 5024 DB_AUTOQUERY_UPDATE, $this->getCle($id_inst));
4851     $this->addToLog(__METHOD__."() : db->autoExecute(\"".DB_PREFIXE.$this->table."\", ".print_r($valF, true).", DB_AUTOQUERY_UPDATE, \"".$this->getCle($id_inst)."\")", VERBOSE_MODE);
4852     //
4853     if ($this->f->isDatabaseError($res, true) === true) {
4854     $this->correct = false;
4855     $this->addToMessage($bdd_msg_error);
4856     return $this->end_treatment(__METHOD__, false);
4857     }
4858 mbroquet 3730
4859 softime 5024 //
4860     $this->addToMessage(sprintf(_("La %s du document s'est effectuee avec succes."), $etat));
4861     //
4862     if ($this->add_log_to_dossier($id_inst, $val) === false) {
4863     return $this->end_treatment(__METHOD__, false);
4864     }
4865     //
4866     return $this->end_treatment(__METHOD__, true);
4867 mbroquet 3730 }
4868 softime 5024 // L'appel de verifier() a déjà positionné correct à false
4869     // et défini un message d'erreur.
4870 softime 8989 $this->addToLog(sprintf($log_msg_error, $id_inst, $uid), DEBUG_MODE);
4871 softime 5024 return $this->end_treatment(__METHOD__, false);
4872 mbroquet 3730 }
4873    
4874     /**
4875     * Récupération du numéro de dossier d'instruction à ajouter aux métadonnées
4876     * @return string numéro de dossier d'instruction
4877     */
4878 softime 10573 protected function getDossier($champ = null) {
4879 mbroquet 3730 if(empty($this->specificMetadata)) {
4880     $this->getSpecificMetadata();
4881     }
4882     return $this->specificMetadata->dossier;
4883     }
4884     /**
4885     * Récupération la version du dossier d'instruction à ajouter aux métadonnées
4886     * @return int Version
4887     */
4888     protected function getDossierVersion() {
4889     if(empty($this->specificMetadata)) {
4890     $this->getSpecificMetadata();
4891     }
4892     return $this->specificMetadata->version;
4893     }
4894     /**
4895     * Récupération du numéro de dossier d'autorisation à ajouter aux métadonnées
4896     * @return string numéro de dossier d'autorisation
4897     */
4898     protected function getNumDemandeAutor() {
4899     if(empty($this->specificMetadata)) {
4900     $this->getSpecificMetadata();
4901     }
4902     return $this->specificMetadata->dossier_autorisation;
4903     }
4904     /**
4905     * Récupération de la date de demande initiale du dossier à ajouter aux métadonnées
4906     * @return date de la demande initiale
4907     */
4908     protected function getAnneemoisDemandeAutor() {
4909     if(empty($this->specificMetadata)) {
4910     $this->getSpecificMetadata();
4911     }
4912     return $this->specificMetadata->date_demande_initiale;
4913     }
4914     /**
4915     * Récupération du type de dossier d'instruction à ajouter aux métadonnées
4916     * @return string type du dossier d'instruction
4917     */
4918     protected function getTypeInstruction() {
4919     if(empty($this->specificMetadata)) {
4920     $this->getSpecificMetadata();
4921     }
4922     return $this->specificMetadata->dossier_instruction_type;
4923     }
4924     /**
4925     * Récupération du statut du dossier d'autorisation à ajouter aux métadonnées
4926     * @return string avis
4927     */
4928     protected function getStatutAutorisation() {
4929     if(empty($this->specificMetadata)) {
4930     $this->getSpecificMetadata();
4931     }
4932     return $this->specificMetadata->statut;
4933     }
4934     /**
4935     * Récupération du type de dossier d'autorisation à ajouter aux métadonnées
4936     * @return string type du dossier d'autorisation
4937     */
4938     protected function getTypeAutorisation() {
4939     if(empty($this->specificMetadata)) {
4940     $this->getSpecificMetadata();
4941     }
4942     return $this->specificMetadata->dossier_autorisation_type;
4943     }
4944     /**
4945     * Récupération de la date d'ajout de document à ajouter aux métadonnées
4946     * @return date de l'évènement
4947     */
4948     protected function getDateEvenementDocument() {
4949     return date("Y-m-d");
4950     }
4951     /**
4952     * Récupération du groupe d'instruction à ajouter aux métadonnées
4953     * @return string Groupe d'instruction
4954     */
4955     protected function getGroupeInstruction() {
4956     if(empty($this->specificMetadata)) {
4957     $this->getSpecificMetadata();
4958     }
4959     return $this->specificMetadata->groupe_instruction;
4960     }
4961     /**
4962     * Récupération du libellé du type du document à ajouter aux métadonnées
4963     * @return string Groupe d'instruction
4964     */
4965     protected function getTitle() {
4966    
4967     // Récupère le champ événement
4968     if (isset($this->valF["evenement"]) AND $this->valF["evenement"] != "") {
4969     $evenement = $this->valF["evenement"];
4970     } else {
4971     $evenement = $this->getVal("evenement");
4972     }
4973    
4974     // Requête sql
4975     $sql = "SELECT libelle FROM ".DB_PREFIXE."evenement
4976     WHERE evenement=".$evenement;
4977 softime 8989 $evenement_libelle = $this->f->db->getOne($sql);
4978 mbroquet 3730 $this->addToLog("getTitle(): db->getOne(\"".$sql."\");", VERBOSE_MODE);
4979     if (database::isError($evenement_libelle)) {
4980     die();
4981     }
4982    
4983     // Retourne le libelle de l'événement
4984     return $evenement_libelle;
4985     }
4986    
4987 softime 6272
4988 mbroquet 3730 /**
4989 softime 6272 * Récupération du champ ERP du dossier d'instruction.
4990     *
4991     * @return boolean
4992     */
4993     public function get_concerne_erp() {
4994     //
4995     if(empty($this->specificMetadata)) {
4996     $this->getSpecificMetadata();
4997     }
4998     //
4999     return $this->specificMetadata->erp;
5000     }
5001    
5002    
5003     /**
5004 mbroquet 3730 * Cette méthode permet de stocker en attribut toutes les métadonnées
5005     * nécessaire à l'ajout d'un document.
5006     */
5007     public function getSpecificMetadata() {
5008     if (isset($this->valF["dossier"]) AND $this->valF["dossier"] != "") {
5009     $dossier = $this->valF["dossier"];
5010     } else {
5011     $dossier = $this->getVal("dossier");
5012     }
5013     //Requête pour récupérer les informations essentiels sur le dossier d'instruction
5014     $sql = "SELECT dossier.dossier as dossier,
5015     dossier_autorisation.dossier_autorisation as dossier_autorisation,
5016     to_char(dossier.date_demande, 'YYYY/MM') as date_demande_initiale,
5017     dossier_instruction_type.code as dossier_instruction_type,
5018     etat_dossier_autorisation.libelle as statut,
5019     dossier_autorisation_type.code as dossier_autorisation_type,
5020 softime 6272 groupe.code as groupe_instruction,
5021     CASE WHEN dossier.erp IS TRUE
5022     THEN 'true'
5023     ELSE 'false'
5024     END as erp
5025 mbroquet 3730 FROM ".DB_PREFIXE."dossier
5026     LEFT JOIN ".DB_PREFIXE."dossier_instruction_type
5027     ON dossier.dossier_instruction_type = dossier_instruction_type.dossier_instruction_type
5028     LEFT JOIN ".DB_PREFIXE."dossier_autorisation
5029     ON dossier.dossier_autorisation = dossier_autorisation.dossier_autorisation
5030     LEFT JOIN ".DB_PREFIXE."etat_dossier_autorisation
5031     ON dossier_autorisation.etat_dossier_autorisation = etat_dossier_autorisation.etat_dossier_autorisation
5032     LEFT JOIN ".DB_PREFIXE."dossier_autorisation_type_detaille
5033     ON dossier_autorisation.dossier_autorisation_type_detaille = dossier_autorisation_type_detaille.dossier_autorisation_type_detaille
5034     LEFT JOIN ".DB_PREFIXE."dossier_autorisation_type
5035     ON dossier_autorisation_type_detaille.dossier_autorisation_type = dossier_autorisation_type.dossier_autorisation_type
5036     LEFT JOIN ".DB_PREFIXE."groupe
5037     ON dossier_autorisation_type.groupe = groupe.groupe
5038     WHERE dossier.dossier = '".$dossier."'";
5039 softime 8989 $res = $this->f->db->query($sql);
5040 mbroquet 3730 $this->f->addToLog("getSpecificMetadata() : db->query(".$sql.")", VERBOSE_MODE);
5041     if ( database::isError($res)){
5042     die();
5043     }
5044    
5045     //Le résultat est récupéré dans un objet
5046     $row =& $res->fetchRow(DB_FETCHMODE_OBJECT);
5047    
5048     //Si il y a un résultat
5049     if ($row !== null) {
5050    
5051 fmichon 3892 // Instrance de la classe dossier
5052     $inst_dossier = $this->get_inst_dossier($dossier);
5053    
5054     // Insère l'attribut version à l'objet
5055     $row->version = $inst_dossier->get_dossier_instruction_version();
5056    
5057 mbroquet 3730 //Alors on créé l'objet dossier_instruction
5058     $this->specificMetadata = $row;
5059    
5060     }
5061     }
5062    
5063     /**
5064     * Retourne le statut du dossier d'instruction
5065     * @param string $idx Identifiant du dossier d'instruction
5066     * @return string Le statut du dossier d'instruction
5067     */
5068     function getStatutAutorisationDossier($idx){
5069    
5070     $statut = '';
5071    
5072     //Si l'identifiant du dossier d'instruction fourni est correct
5073     if ( $idx != '' ){
5074    
5075     //On récupère le statut de l'état du dossier à partir de l'identifiant du
5076     //dossier
5077     $sql = "SELECT etat.statut
5078     FROM ".DB_PREFIXE."dossier
5079     LEFT JOIN
5080     ".DB_PREFIXE."etat
5081     ON
5082     dossier.etat = etat.etat
5083     WHERE dossier ='".$idx."'";
5084 softime 8989 $statut = $this->f->db->getOne($sql);
5085 mbroquet 3730 $this->f->addToLog("getStatutAutorisationDossier() : db->getOne(\"".$sql."\")", VERBOSE_MODE);
5086     if ( database::isError($statut)){
5087     die();
5088     }
5089     }
5090     return $statut;
5091     }
5092    
5093     /**
5094     * Récupère les données du dossier
5095     * @return array
5096     */
5097     function get_dossier_actual() {
5098    
5099     // Initialisation de la valeur de retour
5100     $return = array();
5101    
5102     // Récupération de toutes les valeurs du dossier d'instruction en cours
5103     $sql = "SELECT * FROM ".DB_PREFIXE."dossier
5104     WHERE dossier='".$this->valF['dossier']."'";
5105 softime 8989 $res = $this->f->db->query($sql);
5106 mbroquet 3730 $this->addToLog("get_dossier_actual(): db->query(\"".$sql."\");", VERBOSE_MODE);
5107     $this->f->isDatabaseError($res);
5108    
5109     //
5110     while ($row=& $res->fetchRow(DB_FETCHMODE_ASSOC)) {
5111    
5112     // Récupération de la valeur actuelle du délai, de l'accord tacite,
5113     // de l'état et de l'avis du dossier d'instruction
5114 softime 6565 $return['archive_delai'] = $row['delai'];
5115     $return['archive_accord_tacite'] = $row['accord_tacite'];
5116     $return['archive_etat'] = $row['etat'];
5117     $return['archive_avis'] = $row['avis_decision'];
5118     // Récupération de la valeur actuelle des dates du dossier
5119 mbroquet 3730 // d'instruction
5120 softime 6565 $return['archive_date_complet'] = $row['date_complet'];
5121     $return['archive_date_dernier_depot'] = $row['date_dernier_depot'];
5122     $return['archive_date_rejet'] = $row['date_rejet'];
5123     $return['archive_date_limite'] = $row['date_limite'];
5124     $return['archive_date_notification_delai'] = $row['date_notification_delai'];
5125     $return['archive_date_decision'] = $row['date_decision'];
5126     $return['archive_date_validite'] = $row['date_validite'];
5127     $return['archive_date_achevement'] = $row['date_achevement'];
5128     $return['archive_date_chantier'] = $row['date_chantier'];
5129     $return['archive_date_conformite'] = $row['date_conformite'];
5130     $return['archive_incompletude'] = $row['incompletude'];
5131     $return['archive_incomplet_notifie'] = $row['incomplet_notifie'];
5132     $return['archive_evenement_suivant_tacite'] = $row['evenement_suivant_tacite'];
5133     $return['archive_evenement_suivant_tacite_incompletude'] = $row['evenement_suivant_tacite_incompletude'];
5134     $return['archive_etat_pendant_incompletude'] = $row['etat_pendant_incompletude'];
5135     $return['archive_date_limite_incompletude'] = $row['date_limite_incompletude'];
5136     $return['archive_delai_incompletude'] = $row['delai_incompletude'];
5137     $return['archive_autorite_competente'] = $row['autorite_competente'];
5138 softime 8593 $return['archive_dossier_instruction_type'] = $row['dossier_instruction_type'];
5139 softime 6565 $return['duree_validite'] = $row['duree_validite'];
5140     $return['date_depot'] = $row['date_depot'];
5141 softime 10573 $return['date_depot_mairie'] = $row['date_depot_mairie'];
5142 softime 6565 $return['archive_date_cloture_instruction'] = $row['date_cloture_instruction'];
5143     $return['archive_date_premiere_visite'] = $row['date_premiere_visite'];
5144     $return['archive_date_derniere_visite'] = $row['date_derniere_visite'];
5145     $return['archive_date_contradictoire'] = $row['date_contradictoire'];
5146     $return['archive_date_retour_contradictoire'] = $row['date_retour_contradictoire'];
5147     $return['archive_date_ait'] = $row['date_ait'];
5148     $return['archive_date_transmission_parquet'] = $row['date_transmission_parquet'];
5149 softime 8989 $return['archive_date_affichage'] = $row['date_affichage'];
5150 softime 10573 $return['archive_pec_metier'] = $row['pec_metier'];
5151     $return['archive_a_qualifier'] = $row['a_qualifier'];
5152 mbroquet 3730 }
5153    
5154     // Retour de la fonction
5155     return $return;
5156    
5157     }
5158    
5159     /**
5160     * Permet de vérifier qu'un événement est verrouillable
5161     * @param integer $idx Identifiant de l'instruction
5162     * @return boolean
5163     */
5164     function checkEvenementNonVerrouillable($idx) {
5165    
5166     // Initialisation du résultat
5167     $non_verrouillable = false;
5168    
5169     // Si la condition n'est pas vide
5170     if ($idx != "") {
5171    
5172     // Requête SQL
5173     $sql = "SELECT evenement.non_verrouillable
5174     FROM ".DB_PREFIXE."evenement
5175     LEFT JOIN ".DB_PREFIXE."instruction
5176     ON instruction.evenement = evenement.evenement
5177     WHERE instruction.instruction = $idx";
5178     $this->f->addToLog("checkEvenementNonVerrouillable() : db->getOne(\"".$sql."\")", VERBOSE_MODE);
5179 softime 8989 $res = $this->f->db->getOne($sql);
5180 mbroquet 3730 $this->f->isDatabaseError($res);
5181    
5182     // Si le retour de la requête est true
5183     if ($res == 't') {
5184     //
5185     $non_verrouillable = true;
5186     }
5187     }
5188    
5189     // Retourne résultat
5190     return $non_verrouillable;
5191     }
5192    
5193     /**
5194     * Mise à jour des champs archive_*
5195     * @param mixed $row La ligne de données
5196     */
5197     public function updateArchiveData($row){
5198    
5199     // Récupération de la valeur actuelle du délai, de l'accord tacite,
5200     // de l'état et de l'avis du dossier d'instruction
5201     $this->valF['archive_delai']=$row['delai'];
5202     $this->valF['archive_accord_tacite']=$row['accord_tacite'];
5203     $this->valF['archive_etat']=$row['etat'];
5204     $this->valF['archive_avis']=$row['avis_decision'];
5205     // Récupération de la valeur actuelle des 9 dates du dossier
5206     // d'instruction
5207     if ($row['date_complet'] != '') {
5208     $this->valF['archive_date_complet']=$row['date_complet'];
5209     }
5210     if ($row['date_dernier_depot'] != '') {
5211     $this->valF['archive_date_dernier_depot']=$row['date_dernier_depot'];
5212     }
5213 softime 6565 if ($row['date_rejet'] != '') {
5214 mbroquet 3730 $this->valF['archive_date_rejet']= $row['date_rejet'];
5215     }
5216 softime 6565 if ($row['date_limite'] != '') {
5217 mbroquet 3730 $this->valF['archive_date_limite']= $row['date_limite'];
5218     }
5219 softime 6565 if ($row['date_notification_delai'] != '') {
5220 mbroquet 3730 $this->valF['archive_date_notification_delai']= $row['date_notification_delai'];
5221     }
5222 softime 6565 if ($row['date_decision'] != '') {
5223 mbroquet 3730 $this->valF['archive_date_decision']= $row['date_decision'];
5224     }
5225 softime 6565 if ($row['date_validite'] != '') {
5226 mbroquet 3730 $this->valF['archive_date_validite']= $row['date_validite'];
5227     }
5228 softime 6565 if ($row['date_achevement'] != '') {
5229 mbroquet 3730 $this->valF['archive_date_achevement']= $row['date_achevement'];
5230     }
5231 softime 6565 if ($row['date_chantier'] != '') {
5232 mbroquet 3730 $this->valF['archive_date_chantier']= $row['date_chantier'];
5233     }
5234 softime 6565 if ($row['date_conformite'] != '') {
5235 mbroquet 3730 $this->valF['archive_date_conformite']= $row['date_conformite'];
5236     }
5237 softime 6565 if ($row['incompletude'] != '') {
5238 mbroquet 3730 $this->valF['archive_incompletude']= $row['incompletude'];
5239     }
5240 softime 6565 if ($row['incomplet_notifie'] != '') {
5241 mbroquet 3730 $this->valF['archive_incomplet_notifie']= $row['incomplet_notifie'];
5242     }
5243 softime 6565 if ($row['evenement_suivant_tacite'] != '') {
5244 mbroquet 3730 $this->valF['archive_evenement_suivant_tacite']= $row['evenement_suivant_tacite'];
5245     }
5246 softime 6565 if ($row['evenement_suivant_tacite_incompletude'] != '') {
5247 mbroquet 3730 $this->valF['archive_evenement_suivant_tacite_incompletude']= $row['evenement_suivant_tacite_incompletude'];
5248     }
5249 softime 6565 if ($row['etat_pendant_incompletude'] != '') {
5250 mbroquet 3730 $this->valF['archive_etat_pendant_incompletude']= $row['etat_pendant_incompletude'];
5251     }
5252 softime 6565 if ($row['date_limite_incompletude'] != '') {
5253 mbroquet 3730 $this->valF['archive_date_limite_incompletude']= $row['date_limite_incompletude'];
5254     }
5255 softime 6565 if ($row['delai_incompletude'] != '') {
5256 mbroquet 3730 $this->valF['archive_delai_incompletude']= $row['delai_incompletude'];
5257     }
5258 softime 6565 if ($row['autorite_competente'] != '') {
5259 mbroquet 3730 $this->valF['archive_autorite_competente']= $row['autorite_competente'];
5260     }
5261 softime 6565 if ($row['duree_validite'] != '') {
5262 mbroquet 3730 $this->valF['duree_validite']= $row['duree_validite'];
5263     }
5264 softime 6565 if ($row['date_depot'] != '') {
5265 nmeucci 3873 $this->valF['date_depot']= $row['date_depot'];
5266     }
5267 softime 10573 if ($row['date_depot_mairie'] != '') {
5268     $this->valF['date_depot_mairie']= $row['date_depot_mairie'];
5269     }
5270 softime 6565 // Dates concernant les dossiers contentieux
5271     if ($row['date_cloture_instruction'] != '') {
5272     $this->valF['archive_date_cloture_instruction']= $row['date_cloture_instruction'];
5273     }
5274     if ($row['date_premiere_visite'] != '') {
5275     $this->valF['archive_date_premiere_visite']= $row['date_premiere_visite'];
5276     }
5277     if ($row['date_derniere_visite'] != '') {
5278     $this->valF['archive_date_derniere_visite']= $row['date_derniere_visite'];
5279     }
5280     if ($row['date_contradictoire'] != '') {
5281     $this->valF['archive_date_contradictoire']= $row['date_contradictoire'];
5282     }
5283     if ($row['date_retour_contradictoire'] != '') {
5284     $this->valF['archive_date_retour_contradictoire']= $row['date_retour_contradictoire'];
5285     }
5286     if ($row['date_ait'] != '') {
5287     $this->valF['archive_date_ait']= $row['date_ait'];
5288     }
5289     if ($row['date_transmission_parquet'] != '') {
5290     $this->valF['archive_date_transmission_parquet']= $row['date_transmission_parquet'];
5291     }
5292 softime 8989 //
5293 softime 8593 if ($row['dossier_instruction_type'] != '') {
5294     $this->valF['archive_dossier_instruction_type']= $row['dossier_instruction_type'];
5295     }
5296 softime 8989 if ($row['date_affichage'] != '') {
5297     $this->valF['archive_date_affichage']= $row['date_affichage'];
5298     }
5299 softime 10573 if (isset($row['pec_metier']) === true && $row['pec_metier'] != '') {
5300     $this->valF['archive_pec_metier']= $row['pec_metier'];
5301     }
5302     if (isset($row['a_qualifier']) === true && $row['a_qualifier'] != '') {
5303     $this->valF['archive_a_qualifier']= $row['a_qualifier'];
5304     }
5305 mbroquet 3730 }
5306    
5307     // {{{
5308     // Méthodes de récupération des métadonnées arrêté
5309     /**
5310     * @return string Retourne le numéro d'arrêté
5311     */
5312     function getNumArrete() {
5313     return $this->getVal("numero_arrete");
5314     }
5315     /**
5316     * @return chaîne vide
5317     */
5318     function getReglementaireArrete() {
5319     return 'true';
5320     }
5321     /**
5322     * @return boolean de notification au pétitionnaire
5323     */
5324     function getNotificationArrete() {
5325     return 'true';
5326     }
5327     /**
5328     * @return date de notification au pétitionnaire
5329     */
5330     function getDateNotificationArrete() {
5331     if (empty($this->metadonneesArrete)) {
5332     $this->getArreteMetadata();
5333     }
5334     return $this->metadonneesArrete["datenotification"];
5335     }
5336     /**
5337     * @return boolean check si le document est passé au contrôle de légalité
5338     */
5339     function getControleLegalite() {
5340     return 'true';
5341     }
5342     /**
5343     * @return date de signature de l'arrêté
5344     */
5345     function getDateSignature() {
5346     if (empty($this->metadonneesArrete)) {
5347     $this->getArreteMetadata();
5348     }
5349     return $this->metadonneesArrete["datesignaturearrete"];
5350     }
5351     /**
5352     * @return string nom du signataire
5353     */
5354     function getNomSignataire() {
5355     if (empty($this->metadonneesArrete)) {
5356     $this->getArreteMetadata();
5357     }
5358     return $this->metadonneesArrete["nomsignataire"];
5359     }
5360     /**
5361     * @return string qualité du signataire
5362     */
5363     function getQualiteSignataire() {
5364     if (empty($this->metadonneesArrete)) {
5365     $this->getArreteMetadata();
5366     }
5367     return $this->metadonneesArrete["qualitesignataire"];
5368     }
5369     /**
5370     * @return string numéro du terrain
5371     */
5372     function getAp_numRue() {
5373     if (empty($this->metadonneesArrete)) {
5374     $this->getArreteMetadata();
5375     }
5376     return $this->metadonneesArrete["ap_numrue"];
5377     }
5378     /**
5379     * @return string nom de la rue du terrain
5380     */
5381     function getAp_nomDeLaVoie() {
5382     if (empty($this->metadonneesArrete)) {
5383     $this->getArreteMetadata();
5384     }
5385     return $this->metadonneesArrete["ap_nomdelavoie"];
5386     }
5387     /**
5388     * @return string code postal du terrain
5389     */
5390     function getAp_codePostal() {
5391     if (empty($this->metadonneesArrete)) {
5392     $this->getArreteMetadata();
5393     }
5394     return $this->metadonneesArrete["ap_codepostal"];
5395     }
5396     /**
5397     * @return string ville du terrain
5398     */
5399     function getAp_ville() {
5400     if (empty($this->metadonneesArrete)) {
5401     $this->getArreteMetadata();
5402     }
5403     return $this->metadonneesArrete["ap_ville"];
5404     }
5405     /**
5406     * @return string activité
5407     */
5408     function getActivite() {
5409     return "Droit du sol";
5410     }
5411     /**
5412     * @return string date du retour de controle légalité
5413     */
5414     function getDateControleLegalite() {
5415     if (empty($this->metadonneesArrete)) {
5416     $this->getArreteMetadata();
5417     }
5418     return $this->metadonneesArrete["datecontrolelegalite"];
5419     }
5420    
5421     // Fin des méthodes de récupération des métadonnées
5422     // }}}
5423    
5424     /**
5425     * Méthode de récupération des métadonnées arrêtés dans la base de données,
5426     * les données sont stockés dans l'attribut $this->metadonneesArrete
5427     */
5428     function getArreteMetadata() {
5429    
5430     //Récupération de la dernière instruction dont l'événement est de type 'arrete'
5431     $this->metadonneesArrete = array("nomsignataire"=>"", "qualitesignataire"=>"",
5432     "decisionarrete"=>"", "datenotification"=>"", "datesignaturearrete"=>"",
5433     "datecontrolelegalite"=>"", "ap_numrue"=>"", "ap_nomdelavoie"=>"",
5434     "ap_codepostal"=>"", "ap_ville"=>"");
5435    
5436 softime 10573 $sqlArrete = "SELECT
5437     signataire_arrete.prenom || ' ' ||signataire_arrete.nom as \"nomsignataire\",
5438 mbroquet 3730 signataire_arrete.qualite as \"qualitesignataire\",
5439     instruction.etat as \"decisionarrete\",
5440     instruction.date_retour_rar as \"datenotification\",
5441     instruction.date_retour_signature as \"datesignaturearrete\",
5442     instruction.date_retour_controle_legalite as \"datecontrolelegalite\",
5443     dossier.terrain_adresse_voie_numero as \"ap_numrue\",
5444     dossier.terrain_adresse_voie as \"ap_nomdelavoie\",
5445     dossier.terrain_adresse_code_postal as \"ap_codepostal\",
5446     dossier.terrain_adresse_localite as \"ap_ville\"
5447     FROM ".DB_PREFIXE."instruction
5448     LEFT JOIN ".DB_PREFIXE."signataire_arrete ON
5449     instruction.signataire_arrete = signataire_arrete.signataire_arrete
5450     LEFT JOIN ".DB_PREFIXE."dossier ON
5451     instruction.dossier = dossier.dossier
5452     LEFT JOIN ".DB_PREFIXE."donnees_techniques ON
5453     donnees_techniques.dossier_instruction = dossier.dossier
5454     WHERE instruction.instruction = ".$this->getVal("instruction");
5455 softime 8989 $resArrete = $this->f->db->query($sqlArrete);
5456 mbroquet 3730 $this->f->addToLog("getArreteMetadata(): db->query(\"".$sqlArrete."\");", VERBOSE_MODE);
5457     if ( database::isError($resArrete)){
5458     die();
5459     }
5460    
5461     $this->metadonneesArrete = $resArrete->fetchRow(DB_FETCHMODE_ASSOC);
5462     }
5463    
5464     /**
5465     * CONDITION - has_an_edition.
5466     *
5467     * Condition pour afficher le bouton de visualisation de l'édition.
5468     *
5469     * @return boolean
5470     */
5471     function has_an_edition() {
5472     // Récupère la valeur du champ lettretype
5473     $lettretype = $this->getVal("lettretype");
5474     // Si le champ est vide
5475 softime 7521 if ($lettretype !== '' && $lettretype !== null) {
5476 mbroquet 3730 //
5477 softime 7521 return true;
5478 mbroquet 3730 }
5479    
5480     //
5481 softime 7521 return false;
5482 mbroquet 3730 }
5483    
5484     /**
5485 softime 10573 * CONDITION - is_modifiable.
5486     *
5487     * Controle si l'évenement est modifiable.
5488     *
5489     * @return boolean
5490     */
5491     function is_evenement_modifiable() {
5492     $evenement = $this->get_inst_evenement($this->getVal('evenement'));
5493     return ! $this->get_boolean_from_pgsql_value($evenement->getVal('non_modifiable'));
5494     }
5495    
5496     /**
5497 mbroquet 3730 * CONDITION - is_editable.
5498     *
5499     * Condition pour la modification.
5500     *
5501     * @return boolean
5502     */
5503     function is_editable() {
5504 softime 10573
5505     // XXX
5506     // Identifier si l'instruction est lié à une tâche depuis le champ object_id (mais aussi voir le log car object_id peut être modifié)
5507     // Si cette tâche identifiée est DONE alors la suppression/modification de cette intruction est impossible
5508    
5509 mbroquet 3730 // Contrôle si l'utilisateur possède un bypass
5510 softime 7996 $bypass = $this->f->isAccredited($this->get_absolute_class_name()."_modifier_bypass");
5511 mbroquet 3730 //
5512     if ($bypass == true) {
5513     //
5514     return true;
5515     }
5516 softime 6565
5517 mbroquet 3730 // Si l'utilisateur est un instructeur, que le dossier est cloturé et
5518     // que l'événement n'est pas identifié comme non verrouillable
5519     if ($this->f->isUserInstructeur()
5520     && $this->getStatutAutorisationDossier($this->getParameter("idxformulaire")) == "cloture"
5521     && $this->checkEvenementNonVerrouillable($this->getVal("instruction")) === false) {
5522     //
5523     return false;
5524     }
5525    
5526 softime 6565 // Si l'utilisateur est un intructeur qui correspond à la division du
5527     // dossier
5528     if ($this->is_instructeur_from_division_dossier() === true) {
5529     //
5530     return true;
5531     }
5532    
5533     // Si l'utilisateur est instructeur de la commune du dossier et que
5534     // l'instruction est créée par un instructeur de la commune
5535     if ($this->is_instructeur_from_collectivite_dossier() === true and
5536     $this->getVal('created_by_commune') === 't') {
5537     return true;
5538     }
5539    
5540 mbroquet 3730 //
5541 softime 6565 return false;
5542 mbroquet 3730 }
5543    
5544     /**
5545 softime 10573 * Vérifie si l'événement est supprimable ou pas.
5546     *
5547     * @return boolean
5548     */
5549     function is_evenement_supprimable() {
5550     // Controle si l'évenement est supprimable
5551     $evenement = $this->get_inst_evenement($this->getVal('evenement'));
5552     return ! $this->get_boolean_from_pgsql_value($evenement->getVal('non_supprimable'));
5553     }
5554    
5555     /**
5556 mbroquet 3730 * CONDITION - is_deletable.
5557     *
5558 softime 6864 * Condition pour la suppression.
5559 mbroquet 3730 *
5560     * @return boolean
5561     */
5562     function is_deletable() {
5563 softime 10573
5564     // XXX
5565     // Identifier si l'instruction est lié à une tâche depuis le champ object_id (mais aussi voir le log car object_id peut être modifié)
5566     // Si cette tâche identifiée est DONE alors la suppression/modification de cette intruction est impossible
5567    
5568 softime 6864 // Contrôle si l'utilisateur possède un bypass intégral
5569 softime 7996 $bypass = $this->f->isAccredited($this->get_absolute_class_name()."_supprimer_bypass");
5570 mbroquet 3730 //
5571     if ($bypass == true) {
5572    
5573     //
5574     return true;
5575     }
5576    
5577     // Si l'utilisateur est un intructeur qui ne correspond pas à la
5578 softime 6864 // division du dossier et si l'utilisateur n'a pas la permission bypass
5579     // de la division
5580     if ($this->is_instructeur_from_division_dossier() === false
5581 softime 7996 && $this->f->isAccredited($this->get_absolute_class_name()."_supprimer_bypass_division") === false) {
5582 mbroquet 3730
5583     //
5584     return false;
5585     }
5586 softime 5024
5587     // l'événement est-il le dernier ?
5588     $dernier_evenement = false;
5589     // instanciation dossier
5590 softime 7996 $dossier = $this->f->get_inst__om_dbform(array(
5591     "obj" => "dossier",
5592     "idx" => $this->getVal('dossier'),
5593     ));
5594 softime 5024 // récupération dernier événement
5595     $id_dernier_evenement = $dossier->get_dernier_evenement();
5596     if ($id_dernier_evenement == $this->getVal($this->clePrimaire)) {
5597     $dernier_evenement = true;
5598     }
5599 mbroquet 3730
5600 softime 5024 // Si dossier cloturé ou si pas dernier événement
5601     // ou de type retour ou si une date est renseignée
5602     // ET utilisateur non administrateur
5603     if ($this->getStatutAutorisationDossier($this->getVal('dossier')) == 'cloture'
5604     || $dernier_evenement == false
5605     || $this->is_evenement_retour($this->getVal("evenement")) == true
5606     || $this->getVal('date_envoi_signature') != ''
5607     || $this->getVal('date_retour_signature') != ''
5608     || $this->getVal('date_envoi_rar') != ''
5609     || $this->getVal('date_retour_rar') != ''
5610     || $this->getVal('date_envoi_controle_legalite') != ''
5611     || $this->getVal('date_retour_controle_legalite') != '') {
5612     // pas le droit de supprimer
5613     return false;;
5614     }
5615    
5616 mbroquet 3730 //
5617     return true;
5618     }
5619 softime 6565
5620    
5621 mbroquet 3730 /**
5622 softime 6565 * Vérifie que l'utilisateur est instructeur et qu'il est de la division du
5623     * dossier.
5624     *
5625     * @return, boolean true/false
5626     */
5627     function is_instructeur_from_collectivite_dossier() {
5628     if ($this->f->isUserInstructeur() === true and
5629     $this->f->om_utilisateur["om_collectivite"] == $this->get_dossier_instruction_om_collectivite()) {
5630     return true;
5631     }
5632     return false;
5633     }
5634    
5635     /**
5636 mbroquet 3730 * CONDITION - is_addable.
5637     *
5638     * Condition pour afficher les boutons modifier et supprimer.
5639     *
5640     * @return boolean
5641     */
5642     function is_addable() {
5643     // Contrôle si l'utilisateur possède un bypass
5644 softime 7996 $bypass = $this->f->isAccredited($this->get_absolute_class_name()."_ajouter_bypass");
5645 mbroquet 3730 //
5646     if ($bypass == true) {
5647    
5648     //
5649     return true;
5650     }
5651 softime 6565 // Si l'utilisateur est un intructeur qui correspond à la
5652     // division du dossier ou qu'il peut changer la décision
5653     if ($this->is_instructeur_from_division_dossier() === true or
5654     $this->isInstrCanChangeDecision($this->getParameter('idxformulaire')) === true) {
5655 mbroquet 3730 //
5656 softime 6565 return true;
5657 mbroquet 3730 }
5658    
5659     //
5660 softime 6565 return false;
5661 mbroquet 3730 }
5662    
5663     /**
5664     * CONDITION - is_finalizable.
5665     *
5666     * Condition pour afficher le bouton.
5667     *
5668     * @return boolean
5669     */
5670     function is_finalizable() {
5671     // Contrôle si l'utilisateur possède un bypass
5672 softime 7996 $bypass = $this->f->isAccredited($this->get_absolute_class_name()."_finaliser_bypass");
5673 mbroquet 3730 //
5674     if ($bypass == true) {
5675     //
5676     return true;
5677     }
5678 softime 6565
5679 mbroquet 3730 // Si l'utilisateur est un instructeur, que le dossier est cloturé et
5680     // que l'événement n'est pas identifié comme non verrouillable
5681     if ($this->f->isUserInstructeur()
5682     && $this->getStatutAutorisationDossier($this->getParameter("idxformulaire")) == "cloture"
5683     && $this->checkEvenementNonVerrouillable($this->getVal("instruction")) === false) {
5684     //
5685     return false;
5686     }
5687 softime 6565
5688     // Si l'utilisateur est un intructeur qui correspond à la division du
5689     // dossier
5690     if ($this->is_instructeur_from_division_dossier() === true) {
5691     //
5692     return true;
5693     }
5694 mbroquet 3730
5695 softime 6565 // Si l'utilisateur est instructeur de la commune du dossier et que
5696     // l'instruction est créée par un instructeur de la commune
5697     if ($this->is_instructeur_from_collectivite_dossier() === true and
5698     $this->getVal('created_by_commune') === 't') {
5699     return true;
5700     }
5701    
5702 mbroquet 3730 //
5703 softime 6565 return false;
5704 mbroquet 3730 }
5705    
5706     /**
5707     * CONDITION - is_finalize_without_bypass.
5708     *
5709     * Condition pour afficher le bouton sans le bypass.
5710     *
5711     * @return boolean [description]
5712     */
5713     function is_finalizable_without_bypass() {
5714     // Récupère la valeur du champ finalisé
5715     $om_final_instruction = $this->getVal('om_final_instruction');
5716    
5717     // Si le rapport n'est pas finalisé
5718     if (empty($om_final_instruction)
5719     || $om_final_instruction == 'f') {
5720     //
5721     return true;
5722     }
5723    
5724     //
5725     return false;
5726     }
5727    
5728     /**
5729     * CONDITION - is_unfinalizable.
5730     *
5731     * Condition pour afficher le bouton.
5732     *
5733     * @return boolean
5734     */
5735     function is_unfinalizable(){
5736     // Contrôle si l'utilisateur possède un bypass
5737 softime 7996 $bypass = $this->f->isAccredited($this->get_absolute_class_name()."_definaliser_bypass");
5738 mbroquet 3730 //
5739     if ($bypass == true) {
5740     //
5741     return true;
5742     }
5743 softime 6565
5744     // Si l'utilisateur est un instructeur, que le dossier est cloturé et
5745     // que l'événement n'est pas identifié comme non verrouillable
5746 mbroquet 3730 if ($this->f->isUserInstructeur()
5747 softime 6565 && $this->getStatutAutorisationDossier($this->getParameter("idxformulaire")) == "cloture"
5748     && $this->checkEvenementNonVerrouillable($this->getVal("instruction")) === false) {
5749 mbroquet 3730 //
5750     return false;
5751     }
5752    
5753 softime 6565 // Si l'utilisateur est un intructeur qui correspond à la division du
5754     // dossier
5755     if ($this->is_instructeur_from_division_dossier() === true) {
5756     //
5757     return true;
5758 mbroquet 3730 }
5759    
5760 softime 6565 // Si l'utilisateur est instructeur de la commune du dossier et que
5761     // l'instruction est créée par un instructeur de la commune
5762     if ($this->is_instructeur_from_collectivite_dossier() === true and
5763     $this->getVal('created_by_commune') === 't') {
5764     return true;
5765 mbroquet 3730 }
5766    
5767     //
5768 softime 6565 return false;
5769 mbroquet 3730 }
5770    
5771     /**
5772     * CONDITION - is_unfinalizable_without_bypass.
5773     *
5774     * Condition pour afficher le bouton sans le bypass.
5775     *
5776     * @return boolean
5777     */
5778     function is_unfinalizable_without_bypass() {
5779     // Récupère la valeur du champ finalisé
5780     $om_final_instruction = $this->getVal('om_final_instruction');
5781    
5782     // Si l'instruction est finalisée
5783     if ($om_final_instruction == 't') {
5784     //
5785     return true;
5786     }
5787    
5788     //
5789     return false;
5790     }
5791    
5792 softime 5169
5793 mbroquet 3730 /**
5794 softime 6565 * Permet de définir si un instructeur commune peut editer une instruction
5795     *
5796     * @return boolean true si il peut
5797     */
5798     function isInstrCanChangeDecision($idx) {
5799    
5800     if ($this->f->isAccredited(array("instruction", "instruction_changer_decision"), "OR") !== true or
5801     $this->f->isUserInstructeur() !== true) {
5802     return false;
5803     }
5804    
5805    
5806    
5807     // Sinon on vérifie l'éligibilité du dossier au changement de décision
5808 softime 11876 // /!\ Requête lié à celles du widget indiquant les dossiers éligible au changement
5809     // de décision :
5810     // * dossier_instruction.class.php : view_widget_dossiers_evenement_retour_finalise()
5811     // * dossier_instruction.inc.php : si le paramètre filtre_decision = true
5812     $sql = sprintf(
5813     'SELECT
5814 softime 6565 dossier.dossier
5815     FROM
5816 softime 11876 %1$sdossier
5817     JOIN %1$setat
5818     ON dossier.etat = etat.etat AND etat.statut = \'encours\'
5819     JOIN %1$slien_dossier_demandeur
5820     ON dossier.dossier = lien_dossier_demandeur.dossier AND lien_dossier_demandeur.petitionnaire_principal IS TRUE
5821     JOIN %1$sdossier_instruction_type
5822     ON dossier.dossier_instruction_type=dossier_instruction_type.dossier_instruction_type
5823     JOIN %1$sinstruction
5824     -- Recherche de la dernière instruction qui ne soit pas liée à un événement retour
5825     ON instruction.instruction = (
5826     SELECT instruction
5827     FROM %1$sinstruction
5828     JOIN %1$sevenement ON instruction.evenement=evenement.evenement
5829     AND evenement.retour IS FALSE
5830     WHERE instruction.dossier = dossier.dossier
5831     ORDER BY date_evenement DESC, instruction DESC
5832     LIMIT 1
5833     )
5834     -- On ne garde que les dossiers pour lesquels la dernière instruction est finalisée
5835     -- ou alors pour laquelle l instruction a été ajouté par la commune et est
5836     -- non signée, non notifié, etc.
5837     AND (instruction.om_final_instruction IS TRUE
5838     OR instruction.created_by_commune IS TRUE)
5839     AND instruction.date_retour_signature IS NULL
5840     AND instruction.date_envoi_rar IS NULL
5841     AND instruction.date_retour_rar IS NULL
5842     AND instruction.date_envoi_controle_legalite IS NULL
5843     AND instruction.date_retour_controle_legalite IS NULL
5844     -- On vérifie que l instruction soit un arrêté ou un changement de décision
5845     JOIN %1$sevenement
5846     ON instruction.evenement=evenement.evenement
5847     AND (evenement.type = \'arrete\'
5848     OR evenement.type = \'changement_decision\')
5849     -- Recherche les informations du pétitionnaire principal pour l affichage
5850     JOIN %1$sdemandeur
5851     ON lien_dossier_demandeur.demandeur = demandeur.demandeur
5852     -- Recherche la collectivité rattachée à l instructeur
5853     JOIN %1$sinstructeur
5854     ON dossier.instructeur=instructeur.instructeur
5855     JOIN %1$sdivision
5856     ON instructeur.division=division.division
5857     JOIN %1$sdirection
5858     ON division.direction=direction.direction
5859     JOIN %1$som_collectivite
5860     ON direction.om_collectivite=om_collectivite.om_collectivite
5861 softime 6565 WHERE
5862 softime 11876 -- Vérification que la décision a été prise par l agglo
5863     om_collectivite.niveau = \'2\'
5864     AND dossier.dossier = \'%2$s\'
5865     ',
5866     DB_PREFIXE,
5867     $idx
5868     );
5869 softime 6565
5870    
5871     // Si collectivité de l'utilisateur niveau mono alors filtre sur celle-ci
5872     if ($this->f->isCollectiviteMono($_SESSION['collectivite']) === true) {
5873 softime 11876 $sql .= sprintf(
5874     ' AND dossier.om_collectivite=%1$s',
5875     $_SESSION['collectivite']
5876     );
5877 softime 6565 }
5878 softime 8989 $res = $this->f->db->getone($sql);
5879 softime 6565 if (database::isError($res)) {
5880     die();
5881     }
5882     // Si le dossier n'est pas sujet au changement de decision
5883     if($res == null) {
5884     return false;
5885     }
5886     return true;
5887     }
5888    
5889    
5890     /**
5891 softime 5169 * CONDITION - can_monitoring_dates.
5892     *
5893     * Condition pour afficher le bouton de suivi des dates.
5894     *
5895     * @return boolean
5896     */
5897     public function can_monitoring_dates() {
5898     // Récupère la valeur du champ finalisé
5899     $om_final_instruction = $this->getVal('om_final_instruction');
5900    
5901     // Si l'instruction n'est pas finalisée
5902     if ($om_final_instruction !== 't') {
5903     //
5904     return false;
5905     }
5906    
5907     // Contrôle si l'utilisateur possède un bypass
5908 softime 7996 $bypass = $this->f->isAccredited($this->get_absolute_class_name()."_modification_dates_bypass");
5909 softime 5169 if ($bypass === true) {
5910     return true;
5911     }
5912    
5913 softime 8989 // Permission de modifier le suivi des dates sur un dossier cloturé pour
5914     // un utilisateur lié à un instructeur
5915     $perm_moni_dates_d_closed = $this->f->isAccredited($this->get_absolute_class_name()."_modification_dates_cloture");
5916    
5917     // On vérifie en premier lieu que le DI n'est pas clôturé et que
5918     // l'utilisateur ne possède pas la permission de modifier le suivi des
5919     // dates sur un dossier clôturé
5920 softime 5169 $inst_dossier = $this->get_inst_dossier();
5921 softime 8989 if ($inst_dossier->getStatut() === 'cloture'
5922     && $perm_moni_dates_d_closed === false) {
5923 softime 5169 //
5924     return false;
5925     }
5926     // On récupère ses infos
5927     $coll_di = $inst_dossier->getVal('om_collectivite');
5928     $div_di = $this->getDivisionFromDossier();
5929     // et celles de son éventuel instructeur
5930     $instr_di = $inst_dossier->getVal('instructeur');
5931    
5932 softime 6565 // Il faut disposer d'une entrée instructeur
5933     if ($this->f->isUserInstructeur() === false) {
5934     return false;
5935     }
5936    
5937 softime 5169 // Par défaut on prétend que l'instructeur n'est pas multi
5938     $instr_di_coll_multi = false;
5939     // Si un instructeur est affecté au dossier
5940     if ($instr_di !== '' && $instr_di !== null) {
5941     // Vérifie si l'instructeur est de la collectivité de niveau 2
5942 softime 5295 $instr_di_coll = $this->get_instructeur_om_collectivite($instr_di);
5943 softime 5169 if ($this->f->isCollectiviteMono($instr_di_coll) === false) {
5944     //
5945     $instr_di_coll_multi = true;
5946     }
5947     }
5948    
5949 softime 6565 // Il faut qu'il instruise le dossier ou soit de la même division
5950     if ($this->f->om_utilisateur['instructeur'] === $instr_di
5951     || $this->f->om_utilisateur['division'] === $div_di) {
5952 softime 5169 //
5953     return true;
5954     }
5955    
5956 softime 6565 // On donne également le droit s'il est de la même collectivité que
5957     // le dossier ET si l'instruction est déléguée à la communauté
5958     if ($this->f->isCollectiviteMono($this->f->om_utilisateur['om_collectivite']) === true
5959     && $this->f->om_utilisateur['om_collectivite'] === $coll_di
5960     && $instr_di_coll_multi === true) {
5961 softime 5169 //
5962     return true;
5963     }
5964    
5965 softime 6565 // Si l'instructeur ne rentre pas dans les deux cas précédents
5966 softime 5169 return false;
5967     }
5968    
5969    
5970     /**
5971 mbroquet 3730 * TREATMENT - finalize.
5972     *
5973     * Permet de finaliser un enregistrement.
5974     *
5975     * @param array $val valeurs soumises par le formulaire
5976     *
5977     * @return boolean
5978     */
5979     function finalize($val = array()) {
5980    
5981     // Cette méthode permet d'exécuter une routine en début des méthodes
5982     // dites de TREATMENT.
5983     $this->begin_treatment(__METHOD__);
5984 softime 10808 $message = '';
5985 softime 11585 $ev = $this->get_inst_evenement($this->getVal('evenement'));
5986 mbroquet 3730
5987 softime 11585 // Controle du signataire
5988     if (! $this->controle_signataire($ev)) {
5989     $this->addToMessage(__("Le document ne peut pas être finalisé car aucun signataire n'a été sélectionné."));
5990     // Termine le traitement
5991     return $this->end_treatment(__METHOD__, false);
5992     }
5993    
5994 mbroquet 3730 // Traitement de la finalisation
5995     $ret = $this->manage_finalizing("finalize", $val);
5996    
5997     // Si le traitement retourne une erreur
5998     if ($ret !== true) {
5999    
6000     // Termine le traitement
6001 softime 5024 return $this->end_treatment(__METHOD__, false);
6002 mbroquet 3730 }
6003    
6004 softime 10808 // Envoi des notifications aux demandeurs si la notification est automatique
6005     // et que la signature n'est pas requise
6006     if ($ev->getVal('notification') === 'notification_automatique') {
6007     // Récupération de la catégorie et envoie des notifications au(x) demandeur(s)
6008     $collectivite_di = $this->get_dossier_instruction_om_collectivite($this->getVal('dossier'));
6009     // Récupération de la liste des demandeurs à notifier et de la catégorie
6010     $categorie = $this->f->get_param_option_notification($collectivite_di);
6011 softime 10869 $isPortal = $categorie == null || $categorie == '' || $categorie == 'portal' ? true : false;
6012     $demandeursANotifie = $this->get_demandeurs_notifiable(
6013     $this->getVal('dossier'),
6014     $isPortal
6015     );
6016 softime 10808
6017     // Création d'une notification et d'une tâche pour chaque demandeur à notifier
6018 softime 12124 $demandeurPrincipalNotifie = false;
6019 softime 10813 if (count($demandeursANotifie) > 0) {
6020     foreach ($demandeursANotifie as $demandeur) {
6021 softime 12124 // Identifie si le demandeur principal a été notifié ou pas
6022     // et récupère ses informations
6023     if ($demandeur['petitionnaire_principal'] == 't') {
6024     $demandeurPrincipalNotifie = true;
6025     // Si le demandeur principal est notifiable mais qu'il y a des erreurs dans
6026     // son paramétrage, on effectue pas le traitement et on passe à l'itération
6027     // suivante. On le considère également comme non notifié pour gérer l'envoie
6028     // des messages d'erreurs
6029     // Si la demande a été déposée via le portail alors le paramétrage n'a pas
6030     // d'impact sur la notification
6031     $erreursParam = $this->get_info_notification_fail();
6032     if (! $this->dossier_depose_sur_portail() && $erreursParam != array()) {
6033     $demandeurPrincipalNotifie = false;
6034     continue;
6035     }
6036     }
6037 softime 10813 // Ajout de la notif et récupération de son id
6038     $idNotif = $this->ajouter_notification(
6039     $this->getVal($this->clePrimaire),
6040     $this->f->get_connected_user_login_name(),
6041 softime 10968 $demandeur,
6042     $collectivite_di,
6043 softime 12433 array(),
6044 softime 10968 true
6045 softime 10808 );
6046 softime 10813 if ($idNotif === false) {
6047     // Termine le traitement
6048     return $this->end_treatment(__METHOD__, false);
6049     }
6050     $notification_by_task = $this->notification_by_task(
6051     $idNotif,
6052     $this->getVal('dossier'),
6053     $categorie
6054 softime 10808 );
6055 softime 10813 if ($notification_by_task === false) {
6056     $this->addToMessage(
6057     __("Erreur lors de la génération de la notification au(x) pétitionnaire(s).")
6058     );
6059     // Termine le traitement
6060     return $this->end_treatment(__METHOD__, false);
6061     }
6062 softime 12124 $this->addToMessage($message .= sprintf('%s<br/>%s', __("La notification a été générée."), __("Le suivi de la notification est disponible depuis l'instruction.")));
6063 softime 10808 }
6064     }
6065 softime 12124 // Si le demandeur principal n'est pas notifiable, on créé une nouvelle notification
6066     // en erreur avec en commentaire la raison pour laquelle le demandeur principal
6067     // n'a pas pu être notifié
6068     if (! $demandeurPrincipalNotifie) {
6069     // Analyse pour savoir pourquoi le demandeur principal n'est pas notifiable
6070     $erreursParam = $this->get_info_notification_fail();
6071     $demandeurPrincipal = $this->get_info_petitionnaire_principal_dossier($this->getVal('dossier'));
6072     // Ajout de la notif et récupération de son id
6073     $idNotif = $this->ajouter_notification(
6074     $this->valF[$this->clePrimaire],
6075     $this->f->get_connected_user_login_name(),
6076     $demandeurPrincipal,
6077     $collectivite_di,
6078 softime 12433 array(),
6079 softime 12124 true,
6080     'Echec',
6081     implode(' ', $erreursParam)
6082     );
6083     if ($idNotif === false) {
6084     $this->addToMessage(
6085     __('Erreur : la création de la notification a échouée.').
6086     __("Veuillez contacter votre administrateur.")
6087     );
6088     return false;
6089     }
6090     // Prépare un message d'alerte à destination de l'instructeur pour l'informer
6091     // de l'échec de la notification
6092     $dossier_message = $this->get_inst_dossier_message(0);
6093     $dossier_message_val = array(
6094     'dossier' => $this->getVal('dossier'),
6095     'type' => _('erreur expedition'),
6096     'emetteur' => $this->f->get_connected_user_login_name(),
6097     'login' => $_SESSION['login'],
6098     'date_emission' => date('Y-m-d H:i:s'),
6099     'contenu' => _('Échec lors de la notification de l\'instruction ').
6100     $ev->getVal('libelle').
6101     '.<br>'.
6102     implode("\n", $erreursParam).
6103     '<br>'.
6104     _('Veuillez corriger ces informations avant de renvoyer la notification.')
6105     );
6106     $add = $dossier_message->add_notification_message($dossier_message_val, true);
6107     // Si une erreur se produit pendant l'ajout
6108     if ($add !== true) {
6109     $this->addToLog(__METHOD__."(): Le message d'alerte concernant l'echec de l'envoi de la notification n'a pas pu être envoyé.", DEBUG_MODE);
6110     return false;
6111     }
6112     }
6113 softime 10808 }
6114    
6115 mbroquet 3730 // Termine le traitement
6116     return $this->end_treatment(__METHOD__, true);
6117     }
6118    
6119     /**
6120 softime 12124 * Récupère l'instance de dossier message.
6121     *
6122     * @param string $dossier_message Identifiant du message.
6123     *
6124     * @return object
6125     */
6126     private function get_inst_dossier_message($dossier_message = null) {
6127     //
6128     return $this->get_inst_common("dossier_message", $dossier_message);
6129     }
6130    
6131     /**
6132 softime 11585 * Vérifie si le signataire est obligatoire pour finaliser
6133     * le document apartir du paramétrage de l'événement.
6134     * Si c'est le cas, vérifie si il y a bien un signataire
6135     * renseigné.
6136     * Si c'est le cas renvoie true, sinon renvoie false.
6137     *
6138     * @param evenement évenement de l'instruction permettant de
6139     * récupérer le paramétrage
6140     * @return boolean
6141     */
6142     protected function controle_signataire($evenement) {
6143     // Vérifie si le signataire est obligatoire et si c'est le cas
6144     // vérifie si il y a bien un signataire pour le document
6145     if ($evenement->is_signataire_obligatoire() &&
6146     ($this->getVal('signataire_arrete') === null ||
6147     $this->getVal('signataire_arrete') === '')) {
6148     return false;
6149     }
6150     return true;
6151     }
6152    
6153     /**
6154 mbroquet 3730 * TREATMENT - unfinalize.
6155     *
6156     * Permet de définaliser un enregistrement.
6157     *
6158     * @param array $val valeurs soumises par le formulaire
6159     *
6160     * @return boolean
6161     */
6162     function unfinalize($val = array()) {
6163    
6164     // Cette méthode permet d'exécuter une routine en début des méthodes
6165     // dites de TREATMENT.
6166     $this->begin_treatment(__METHOD__);
6167    
6168     // Traitement de la finalisation
6169     $ret = $this->manage_finalizing("unfinalize", $val);
6170    
6171     // Si le traitement retourne une erreur
6172     if ($ret !== true) {
6173    
6174     // Termine le traitement
6175 softime 5024 return $this->end_treatment(__METHOD__, false);
6176 mbroquet 3730 }
6177    
6178     // Termine le traitement
6179     return $this->end_treatment(__METHOD__, true);
6180     }
6181    
6182     /**
6183     * VIEW - view_edition
6184     *
6185     * Edite l'édition de l'instruction ou affiche celle contenue dans le stockage.
6186     *
6187     * @return null Si l'action est incorrecte
6188     */
6189     function view_edition() {
6190    
6191     // Si l'instruction est finalisée
6192     if($this->getVal("om_final_instruction") == 't'
6193     && $this->getVal("om_final_instruction") != null) {
6194    
6195     // Ouvre le document
6196 softime 7996 $lien = '../app/index.php?module=form&snippet=file&obj='.$this->table.'&'.
6197 mbroquet 3730 'champ=om_fichier_instruction&id='.$this->getVal($this->clePrimaire);
6198     //
6199     header("Location: ".$lien);
6200     } else {
6201    
6202     // Récupère la collectivite du dossier d'instruction
6203     $dossier_instruction_om_collectivite = $this->get_dossier_instruction_om_collectivite();
6204    
6205     //
6206     $collectivite = $this->f->getCollectivite($dossier_instruction_om_collectivite);
6207    
6208     // Paramètre du PDF
6209     $params = array(
6210     "watermark" => true,
6211     "specific" => array(
6212     "mode" => "previsualisation",
6213     ),
6214     );
6215 softime 8593 // Si la rédaction libre est activée sur l'instruction
6216     if ($this->getVal("flag_edition_integrale") == 't') {
6217     $params["specific"]["corps"] = array(
6218     "mode" => "set",
6219     "value" => $this->getVal("corps_om_htmletatex"),
6220     );
6221     $params["specific"]["titre"] = array(
6222     "mode" => "set",
6223     "value" => $this->getVal("titre_om_htmletat"),
6224     );
6225     }
6226 mbroquet 3730
6227     // Génération du PDF
6228     $result = $this->compute_pdf_output('lettretype', $this->getVal("lettretype"), $collectivite, null, $params);
6229     // Affichage du PDF
6230     $this->expose_pdf_output(
6231     $result['pdf_output'],
6232     $result['filename']
6233     );
6234     }
6235     }
6236    
6237     /**
6238     * Récupère la collectivité du dossier d'instruction.
6239     *
6240 softime 7685 * @param string $dossier_instruction_id Identifiant du DI.
6241     *
6242 mbroquet 3730 * @return integer
6243     */
6244 softime 7685 function get_dossier_instruction_om_collectivite($dossier_instruction_id = null) {
6245 mbroquet 3730
6246 softime 7685 // Si l'identifiant n'est pas renseigné
6247     if ($dossier_instruction_id === null) {
6248 softime 8593 // Récupère la valeur
6249     if ($this->getVal('dossier') !== null && $this->getVal('dossier') !== '') {
6250     $dossier_instruction_id = $this->getVal('dossier');
6251     } elseif ($this->getParameter('idxformulaire') !== null
6252     && $this->getParameter('idxformulaire') !== '') {
6253     //
6254     $dossier_instruction_id = $this->getParameter('idxformulaire');
6255     } elseif ($this->f->get_submitted_get_value('idxformulaire') !== null
6256     && $this->f->get_submitted_get_value('idxformulaire') !== '') {
6257     //
6258     $dossier_instruction_id = $this->f->get_submitted_get_value('idxformulaire');
6259     }
6260 softime 7685 }
6261    
6262 mbroquet 3730 //
6263 softime 7996 $dossier_instruction = $this->f->get_inst__om_dbform(array(
6264     "obj" => "dossier_instruction",
6265     "idx" => $dossier_instruction_id,
6266     ));
6267 mbroquet 3730
6268     //
6269     return $dossier_instruction->getVal('om_collectivite');
6270     }
6271    
6272     /**
6273     * VIEW - view_bible
6274     *
6275     * Affiche la bible manuelle.
6276     *
6277     * @return void
6278     */
6279     function view_bible() {
6280     // Vérification de l'accessibilité sur l'élément
6281     $this->checkAccessibility();
6282    
6283     /**
6284     * Affichage de la structure HTML
6285     */
6286     //
6287 softime 8989 if ($this->f->isAjaxRequest()) {
6288 mbroquet 3730 //
6289     header("Content-type: text/html; charset=".HTTPCHARSET."");
6290     } else {
6291     //
6292 softime 8989 $this->f->setFlag("htmlonly");
6293     $this->f->display();
6294 mbroquet 3730 }
6295     //
6296 softime 8989 $this->f->displayStartContent();
6297 mbroquet 3730 //
6298 softime 8989 $this->f->setTitle(_("Liste des éléments de la bible en lien avec un evenement"));
6299     $this->f->displayTitle();
6300 mbroquet 3730
6301     /**
6302     *
6303     */
6304     //
6305 softime 8989 ($this->f->get_submitted_get_value("ev") ? $evenement = $this->f->get_submitted_get_value("ev") : $evenement = "");
6306 mbroquet 3730 $evenement = intval($evenement);
6307     //
6308 softime 8989 ($this->f->get_submitted_get_value("idx") ? $idx = $this->f->get_submitted_get_value("idx") : $idx = "");
6309 softime 5169 // Récupération du code du type de DA
6310     $code_da_type = '';
6311     if (preg_match('/[A-Za-z]{2,3}/', $idx, $matches) !== false) {
6312     $code_da_type = $matches[0];
6313     }
6314 mbroquet 3730 //
6315 softime 8989 ($this->f->get_submitted_get_value("complement") ? $complement = $this->f->get_submitted_get_value("complement") : $complement = "1");
6316 mbroquet 3730
6317     // Récupération de la collectivité du dossier
6318 softime 7996 $dossier = $this->f->get_inst__om_dbform(array(
6319     "obj" => "dossier",
6320     "idx" => $idx,
6321     ));
6322 mbroquet 3730
6323     /**
6324     *
6325     */
6326     //
6327     $sql = "SELECT *, bible.libelle as bible_lib
6328     FROM ".DB_PREFIXE."bible
6329     LEFT OUTER JOIN ".DB_PREFIXE."dossier_autorisation_type
6330     ON bible.dossier_autorisation_type=dossier_autorisation_type.dossier_autorisation_type
6331     LEFT JOIN ".DB_PREFIXE."om_collectivite
6332     ON bible.om_collectivite = om_collectivite.om_collectivite
6333 softime 7366 WHERE (evenement=".$evenement." OR evenement IS NULL)
6334 softime 8989 AND (complement=".$complement." OR complement IS NULL)
6335 mbroquet 3730 AND (bible.dossier_autorisation_type IS NULL
6336 softime 5169 OR dossier_autorisation_type.code ='".$code_da_type."')
6337 mbroquet 3730 AND (om_collectivite.niveau = '2'
6338     OR bible.om_collectivite = ".$dossier->getVal("om_collectivite").")
6339     ORDER BY bible_lib ASC";
6340 softime 8989 $res = $this->f->db->query($sql);
6341     $this->f->addToLog(__METHOD__.": db->query(\"".$sql."\");", VERBOSE_MODE);
6342     $this->f->isDatabaseError($res);
6343 mbroquet 3730 //
6344     echo "<form method=\"post\" name=\"f3\" action=\"#\">\n";
6345     //
6346     if ($res->numrows() > 0) {
6347     //
6348     echo "\t<table id='tab-bible' width='100%'>\n";
6349     //
6350     echo "\t\t<tr class=\"ui-tabs-nav ui-accordion ui-state-default tab-title\">";
6351     echo "<th>"._("Choisir")."</th>";
6352     echo "<th>"._("Libelle")."</th>";
6353     echo "</tr>\n";
6354     //
6355     $i = 0;
6356     //
6357     while ($row=& $res->fetchRow(DB_FETCHMODE_ASSOC)) {
6358     //
6359     echo "\t\t<tr";
6360     echo " class=\"".($i % 2 == 0 ? "odd" : "even")."\"";
6361     echo ">";
6362     //
6363     echo "<td class=\"center\"><input type=\"checkbox\" name=\"choix[]\" value=\"".$i."\" id=\"checkbox".$i."\" /></td>";
6364     // XXX utilisation de l'attribut titre pour afficher une infobulle
6365     echo "<td><span class=\"content\" title=\"".htmlentities($row['contenu'])."\" id=\"content".$i."\">".$row['bible_lib']."</span></td>";
6366     //
6367     echo "</tr>\n";
6368     //
6369     $i++;
6370     }
6371     echo "\t</table>\n";
6372     //
6373     echo "<div class=\"formControls\">\n";
6374 softime 8989 $this->f->layout->display_form_button(array(
6375 mbroquet 3730 "value" => _("Valider"),
6376     "onclick" => "bible_return('f2', 'complement".($complement == "1" ? "" : $complement)."_om_html'); return false;",
6377     ));
6378 softime 8989 $this->f->displayLinkJsCloseWindow();
6379 mbroquet 3730 echo "</div>\n";
6380    
6381     } else {
6382     //
6383     $message_class = "error";
6384     $message = _("Aucun element dans la bible pour l'evenement")." : ".$evenement;
6385 softime 8989 $this->f->displayMessage($message_class, $message);
6386 mbroquet 3730 //
6387     echo "<div class=\"formControls\">\n";
6388 softime 8989 $this->f->displayLinkJsCloseWindow();
6389 mbroquet 3730 echo "</div>\n";
6390     }
6391     //
6392     echo "</form>\n";
6393    
6394     /**
6395     * Affichage de la structure HTML
6396     */
6397     //
6398 softime 8989 $this->f->displayEndContent();
6399 mbroquet 3730 }
6400    
6401     /**
6402 softime 5169 * VIEW - view_bible_auto
6403 mbroquet 3730 *
6404 softime 5169 * Renvoie les valeurs de la bible à placer dans les compléments de l'instruction.
6405 mbroquet 3730 *
6406     * @return void
6407     */
6408     function view_bible_auto() {
6409     // Vérification de l'accessibilité sur l'élément
6410     $this->checkAccessibility();
6411     //
6412 softime 8989 $this->f->disableLog();
6413 mbroquet 3730
6414     $formatDate="AAAA-MM-JJ";
6415    
6416     // Récupération des paramètres
6417 softime 8989 $idx = $this->f->get_submitted_get_value('idx');
6418     $evenement = $this->f->get_submitted_get_value('ev');
6419 mbroquet 3730
6420     // Initialisation de la variable de retour
6421     $retour['complement_om_html'] = '';
6422     $retour['complement2_om_html'] = '';
6423     $retour['complement3_om_html'] = '';
6424     $retour['complement4_om_html'] = '';
6425     // Vérification d'une consultation liée à l'événement
6426 softime 8989 $consultation = $this->f->db->getOne(
6427 mbroquet 3730 "select consultation from ".DB_PREFIXE."evenement where evenement=".$evenement
6428     );
6429 softime 8989 $this->f->isDatabaseError($consultation);
6430 mbroquet 3730 // Si consultation liée, récupération du retour d'avis
6431     if($consultation=='Oui'){
6432 softime 11876 $sql = sprintf(
6433     '(SELECT
6434     date_retour,
6435     avis_consultation.libelle as avis_consultation,
6436     COALESCE(service.libelle, tiers_consulte.libelle) as service
6437     FROM
6438     %1$sconsultation
6439     LEFT JOIN %1$stiers_consulte ON consultation.tiers_consulte = tiers_consulte.tiers_consulte
6440     LEFT JOIN %1$sservice ON consultation.service = service.service
6441     LEFT JOIN %1$savis_consultation ON consultation.avis_consultation = avis_consultation.avis_consultation
6442     WHERE
6443     dossier = \'%2$s\'
6444     AND consultation.visible)',
6445     DB_PREFIXE,
6446     $this->f->db->escapeSimple($idx)
6447     );
6448 softime 8989 $res = $this->f->db->query($sql);
6449     $this->f->isDatabaseError($res);
6450 mbroquet 3730 // Récupération des consultations
6451     while ($row=& $res->fetchRow(DB_FETCHMODE_ASSOC)){
6452     $correct=false;
6453     // date retour
6454     if ($row['date_retour']<>""){
6455     if ($formatDate=="AAAA-MM-JJ"){
6456     $date = explode("-", $row['date_retour']);
6457     // controle de date
6458     if (count($date) == 3 and
6459     checkdate($date[1], $date[2], $date[0])) {
6460     $date_retour_f= $date[2]."/".$date[1]."/".$date[0];
6461     $correct=true;
6462     }else{
6463     $msg= $msg."<br>La date ".$row['date_retour']." n'est pas une date.";
6464     $correct=false;
6465     }
6466     }
6467     }
6468     //
6469     $temp="Vu l'avis ".$row['avis_consultation']." du service ".$row['service'];
6470     if($correct == true){
6471     $temp=$temp." du ".$date_retour_f;
6472     }
6473     // Concaténation des retours d'avis de consultation
6474 softime 7067 $retour['complement_om_html'] .= $temp . "<br/><br/>";
6475 mbroquet 3730 } // while
6476    
6477     } // consultation
6478     // Récupération des bibles automatiques pour le champ complement_om_html
6479 softime 8989 $retour['complement_om_html'] .= $this->getBible($evenement, $idx, '1');
6480 mbroquet 3730 // Récupération des bibles automatiques pour le champ complement2_om_html
6481 softime 8989 $retour['complement2_om_html'] .= $this->getBible($evenement, $idx, '2');
6482 mbroquet 3730 // Récupération des bibles automatiques pour le champ complement3_om_html
6483 softime 8989 $retour['complement3_om_html'] .= $this->getBible($evenement, $idx, '3');
6484 mbroquet 3730 // Récupération des bibles automatiques pour le champ complement4_om_html
6485 softime 8989 $retour['complement4_om_html'] .= $this->getBible($evenement, $idx, '4');
6486 mbroquet 3730
6487    
6488    
6489     echo json_encode($retour);
6490     }
6491    
6492     /**
6493 softime 7521 * VIEW - view_pdf_temp
6494     *
6495     * @return void
6496     */
6497     function view_pdf_temp() {
6498     $this->checkAccessibility();
6499 softime 8593 // Utilisation de $_POST pour ne pas que les textes soient altérés.
6500 softime 7521 $this->f->set_submitted_value();
6501 softime 8593 $merge_fields = array();
6502     //
6503     if (array_key_exists('c1', $_POST) === true) {
6504 softime 11876 $merge_fields['[complement_instruction]'] = $_POST['c1'];
6505     $merge_fields['[complement1_instruction]'] = $_POST['c1'];
6506 softime 8593 }
6507     if (array_key_exists('c2', $_POST) === true) {
6508 softime 11876 $merge_fields['[complement2_instruction]'] = $_POST['c2'];
6509 softime 8593 }
6510     if (array_key_exists('c3', $_POST) === true) {
6511 softime 11876 $merge_fields['[complement3_instruction]'] = $_POST['c3'];
6512 softime 8593 }
6513     if (array_key_exists('c4', $_POST) === true) {
6514 softime 11876 $merge_fields['[complement4_instruction]'] = $_POST['c4'];
6515 softime 8593 }
6516 softime 7521 $params = array(
6517     "watermark" => true,
6518     "specific" => array(
6519     "merge_fields" => $merge_fields,
6520     ),
6521     );
6522 softime 8593 //
6523     if (array_key_exists('corps', $_POST) === true) {
6524     $params["specific"]["corps"] = array(
6525     "mode" => "set",
6526 softime 11876 "value" => $_POST['corps'],
6527 softime 8593 );
6528     }
6529     if (array_key_exists('titre', $_POST) === true) {
6530     $params["specific"]["titre"] = array(
6531     "mode" => "set",
6532 softime 11876 "value" => $_POST['titre'],
6533 softime 8593 );
6534     }
6535 softime 7521 $dossier_instruction_om_collectivite = $this->get_dossier_instruction_om_collectivite();
6536     $collectivite = $this->f->getCollectivite($dossier_instruction_om_collectivite);
6537     $result = $this->compute_pdf_output('lettretype', $this->getVal('lettretype'), $collectivite, null, $params);
6538     $retour = array(
6539     'base' => base64_encode($result['pdf_output']),
6540     );
6541     echo json_encode($retour);
6542     }
6543    
6544     /**
6545     * Dans le contexte de prévisualisation des éditions, génère le rendu du
6546     * PDF sans prise en compte de la valeur des compléments et le retourne en
6547     * base 64.
6548     *
6549     * @return string Rendu PDF converti en base 64.
6550     */
6551     function init_pdf_temp() {
6552     $params = array(
6553     "watermark" => true,
6554     );
6555 softime 8593 // Si la rédaction libre est activée sur l'instruction
6556     if ($this->getVal("flag_edition_integrale") == 't') {
6557     $params["specific"]["corps"] = array(
6558     "mode" => "set",
6559     "value" => $this->getVal("corps_om_htmletatex"),
6560     );
6561     $params["specific"]["titre"] = array(
6562     "mode" => "set",
6563     "value" => $this->getVal("titre_om_htmletat"),
6564     );
6565     }
6566 softime 7521 $dossier_instruction_om_collectivite = $this->get_dossier_instruction_om_collectivite();
6567     $collectivite = $this->f->getCollectivite($dossier_instruction_om_collectivite);
6568     $result = $this->compute_pdf_output('lettretype', $this->getVal('lettretype'), $collectivite, null, $params);
6569    
6570     return base64_encode($result['pdf_output']);
6571     }
6572    
6573     /**
6574 mbroquet 3730 * Récupération des éléments de bible.
6575     *
6576     * @param integer $event id de l'événement
6577     * @param string $idx id du dossier
6578     * @param integer $compnb numéro du champ complement
6579     *
6580     * @return string Chaîne de texte à insérer dans le champ complement
6581     */
6582 softime 8989 function getBible($event, $idx, $compnb) {
6583 mbroquet 3730 // Récupération de la collectivité du dossier
6584 softime 7996 $dossier = $this->f->get_inst__om_dbform(array(
6585     "obj" => "dossier",
6586     "idx" => $idx,
6587     ));
6588 softime 5169 // Récupération du code du type de DA
6589     $code_da_type = '';
6590     if (preg_match('/[A-Za-z]{2,3}/', $idx, $matches) !== false) {
6591     $code_da_type = $matches[0];
6592     }
6593 mbroquet 3730 //
6594     $sql = "SELECT * FROM ".DB_PREFIXE."bible
6595     LEFT OUTER JOIN ".DB_PREFIXE."dossier_autorisation_type
6596     ON bible.dossier_autorisation_type=
6597     dossier_autorisation_type.dossier_autorisation_type
6598     LEFT JOIN
6599     ".DB_PREFIXE."om_collectivite
6600     ON bible.om_collectivite = om_collectivite.om_collectivite
6601 softime 7366 WHERE (evenement =".$event." or evenement IS NULL) and
6602 softime 8989 (complement=".$compnb." OR complement IS NULL) and
6603 mbroquet 3730 automatique='Oui' and
6604 softime 5169 (dossier_autorisation_type.code ='".$code_da_type."' or
6605 mbroquet 3730 bible.dossier_autorisation_type IS NULL) and
6606     (om_collectivite.niveau = '2' OR bible.om_collectivite = ".$dossier->getVal("om_collectivite").")";
6607    
6608 softime 8989 $res = $this->f->db->query($sql);
6609     $this->f->isDatabaseError($res);
6610 mbroquet 3730 $temp = "";
6611     while ($row=& $res->fetchRow(DB_FETCHMODE_ASSOC)){
6612     // Remplacement des retours à la ligne par des br
6613     $temp .= preg_replace(
6614     '#(\\\r|\\\r\\\n|\\\n)#', '<br/>', $row['contenu']
6615     );
6616 softime 7521 // Ajout d'un saut de ligne entre chaque bible.
6617     $temp .= '<br/>';
6618 mbroquet 3730 } // fin while
6619     return $temp;
6620     }
6621    
6622     /**
6623     * VIEW - view_suivi_bordereaux.
6624     *
6625 nmeucci 4317 * Formulaire de choix du bordereau de suivi, permettant de générer les 4 bordereaux.
6626     * Si l'utilisateur est d'une collectivité de niveau 2 il a le choix de la
6627     * collectivité des dossiers affichés.
6628 mbroquet 3730 *
6629     * @return void
6630     */
6631     function view_suivi_bordereaux() {
6632     // Vérification de l'accessibilité sur l'élément
6633     $this->checkAccessibility();
6634    
6635     /**
6636     * Validation du formulaire
6637     */
6638     // Si le formulaire a été validé
6639 softime 8989 if ($this->f->get_submitted_post_value("validation") !== null) {
6640 mbroquet 3730 // Si un bordereau à été sélectionné
6641 softime 8989 if ($this->f->get_submitted_post_value("bordereau") !== null && $this->f->get_submitted_post_value("bordereau") == "" ) {
6642 mbroquet 3730 // Si aucun bordereau n'a été sélectionné
6643     $message_class = "error";
6644     $message = _("Veuillez selectionner un bordereau.");
6645     }
6646     // Sinon si les dates ne sont pas valide
6647 softime 8989 elseif (($this->f->get_submitted_post_value("date_bordereau_debut") !== null
6648     && $this->f->get_submitted_post_value("date_bordereau_debut") == "")
6649     || ($this->f->get_submitted_post_value("date_bordereau_fin") !== null
6650     && $this->f->get_submitted_post_value("date_bordereau_fin") == "")) {
6651 mbroquet 3730 // Si aucune date n'a été saisie
6652     $message_class = "error";
6653     $message = _("Veuillez saisir une date valide.");
6654     }
6655 softime 7366 // Sinon si les dates ne sont pas valides
6656 softime 8989 elseif ($this->f->get_submitted_post_value("bordereau") === "bordereau_avis_maire_prefet"
6657     && $this->f->getParameter("id_evenement_bordereau_avis_maire_prefet") == null) {
6658 softime 7366 // Si aucune date n'a été saisie
6659     $message_class = "error";
6660     $message = _("Erreur de parametrage. Contactez votre administrateur.");
6661     }
6662 mbroquet 3730 // Affiche le message de validation
6663     else {
6664     // On récupère le libellé du bordereau pour l'afficher à l'utilisateur
6665     $sql = "SELECT om_etat.libelle
6666     FROM ".DB_PREFIXE."om_etat
6667 softime 8989 WHERE om_etat.id = '".$this->f->get_submitted_post_value("bordereau")."'";
6668     $res = $this->f->db->getone($sql);
6669     $this->f->addToLog(__METHOD__.": db->getone(\"".$sql."\")", VERBOSE_MODE);
6670     $this->f->isDatabaseError($res);
6671 mbroquet 3730 //
6672     $message_class = "valid";
6673     $message = _("Cliquez sur le lien ci-dessous pour telecharger votre bordereau");
6674     $message .= " : <br/><br/>";
6675     $message .= "<a class='om-prev-icon pdf-16'";
6676     $message .= " title=\""._("Bordereau")."\"";
6677 softime 7996 $message .= "href='".OM_ROUTE_FORM."&obj=instruction";
6678 nmeucci 4317 $message .= "&action=220";
6679     $message .= "&idx=0";
6680 softime 8989 $message .= "&type_bordereau=".$this->f->get_submitted_post_value("bordereau");
6681     $message .= "&date_bordereau_debut=".$this->f->get_submitted_post_value("date_bordereau_debut");
6682     $message .= "&date_bordereau_fin=".$this->f->get_submitted_post_value("date_bordereau_fin");
6683 mbroquet 3730 // Si l'utilisateur est MULTI alors on ajoute le paramètre collectivite
6684 softime 8989 if ($this->f->get_submitted_post_value("om_collectivite") !== null) {
6685     $message .= "&collectivite=".$this->f->get_submitted_post_value("om_collectivite");
6686 mbroquet 3730 }
6687     $message .= "'"." target='_blank'>";
6688 softime 8989 $message .= $res." "._("du")." ".$this->f->get_submitted_post_value("date_bordereau_debut")
6689     ." "._("au")." ".$this->f->get_submitted_post_value("date_bordereau_fin");
6690 mbroquet 3730 $message .= "</a>";
6691     }
6692     }
6693    
6694     /**
6695     * Affichage des messages et du formulaire
6696     */
6697     // Affichage du message de validation ou d'erreur
6698     if (isset($message) && isset($message_class) && $message != "") {
6699 softime 8989 $this->f->displayMessage($message_class, $message);
6700 mbroquet 3730 }
6701     // Ouverture du formulaire
6702     printf("\t<form");
6703     printf(" method=\"post\"");
6704     printf(" id=\"suivi_bordereaux_form\"");
6705     printf(" action=\"\"");
6706     printf(">\n");
6707     // Paramétrage des champs du formulaire
6708     $champs = array("date_bordereau_debut", "date_bordereau_fin", "bordereau");
6709 softime 8989 // Si l'utilisateur est d'une collectivité de niveau 2 on affiche un select
6710 mbroquet 3730 // collectivité dans le formulaire
6711 softime 8989 if ($_SESSION["niveau"] == 2) {
6712 mbroquet 3730 array_push($champs, "om_collectivite");
6713     }
6714     // Création d'un nouvel objet de type formulaire
6715 softime 7996 $form = $this->f->get_inst__om_formulaire(array(
6716     "validation" => 0,
6717     "maj" => 0,
6718     "champs" => $champs,
6719     ));
6720 mbroquet 3730 // Paramétrage du champ date_bordereau_debut
6721     $form->setLib("date_bordereau_debut", _("date_bordereau_debut"));
6722     $form->setType("date_bordereau_debut", "date");
6723     $form->setTaille("date_bordereau_debut", 12);
6724     $form->setMax("date_bordereau_debut", 12);
6725     $form->setRequired("date_bordereau_debut");
6726     $form->setOnchange("date_bordereau_debut", "fdate(this)");
6727     $form->setVal("date_bordereau_debut", date("d/m/Y"));
6728     // Paramétrage du champ date_bordereau_fin
6729     $form->setLib("date_bordereau_fin", _("date_bordereau_fin"));
6730     $form->setType("date_bordereau_fin", "date");
6731     $form->setTaille("date_bordereau_fin", 12);
6732     $form->setMax("date_bordereau_fin", 12);
6733     $form->setRequired("date_bordereau_fin");
6734     $form->setOnchange("date_bordereau_fin", "fdate(this)");
6735     $form->setVal("date_bordereau_fin", date("d/m/Y"));
6736     // Paramétrage du champ bordereau
6737     $form->setLib("bordereau", _("bordereau"));
6738     $form->setType("bordereau", "select");
6739     $form->setRequired("bordereau");
6740     // Valeurs des champs
6741 softime 8989 if ($this->f->get_submitted_post_value("validation") !== null) {
6742     $form->setVal("date_bordereau_debut", $this->f->get_submitted_post_value("date_bordereau_debut"));
6743     $form->setVal("date_bordereau_fin", $this->f->get_submitted_post_value("date_bordereau_fin"));
6744     $form->setVal("bordereau", $this->f->get_submitted_post_value("bordereau"));
6745     $form->setVal("om_collectivite", $this->f->get_submitted_post_value("om_collectivite"));
6746 mbroquet 3730 }
6747     // Données du select - On récupère ici la liste de tous les états disponibles
6748     // dans la table om_etat qui ont un id qui commence par la cahine de caractères
6749     // 'bordereau_'
6750     $sql = "SELECT om_etat.id, om_etat.libelle
6751     FROM ".DB_PREFIXE."om_etat
6752     WHERE om_etat.id LIKE 'bordereau_%'
6753     ORDER BY om_etat.id";
6754 softime 8989 $res = $this->f->db->query($sql);
6755     $this->f->addToLog(__METHOD__.": db->query(\"".$sql."\")", VERBOSE_MODE);
6756     $this->f->isDatabaseError($res);
6757 mbroquet 3730 // Données du select
6758     $contenu = array(
6759     0 => array("", ),
6760     1 => array(_("choisir bordereau")),
6761     );
6762     while ($row =& $res->fetchRow(DB_FETCHMODE_ASSOC)) {
6763     $contenu[0][] = $row['id'];
6764     $contenu[1][] = $row['libelle'];
6765     }
6766     $form->setSelect("bordereau", $contenu);
6767 softime 8989 //
6768     if ($_SESSION["niveau"] == 2) {
6769     $form->setLib("om_collectivite", _("collectivite"));
6770     $form->setType("om_collectivite", "select");
6771 mbroquet 3730
6772 softime 8989 // Données du select - On récupère ici la liste de tous toutes les collectivités
6773     // de niveau 1
6774     $sql = "SELECT om_collectivite, libelle
6775     FROM ".DB_PREFIXE."om_collectivite
6776     WHERE niveau = '1' ORDER BY libelle";
6777     $res = $this->f->db->query($sql);
6778     $this->f->addToLog(__METHOD__.": db->query(\"".$sql."\")", VERBOSE_MODE);
6779     $this->f->isDatabaseError($res);
6780     // La valeur par défaut du select est Toutes
6781     $list_collectivites = array(
6782     0 => array("", ),
6783     1 => array(_("toutes"))
6784     );
6785 mbroquet 3730
6786 softime 8989 $id_colls = "";
6787     // On stocke dans $id_colls l'id de toutes les collectivités de niveau 1 séparées
6788     // par des virgules, pour un traitement plus facile dans la requête de sous-état
6789     while ($row =& $res->fetchRow(DB_FETCHMODE_ASSOC)) {
6790     if ($id_colls != "") {
6791     $id_colls .= ",";
6792     }
6793     $id_colls .= $row['om_collectivite'];
6794     $list_collectivites[0][] = $row['om_collectivite'];
6795     $list_collectivites[1][] = $row['libelle'];
6796 mbroquet 3730 }
6797 softime 8989 // On affecte la liste d'identifiants à l'option Toutes
6798     $list_collectivites[0][0] = $id_colls ;
6799     $form->setSelect("om_collectivite", $list_collectivites);
6800 mbroquet 3730 }
6801     // Affichage du formulaire
6802     $form->entete();
6803     $form->afficher($champs, 0, false, false);
6804     $form->enpied();
6805     // Affichage du bouton
6806     printf("\t<div class=\"formControls\">\n");
6807 softime 8989 $this->f->layout->display_form_button(array("value" => _("Valider"), "name" => "validation"));
6808 mbroquet 3730 printf("\t</div>\n");
6809     // Fermeture du formulaire
6810     printf("\t</form>\n");
6811     }
6812    
6813 nmeucci 4317
6814     /**
6815     * VIEW - view_generate_suivi_bordereaux.
6816     *
6817     * Génère et affiche les bordereaux de suivi.
6818     *
6819     * @return [void]
6820     */
6821     function view_generate_suivi_bordereaux() {
6822     // Vérification de l'accessibilité sur l'élément
6823     $this->checkAccessibility();
6824     // Récupération du type de bordereau
6825     $bordereau = $this->f->get_submitted_get_value('type_bordereau');
6826     // Génération du PDF
6827     $result = $this->compute_pdf_output('etat', $bordereau, null, $this->getVal($this->clePrimaire));
6828     // Affichage du PDF
6829     $this->expose_pdf_output(
6830     $result['pdf_output'],
6831     $result['filename']
6832     );
6833     }
6834    
6835    
6836 mbroquet 3730 /**
6837     * VIEW - view_suivi_envoi_lettre_rar.
6838     *
6839 softime 8989 * Vue pour imprimer les AR.
6840 mbroquet 3730 *
6841     * @return void
6842     */
6843     function view_suivi_envoi_lettre_rar() {
6844     // Vérification de l'accessibilité sur l'élément
6845     $this->checkAccessibility();
6846    
6847     //
6848 softime 8989 if ($this->f->get_submitted_post_value("date") !== null) {
6849     $date = $this->f->get_submitted_post_value("date");
6850 mbroquet 3730 } else {
6851     $date = "";
6852     }
6853     //
6854 softime 8989 if ($this->f->get_submitted_post_value("liste_code_barres_instruction") !== null) {
6855     $liste_code_barres_instruction = $this->f->get_submitted_post_value("liste_code_barres_instruction");
6856 mbroquet 3730 } else {
6857     $liste_code_barres_instruction = "";
6858     }
6859    
6860     // Compteur du nombre de page générées
6861     $nbLettres = 0;
6862     // Liste d'id des instructions
6863     $id4Gen = array();
6864     //
6865     $error = "";
6866    
6867 softime 5504 // Initialisation du tableau qui va contenir les DI pour lister les liens
6868     $dossierTab = array();
6869     // On vérifie que l'utilisateur ait les droits pour afficher des consultations
6870     $isAccredited = $this->f->isAccredited(array("dossier_instruction","dossier_instruction_consulter"), "OR");
6871     $hasHidden = true;
6872     // S'il ne peut pas les consulter il aura des dossiers caché
6873     if ($isAccredited === true) {
6874     $hasHidden = false;
6875     }
6876    
6877 mbroquet 3730 /**
6878     * Validation du formulaire
6879     */
6880     // Si le formulaire a été validé
6881 softime 8989 if ($this->f->get_submitted_post_value('validation') !== null) {
6882 mbroquet 3730 //
6883     if (empty($date) || empty($liste_code_barres_instruction)) {
6884     //
6885     $message_class = "error";
6886     $message = _("Tous les champs doivent etre remplis.");
6887     } else {
6888     // Création d'un tableau d'instruction
6889 softime 8989 $liste = explode("\r\n", $this->f->get_submitted_post_value("liste_code_barres_instruction"));
6890 mbroquet 3730 //
6891     foreach ($liste as $code_barres) {
6892     // On enlève les éventuels espaces saisis
6893     $code_barres = trim($code_barres);
6894     // Vérification de l'existence de l'instruction
6895     if ($code_barres != "") {
6896     // Si la valeur transmise est numérique
6897     if (is_numeric($code_barres)) {
6898     //
6899 softime 6565 $sql = "SELECT count(*)
6900     FROM ".DB_PREFIXE."instruction
6901     INNER JOIN ".DB_PREFIXE."dossier
6902     ON dossier.dossier=instruction.dossier
6903     INNER JOIN ".DB_PREFIXE."dossier_instruction_type
6904     ON dossier.dossier_instruction_type = dossier_instruction_type.dossier_instruction_type
6905     INNER JOIN ".DB_PREFIXE."dossier_autorisation_type_detaille
6906     ON dossier_instruction_type.dossier_autorisation_type_detaille = dossier_autorisation_type_detaille.dossier_autorisation_type_detaille
6907     INNER JOIN ".DB_PREFIXE."dossier_autorisation_type
6908     ON dossier_autorisation_type_detaille.dossier_autorisation_type = dossier_autorisation_type.dossier_autorisation_type
6909     INNER JOIN ".DB_PREFIXE."groupe
6910     ON dossier_autorisation_type.groupe = groupe.groupe
6911     WHERE code_barres='".$this->f->db->escapesimple($code_barres)."'";
6912 softime 7067
6913     // Ajout d'un filtre sur les groupes auxquels l'utilisateur a accès
6914     $group_clause = array();
6915     foreach ($_SESSION["groupe"] as $key => $value) {
6916     $group_clause[$key] = "(groupe.code = '".$key."'";
6917     if($value["confidentiel"] !== true) {
6918     $group_clause[$key] .= " AND dossier_autorisation_type.confidentiel IS NOT TRUE";
6919     }
6920     $group_clause[$key] .= ")";
6921     }
6922     $conditions = implode(" OR ", $group_clause);
6923     $sql .= " AND (" . $conditions . ")";
6924    
6925 softime 8989 $nbInstr = $this->f->db->getone($sql);
6926     $this->f->addToLog(__METHOD__.": db->getone(\"".$sql."\")", VERBOSE_MODE);
6927     $this->f->isDatabaseError($nbInstr);
6928 mbroquet 3730 //
6929     if ($nbInstr == "1") {
6930     // Récupération de la date d'envoi de l'instruction bippé
6931     $sql = "SELECT to_char(date_envoi_rar,'DD/MM/YYYY') as date_envoi_rar, instruction FROM ".DB_PREFIXE."instruction WHERE code_barres='".$code_barres."'";
6932 softime 8989 $res = $this->f->db->query($sql);
6933     $this->f->addToLog(__METHOD__.": db->query(\"".$sql."\")", VERBOSE_MODE);
6934     $this->f->isDatabaseError($res);
6935 mbroquet 3730 $row =& $res->fetchRow(DB_FETCHMODE_ASSOC);
6936     // Si pas de date ou correspond à la date du formulaire on
6937     // effectue le traitement
6938     if ($row["date_envoi_rar"] == "" || $row["date_envoi_rar"] == $date) {
6939 softime 7996 $instr = $this->f->get_inst__om_dbform(array(
6940     "obj" => "instruction",
6941     "idx" => $row['instruction'],
6942     ));
6943 mbroquet 3730 $valF = array();
6944     foreach($instr->champs as $id => $champ) {
6945     $valF[$champ] = $instr->val[$id];
6946     }
6947 softime 5504
6948     # Si on peut consulter les dossiers et que le dossier n'existe pas déjà dans la liste
6949     if ($isAccredited === true
6950     && array_key_exists($instr->getVal("dossier"), $dossierTab) === false) {
6951 softime 7996 $dossier = $this->f->get_inst__om_dbform(array(
6952     "obj" => "dossier",
6953     "idx" => $instr->getVal("dossier"),
6954     ));
6955 softime 5504 if ($dossier->is_user_from_allowed_collectivite()){
6956     $dossierTab[$instr->getVal("dossier")] = $dossier;
6957     } else {
6958     $hasHidden = true;
6959     }
6960     }
6961    
6962 mbroquet 3730 $valF['date_evenement']=
6963     $instr->dateDBToForm($valF['date_evenement']);
6964     $valF['archive_date_complet']=
6965     $instr->dateDBToForm($valF['archive_date_complet']);
6966     $valF['archive_date_rejet']=
6967     $instr->dateDBToForm($valF['archive_date_rejet']);
6968     $valF['archive_date_limite']=
6969     $instr->dateDBToForm($valF['archive_date_limite']);
6970     $valF['archive_date_notification_delai']=
6971     $instr->dateDBToForm($valF['archive_date_notification_delai']);
6972     $valF['archive_date_decision']=
6973     $instr->dateDBToForm($valF['archive_date_decision']);
6974     $valF['archive_date_validite']=
6975     $instr->dateDBToForm($valF['archive_date_validite']);
6976     $valF['archive_date_achevement']=
6977     $instr->dateDBToForm($valF['archive_date_achevement']);
6978     $valF['archive_date_chantier']=
6979     $instr->dateDBToForm($valF['archive_date_chantier']);
6980     $valF['archive_date_conformite']=
6981     $instr->dateDBToForm($valF['archive_date_conformite']);
6982     $valF['archive_date_dernier_depot']=
6983     $instr->dateDBToForm($valF['archive_date_dernier_depot']);
6984     $valF['archive_date_limite_incompletude']=
6985     $instr->dateDBToForm($valF['archive_date_limite_incompletude']);
6986     $valF['date_finalisation_courrier']=
6987     $instr->dateDBToForm($valF['date_finalisation_courrier']);
6988     $valF['date_envoi_signature']=
6989     $instr->dateDBToForm($valF['date_envoi_signature']);
6990     $valF['date_retour_signature']=
6991     $instr->dateDBToForm($valF['date_retour_signature']);
6992     $valF['date_envoi_rar']=
6993     $instr->dateDBToForm($valF['date_envoi_rar']);
6994     $valF['date_retour_rar']=
6995     $instr->dateDBToForm($valF['date_retour_rar']);
6996     $valF['date_envoi_controle_legalite']=
6997     $instr->dateDBToForm($valF['date_envoi_controle_legalite']);
6998     $valF['date_retour_controle_legalite']=
6999     $instr->dateDBToForm($valF['date_retour_controle_legalite']);
7000     $valF['date_envoi_rar'] = $date;
7001    
7002     // Vérification de la finalisation du document
7003     // correspondant au code barres
7004     if($instr->getVal("om_final_instruction") === 't') {
7005     $instr->setParameter('maj', 1);
7006 nmeucci 3971 $instr->class_actions[1]["identifier"] =
7007     "envoi lettre RAR (depuis le menu suivi des pièces)";
7008 softime 8989 if ($instr->modifier($valF) == true) {
7009 mbroquet 3730 $id4Gen[] = $code_barres;
7010     $nbLettres ++;
7011     } else {
7012     //
7013     if ($error != "") {
7014     $error .= "<br/>";
7015     }
7016     $error .= sprintf(_("Une erreur s'est produite lors de la modification de l'instruction %s."),
7017     $code_barres);
7018     $error .= " ";
7019     $error .= _("Veuillez contacter votre administrateur.");
7020     }
7021     } else {
7022     //
7023     if ($error != "") {
7024     $error .= "<br/>";
7025     }
7026     $error .= sprintf(_("Le document correspondant au
7027     code barres %s n'est pas finalise,
7028     le bordereau ne sera pas genere."),
7029     $code_barres);
7030     }
7031    
7032     } else {
7033     //
7034     if ($error != "") {
7035     $error .= "<br/>";
7036     }
7037     $error .= _("Une lettre correspondante a l'instruction ayant pour code barres")." ".$code_barres." "._("a deja ete envoyee, le bordereau ne sera pas genere.");
7038     }
7039     } else {
7040     //
7041     if ($error != "") {
7042     $error .= "<br/>";
7043     }
7044     $error .= _("Le numero")." ".$code_barres." "._("ne correspond a aucun code barres d'instruction.");
7045     }
7046     } else {
7047     //
7048     if ($error != "") {
7049     $error .= "<br/>";
7050     }
7051     $error .= _("Le code barres d'instruction")." ".$code_barres." "._("n'est pas valide.");
7052     }
7053     }
7054     }
7055     }
7056     }
7057    
7058     /**
7059     * Affichage des messages et du formulaire
7060     */
7061     // Affichage du message de validation ou d'erreur
7062     if (isset($message) && isset($message_class) && $message != "") {
7063 softime 8989 $this->f->displayMessage($message_class, $message);
7064 mbroquet 3730 }
7065     // Affichage du message d'erreur
7066     if(!empty($error)) {
7067 softime 8989 $this->f->displayMessage("error", $error);
7068 mbroquet 3730 }
7069     // Affichage du message de validation de la saisie
7070     if ($nbLettres > 0) {
7071     //
7072 softime 5504 echo "\n<div class=\"message ui-widget ui-corner-all ui-state-highlight ui-state-valid\" >";
7073     echo "\n<p>";
7074     echo "\n<span class=\"ui-icon ui-icon-info\"></span>";
7075     echo "\n<span class=\"text\">";
7076     echo _("Cliquez sur le lien ci-dessous pour telecharger votre document");
7077     echo " : \n<br/><br/>";
7078     echo "\n<a class='om-prev-icon pdf-16'";
7079 softime 8989 echo "\n title=\""._("imprimer les AR")."\"";
7080 softime 7996 echo "\n href=\"".OM_ROUTE_FORM."&obj=instruction&action=180&idx=0&liste=".implode(",",$id4Gen)."\"";
7081 softime 5504 echo "\n target='_blank'>";
7082 softime 8989 echo _("Telecharger le document pour")." ".$nbLettres." "._("AR");
7083 softime 5504 echo "\n</a>";
7084     echo "\n</span>";
7085     echo "\n</p>";
7086     echo "\n<br/>\n";
7087     if ($isAccredited === true) {
7088     echo '<fieldset id="fieldset-form-rar-lien_di" class="cadre ui-corner-all startClosed" style="background-color: inherite;">';
7089     echo "\n<legend class=\"ui-corner-all ui-widget-content ui-state-active\" style=\"background-color: transparent; color: inherit;\">\n";
7090     echo _('Dossiers concernés par ce traitement');
7091     echo "\n</legend>";
7092     echo "\n<div class=\"fieldsetContent\" style=\"display: none;background-color: inherite\">";
7093    
7094     if ($hasHidden === true) {
7095     echo "\n<br/>";
7096     echo "\n<p>";
7097     echo "\n<span class='text'>";
7098     echo _("Certains dossiers ont été omis de la liste ci-dessous car vous ne possédez pas les permissions nécessaires pour y accéder.");
7099     echo "</span>";
7100     echo "\n</p>";
7101     echo "\n<br/>";
7102     }
7103     foreach ($dossierTab as $dossier) {
7104 softime 7067
7105     $inst_da = $this->get_inst_common("dossier_autorisation", $dossier->getVal('dossier_autorisation'));
7106     $inst_datd = $this->get_inst_common("dossier_autorisation_type_detaille", $inst_da->getVal('dossier_autorisation_type_detaille'));
7107     $code_datd = $inst_datd->getVal('code');
7108    
7109     $obj = "dossier_instruction";
7110     if ($code_datd === 'REC' OR $code_datd === 'REG') {
7111     $obj = "dossier_contentieux_tous_recours";
7112     }
7113     if ($code_datd === 'IN') {
7114     $obj = "dossier_contentieux_toutes_infractions";
7115     }
7116    
7117 softime 5504 echo "\n<div class=\"bloc group\">";
7118     echo "\n<div class=\"field field-type-text\">";
7119    
7120     echo "\n<p>";
7121     echo "\n<span class='text'>";
7122     echo "\n<a class=\"om-icon om-icon-16 consult-16\" title=\"" . _('Consulter') . "\"";
7123 softime 7996 echo "\n href=\"".OM_ROUTE_FORM."&obj=dossier_instruction&action=3&idx=";
7124 softime 5504 echo $dossier->getVal("dossier");
7125     echo "\">";
7126     echo "\n</a>";
7127    
7128     echo "\n<a title=\""._("Consulter")."\" style=\"vertical-align:middle;\"";
7129 softime 7996 echo " href=\"".OM_ROUTE_FORM."&obj=";
7130 softime 7067 echo $obj;
7131     echo "&action=3&idx=";
7132 softime 5504 echo $dossier->getVal("dossier");
7133     echo "\">";
7134     echo $dossier->getVal("dossier_libelle");
7135     echo "\n</a>";
7136     echo "\n</span>";
7137     echo "\n</p>";
7138    
7139     echo "\n</div>";
7140     echo "\n</div>";
7141     }
7142     echo "\n</div>";
7143     echo "\n</fieldset>";
7144     }
7145     echo "\n</div>";
7146     echo "\n</div>";
7147 mbroquet 3730 }
7148     // Ouverture du formulaire
7149     echo "\t<form";
7150     echo " method=\"post\"";
7151     echo " id=\"suivi_envoi_lettre_rar_form\"";
7152     echo " action=\"\"";
7153     echo ">\n";
7154     // Paramétrage des champs du formulaire
7155     $champs = array("date", "liste_code_barres_instruction");
7156     // Création d'un nouvel objet de type formulaire
7157 softime 7996 $form = $this->f->get_inst__om_formulaire(array(
7158     "validation" => 0,
7159     "maj" => 0,
7160     "champs" => $champs,
7161     ));
7162 mbroquet 3730 // Paramétrage du champ date du formulaire
7163     $form->setLib("date", _("Date")."* :");
7164     $form->setType("date", "date");
7165     $form->setOnchange("date", "fdate(this)");
7166     $form->setVal("date", ($date == "" ? date("d/m/Y") : $date));
7167     $form->setTaille("date", 10);
7168     $form->setMax("date", 10);
7169     // Paramétrage du champ liste_code_barres_instruction du formulaire
7170     $form->setLib("liste_code_barres_instruction", _("Liste des codes barres d'instructions scannes")."* :");
7171     $form->setType("liste_code_barres_instruction", "textarea");
7172     $form->setVal("liste_code_barres_instruction", $liste_code_barres_instruction);
7173     $form->setTaille("liste_code_barres_instruction", 20);
7174     $form->setMax("liste_code_barres_instruction", 20);
7175     // Affichage du formulaire
7176     $form->entete();
7177     $form->afficher($champs, 0, false, false);
7178     $form->enpied();
7179     // Affichage du bouton
7180     echo "\t<div class=\"formControls\">\n";
7181 softime 8989 $this->f->layout->display_form_button(array("value" => _("Valider"), "name" => "validation"));
7182 mbroquet 3730 echo "\t</div>\n";
7183     // Fermeture du formulaire
7184     echo "\t</form>\n";
7185     }
7186    
7187     /**
7188     * VIEW - view_suivi_mise_a_jour_des_dates.
7189     *
7190     * Vu pour mettre à jour les dates de suivi de l'instruction.
7191     *
7192     * @return void
7193     */
7194     function view_suivi_mise_a_jour_des_dates() {
7195     // Vérification de l'accessibilité sur l'élément
7196     $this->checkAccessibility();
7197    
7198     // Récupération des valeur passées en POST ou GET
7199 softime 8989 if($this->f->get_submitted_post_value("type_mise_a_jour") !== null) {
7200     $type_mise_a_jour = $this->f->get_submitted_post_value("type_mise_a_jour");
7201     } elseif($this->f->get_submitted_get_value('type_mise_a_jour') !== null) {
7202     $type_mise_a_jour = $this->f->get_submitted_get_value('type_mise_a_jour');
7203 mbroquet 3730 } else {
7204     $type_mise_a_jour = "";
7205     }
7206 softime 8989 if($this->f->get_submitted_post_value('date') !== null) {
7207     $date = $this->f->get_submitted_post_value('date');
7208     } elseif($this->f->get_submitted_get_value('date') !== null) {
7209     $date = $this->f->get_submitted_get_value('date');
7210 mbroquet 3730 } else {
7211     $date = "";
7212     }
7213 softime 8989 if($this->f->get_submitted_post_value('code_barres') !== null) {
7214     $code_barres = $this->f->get_submitted_post_value('code_barres');
7215     } elseif($this->f->get_submitted_get_value('code_barres') !== null) {
7216     $code_barres = $this->f->get_submitted_get_value('code_barres');
7217 mbroquet 3730 } else {
7218     $code_barres = "";
7219     }
7220     // Booléen permettant de définir si un enregistrement à eu lieu
7221     $correct = false;
7222     // Booléen permettant de définir si les dates peuvent êtres enregistrées
7223     $date_error = false;
7224     // Champs date à mettre à jour
7225     $liste_champs=array();
7226    
7227     // Si le formulaire a été validé
7228 softime 8989 if ($this->f->get_submitted_post_value('validation') !== null) {
7229 mbroquet 3730 if(!empty($type_mise_a_jour) and !empty($date) and !empty($code_barres)) {
7230    
7231 softime 6565 // Vérification de l'existence de l'instruction
7232     $sql = "SELECT instruction
7233     FROM ".DB_PREFIXE."instruction
7234     INNER JOIN ".DB_PREFIXE."dossier
7235     ON dossier.dossier=instruction.dossier
7236     INNER JOIN ".DB_PREFIXE."dossier_instruction_type
7237     ON dossier.dossier_instruction_type = dossier_instruction_type.dossier_instruction_type
7238     INNER JOIN ".DB_PREFIXE."dossier_autorisation_type_detaille
7239     ON dossier_instruction_type.dossier_autorisation_type_detaille = dossier_autorisation_type_detaille.dossier_autorisation_type_detaille
7240     INNER JOIN ".DB_PREFIXE."dossier_autorisation_type
7241     ON dossier_autorisation_type_detaille.dossier_autorisation_type = dossier_autorisation_type.dossier_autorisation_type
7242     INNER JOIN ".DB_PREFIXE."groupe
7243     ON dossier_autorisation_type.groupe = groupe.groupe
7244     WHERE code_barres='".$this->f->db->escapesimple($code_barres)."'";
7245 softime 7067
7246     // Ajout d'un filtre sur les groupes auxquels l'utilisateur a accès
7247     $group_clause = array();
7248     foreach ($_SESSION["groupe"] as $key => $value) {
7249     $group_clause[$key] = "(groupe.code = '".$key."'";
7250     if($value["confidentiel"] !== true) {
7251     $group_clause[$key] .= " AND dossier_autorisation_type.confidentiel IS NOT TRUE";
7252     }
7253     $group_clause[$key] .= ")";
7254     }
7255     $conditions = implode(" OR ", $group_clause);
7256     $sql .= " AND (" . $conditions . ")";
7257    
7258    
7259 softime 8989 $res = $this->f->db->query($sql);
7260     $this->f->addToLog(__METHOD__.": db->query(\"".$sql."\")", VERBOSE_MODE);
7261     $this->f->isDatabaseError($res);
7262 mbroquet 3730
7263     if($res->numrows() == 1) {
7264     $liste_champs = explode(";", $type_mise_a_jour);
7265 softime 11418 $row =& $res->fetchRow(DB_FETCHMODE_ASSOC);
7266     $instr = $this->f->get_inst__om_dbform(array(
7267     "obj" => "instruction",
7268     "idx" => $row['instruction'],
7269     ));
7270 mbroquet 3730 // Mise à jour des dates après l'écran de verification
7271 softime 8989 if($this->f->get_submitted_post_value('is_valid') !== null and $this->f->get_submitted_post_value('is_valid') == "true") {
7272 mbroquet 3730 $valF = array();
7273     foreach($instr->champs as $id => $champ) {
7274     $valF[$champ] = $instr->val[$id];
7275     }
7276 softime 6565 $valF['date_evenement'] = $instr->dateDBToForm($valF['date_evenement']);
7277     $valF['archive_date_complet'] = $instr->dateDBToForm($valF['archive_date_complet']);
7278     $valF['archive_date_rejet'] = $instr->dateDBToForm($valF['archive_date_rejet']);
7279     $valF['archive_date_limite'] = $instr->dateDBToForm($valF['archive_date_limite']);
7280     $valF['archive_date_notification_delai'] = $instr->dateDBToForm($valF['archive_date_notification_delai']);
7281     $valF['archive_date_decision'] = $instr->dateDBToForm($valF['archive_date_decision']);
7282     $valF['archive_date_validite'] = $instr->dateDBToForm($valF['archive_date_validite']);
7283     $valF['archive_date_achevement'] = $instr->dateDBToForm($valF['archive_date_achevement']);
7284     $valF['archive_date_chantier'] = $instr->dateDBToForm($valF['archive_date_chantier']);
7285     $valF['archive_date_conformite'] = $instr->dateDBToForm($valF['archive_date_conformite']);
7286     $valF['archive_date_dernier_depot'] = $instr->dateDBToForm($valF['archive_date_dernier_depot']);
7287     $valF['archive_date_limite_incompletude'] = $instr->dateDBToForm($valF['archive_date_limite_incompletude']);
7288     $valF['date_finalisation_courrier'] = $instr->dateDBToForm($valF['date_finalisation_courrier']);
7289     $valF['date_envoi_signature'] = $instr->dateDBToForm($valF['date_envoi_signature']);
7290     $valF['date_retour_signature'] = $instr->dateDBToForm($valF['date_retour_signature']);
7291     $valF['date_envoi_rar'] = $instr->dateDBToForm($valF['date_envoi_rar']);
7292     $valF['date_retour_rar'] = $instr->dateDBToForm($valF['date_retour_rar']);
7293     $valF['date_envoi_controle_legalite'] = $instr->dateDBToForm($valF['date_envoi_controle_legalite']);
7294     $valF['date_retour_controle_legalite'] = $instr->dateDBToForm($valF['date_retour_controle_legalite']);
7295     $valF['archive_date_cloture_instruction'] = $instr->dateDBToForm($valF['archive_date_cloture_instruction']);
7296     $valF['archive_date_premiere_visite'] = $instr->dateDBToForm($valF['archive_date_premiere_visite']);
7297     $valF['archive_date_derniere_visite'] = $instr->dateDBToForm($valF['archive_date_derniere_visite']);
7298     $valF['archive_date_contradictoire'] = $instr->dateDBToForm($valF['archive_date_contradictoire']);
7299     $valF['archive_date_retour_contradictoire'] = $instr->dateDBToForm($valF['archive_date_retour_contradictoire']);
7300     $valF['archive_date_ait'] = $instr->dateDBToForm($valF['archive_date_ait']);
7301     $valF['archive_date_transmission_parquet'] = $instr->dateDBToForm($valF['archive_date_transmission_parquet']);
7302 mbroquet 3730
7303     foreach(explode(";", $type_mise_a_jour) as $maj_date) {
7304     $valF[$maj_date]=$date;
7305     }
7306    
7307     // Vérification de la finalisation du document
7308     // correspondant au code barres
7309     if($valF["om_final_instruction"] === 't' or
7310     $valF["lettretype"] == '') {
7311     $code_barres = "";
7312    
7313     //Désactivation de l'autocommit
7314 softime 8989 $this->f->db->autoCommit(false);
7315 mbroquet 3730
7316     //On modifie les valeurs de l'instruction
7317     $instr->setParameter('maj', 170);
7318 nmeucci 3965 $instr->class_actions[170]["identifier"] =
7319 nmeucci 3972 "mise à jour des dates (depuis le menu suivi des pièces)";
7320 softime 8989 $retour = $instr->modifier($valF);
7321 mbroquet 3730
7322     //Si une erreur s'est produite, on défait les modifications
7323     //qui ont été faites
7324     if (!$retour){
7325     $instr->undoValidation();
7326     }
7327     //Sinon, on valide en base de données les modifications
7328     else {
7329 softime 8989 $this->f->db->commit();
7330 mbroquet 3730 }
7331    
7332     // Variable correct retourné depuis la classe instruction
7333     $correct = $instr->correct;
7334    
7335     // Si la modification sur l'instruction a échoué
7336     if ($correct === false) {
7337    
7338     // Message d'erreur de la classe instruction
7339     $error = $instr->msg;
7340     }
7341    
7342     } else {
7343     // Indique que le traitement est en erreur
7344     $correct = false;
7345     // Message d'erreur
7346     $error = sprintf(_("Le document n'est pas finalise."),
7347     "<span class='bold'>".$code_barres."</span>");
7348     }
7349     } else {
7350     // Récupération des infos du dossier
7351     $sqlInfo = "SELECT dossier.dossier_libelle,
7352     evenement.libelle as evenement,
7353     autorite_competente.code as autorite_competente_code,
7354     autorite_competente.libelle as autorite_competente,
7355     evenement.type as evenement_type,
7356     to_char(date_envoi_signature,'DD/MM/YYYY') as date_envoi_signature,
7357     to_char(date_retour_signature,'DD/MM/YYYY') as date_retour_signature,
7358     to_char(date_envoi_controle_legalite,'DD/MM/YYYY') as date_envoi_controle_legalite,
7359     to_char(date_retour_controle_legalite,'DD/MM/YYYY') as date_retour_controle_legalite,
7360     to_char(date_envoi_rar,'DD/MM/YYYY') as date_envoi_rar,
7361     to_char(date_retour_rar,'DD/MM/YYYY') as date_retour_rar
7362     FROM ".DB_PREFIXE."instruction
7363     INNER JOIN ".DB_PREFIXE."dossier ON
7364     dossier.dossier=instruction.dossier
7365     LEFT JOIN ".DB_PREFIXE."autorite_competente ON
7366     dossier.autorite_competente=autorite_competente.autorite_competente
7367     INNER JOIN ".DB_PREFIXE."evenement ON
7368     instruction.evenement=evenement.evenement
7369     WHERE code_barres='".$code_barres."'";
7370 softime 8989 $resInfo = $this->f->db->query($sqlInfo);
7371     $this->f->isDatabaseError($resInfo);
7372 mbroquet 3730 $infos = $resInfo->fetchRow(DB_FETCHMODE_ASSOC);
7373    
7374     // Vérification de la non modification des dates de suivi
7375     foreach(explode(";", $type_mise_a_jour) as $champ) {
7376 softime 11418 if ($champ === 'date_envoi_controle_legalite') {
7377     if ($instr->is_sent_to_cl() === true) {
7378     $error = __("Les dates de suivis ne peuvent etre modifiees");
7379     $date_error = true;
7380     break;
7381     }
7382     }
7383 mbroquet 3730 if($infos[$champ] != "" AND $infos[$champ] != $date) {
7384     $error = _("Les dates de suivis ne peuvent etre modifiees");
7385     $date_error = true;
7386 softime 11418 break;
7387 mbroquet 3730 }
7388     }
7389     }
7390     } else {
7391     $error = _("Le numero saisi ne correspond a aucun code barres d'instruction.");
7392     }
7393    
7394     } else {
7395     $error = _("Tous les champs doivent etre remplis.");
7396     }
7397     }
7398    
7399     /**
7400     * Affichage des messages et du formulaire
7401     */
7402     // Affichage du message de validation ou d'erreur
7403     if (isset($message) && isset($message_class) && $message != "") {
7404 softime 8989 $this->f->displayMessage($message_class, $message);
7405 mbroquet 3730 }
7406     // Affichage du message d'erreur
7407     if(!empty($error)) {
7408 softime 8989 $this->f->displayMessage("error", $error);
7409 mbroquet 3730 }
7410    
7411     // Affichage du message de validation de la saisie
7412     if($correct === true) {
7413 softime 8989 $this->f->displayMessage("ok", _("Saisie enregistree"));
7414 mbroquet 3730 }
7415     // Ouverture du formulaire
7416     echo "\t<form";
7417     echo " method=\"post\"";
7418     echo " id=\"suivi_mise_a_jour_des_dates_form\"";
7419     echo " action=\"\"";
7420     echo ">\n";
7421     // Paramétrage des champs du formulaire
7422     if(isset($infos)) {
7423     $champs = array("type_mise_a_jour", "date", "code_barres", "dossier_libelle", "evenement"
7424     , "autorite_competente", "date_envoi_signature",
7425     "date_retour_signature", "date_envoi_controle_legalite",
7426     "date_retour_controle_legalite", "date_envoi_rar",
7427     "date_retour_rar", "is_valid");
7428     } else {
7429     $champs = array("type_mise_a_jour", "date", "code_barres");
7430     }
7431     // Création d'un nouvel objet de type formulaire
7432 softime 7996 $form = $this->f->get_inst__om_formulaire(array(
7433     "validation" => 0,
7434     "maj" => 0,
7435     "champs" => $champs,
7436     ));
7437 mbroquet 3730 // Paramétrage des champs du formulaire
7438     // Parametrage du champ type_mise_a_jour
7439     $form->setLib("type_mise_a_jour", _("Date a mettre a jour")."* :");
7440     if(isset($infos)) {
7441     $form->setType("type_mise_a_jour", "selecthiddenstatic");
7442    
7443     } else {
7444     $form->setType("type_mise_a_jour", "select");
7445    
7446     }
7447     $form->setVal("type_mise_a_jour", $type_mise_a_jour);
7448     $contenu = array();
7449    
7450     $contenu[0][0] = "date_envoi_signature";
7451     $contenu[1][0] = _("date d'envoi pour signature Mairie/Prefet");
7452    
7453     $contenu[0][1] = "date_retour_signature";
7454     $contenu[1][1] = _("date de retour de signature Mairie/Prefet");
7455    
7456     $contenu[0][2] = "date_retour_signature;date_envoi_controle_legalite";
7457     $contenu[1][2] = _("date de retour de signature + Envoi controle legalite");
7458    
7459     $contenu[0][3] = "date_envoi_controle_legalite";
7460     $contenu[1][3] = _("date d'envoi au controle de legalite");
7461    
7462     $contenu[0][4] = "date_retour_controle_legalite";
7463     $contenu[1][4] = _("date de retour de controle de legalite");
7464    
7465     $contenu[0][5] = "date_retour_rar";
7466 softime 8989 $contenu[1][5] = __("date de notification du correspondant");
7467 mbroquet 3730
7468     $form->setSelect("type_mise_a_jour", $contenu);
7469    
7470     // Parametrage du champ date
7471     $form->setLib("date", _("Date")."* :");
7472     if(isset($infos)) {
7473     $form->setType("date", "hiddenstaticdate");
7474    
7475     } else {
7476     $form->setType("date", "date");
7477     }
7478     $form->setVal("date", $date);
7479     $form->setTaille("date", 10);
7480     $form->setMax("date", 10);
7481    
7482     // Parametrage du champ code_barres
7483     $form->setLib("code_barres", _("Code barres d'instruction")."* :");
7484     if(isset($infos)) {
7485     $form->setType("code_barres", "hiddenstatic");
7486     } else {
7487     $form->setType("code_barres", "text");
7488     }
7489     $form->setVal("code_barres", $code_barres);
7490     $form->setTaille("code_barres", 20);
7491     $form->setMax("code_barres", 20);
7492    
7493     // Ajout des infos du dossier correspondantes à l'instruction séléctionnée
7494     if(isset($infos)) {
7495    
7496     // Tous les champs sont défini par defaut à static
7497     foreach ($infos as $key => $value) {
7498     $form->setType($key, "static");
7499     if(in_array($key, $liste_champs)) {
7500     $form->setVal($key, $date);
7501     } else {
7502     $form->setVal($key, $value);
7503     }
7504     }
7505    
7506     // Les champs dont on viens de définir la valeur sont en gras
7507     foreach ($liste_champs as $value) {
7508     $form->setBloc($value,'DF',"",'bold');
7509     }
7510    
7511     // Parametrage du champ dossier
7512     $form->setLib("dossier_libelle", _("dossier_libelle")." :");
7513     $form->setType("dossier_libelle", "static");
7514     $form->setVal("dossier_libelle", $infos['dossier_libelle']);
7515    
7516     // Parametrage du champ evenement
7517     $form->setLib("evenement", _("evenement")." :");
7518     $form->setType("evenement", "static");
7519     $form->setVal("evenement", $infos['evenement']);
7520    
7521     // Parametrage du champ autorite_competente
7522     $form->setLib("autorite_competente", _("Autorite competente")." :");
7523     $form->setType("autorite_competente", "static");
7524     $form->setVal("autorite_competente", $infos['autorite_competente']);
7525    
7526 softime 8989 // Parametrage des libellés d'envoi avec AR
7527     $form->setLib("date_envoi_rar", __("date_envoi_ar")." :");
7528     $form->setLib("date_retour_rar", __("date_notification")." :");
7529 mbroquet 3730
7530     $form->setLib("date_envoi_signature", _("date_envoi_signature")." :");
7531     $form->setLib("date_retour_signature", _("date_retour_signature")." :");
7532     $form->setLib("date_envoi_controle_legalite", _("date_envoi_controle_legalite")." :");
7533     $form->setLib("date_retour_controle_legalite", _("date_retour_controle_legalite")." :");
7534     // Configuration des libellé en fonction de l'autorité compétente
7535     if($infos['autorite_competente_code'] == 'ETAT') {
7536     $form->setType("date_envoi_controle_legalite", "hiddendate");
7537     $form->setType("date_retour_controle_legalite", "hiddendate");
7538     }
7539    
7540     // Ajout d'un champ hidden permettant de savoir que le formulaire précédant est celui de vérification
7541     $form->setLib("is_valid", _("Valide")." :");
7542     $form->setType("is_valid", "hidden");
7543     $form->setVal("is_valid", 'true');
7544    
7545     $form->setFieldset('dossier_libelle','D',_('Synthese'));
7546     $form->setFieldset('is_valid','F');
7547    
7548     }
7549    
7550    
7551     // Création du fieldset regroupant les champs permettant la mise à jour des date
7552     $form->setFieldset('type_mise_a_jour','D',_('Mise a jour'));
7553     $form->setFieldset('code_barres','F');
7554     // Affichage du formulaire
7555     $form->entete();
7556     $form->afficher($champs, 0, false, false);
7557     $form->enpied();
7558     // Affichage du bouton
7559     echo "\t<div class=\"formControls\">\n";
7560     //
7561     if(!$date_error) {
7562 softime 8989 $this->f->layout->display_form_button(array("value" => _("Valider"), "name" => "validation"));
7563 mbroquet 3730 }
7564     // Si pas sur l'écran de validation
7565     if(isset($infos)) {
7566 softime 7996 echo "<a class=\"retour\" href=\"".OM_ROUTE_FORM."&obj=instruction_suivi_mise_a_jour_des_dates&action=170&idx=0";
7567 mbroquet 3730 echo "&amp;type_mise_a_jour=".$type_mise_a_jour."&amp;date=".$date."&amp;code_barres=".$code_barres;
7568     echo "\">Retour</a>";
7569     }
7570     echo "\t</div>\n";
7571     // Fermeture du formulaire
7572     echo "\t</form>\n";
7573     }
7574    
7575     /**
7576     * [view_pdf_lettre_rar description]
7577     *
7578     * @return [type] [description]
7579     */
7580     function view_pdf_lettre_rar() {
7581     // Vérification de l'accessibilité sur l'élément
7582     $this->checkAccessibility();
7583 softime 8989 //
7584     $this->f->disableLog();
7585 mbroquet 3730
7586 softime 8989 if($this->f->get_submitted_get_value('liste') != null) {
7587     $listeCodeBarres = explode(',',$this->f->get_submitted_get_value('liste'));
7588 mbroquet 3730
7589     // Classe permettant la mise en page de l'édition pdf
7590     require_once "../obj/pdf_lettre_rar.class.php";
7591     $pdf_lettre_rar = new pdf_lettre_rar('P', 'mm', 'A4');
7592     // Initialisation de la mise en page
7593 softime 8989 $pdf_lettre_rar->init($this->f);
7594 mbroquet 3730
7595     foreach ($listeCodeBarres as $code_barres) {
7596    
7597 softime 7067 // On récupère le dossier
7598     $sql = "SELECT dossier
7599     FROM " . DB_PREFIXE . "instruction
7600     WHERE code_barres = '" . $code_barres . "'";
7601 softime 8989 $dossier = $this->f->db->getOne($sql);
7602 softime 7067 $this->f->addToLog(__METHOD__."(): db->getOne(\"".$sql."\")", VERBOSE_MODE);
7603     $this->f->isDatabaseError($dossier);
7604 softime 7996 $inst_dossier = $this->f->get_inst__om_dbform(array(
7605     "obj" => "dossier",
7606     "idx" => $dossier,
7607     ));
7608 softime 7067
7609     // En fonction du type de dossier, on récupère un demandeur différent dans les requêtes
7610     $groupe = $inst_dossier->get_type_affichage_formulaire();
7611     switch ($groupe) {
7612     case 'CTX IN':
7613     $sql_demandeur = "(lien_dossier_demandeur.petitionnaire_principal IS TRUE AND demandeur.type_demandeur='plaignant')";
7614     break;
7615     case 'CTX RE':
7616     $sql_demandeur = "(lien_dossier_demandeur.petitionnaire_principal IS TRUE AND demandeur.type_demandeur='requerant')";
7617     break;
7618     case 'ADS':
7619     case 'DPC':
7620 softime 10573 case 'CONSULTATION ENTRANTE':
7621 softime 7067 default:
7622     $sql_demandeur = "((lien_dossier_demandeur.petitionnaire_principal IS TRUE AND demandeur.type_demandeur='petitionnaire') OR demandeur.type_demandeur='delegataire')";
7623     break;
7624     }
7625    
7626 mbroquet 3730 // Test si l'evenement est de type arrete et si un délégataire a été nommé
7627     $sql = "SELECT
7628     dossier.dossier_libelle,
7629     evenement.type,
7630 softime 3834 count(lien_dossier_demandeur) as nbdemandeur,
7631     CASE
7632     WHEN division.libelle IS NOT NULL AND phase.code IS NOT NULL
7633     THEN CONCAT(phase.code, ' - ', division.libelle)
7634     ELSE
7635     phase.code
7636     END AS code_phase
7637 mbroquet 3730 FROM ".DB_PREFIXE."instruction
7638     LEFT JOIN ".DB_PREFIXE."dossier
7639     ON instruction.dossier = dossier.dossier
7640 softime 3834 LEFT JOIN ".DB_PREFIXE."division
7641     ON dossier.division = division.division
7642 mbroquet 3730 INNER JOIN ".DB_PREFIXE."evenement ON
7643 softime 3834 instruction.evenement=evenement.evenement
7644     LEFT JOIN ".DB_PREFIXE."phase
7645     ON evenement.phase = phase.phase
7646 mbroquet 3730 inner JOIN ".DB_PREFIXE."lien_dossier_demandeur ON
7647     instruction.dossier=lien_dossier_demandeur.dossier
7648     inner join ".DB_PREFIXE."demandeur on
7649     demandeur.demandeur=lien_dossier_demandeur.demandeur
7650     WHERE code_barres='".$code_barres."'
7651 softime 7067 AND " . $sql_demandeur . "
7652 softime 3834 GROUP BY dossier.dossier_libelle, evenement.type, phase.code, division.libelle";
7653 mbroquet 3730
7654 softime 8989 $res = $this->f->db->query($sql);
7655     $this->f->addToLog(__METHOD__.": db->query(\"".$sql."\")", VERBOSE_MODE);
7656     $this->f->isDatabaseError($res);
7657 mbroquet 3730 $testDemandeur = $res->fetchrow(DB_FETCHMODE_ASSOC);
7658    
7659    
7660     // Recuperation de l'adresse de destination
7661     $sqlAdresse = "SELECT
7662     CASE WHEN demandeur.qualite='particulier'
7663     THEN TRIM(CONCAT_WS(' ', pc.libelle, demandeur.particulier_nom, demandeur.particulier_prenom))
7664     ELSE TRIM(demandeur.personne_morale_denomination)
7665     END as ligne1,
7666     CASE WHEN demandeur.qualite='personne_morale'
7667     THEN TRIM(demandeur.personne_morale_raison_sociale)
7668     ELSE ''
7669     END as ligne1_1,
7670     CASE WHEN demandeur.qualite='personne_morale' AND (demandeur.personne_morale_nom IS NOT NULL OR demandeur.personne_morale_prenom IS NOT NULL)
7671     THEN TRIM(CONCAT_WS(' ', 'rep. par', demandeur.personne_morale_nom, demandeur.personne_morale_prenom))
7672     ELSE ''
7673     END as ligne1_2,
7674     trim(concat(demandeur.numero,' ',demandeur.voie)) as ligne2,
7675     CASE demandeur.complement
7676     WHEN null THEN ''
7677     ELSE trim(demandeur.complement)
7678     END as ligne3,
7679     CASE demandeur.lieu_dit
7680     WHEN null THEN ''
7681     ELSE trim(demandeur.lieu_dit)
7682     END as ligne4,
7683     CONCAT_WS(' ', demandeur.code_postal, demandeur.localite,
7684     (CASE WHEN demandeur.bp IS NOT NULL
7685     THEN CONCAT_WS(' ', 'BP', demandeur.bp)
7686     ELSE ''
7687     END),
7688     (CASE WHEN demandeur.cedex IS NOT NULL
7689     THEN CONCAT_WS(' ', 'CEDEX', demandeur.cedex)
7690     ELSE ''
7691     END))
7692     as ligne5,
7693     code_barres as code_barres
7694     FROM ".DB_PREFIXE."instruction
7695     INNER JOIN ".DB_PREFIXE."dossier ON dossier.dossier = instruction.dossier
7696     INNER JOIN ".DB_PREFIXE."lien_dossier_demandeur ON dossier.dossier = lien_dossier_demandeur.dossier
7697     INNER JOIN ".DB_PREFIXE."demandeur ON lien_dossier_demandeur.demandeur = demandeur.demandeur
7698     LEFT OUTER JOIN ".DB_PREFIXE."civilite as pc ON demandeur.particulier_civilite = pc.civilite OR demandeur.personne_morale_civilite = pc.civilite
7699     WHERE instruction.code_barres ='".$code_barres."'";
7700    
7701     // Envoi pour delegataire ou petitionnaire principal selon le type d'evenement
7702     if($testDemandeur['type'] != 'arrete' AND $testDemandeur['nbdemandeur'] > 1) {
7703     $sqlAdresse .= " AND demandeur.type_demandeur='delegataire'";
7704     } else {
7705 softime 7996 $sqlAdresse .= " AND demandeur.type_demandeur='petitionnaire' AND lien_dossier_demandeur.petitionnaire_principal IS TRUE";
7706 mbroquet 3730 }
7707    
7708 softime 8989 $resAdresse = $this->f->db->query($sqlAdresse);
7709 mbroquet 3730 $adresse_dest = $resAdresse->fetchrow(DB_FETCHMODE_ASSOC);
7710 softime 8989 $this->f->addToLog(__METHOD__.": db->query(\"".$sqlAdresse."\")", VERBOSE_MODE);
7711     $this->f->isDatabaseError($resAdresse);
7712 mbroquet 3730
7713     // Création adresse destinataire sans ligne vide
7714     $adresse_destinataire = array();
7715     if (!empty($adresse_dest['ligne1'])) {
7716     $adresse_destinataire[] = $adresse_dest['ligne1'];
7717     }
7718     if (!empty($adresse_dest['ligne1_1'])) {
7719     $adresse_destinataire[] = $adresse_dest['ligne1_1'];
7720     }
7721     if (!empty($adresse_dest['ligne1_2'])) {
7722     $adresse_destinataire[] = $adresse_dest['ligne1_2'];
7723     }
7724     $adresse_destinataire[] = $adresse_dest['ligne2'];
7725     if (!empty($adresse_dest['ligne3'])) {
7726     $adresse_destinataire[] = $adresse_dest['ligne3'];
7727     }
7728     if (!empty($adresse_dest['ligne4'])) {
7729     $adresse_destinataire[] = $adresse_dest['ligne4'];
7730     }
7731     $adresse_destinataire[] = $adresse_dest['ligne5'];
7732    
7733     // Création du champ specifique
7734     $specifique_content = array();
7735     $specifique_content[] = $adresse_dest['ligne1'];
7736     $specifique_content[] = $adresse_dest['ligne1_1'];
7737     $specifique_content[] = $adresse_dest['ligne1_2'];
7738     $specifique_content[] = $testDemandeur['dossier_libelle'];
7739     $specifique_content[] = "|||||".$adresse_dest['code_barres']."|||||";
7740     unset($adresse_dest['code_barres']);
7741     // Ajout d'une page aux pdf
7742 softime 3834 $pdf_lettre_rar->addLetter($adresse_destinataire, $specifique_content, $testDemandeur['code_phase']);
7743 mbroquet 3730
7744     }
7745     $pdf_output = $pdf_lettre_rar->output("lettre_rar".date("dmYHis").".pdf","S");
7746 softime 7685 $om_edition = $this->f->get_inst__om_edition();
7747 mbroquet 3730 $om_edition->expose_pdf_output($pdf_output, "lettre_rar".date("dmYHis").".pdf");
7748     }
7749     }
7750    
7751     /**
7752     * VIEW - view_bordereau_envoi_maire.
7753     *
7754     * Formulaire demandant :
7755     * - le code-barres de l'événement d'instruction
7756     * - la date d'envoi du courrier pour signature par le maire
7757     *
7758     * Lors de la validation :
7759     * => met à jour cette date dans l'événement d'instruction
7760     * => crée un lien permettant de générer en PDF le bordereau
7761     *
7762     * @return void
7763     */
7764     function view_bordereau_envoi_maire() {
7765     // Vérification de l'accessibilité sur l'élément
7766     $this->checkAccessibility();
7767    
7768     // Récupération des valeur passées en POST ou GET
7769     $code_barres = "";
7770     if($this->f->get_submitted_post_value('code_barres') !== null) {
7771     $code_barres = $this->f->get_submitted_post_value('code_barres');
7772     } elseif($this->f->get_submitted_get_value('code_barres')!==null) {
7773     $code_barres = $this->f->get_submitted_get_value('code_barres');
7774     }
7775     $date = "";
7776     if($this->f->get_submitted_post_value('date') !== null) {
7777     $date = $this->f->get_submitted_post_value('date');
7778     } elseif($this->f->get_submitted_get_value('date') !== null) {
7779     $date = $this->f->get_submitted_get_value('date');
7780     }
7781     $validation = 0;
7782     if($this->f->get_submitted_post_value('validation') !== null) {
7783     $validation = $this->f->get_submitted_post_value('validation');
7784     } elseif($this->f->get_submitted_get_value('validation') !== null) {
7785     $validation = $this->f->get_submitted_get_value('validation');
7786     }
7787    
7788     // Si le formulaire a été validé
7789     if ($this->f->get_submitted_post_value('validation') !== null) {
7790     // Tous les champs doivent obligatoirement être remplis
7791     if (!empty($date) && !empty($code_barres)) {
7792     $date_en = $this->dateDB($date);
7793     // Si date valide
7794     if ($date_en != "") {
7795     $id_instruction = $this->get_instruction_by_barcode($code_barres);
7796     // Si un événement d'instruction a été trouvé pour ce code-barres
7797     if ($id_instruction !== null) {
7798     $ret = $this->update_date_envoi_signature($id_instruction, $date_en);
7799     // Si mise à jour réussie de la date d'envoi du courrier
7800     // pour signature par l'autorité compétente
7801     if($ret === true) {
7802     // Message de validation avec lien PDF
7803     $message_class = "valid";
7804     $message = '&bullet; '._("Veuillez cliquer sur le lien ci-dessous pour telecharger votre bordereau");
7805     $message .= " : <br/><br/>";
7806     $message .= "<a class='om-prev-icon pdf-16'";
7807     $message .= " id=\"generer_bordereau_envoi_maire\"";
7808     $message .= " title=\""._("Bordereau")."\"";
7809 softime 7996 $message .= " href='".OM_ROUTE_FORM."&obj=instruction";
7810 mbroquet 3730 $message .= "&action=200";
7811     $message .= "&idx=".$id_instruction."'";
7812     $message .= " target='_blank'>";
7813     $message .= _("Bordereau d'envoi au maire");
7814     $message .= "</a><br/><br/>";
7815     $message .= '&bullet; '._("Rappel des informations saisies")." :<br/><br/>";
7816     $message .= _("Code du courrier")." : ".$code_barres."<br/>";
7817     $message .= _("Date d'envoi du courrier pour signature par le maire")." : ".$date;
7818    
7819     } else {
7820     // Message d'erreur
7821     $message_class = "error";
7822     $message = sprintf(_("Erreur lors de la mise a jour de l'evenement d'instruction correspondant au code barres %s."),
7823     $code_barres);
7824     }
7825     }
7826     else {
7827     $message_class = "error";
7828     $message = _("Le numero saisi ne correspond a aucun code-barres d'evenement d'instruction.");
7829     }
7830     }
7831     else {
7832     $message_class = "error";
7833     $message = _("La date est invalide.");
7834     }
7835     } else {
7836     $message_class = "error";
7837     $message = _("Tous les champs doivent etre remplis.");
7838     }
7839     }
7840    
7841     /**
7842     * Affichage des messages et du formulaire
7843     */
7844    
7845     // Affichage du message de validation ou d'erreur
7846     if (isset($message) && isset($message_class) && $message != "") {
7847     $this->f->displayMessage($message_class, $message);
7848     }
7849    
7850     // Ouverture du formulaire
7851     $datasubmit = $this->getDataSubmit();
7852     echo "\n<!-- ########## START DBFORM ########## -->\n";
7853     echo "<form";
7854     echo " id=\"bordereau_envoi_maire\"";
7855     echo " method=\"post\"";
7856     echo " name=\"f1\"";
7857     echo " action=\"";
7858     echo $datasubmit;
7859     echo "\"";
7860     echo ">\n";
7861    
7862     // Paramétrage des champs du formulaire
7863     $champs = array("code_barres","date");
7864    
7865     // Création d'un nouvel objet de type formulaire
7866 softime 7996 $form = $this->f->get_inst__om_formulaire(array(
7867     "validation" => 0,
7868     "maj" => 0,
7869     "champs" => $champs,
7870     ));
7871 mbroquet 3730
7872     $template_required_label = '%s *';
7873     // Parametrage du champ code_barres
7874     $form->setLib("code_barres", sprintf($template_required_label,_("Code du courrier")));
7875     $form->setType("code_barres", "text");
7876     $form->setVal("code_barres", $code_barres);
7877     $form->setTaille("code_barres", 20);
7878     $form->setMax("code_barres", 20);
7879     // Parametrage du champ date
7880     $form->setLib("date", sprintf($template_required_label,_("Date d'envoi du courrier pour signature par le maire")));
7881     $form->setType("date", "date") ;
7882     if (empty($date)) {
7883     $date = date('d/m/Y');
7884     }
7885     $form->setVal("date", $date);
7886     $form->setTaille("date", 10);
7887     $form->setMax("date", 10);
7888    
7889     // Création du bloc regroupant les champs
7890     $form->setBloc('code_barres','D');
7891     $form->setBloc('date','F');
7892     // Affichage du formulaire
7893     $form->entete();
7894     $form->afficher($champs, 0, false, false);
7895     $form->enpied();
7896     // Affichage du bouton
7897     printf("\t<div class=\"formControls\">\n");
7898     //
7899     $this->f->layout->display_form_button(array("value" => _("Valider"), "name" => "validation"));
7900     printf("\t</div>\n");
7901     // Fermeture du formulaire
7902     printf("\t</form>\n");
7903     }
7904    
7905     /**
7906     * VIEW - view_bordereau_envoi_maire.
7907     *
7908     * PDF de bordereau d'envoi au maire pour l'événement d'instruction instancié
7909     *
7910     * @return [void]
7911     */
7912     function view_generate_bordereau_envoi_maire() {
7913     // Vérification de l'accessibilité sur l'élément
7914     $this->checkAccessibility();
7915     // Récupération de la collectivité du dossier d'instruction
7916     $collectivite_di = $this->get_dossier_instruction_om_collectivite();
7917     // Récupération de ses paramètres
7918     $collectivite = $this->f->getCollectivite($collectivite_di);
7919     // Génération du PDF
7920     $result = $this->compute_pdf_output('etat', 'communaute_bordereau_envoi_maire', $collectivite, $this->getVal(($this->clePrimaire)));
7921     // Affichage du PDF
7922     $this->expose_pdf_output(
7923     $result['pdf_output'],
7924     $result['filename']
7925     );
7926     }
7927    
7928     /**
7929 softime 10808 * VIEW - view_rapport_instruction.
7930     *
7931     * Ouvre le sous-formulaire en ajaxIt dans un overlay.
7932     * Cette action est bindée pour utiliser la fonction popUpIt.
7933     *
7934     * @return void
7935     */
7936     function view_overlay_notification_manuelle() {
7937    
7938     // Vérification de l'accessibilité sur l'élément
7939     $this->checkAccessibility();
7940    
7941     printf(
7942     '<script type="text/javascript" >
7943     overlayIt(\'%1$s\',\'%2$s&objsf=%1$s&idxformulaire=%4$s&retourformulaire=dossier_instruction&obj=%1$s&action=411&idx=%3$s\', 1);
7944     </script>',
7945     'instruction_notification_manuelle',
7946     OM_ROUTE_SOUSFORM,
7947     $this->getVal($this->clePrimaire),
7948     $this->getVal('dossier')
7949     );
7950     }
7951    
7952     /**
7953 softime 11585 * VIEW - view_overlay_notification_service_consulte.
7954     *
7955     * Ouvre le sous-formulaire de notification des services consulte
7956     * en ajaxIt dans un overlay.
7957     * Cette action est bindée pour utiliser la fonction popUpIt.
7958     *
7959     * @return void
7960     */
7961     function view_overlay_notification_service_consulte() {
7962    
7963     // Vérification de l'accessibilité sur l'élément
7964     $this->checkAccessibility();
7965    
7966     printf(
7967     '<script type="text/javascript" >
7968     overlayIt(\'%1$s\',\'%2$s&objsf=%1$s&idxformulaire=%4$s&retourformulaire=dossier_instruction&obj=%1$s&action=420&idx=%3$s\', 1);
7969     </script>',
7970     'instruction_notification_manuelle',
7971     OM_ROUTE_SOUSFORM,
7972     $this->getVal($this->clePrimaire),
7973     $this->getVal('dossier')
7974     );
7975     }
7976    
7977     /**
7978     * VIEW - overlay_notification_tiers_consulte.
7979     *
7980     * Ouvre le sous-formulaire de notification des tiers consulte
7981     * en ajaxIt dans un overlay.
7982     * Cette action est bindée pour utiliser la fonction popUpIt.
7983     *
7984     * @return void
7985     */
7986     function view_overlay_notification_tiers_consulte() {
7987    
7988     // Vérification de l'accessibilité sur l'élément
7989     $this->checkAccessibility();
7990    
7991     printf(
7992     '<script type="text/javascript" >
7993     overlayIt(\'%1$s\',\'%2$s&objsf=%1$s&idxformulaire=%4$s&retourformulaire=dossier_instruction&obj=%1$s&action=430&idx=%3$s\', 1);
7994     </script>',
7995     'instruction_notification_manuelle',
7996     OM_ROUTE_SOUSFORM,
7997     $this->getVal($this->clePrimaire),
7998     $this->getVal('dossier')
7999     );
8000     }
8001     /**
8002 softime 6565 * Retourne l'événement d'instruction dont on donne le code-barres, avec un filtre
8003     * pour exclure les dossiers du groupe contentieux.
8004 mbroquet 3730 *
8005     * @param [string] $barcode numéro du code-barres
8006     * @return [mixed] ID de son instruction ou null si aucun code
8007     */
8008     function get_instruction_by_barcode($barcode) {
8009     // Begin
8010     $this->begin_treatment(__METHOD__);
8011     // Vérification de l'existence de l'événement d'instruction
8012 softime 6565 // pour le code-barres donné, en excluant les dossiers liés au groupe CTX
8013 mbroquet 3730 $sql = "SELECT instruction
8014 softime 6565 FROM ".DB_PREFIXE."instruction
8015     INNER JOIN ".DB_PREFIXE."dossier
8016     ON dossier.dossier=instruction.dossier
8017     INNER JOIN ".DB_PREFIXE."dossier_instruction_type
8018     ON dossier.dossier_instruction_type = dossier_instruction_type.dossier_instruction_type
8019     INNER JOIN ".DB_PREFIXE."dossier_autorisation_type_detaille
8020     ON dossier_instruction_type.dossier_autorisation_type_detaille = dossier_autorisation_type_detaille.dossier_autorisation_type_detaille
8021     INNER JOIN ".DB_PREFIXE."dossier_autorisation_type
8022     ON dossier_autorisation_type_detaille.dossier_autorisation_type = dossier_autorisation_type.dossier_autorisation_type
8023     INNER JOIN ".DB_PREFIXE."groupe
8024     ON dossier_autorisation_type.groupe = groupe.groupe
8025     AND groupe.code != 'CTX'
8026     WHERE code_barres = '".$this->f->db->escapesimple($barcode)."'";
8027 mbroquet 3730 $res = $this->f->db->getOne($sql);
8028     $this->f->addToLog(__METHOD__." : db->getOne(\"".$sql."\")", VERBOSE_MODE);
8029     $this->f->isDatabaseError($res);
8030     // Retourne résultat
8031     return $this->end_treatment(__METHOD__, $res);
8032     }
8033    
8034     /**
8035     * Met à jour le champ date d'envoi signature
8036     * avec la date fournie et pour l'instruction donnée
8037     *
8038     * @param [string] $id ID de l'événement d'instruction
8039     * @param [string] $date date au format EN
8040     * @return [boolean] true si mise à jour avec succès
8041     */
8042     function update_date_envoi_signature($id, $date) {
8043     // Préparation du tableau
8044     $valF = array();
8045     $valF['date_envoi_signature'] = $date;
8046     // Begin
8047     $this->begin_treatment(__METHOD__);
8048     // Requête
8049 softime 8989 $res = $this->f->db->autoExecute(
8050 mbroquet 3730 DB_PREFIXE.$this->table,
8051     $valF,
8052     DB_AUTOQUERY_UPDATE,
8053     $this->getCle($id)
8054     );
8055     // S'il y a eu une erreur
8056     if (database::isError($res, true)) {
8057     $this->end_treatment(__METHOD__, false);
8058     }
8059     //
8060     return $this->end_treatment(__METHOD__, true);
8061     }
8062    
8063     /**
8064     * Méthode permettant de définir des valeurs à envoyer en base après
8065     * validation du formulaire d'ajout.
8066     * @param array $val tableau des valeurs retournées par le formulaire
8067     */
8068 softime 6929 function setValFAjout($val = array()) {
8069 mbroquet 3730 // Mise à jour du flag created_by_commune lors d'un changement de décision
8070     // par un utilisateur de commune sur un dossier instruit par la comcom
8071 softime 6565 if ($this->isInstrCanChangeDecision($this->valF["dossier"])) {
8072 mbroquet 3730 $this->valF['created_by_commune'] = true;
8073     }
8074 softime 8593
8075     //
8076     if ($this->evenement_has_an_edition($this->valF['evenement']) === false) {
8077     if (isset($this->valF['flag_edition_integrale']) === true) {
8078     unset($this->valF['flag_edition_integrale']);
8079     }
8080     if (isset($this->valF['signataire_arrete']) === true) {
8081     unset($this->valF['signataire_arrete']);
8082     }
8083     }
8084 mbroquet 3730 }
8085 nmeucci 3876
8086 fmichon 3892
8087 fmichon 4708 /**
8088     * Récupère l'instance d'un événement de workflow.
8089     *
8090     * @param mixed $evenement Identifiant de l'événement.
8091     *
8092     * @return object
8093     */
8094     function get_inst_evenement($evenement = null) {
8095     //
8096     return $this->get_inst_common("evenement", $evenement);
8097     }
8098 softime 3976
8099 fmichon 3892 /**
8100 softime 3976 * Logue l'action de l'instruction dans son DI.
8101 nmeucci 3933 *
8102 softime 3976 * @param string $id Clé primaire de l'instruction.
8103     * @param array $val Valeurs de l'instruction.
8104     *
8105     * @return bool Vrai si traitement effectué avec succès
8106 nmeucci 3876 */
8107 softime 3976 private function add_log_to_dossier($id, array $val) {
8108 nmeucci 3933 $maj = $this->getParameter("maj");
8109 nmeucci 3943 // Action = Trace par défaut
8110     $action = $this->get_backtrace();
8111     // Action = Identifant de l'action si contexte connu
8112     if (empty($maj) === false
8113     || (empty($maj) === true && $maj === 0)) {
8114     $action = $this->get_action_param($maj, 'identifier');
8115 nmeucci 3965 if ($action === 'modifier_suivi') {
8116     $action = "modifier (via l'action suivi des dates)";
8117     }
8118 nmeucci 4108 if ($action === 'notifier_commune'
8119     && isset($val['mails_destinataires']) === true) {
8120     $action = "notification de la commune (courriels : ";
8121     $action .= $val['mails_destinataires'].")";
8122     }
8123 nmeucci 3943 }
8124 nmeucci 3876 // Création du log
8125     $log = array(
8126     'date' => date('Y-m-d H:i:s'),
8127     'user' => $_SESSION['login'],
8128     'action' => $action,
8129     'values' => array(
8130     'date_evenement' => $this->dateDB($val['date_evenement']),
8131     'date_retour_rar' => $this->dateDB($val['date_retour_rar']),
8132     'date_retour_signature' => $this->dateDB($val['date_retour_signature']),
8133     'evenement' => $val['evenement'],
8134     'action' => $val['action'],
8135 nmeucci 3963 'instruction' => $id,
8136 nmeucci 3876 'etat' => $val['etat'],
8137     ),
8138     );
8139     // Ajout du log
8140 softime 3976 $di = $this->get_inst_dossier($val['dossier']);
8141 nmeucci 3876 $ret = $di->add_log_instructions($log);
8142     if ($ret === false) {
8143     $this->correct = false;
8144     $this->msg = '';
8145     $this->addToMessage($di->msg);
8146     }
8147     return $ret;
8148     }
8149 nmeucci 3943
8150 softime 3976
8151 nmeucci 3943 /**
8152 softime 3976 * Retourne le contexte de déboguage formaté en HTML.
8153 nmeucci 3943 *
8154 softime 3976 * @return string Une ligne par trace
8155 nmeucci 3943 */
8156     private function get_backtrace() {
8157     $trace = debug_backtrace();
8158 nmeucci 3957 $backtrace = '';
8159     $i = 1;
8160 nmeucci 3943 foreach ($trace as $key => $value) {
8161 nmeucci 3957 $func = $trace[$key]['function'];
8162     // On ne s'autolog pas
8163     if ($func === 'get_backtrace'
8164     || $func === 'add_log_to_dossier') {
8165     continue;
8166     }
8167     $backtrace .= $i.') ';
8168     // Si dans une classe
8169     if (isset($trace[$key]['class']) === true
8170     && empty($trace[$key]['class']) === false) {
8171 nmeucci 3963 $backtrace .= $trace[$key]['class'].'->'.$func;
8172 nmeucci 3957 }
8173     // Si procédural
8174     else {
8175     $file = $trace[$key]['file'];
8176 nmeucci 3963 $line = $trace[$key]['line'];
8177 softime 3976 $truncated_file = $this->f->get_relative_path($file);
8178 nmeucci 3963 if ($truncated_file !== false) {
8179     $file = $truncated_file;
8180     }
8181     $backtrace .= $func.' IN<br/>&nbsp;&nbsp;&nbsp;&nbsp; '.$file.':'.$line;
8182 nmeucci 3957 }
8183     $backtrace .= '<br/>';
8184     $i++;
8185 nmeucci 3943 }
8186 nmeucci 3957 return $backtrace;
8187 nmeucci 3943 }
8188 nmeucci 3963
8189 nmeucci 4108 /**
8190     * CONDITION - is_notifiable.
8191     *
8192     * Condition pour afficher l'action notifier_commune.
8193     *
8194     * @return boolean
8195     */
8196     public function is_notifiable() {
8197     // L'instruction doit être finalisée, ce qui revient à dire
8198     // définalisable sans bypass
8199     if ($this->is_unfinalizable_without_bypass() === false) {
8200     return false;
8201     }
8202     // La collectivité de l'utilisateur doit être de niveau multi
8203     if ($this->f->has_collectivite_multi() === false) {
8204     return false;
8205     }
8206     // Le paramètre multi de l'objet du courriel doit exister
8207     if ($this->f->getParameter('param_courriel_de_notification_commune_objet_depuis_instruction') === NULL) {
8208     return false;
8209     }
8210     // Le paramètre multi du modèle du courriel doit exister
8211     if ($this->f->getParameter('param_courriel_de_notification_commune_modele_depuis_instruction') === NULL) {
8212     return false;
8213     }
8214     // A ce stade toutes les conditions sont satisfaites
8215     return true;
8216     }
8217 nmeucci 3963
8218 nmeucci 4108 /**
8219     * TREATMENT - notifier_commune.
8220     *
8221     * Notifie aux communes et par courriel la finalisation d'une instruction.
8222     *
8223     * @return boolean
8224     */
8225     public function notifier_commune() {
8226     // Cette méthode permet d'exécuter une routine en début des méthodes
8227     // dites de TREATMENT.
8228     $this->begin_treatment(__METHOD__);
8229     // Définition des paramètres
8230     $p_objet = 'param_courriel_de_notification_commune_objet_depuis_instruction';
8231     $p_modele = 'param_courriel_de_notification_commune_modele_depuis_instruction';
8232     $p_courriel = 'param_courriel_de_notification_commune';
8233     // Définition des variables de substitution
8234     $id_di = $this->getVal('dossier');
8235     $id_inst = $this->getVal($this->clePrimaire);
8236     // Instanciation du DI
8237     $di = $this->get_inst_dossier($id_di);
8238     // Récupération du paramétrage de la collectivité du dossier
8239     $collectivite_di = $di->getVal('om_collectivite');
8240     $params_mono = $this->f->getCollectivite($collectivite_di);
8241     // Récupération du paramétrage de la collectivité multi
8242     $collectivite_multi = $this->f->get_idx_collectivite_multi();
8243     $params_multi = $this->f->getCollectivite($collectivite_multi);
8244     // Vérification de l'objet (obligatoirement multi)
8245     $objet = null;
8246     if (isset($params_multi[$p_objet]) === true
8247     && $params_multi[$p_objet] !== '') {
8248     $objet = $params_multi[$p_objet];
8249     }
8250     // Vérification du modèle mono en priorité
8251     $modele = null;
8252     if (isset($params_mono[$p_modele]) === true
8253     && $params_mono[$p_modele] !== '') {
8254     $modele = $params_mono[$p_modele];
8255    
8256     }
8257     // Sinon vérification du modèle multi
8258     if ($modele === null
8259     && isset($params_multi[$p_modele]) === true
8260     && $params_multi[$p_modele] !== '') {
8261     $modele = $params_multi[$p_modele];
8262     }
8263     // Vérification des adresses de courriel mono
8264     $courriels_valides = array();
8265     $courriels_invalides = array();
8266     if (isset($params_mono[$p_courriel]) === true
8267     && $params_mono[$p_courriel] !== '') {
8268     // Un mail par ligne
8269     $adresses = explode("\n", $params_mono[$p_courriel]);
8270     // Vérification de la validité de chaque mail avec preg_match
8271     foreach ($adresses as $adresse) {
8272     $adresse = trim($adresse);
8273     if ($this->f->checkValidEmailAddress($adresse) === 1) {
8274     $courriels_valides[] = $adresse;
8275     } else {
8276     $courriels_invalides[] = $adresse;
8277     }
8278     }
8279     }
8280     // Vérification du paramétrage global :
8281     // on stoppe le traitement si au moins un paramètre est incorrect
8282     if ($objet === null
8283     || $modele === null
8284     || count($courriels_valides) === 0
8285     || count($courriels_invalides) > 0) {
8286     // On construit le message d'erreur adéquat
8287     $this->addToMessage(_('Erreur de paramétrage :'));
8288     if ($objet === null) {
8289     $this->addToMessage(_("* l'objet du courriel envoyé aux communes est vide"));
8290     }
8291     if ($modele === null) {
8292     $this->addToMessage(_("* le modèle du courriel envoyé aux communes est vide"));
8293     }
8294     if (count($courriels_valides) === 0) {
8295     $this->addToMessage(_("* aucun courriel valide de destinataire de la commune"));
8296     }
8297     if (count($courriels_invalides) > 0) {
8298     $courriels_invalides = implode(', ', $courriels_invalides);
8299     $this->addToMessage(_("* un ou plusieurs courriels des destinataires de la commune sont invalides : ").$courriels_invalides);
8300     }
8301     $this->addToMessage(_("Veuillez contacter votre administrateur."));
8302     return $this->end_treatment(__METHOD__, false);
8303     }
8304     // Remplacement des variables de substitution
8305     $objet = str_replace('<DOSSIER_INSTRUCTION>', $id_di, $objet);
8306     $modele = $this->formater_modele($modele, $id_di, $id_inst);
8307     // Exécution du traitement d'envoi du/des mail(s)
8308     $fails = array();
8309     foreach ($courriels_valides as $email) {
8310     if ($this->f->sendMail(
8311     iconv("UTF-8", "CP1252", $objet),
8312     iconv("UTF-8", "CP1252", $modele),
8313     iconv("UTF-8", "CP1252", $email)) === false) {
8314     $fails[] = $email;
8315     }
8316     }
8317     // Si échec message d'erreur et arrêt du traitement
8318     if (count($fails) > 0) {
8319     $fails = implode(', ', $fails);
8320     $this->addToMessage(_("Erreur lors de l'envoi du courriel aux destinataires : ").$fails);
8321     $this->addToMessage(_("Veuillez contacter votre administrateur."));
8322     return $this->end_treatment(__METHOD__, false);
8323     }
8324     // Ajout du log
8325     $this->setValFFromVal();
8326     $val_inst = $this->valF;
8327     $val_inst['mails_destinataires'] = implode(', ', $courriels_valides);
8328     if ($this->add_log_to_dossier($id_inst, $val_inst) === false) {
8329     $this->addToMessage(_("Erreur lors de la notification."));
8330     $this->addToMessage(_("Veuillez contacter votre administrateur."));
8331     return $this->end_treatment(__METHOD__, false);
8332     }
8333     // Message de validation
8334     $this->addToMessage(_('La commune a été notifiée.'));
8335     return $this->end_treatment(__METHOD__, true);
8336     }
8337    
8338     /**
8339     * Formatte le corps du courriel notifié aux communes
8340     *
8341     * @param string $modele template du modèle du courriel
8342     * @param string $id_di clé primaire du DI
8343     * @param string $id_inst clé primaire de l'instruction
8344     * @return string corps du mail au format HTML
8345     */
8346     public function formater_modele($modele, $id_di, $id_inst) {
8347     // Création du lien d'accès direct à l'instruction
8348 softime 7996 $url_inst = PATH_BASE_URL.'app/index.php?module=form&direct_link=true&obj=dossier_instruction&action=3'.
8349 nmeucci 4108 '&direct_field=dossier&direct_form=instruction&direct_action=3&direct_idx='.$id_inst;
8350     $url_inst = '<a href="'.$url_inst.'">'.$url_inst.'</a>';
8351     // Remplacement des champs de fusion
8352     $modele = str_replace('<DOSSIER_INSTRUCTION>', $id_di, $modele);
8353     $modele = str_replace('<URL_INSTRUCTION>', $url_inst, $modele);
8354     $modele = str_replace('<ID_INSTRUCTION>', $id_inst, $modele);
8355     // Encodage HTML des sauts de ligne
8356     $modele = preg_replace("/\r\n|\r|\n/",'<br/>',$modele);
8357     //
8358     return $modele;
8359     }
8360 softime 5169
8361    
8362     /**
8363     * Récupère l'instance de l'instructeur
8364     *
8365     * @param integer $instructeur Identifiant de l'instructeur.
8366     *
8367     * @return object
8368     */
8369     protected function get_inst_instructeur($instructeur) {
8370     //
8371     return $this->get_inst_common("instructeur", $instructeur);
8372     }
8373    
8374    
8375     /**
8376     * Récupère l'instance de l'utilisateur
8377     *
8378     * @param integer $om_utilisateur Identifiant de l'utilisateur.
8379     *
8380     * @return object
8381     */
8382     protected function get_inst_om_utilisateur($om_utilisateur) {
8383     //
8384     return $this->get_inst_common("om_utilisateur", $om_utilisateur);
8385     }
8386    
8387    
8388 softime 6565 /**
8389 softime 5295 * Récupère l'instance de la division.
8390     *
8391     * @param integer $division Identifiant de la division.
8392     *
8393     * @return object
8394     */
8395     protected function get_inst_division($division) {
8396     //
8397     return $this->get_inst_common("division", $division);
8398     }
8399    
8400    
8401     /**
8402     * Récupère l'instance de la direction.
8403     *
8404     * @param integer $direction Identifiant de la direction.
8405     *
8406     * @return object
8407     */
8408     protected function get_inst_direction($direction) {
8409     //
8410     return $this->get_inst_common("direction", $direction);
8411     }
8412    
8413    
8414     /**
8415     * Récupère la collectivité d'un instructeur en passant par sa division puis
8416     * par sa direction.
8417     *
8418     * @param integer $instructeur Identifiant de l'instructeur.
8419     *
8420     * @return integer
8421     */
8422     protected function get_instructeur_om_collectivite($instructeur) {
8423     // Chemin vers la collectivité d'un instructeur
8424     $inst_instr = $this->get_inst_instructeur($instructeur);
8425     $inst_division = $this->get_inst_division($inst_instr->getVal('division'));
8426     $inst_direction = $this->get_inst_direction($inst_division->getVal('direction'));
8427    
8428     // Collectivité
8429     $om_collectivite = $inst_direction->getVal('om_collectivite');
8430    
8431     //
8432     return $om_collectivite;
8433     }
8434    
8435 softime 6565 /*
8436     * CONDITION - can_user_access_dossier_contexte_ajout
8437     *
8438     * Vérifie que l'utilisateur a bien accès au dossier d'instruction passé dans le
8439     * formulaire d'ajout.
8440     * Cette méthode vérifie que l'utilisateur est lié au groupe du dossier, et si le
8441     * dossier est confidentiel qu'il a accès aux confidentiels de ce groupe.
8442     *
8443     */
8444     function can_user_access_dossier_contexte_ajout() {
8445 softime 5295
8446 softime 6565 ($this->f->get_submitted_get_value('idxformulaire') !== null ? $id_dossier =
8447     $this->f->get_submitted_get_value('idxformulaire') : $id_dossier = "");
8448     //
8449     if ($id_dossier !== "") {
8450 softime 7996 $dossier = $this->f->get_inst__om_dbform(array(
8451     "obj" => "dossier_instruction",
8452     "idx" => $id_dossier,
8453     ));
8454 softime 6565 //
8455     return $dossier->can_user_access_dossier();
8456     }
8457     return false;
8458     }
8459    
8460     /*
8461     * CONDITION - can_user_access_dossier
8462     *
8463     * Vérifie que l'utilisateur a bien accès au dossier lié à l'instruction instanciée.
8464     * Cette méthode vérifie que l'utilisateur est lié au groupe du dossier, et si le
8465     * dossier est confidentiel qu'il a accès aux confidentiels de ce groupe.
8466     *
8467     */
8468     function can_user_access_dossier_contexte_modification() {
8469    
8470     $id_dossier = $this->getVal('dossier');
8471     //
8472     if ($id_dossier !== "" && $id_dossier !== null) {
8473 softime 7996 $dossier = $this->f->get_inst__om_dbform(array(
8474     "obj" => "dossier_instruction",
8475     "idx" => $id_dossier,
8476     ));
8477 softime 6565 //
8478     return $dossier->can_user_access_dossier();
8479     }
8480     return false;
8481     }
8482    
8483 softime 8593 /**
8484 softime 10713 * TREATMENT - envoyer_a_signature_sans_relecture
8485     *
8486     * Permet d'envoyer le document de l'instruction au parapheur pour signature sans relecture
8487     *
8488     * @return boolean true si l'envoi a été effectué avec succès false sinon
8489     */
8490     function envoyer_a_signature_sans_relecture() {
8491     return $this->envoyer_a_signature();
8492     }
8493    
8494     /**
8495     * TREATMENT - envoyer_a_signature_avec_relecture
8496     *
8497     * Permet d'envoyer le document de l'instruction au parapheur pour signature avec relecture
8498     *
8499     * @return boolean true si l'envoi a été effectué avec succès false sinon
8500     */
8501     function envoyer_a_signature_avec_relecture() {
8502 softime 10808 $is_forced_view_files = true;
8503     return $this->envoyer_a_signature($is_forced_view_files);
8504 softime 10713 }
8505    
8506     /**
8507 softime 10573 * TREATMENT - envoyer_a_signature
8508     *
8509     * Permet d'envoyer le document de l'instruction au parapheur pour signature
8510 softime 10713 *
8511     * @param boolean $is_forced_view_files Indique si il y a une relecture (true) ou non (false)
8512 softime 10573 *
8513     * @return boolean true si l'envoi a été effectué avec succès false sinon
8514     */
8515 softime 10713 function envoyer_a_signature($is_forced_view_files = false) {
8516 softime 10573 $this->begin_treatment(__METHOD__);
8517     $this->correct = true;
8518    
8519     // Instanciation de l'objet signataire_arrete
8520     $inst_signataire_arrete = $this->f->get_inst__om_dbform(array(
8521     'obj' => 'signataire_arrete',
8522     'idx' => $this->getVal('signataire_arrete'),
8523     ));
8524    
8525     // Instanciation de l'objet dossier
8526     $inst_dossier = $this->f->get_inst__om_dbform(array(
8527     'obj' => 'dossier',
8528     'idx' => $this->getVal('dossier'),
8529     ));
8530    
8531     // Récupération du document à signer
8532     $file = $this->f->storage->get($this->getVal('om_fichier_instruction'));
8533     if ($file === OP_FAILURE) {
8534     $this->correct = false;
8535     $this->addToMessage(__("Une erreur est survenue lors de la récupération du contenu du document de l'instruction."));
8536     // Termine le traitement
8537     return $this->end_treatment(__METHOD__, false);
8538     }
8539    
8540     // Initialisation des paramètre à passer pour l'envoi en signature
8541 softime 10808 $data = array(
8542 softime 10573 "om_utilisateur_email" => $this->f->om_utilisateur['email'],
8543     "om_utilisateur_nom" => $this->f->om_utilisateur['nom'],
8544     "signataire_arrete_email" => $inst_signataire_arrete->getVal('email'),
8545     "signataire_arrete_nom" => $inst_signataire_arrete->getVal('nom'),
8546     "signataire_arrete_prenom" => $inst_signataire_arrete->getVal('prenom'),
8547 softime 11876 // Permet d'envoyer en signature l'instruction le jour de la date limite
8548     "date_limite_instruction" => $this->compute_date_limite(1),
8549 softime 10573 "dossier" => $this->getVal('dossier'),
8550 softime 10713 "is_forced_view_files" => $is_forced_view_files,
8551     'commentaire_signature' => $is_forced_view_files === true ? __('relecture demandee.') : null
8552 softime 10573 );
8553    
8554 softime 10808 // Initialisation des métadonnées
8555     $metadonnee_dossier = $file['metadata'];
8556 softime 11228 // récupération de l'extension du fichier
8557     $extension = substr($metadonnee_dossier['filename'], strrpos($metadonnee_dossier['filename'], '.'));
8558     // Modification du libellé du document transmis au parapheur
8559     // pour le mettre sous la forme : instruction_xxx_libelle_lettretype.extension
8560     $metadonnee_dossier['filename'] = $this->getDocumentLibelle().$extension;
8561     $metadonnee_dossier['titre_document'] = $this->getDocumentTitre();
8562 softime 10808
8563     $metadonnee_dossier['url_di'] = sprintf(
8564     '%sapp/index.php?module=form&direct_link=true&obj=dossier_instruction&action=3&direct_field=dossier&direct_form=instruction&direct_action=3&direct_idx=%s',
8565 softime 11418 $this->f->get_param_base_path_metadata_url_di() !== null ? $this->f->get_param_base_path_metadata_url_di() : PATH_BASE_URL,
8566 softime 10808 $this->getVal($this->clePrimaire)
8567     );
8568    
8569     $optional_data = null;
8570     // Si il y a des paramètres supplémentaire spécifié dans le signataire alors on les récupère
8571     if ($inst_signataire_arrete->getVal('parametre_parapheur') !== null && $inst_signataire_arrete->getVal('parametre_parapheur') !== '') {
8572     $optional_data = json_decode($inst_signataire_arrete->getVal('parametre_parapheur'), true);
8573     if (json_last_error() !== JSON_ERROR_NONE) {
8574     $this->correct = false;
8575     $this->addToMessage(__("Les paramètres supplémentaires envoyés au parapheur ne sont pas au bon format."));
8576     $this->addToLog(__METHOD__."(): ".
8577     __("Erreur lors du décodage du format json des paramètres supplémentaires envoyé au parapheur.
8578     Tableau : ").var_export($inst_signataire_arrete->getVal('parametre_parapheur'), true)
8579     );
8580     // Termine le traitement
8581     return $this->end_treatment(__METHOD__, false);
8582     }
8583     }
8584    
8585 softime 10573 //Instanciation de la classe electronicsignature
8586     $inst_es = $this->get_electronicsignature_instance();
8587     if ($inst_es === false) {
8588     $this->correct = false;
8589     return $this->end_treatment(__METHOD__, false);
8590     }
8591    
8592     // Appel de la méthode de l'abstracteur send_for_signature()
8593     // Cette méthode doit retourner un tableau de valeur
8594     try {
8595 softime 10808 $result = $inst_es->send_for_signature($data, $file['file_content'], $metadonnee_dossier, $optional_data);
8596 softime 10573 } catch (electronicsignature_exception $e) {
8597     $this->handle_electronicsignature_exception($e);
8598     return $this->end_treatment(__METHOD__, false);
8599     }
8600    
8601     // Après avoir reçu le résultat du parapheur, il faut mettre à jour les champs
8602     $valF = array();
8603    
8604     // Pour appeler la fonction modifier il faut traiter tous les champs de l'objet
8605     foreach($this->champs as $identifiant => $champ) {
8606     $valF[$champ] = $this->val[$identifiant];
8607     }
8608     // On fait ensuite nos modifications spécifiques
8609     $valF['id_parapheur_signature'] = $result['id_parapheur_signature'];
8610     $valF['statut_signature'] = $result['statut'];
8611     $valF['commentaire_signature'] = isset($result['commentaire_signature']) == true ? $result['commentaire_signature'] : null;
8612     $valF['date_envoi_signature'] = date("Y-m-d", strtotime($result['date_envoi_signature']));
8613     $valF['historique_signature'] = $this->get_updated_historique_signature($result);
8614    
8615     $ret = $this->modifier($valF);
8616    
8617     if ($ret === false) {
8618     $this->correct = false;
8619     $this->addToMessage(__("Une erreur est survenue lors de la mise à jour des champs."));
8620     // Termine le traitement
8621     return $this->end_treatment(__METHOD__, false);
8622     }
8623    
8624     // Message
8625     $this->addToMessage(__("Le document a été envoyé pour signature dans le parapheur."));
8626     if (array_key_exists('signature_page_url', $result) === true) {
8627     $this->addToMessage(sprintf(
8628 softime 11228 '<br> > <a href="%1$s" title="%2$s" target="_blank">%2$s</a>',
8629     $result['signature_page_url'],
8630     __("Signez directement le document")
8631 softime 10573 ));
8632     }
8633    
8634     // Tout s'est bien passé, on termine le traitement
8635     return $this->end_treatment(__METHOD__, true);
8636     }
8637    
8638     /**
8639 softime 11876 * Permet de récupérer la bonne date limite en fonction de si l'instruction
8640     * est en incomplet notifié ou non.
8641     * On peut ajouter des jours à cette date grâce au paramètre "delay".
8642     * Cette fonction est utilisée dans un cas spécifique où on veut envoyer
8643     * l'instruction en signature le jour de la date limite.
8644     *
8645     * @param int $delay Le nombre de jour à ajouter à la date limite.
8646     *
8647     * @return string $date_limite la date limite calculé ou false
8648     */
8649     private function compute_date_limite($delay) {
8650     // Instanciation de l'objet dossier
8651     $inst_dossier = $this->f->get_inst__om_dbform(array(
8652     'obj' => 'dossier',
8653     'idx' => $this->getVal('dossier'),
8654     ));
8655    
8656     $date_to_compute = null;
8657     if ($inst_dossier->getVal('incomplet_notifie') === 't') {
8658     $date_to_compute = $inst_dossier->getVal('date_limite_incompletude');
8659     } else {
8660     $date_to_compute = $inst_dossier->getVal('date_limite');
8661     }
8662    
8663     $date_limite = date("Y-m-d", strtotime($date_to_compute."+ $delay days"));
8664    
8665     return $date_limite;
8666     }
8667    
8668     /**
8669 softime 10573 * Permet de récupérer la traduction de la valeur de statut_signature
8670     *
8671     * @return string la valeur de statut_signature traduite | false
8672     */
8673     function get_trad_for_statut($value_to_trad){
8674     $statut_signature_tab = array(
8675     'waiting' => __('en préparation'),
8676     'in_progress' => __('en cours de signature'),
8677     'canceled' => __('signature annulée'),
8678 softime 10808 'expired' => __('délai de signature expiré'),
8679 softime 10573 'finished' => __('signé')
8680     );
8681     if (array_key_exists($value_to_trad, $statut_signature_tab) === true) {
8682     return $statut_signature_tab[$value_to_trad];
8683     }
8684    
8685     return false;
8686     }
8687    
8688     /**
8689     * Permet de mettre à jour le tableau json sotcké dans le champ historique_signature
8690     *
8691     * @return string (json) la valeur de historique_signature mis à jour | false
8692     */
8693     function get_updated_historique_signature($historique_signature_values) {
8694    
8695     $historique_signature_value_tab = $this->get_historique_signature_decoded();
8696    
8697     if ($historique_signature_value_tab === false) {
8698     $this->addToLog(__METHOD__."(): erreur historique signature", DEBUG_MODE);
8699     return false;
8700     }
8701    
8702     $last_val_historique_signature = array();
8703    
8704     // Si la tableau récupéré n'est pas vide alors
8705     // on récupère la dernière ligne du tableau
8706     if (empty($historique_signature_value_tab) === false) {
8707     $last_val_historique_signature = end($historique_signature_value_tab);
8708     }
8709    
8710     $format_date = '';
8711     $format_date_hour = '';
8712     $date_converted=array();
8713    
8714     $date_to_convert = array(
8715     'date_envoi_signature' => $historique_signature_values['date_envoi_signature'],
8716 softime 11876 'date_limite_instruction' => $this->compute_date_limite(0),
8717 softime 10573 'date_retour_signature' => $historique_signature_values['date_retour_signature']
8718     );
8719    
8720     // Conversion des dates en fonction de leur format
8721     foreach ($date_to_convert as $key => $value) {
8722     $date_converted[$key] = null;
8723     if ($value != null) {
8724     $format_date = 'd/m/Y';
8725     $format_date_hour = 'd/m/Y H:i:s';
8726     $date_converted[$key] = empty(date_parse($value)['hour']) === false ? date($format_date_hour, strtotime($value)) : date($format_date, strtotime($value));
8727     }
8728     }
8729    
8730     // Ce tableau permet de lister les colonnes de historique_signature et de les rendre traduisibles.
8731     // Il faut en effet mettre les gettext avec l'intitulé explicite au moins
8732     // une fois afin qu'il puisse être reconnu par le logiciel de traduction.
8733     $tab_for_columns_trad = array(
8734     __('entry_date'),
8735     __('id_parapheur_signature'),
8736     __('emetteur'),
8737     __('signataire'),
8738     __('date_envoi'),
8739     __('date_limite'),
8740     __('date_retour'),
8741     __('statut_signature'),
8742     __('commentaire_signature')
8743     );
8744    
8745     array_push($historique_signature_value_tab, array(
8746     'entry_date' => date('d/m/Y H:i:s'),
8747     'id_parapheur_signature' => $historique_signature_values['id_parapheur_signature'] == null ? (isset($last_val_historique_signature['id_parapheur_signature']) === true ? $last_val_historique_signature['id_parapheur_signature'] : null) : $historique_signature_values['id_parapheur_signature'],
8748     'emetteur' => $historique_signature_values['om_utilisateur_email'] == null ? (isset($last_val_historique_signature['emetteur']) === true ? $last_val_historique_signature['emetteur'] : null) : $historique_signature_values['om_utilisateur_email'],
8749     'signataire' => $historique_signature_values['signataire_arrete_email'] == null ? (isset($last_val_historique_signature['signataire']) === true ? $last_val_historique_signature['signataire'] : null) : $historique_signature_values['signataire_arrete_email'],
8750     'date_envoi' => $historique_signature_values['date_envoi_signature'] == null ? (isset($last_val_historique_signature['date_envoi']) === true ? $last_val_historique_signature['date_envoi'] : null) : $date_converted['date_envoi_signature'],
8751     'date_limite' => $historique_signature_values['date_limite_instruction'] == null ? (isset($last_val_historique_signature['date_limite']) === true ? $last_val_historique_signature['date_limite'] : null) : $date_converted['date_limite_instruction'],
8752     'date_retour' => $historique_signature_values['date_retour_signature'] == null ? (isset($last_val_historique_signature['date_retour']) === true ? $last_val_historique_signature['date_retour'] : null) : $date_converted['date_retour_signature'],
8753     'statut_signature' => $historique_signature_values['statut'] == null ? (isset($last_val_historique_signature['statut_signature']) === true ? $last_val_historique_signature['statut_signature'] : null) : $this->get_trad_for_statut($historique_signature_values['statut']),
8754     'commentaire_signature' => isset($historique_signature_values['commentaire_signature']) === false || $historique_signature_values['commentaire_signature'] == null ? null : $historique_signature_values['commentaire_signature'],
8755     ));
8756    
8757     return json_encode($historique_signature_value_tab, JSON_HEX_APOS);
8758     }
8759 softime 11876
8760     /**
8761     * TREATMENT - annuler_envoi_en_signature
8762     *
8763     * Permet d'annuler l'envoi du document de l'instruction au parapheur pour signature
8764     *
8765     * @return boolean true si l'annulation a été effectué avec succès false sinon
8766     */
8767     function annuler_envoi_en_signature() {
8768     $this->begin_treatment(__METHOD__);
8769     $this->correct = true;
8770 softime 10573
8771 softime 11876 //Instanciation de la classe electronicsignature
8772     $inst_es = $this->get_electronicsignature_instance();
8773     if ($inst_es === false) {
8774     $this->correct = false;
8775     return $this->end_treatment(__METHOD__, false);
8776     }
8777 softime 10573
8778 softime 11876 $data = array();
8779     if (! empty($this->getVal('id_parapheur_signature'))) {
8780     $data['id_parapheur_signature'] = $this->getVal('id_parapheur_signature');
8781     } else {
8782     $this->correct = false;
8783     $this->addToMessage(__("Il n'y a pas d'identifiant de parapheur."));
8784     return $this->end_treatment(__METHOD__, false);
8785     }
8786    
8787     // Appel de la méthode de l'abstracteur cancel_send_for_signature()
8788     // Cette méthode doit retourner un tableau de valeur
8789     try {
8790     $result = $inst_es->cancel_send_for_signature($data);
8791     } catch (electronicsignature_exception $e) {
8792     $this->handle_electronicsignature_exception($e);
8793     return $this->end_treatment(__METHOD__, false);
8794     }
8795    
8796     // Après avoir reçu le résultat du parapheur, il faut mettre à jour les champs
8797     $valF = array();
8798    
8799     // Pour appeler la fonction modifier il faut traiter tous les champs de l'objet
8800     foreach($this->champs as $identifiant => $champ) {
8801     $valF[$champ] = $this->val[$identifiant];
8802     }
8803     // On fait ensuite nos modifications spécifiques
8804     $valF['id_parapheur_signature'] = null;
8805     $valF['statut_signature'] = $result['statut'];
8806     $valF['commentaire_signature'] = isset($result['commentaire_signature']) == true ? $result['commentaire_signature'] : null;
8807     $valF['date_envoi_signature'] = null;
8808     $valF['historique_signature'] = $this->get_updated_historique_signature($result);
8809    
8810     $ret = $this->modifier($valF);
8811    
8812     if ($ret === false) {
8813     $this->correct = false;
8814     $this->addToMessage(__("Une erreur est survenue lors de la mise à jour des champs."));
8815     // Termine le traitement
8816     return $this->end_treatment(__METHOD__, false);
8817     }
8818    
8819     // Message
8820     $this->addToMessage(__("L'annulation a été effectuée avec succès."));
8821    
8822     // Tout s'est bien passé, on termine le traitement
8823     return $this->end_treatment(__METHOD__, true);
8824     }
8825    
8826    
8827 softime 10573 /**
8828     * Récupère le contenu du champ historique_signature et le converti en tableau
8829     *
8830     * @return array sinon false en cas d'erreur
8831     */
8832     protected function get_historique_signature_decoded() {
8833 softime 11876 $val = str_replace("'", '"', $this->getVal('historique_signature'));
8834     if ($val === '' || $val == 'false') {
8835 softime 10573 $val = json_encode(array());
8836     }
8837     if($this->isJson($val) === false) {
8838     return false;
8839     }
8840     return json_decode($val, true);
8841     }
8842    
8843 softime 10808 /**
8844     * Récupère les informations à afficher dans le tableau de suivi à l'aide
8845     * d'une requête sql. Stocke ces informations dans un tableau.
8846 softime 12433 * Converti le tableau au format json et renvoi le json obtenu.
8847 softime 10808 *
8848 softime 12433 * Pour identifier quel suivi est affiché (notification des demandeurs, des services ou
8849     * de tiers) ce sont les tâches liées aux notifications qui sont utilisés.
8850     * La clause where de la requête est construite à partir du tableau contenant les types
8851     * de tâches fourni en paramètre.
8852     * Il est également possible d'afficher les notifications n'étant pas lié à des tâches.
8853     *
8854     * Si le suivi concerne la notification des demandeurs via le portail citoyen,
8855     * la date de premier accès ne sera pas affichée.
8856     *
8857     * @param array liste des tâches permettant d'identifier quelles notification afficher
8858     * @param boolean permet d'afficher les notifications non liées à des tâches
8859 softime 10808 * @return json
8860     */
8861 softime 12124 protected function get_json_suivi_notification($typeTache, $nonLieTache = false) {
8862 softime 11585 $whereTypeTache = '';
8863 softime 12124 $sqlTaskNull = '';
8864 softime 12433 $suiviDateAcces = true;
8865 softime 12124 // Défini si on veux que la requête récupère également les notifications qui n'ont pas
8866     // de tâches associées. C'est le cas pour les notifications de demandeurs lorsque la
8867     // notification du demandeur principal n'a pas pu être envoyée à cause d'un mauvais
8868     // paramétrage
8869     if(is_bool($nonLieTache) && $nonLieTache === true) {
8870     $sqlTaskNull = 'OR task.type is null';
8871     }
8872     // Prépare la clause where pour ne récupérer que les notifications liées à certain type de tâches
8873     // Permet de différencier les notifications des demandeurs de celle des services et de celles des
8874     // tiers consulté
8875 softime 12433 if (is_array($typeTache) && $typeTache != array()) {
8876 softime 11585 if (is_array($typeTache)) {
8877     $whereTypeTache = sprintf(
8878 softime 12124 'AND (task.type IN (%1$s) %2$s)',
8879     "'".implode("', '", $typeTache)."'",
8880     $sqlTaskNull
8881 softime 11585 );
8882     }
8883 softime 12433 // La date de premier accès n'a pas besoin d'être renseigné pour
8884     // les notifications des demandeurs via le portail citoyen.
8885     // Les notifications des demandeurs sont liés à 3 types de tâches
8886     // notification_recepisse, notification_instruction, notification_decision
8887     // Si le suivi de la notification concerne un de ces types de tâches on
8888     // considère que c'est une notification de demandeurs.
8889     // Dans ce cas on vérifie si cette notification est paramétrée pour passer
8890     // via le portail. Par défaut si rien n'est paramétré on considère que la
8891     // notification est faite via le portail
8892     if ((in_array('notification_recepisse', $typeTache) ||
8893     in_array('notification_instruction', $typeTache) ||
8894     in_array('notification_decision', $typeTache))) {
8895     $dossier = $this->getVal('dossier');
8896     $collectivite_di = $this->get_dossier_instruction_om_collectivite($dossier);
8897     $modeNotification = $this->f->get_param_option_notification($collectivite_di);
8898     if (empty($modeNotification) || $modeNotification == 'portal') {
8899     $suiviDateAcces = false;
8900     }
8901     }
8902 softime 11585 }
8903 softime 12433
8904 softime 10808 $valSuivi = array();
8905     // Liste des champs à afficher. Permet également la traduction des noms de colonnes.
8906     $listeChampsTrad = array(
8907     __('emetteur'),
8908     __('date_envoi'),
8909     __('destinataire'),
8910     __('date_premier_acces'),
8911     __('instruction'),
8912 softime 12433 __('annexes'),
8913 softime 10808 __('statut'),
8914     __('commentaire')
8915     );
8916     $listeChamps = array(
8917     'emetteur',
8918     'date_envoi',
8919     'destinataire',
8920     'date_premier_acces',
8921     'instruction',
8922 softime 12433 'annexes',
8923 softime 10808 'statut',
8924     'commentaire'
8925     );
8926 softime 12433 // Si la date de premier_acces n'a pas à être affiché on la supprime de la liste
8927     if (! $suiviDateAcces) {
8928     $listeChamps = array(
8929     'emetteur',
8930     'date_envoi',
8931     'destinataire',
8932     'instruction',
8933     'annexes',
8934     'statut',
8935     'commentaire'
8936     );
8937     }
8938 softime 10573
8939 softime 10808 // Récupération des infos nécessaires à l'affichage du tableau
8940     $sql = sprintf(
8941 softime 11585 'SELECT DISTINCT
8942 softime 10869 instruction_notification.instruction_notification,
8943 softime 12124 -- Affiche la mention automatique avec le nom de l emetteur si la notification a été envoyé automatiquement
8944 softime 10869 CASE WHEN instruction_notification.automatique = TRUE
8945     THEN TRIM(CONCAT(instruction_notification.emetteur, \' \', \'(automatique)\'))
8946     ELSE instruction_notification.emetteur
8947     END as emetteur,
8948 softime 10808 date_envoi,
8949     instruction_notification.destinataire,
8950 softime 10869 instruction_notification.date_premier_acces,
8951 softime 10808 evenement.libelle as instruction,
8952 softime 10869 instruction_notification.statut,
8953     instruction_notification.commentaire,
8954 softime 12433 annexes.instruction_annexe as annexes
8955 softime 10808 FROM
8956     %1$sinstruction_notification
8957     LEFT JOIN %1$sinstruction
8958     ON instruction.instruction = instruction_notification.instruction
8959     LEFT JOIN %1$sevenement
8960     ON instruction.evenement = evenement.evenement
8961 softime 10869 LEFT JOIN %1$sinstruction_notification_document
8962     ON instruction_notification.instruction_notification = instruction_notification_document.instruction_notification
8963     AND instruction_notification_document.annexe = true
8964 softime 12124 -- Récupère les tâches liées au notification pour pouvoir par la suite identifier le type de notification
8965 softime 11585 LEFT JOIN %1$stask
8966     ON instruction_notification.instruction_notification::CHARACTER VARYING = task.object_id
8967 softime 12124 -- Récupération de la liste des annexes sous la forme d une liste
8968 softime 11585 LEFT JOIN (
8969     SELECT
8970     instruction_notification,
8971 softime 12124 -- Récupère la liste des annexes de la notification
8972 softime 12433 -- sous la forme d un json pour récupérer toutes les informatiosn nécessaire
8973     -- à l affichage du lien vers les annexes
8974     CONCAT(
8975     \'[\',
8976     STRING_AGG(
8977     -- Affiche le nom du fichier selon le type de document/pièce
8978     CASE
8979     WHEN instruction_notification_document.document_type = \'instruction\'
8980     THEN CONCAT(
8981     \'{
8982     "obj" : "instruction",
8983     "champs" : "om_fichier_instruction",
8984     "label" : "\', evenement.libelle, \'",
8985     "id" : "\', instruction.instruction,\'"
8986     }\'
8987     )
8988     WHEN instruction_notification_document.document_type = \'consultation\'
8989     THEN CONCAT(
8990     \'{
8991     "obj" : "consultation",
8992     "champs" : "fichier",
8993     "label" : "Avis - \', service.libelle, \'",
8994     "id" : "\', consultation.consultation,\'"
8995     }\'
8996     )
8997     ELSE
8998     CONCAT(
8999     \'{
9000     "obj" : "document_numerise",
9001     "champs" : "uid",
9002     "label" : "\', document_numerise.nom_fichier, \' - \', document_numerise_type.libelle, \'",
9003     "id" : "\', document_numerise.document_numerise,\'"
9004     }\'
9005     )
9006     END,
9007     \', \'),
9008     \']\'
9009 softime 11585 ) AS instruction_annexe
9010     FROM
9011     %1$sinstruction_notification_document
9012     LEFT JOIN %1$sinstruction
9013     ON instruction_notification_document.instruction = instruction.instruction
9014     LEFT JOIN %1$sevenement
9015     ON instruction.evenement = evenement.evenement
9016     LEFT JOIN %1$sconsultation
9017     ON instruction_notification_document.document_id = consultation.consultation
9018     LEFT JOIN %1$sservice
9019     ON consultation.service = service.service
9020 softime 12433 LEFT JOIN %1$sdocument_numerise
9021     ON instruction_notification_document.document_id = document_numerise.document_numerise
9022     LEFT JOIN %1$sdocument_numerise_type
9023     ON document_numerise.document_numerise_type = document_numerise_type.document_numerise_type
9024 softime 11585 WHERE
9025     instruction_notification_document.annexe = \'t\'
9026     GROUP BY
9027     instruction_notification
9028     ) AS annexes
9029     ON
9030     annexes.instruction_notification = instruction_notification.instruction_notification
9031 softime 10808 WHERE
9032 softime 10869 instruction.instruction = %2$s
9033 softime 11585 %3$s
9034 softime 10869 ORDER BY
9035     date_envoi ASC, instruction_notification.destinataire ASC',
9036 softime 10808 DB_PREFIXE,
9037 softime 11585 $this->getVal('instruction'),
9038     $whereTypeTache
9039 softime 10808 );
9040     $res = $this->f->db->query($sql);
9041     $this->f->addToLog(__METHOD__."(): db->query(\"".$sql."\")", VERBOSE_MODE);
9042     $this->f->isDatabaseError($res);
9043 softime 12433 // Préparation du lien de téléchargement des annexes
9044     $htmlList =
9045     '<style>
9046     #content .gridjs-td a.lien_annexe {
9047     text-decoration : underline dotted 1px;
9048     }
9049     #content a.lien_annexe:hover {
9050     text-decoration : underline solid 1px;
9051     color : #46aede;
9052     }
9053     ol {padding-left : 10px;}
9054     </style>
9055     <ol>%1$s</ol>';
9056     $lienTelechargement =
9057     '<a class="lien_annexe" href="../app/index.php?module=form&amp;snippet=file&amp;obj=%1$s&amp;champ=%2$s&amp;id=%3$s" target="blank" title="%4$s">
9058     Annexe
9059     </a>';
9060 softime 10808 // Stockage des infos de chaque notification dans un tableau
9061     while( $row =& $res->fetchrow(DB_FETCHMODE_ASSOC) ) {
9062     $valNotif = array();
9063     foreach($listeChamps as $champ) {
9064     $valNotif[$champ] = $row[$champ];
9065 softime 10815 if (($champ === 'date_envoi'
9066     || $champ === 'date_premier_acces')
9067     && $row[$champ] !== null
9068     && $row[$champ] !== '') {
9069 softime 10814 //
9070     $valNotif[$champ] = date('d/m/Y H:i:s', strtotime($row[$champ]));
9071 softime 12433 } else if ($champ === 'annexes') {
9072     $listeAnnexe = '';
9073     $infoAnnexes = json_decode($row[$champ], true);
9074     if (! empty($infoAnnexes) && json_last_error() === JSON_ERROR_NONE) {
9075     // A partir des infos récupérées prépare le code html du lien vers chacune
9076     // des annexes et ajoute un élément de liste par annexe
9077     foreach($infoAnnexes as $annexe) {
9078     $listeAnnexe .= sprintf(
9079     '<li>%s</li>',
9080     sprintf($lienTelechargement,
9081     $annexe['obj'],
9082     $annexe['champs'],
9083     $annexe['id'],
9084     $annexe['label']
9085     )
9086     );
9087     }
9088     // Construction de la liste des annexes
9089     $valNotif[$champ] = sprintf(
9090     $htmlList,
9091     $listeAnnexe
9092     );
9093     }
9094 softime 10814 }
9095 softime 10808 }
9096     array_push($valSuivi, $valNotif);
9097     }
9098    
9099     // Passage du tableau au format json
9100     return json_encode($valSuivi, JSON_HEX_APOS);
9101     }
9102    
9103 softime 10573 /**
9104     * Traitement des erreurs retournées par l'abstracteur electronicsignature.
9105     *
9106     * @param electronicsignature_exception $exception Exception retournée par l'abstracteur.
9107     *
9108     * @return void
9109     */
9110     public function handle_electronicsignature_exception(electronicsignature_exception $exception) {
9111     $this->f->displayMessage('error', $exception->getMessage());
9112     }
9113    
9114    
9115     /**
9116     * Retourne une instance du connecteur electronicsignature, et la créer si elle n'existe pas.
9117     *
9118     * @param boolean $with_handle_error Flag pour afficher ou non le message d'erreur à l'utilisateur.
9119     * @return electronicsignature Instance de l'abstracteur.
9120     */
9121     public function get_electronicsignature_instance($with_handle_error = true) {
9122     if(isset($this->electronicsignature_instance)) {
9123     return $this->electronicsignature_instance;
9124     }
9125     // Instanciation du connecteur electronicsignature
9126     try {
9127     require_once "electronicsignature.class.php";
9128     $collectivites = array("collectivite_idx" => $this->get_dossier_instruction_om_collectivite(), "collectivite_multi_idx" => $this->f->get_idx_collectivite_multi());
9129     $this->electronicsignature_instance = new electronicsignature($collectivites);
9130     } catch (electronicsignature_exception $e) {
9131     if ($with_handle_error === true) {
9132     $this->handle_electronicsignature_exception($e);
9133     }
9134     return false;
9135     }
9136     return $this->electronicsignature_instance;
9137     }
9138    
9139     /**
9140 softime 11418 * TREATMENT - envoyer_au_controle_de_legalite
9141     *
9142     * Ajoute la tâche envoi_CL.
9143     * C'est le traitement de la tâche qui mettra à jour la date d'envoi au contrôle de légalité.
9144     *
9145     * @return [type] [description]
9146     */
9147     function envoyer_au_controle_de_legalite() {
9148     $this->begin_treatment(__METHOD__);
9149     $this->correct = true;
9150    
9151     //
9152     if ($this->can_be_sended_to_cl() === true) {
9153     // Création de la task 'envoi_CL'
9154     $inst_task = $this->f->get_inst__om_dbform(array(
9155     "obj" => "task",
9156     "idx" => 0,
9157     ));
9158     $task_val = array(
9159     'type' => 'envoi_CL',
9160     'object_id' => $this->getVal('instruction'),
9161     'dossier' => $this->getVal('dossier'),
9162     );
9163     // Change l'état de la tâche de notification en fonction de l'état de
9164     // transmission du dossier d'instruction
9165     $inst_di = $this->get_inst_dossier($this->getVal('dossier'));
9166     if ($this->f->is_option_mode_service_consulte_enabled() === false
9167     && ($inst_di->getVal('etat_transmission_platau') == 'non_transmissible'
9168     || $inst_di->getVal('etat_transmission_platau') == 'transmis_mais_non_transmissible')) {
9169     //
9170     $task_val['state'] = $inst_task::STATUS_DRAFT;
9171     }
9172     $add_task = $inst_task->add_task(array('val' => $task_val));
9173     if ($add_task === false) {
9174     $this->addToMessage(sprintf('%s %s',
9175     __("Une erreur s'est produite lors de la création tâche."),
9176     __("Veuillez contacter votre administrateur.")
9177     ));
9178     $this->correct = false;
9179     return $this->end_treatment(__METHOD__, false);
9180     }
9181     // Mise à jour du champs 'envoye_cl_platau'
9182     $instr_val = array(
9183     'envoye_cl_platau' => 't',
9184     );
9185     $res = $this->f->db->autoExecute(
9186     DB_PREFIXE.$this->table,
9187     $instr_val,
9188     DB_AUTOQUERY_UPDATE,
9189     $this->getCle($this->getVal($this->clePrimaire))
9190     );
9191 softime 12124 $this->addToLog(__METHOD__."(): db->autoexecute(\"".DB_PREFIXE.'.'.$this->table."\", ".print_r($instr_val, true).", DB_AUTOQUERY_UPDATE, \"".$this->getCle($this->clePrimaire)."\");", VERBOSE_MODE);
9192 softime 11418 if ($this->f->isDatabaseError($res, true) === true) {
9193     $this->addToMessage(sprintf('%s %s',
9194     __("Une erreur s'est produite lors de la mise à jour de l'instruction."),
9195     __("Veuillez contacter votre administrateur.")
9196     ));
9197     $this->correct = false;
9198     return $this->end_treatment(__METHOD__, false);
9199     }
9200     // Message de validation à l'utilisateur
9201     $this->addToMessage(__('Votre demande de transfert au contrôle de légalité à bien été prise en compte.'));
9202     $this->addToMessage(__("La date d'envoi au contrôle de légalité sera mise à jour ultérieurement."));
9203     }
9204     //
9205     return $this->end_treatment(__METHOD__, true);
9206     }
9207    
9208    
9209     /**
9210 softime 8593 * Retourne le lien de retour (VIEW formulaire et VIEW sousformulaire).
9211     *
9212     * @param string $view Appel dans le contexte de la vue 'formulaire' ou de
9213     * la vue 'sousformulaire'.
9214     *
9215     * @return string
9216     */
9217     function get_back_link($view = "formulaire") {
9218     //
9219     $href = parent::get_back_link($view);
9220     //
9221     $crud = $this->get_action_crud();
9222 mbroquet 3730
9223 softime 8593 // Redirection vers le formulaire de modification à la validation du
9224     // formulaire d'ajout si l'événement associé possède une lettre type
9225     if (($crud === 'create'
9226     || ($crud === null
9227     && $this->getParameter('maj') == 0))
9228     && $this->correct == true
9229     && $this->evenement_has_an_edition($this->valF['evenement']) === true) {
9230 softime 7996
9231 softime 8593 // On instancie l'instruction
9232     $inst_instruction = $this->f->get_inst__om_dbform(array(
9233     "obj" => "instruction",
9234     "idx" => $this->valF[$this->clePrimaire],
9235     ));
9236    
9237     // Si l'instruction n'est pas finalisée automatiquement
9238     if ($inst_instruction->getVal('om_final_instruction') !== 't') {
9239     $href = str_replace("&action=3", "&action=1", $href);
9240     //
9241     if (strpos($href, "&retour=tab") !== false) {
9242     $href = str_replace("&retour=tab", "&retour= form", $href);
9243     } else {
9244     $href .= "&retour=form";
9245     }
9246     }
9247     }
9248    
9249     //
9250     return $href;
9251     }
9252    
9253 softime 10573 public function view_json_data() {
9254     $this->checkAccessibility();
9255     $this->f->disableLog();
9256     $view = $this->get_json_data();
9257     printf(json_encode($view));
9258     }
9259    
9260     public function get_json_data() {
9261     $val = array_combine($this->champs, $this->val);
9262     foreach ($val as $key => $value) {
9263     $val[$key] = strip_tags($value);
9264     }
9265     $val['tacite'] = 'f';
9266     $inst_ad = $this->f->get_inst__om_dbform(array(
9267     "obj" => "avis_decision",
9268     "idx" => $val['avis_decision'],
9269     ));
9270     if (preg_match('/[tT]acite/', $inst_ad->getVal('libelle')) === 1) {
9271     $val['tacite'] = 't';
9272     }
9273     return $val;
9274     }
9275    
9276 softime 11418 public function get_related_instructions_next($next_type = 'retour_signature', $instruction = null) {
9277     if (in_array($next_type, array('retour_signature', 'retour_ar', 'suivant_tacite', )) === false) {
9278     return false;
9279     }
9280     $result = array();
9281     $evenements = array();
9282     if ($instruction === null) {
9283     $instruction = $this->getVal($this->clePrimaire);
9284     $evenement = $this->getVal('evenement');
9285     $dossier = $this->getVal('dossier');
9286     } else {
9287     $inst = $this->f->get_inst__om_dbform(array(
9288     "obj" => "instruction",
9289     "idx" => $instruction,
9290     ));
9291     $evenement = $inst->getVal('evenement');
9292     $dossier = $inst->getVal('dossier');
9293     }
9294     //
9295     $query = sprintf('
9296     SELECT evenement_%3$s
9297     FROM %1$sevenement
9298     WHERE evenement = %2$s
9299     ',
9300     DB_PREFIXE,
9301     $evenement,
9302     $next_type
9303     );
9304     $res = $this->f->get_one_result_from_db_query($query, true);
9305     if ($res['code'] === 'KO') {
9306     return false;
9307     }
9308     $ev_next = $res['result'];
9309     //
9310     $query = sprintf('
9311     SELECT MAX(instruction.instruction) as instruction
9312     FROM %1$sinstruction
9313     WHERE dossier = \'%3$s\'
9314     AND evenement = %2$s
9315     ',
9316     DB_PREFIXE,
9317     $ev_next,
9318     $dossier
9319     );
9320     $res = $this->f->get_one_result_from_db_query($query, true);
9321     if ($res['code'] === 'KO') {
9322     return false;
9323     }
9324     //
9325     return $res['result'];
9326     }
9327    
9328 softime 10573 public function get_related_instructions($instruction = null) {
9329     $result = array();
9330     $evenements = array();
9331     if ($instruction === null) {
9332     $instruction = $this->getVal($this->clePrimaire);
9333     $evenement = $this->getVal('evenement');
9334     $dossier = $this->getVal('dossier');
9335     } else {
9336     $inst = $this->f->get_inst__om_dbform(array(
9337     "obj" => "instruction",
9338     "idx" => $instruction,
9339     ));
9340     $evenement = $inst->getVal('evenement');
9341     $dossier = $inst->getVal('dossier');
9342     }
9343     //
9344     $query = sprintf('
9345     SELECT evenement
9346     FROM %1$sevenement
9347     WHERE evenement_retour_ar = %2$s
9348     OR evenement_retour_signature = %2$s
9349     ',
9350     DB_PREFIXE,
9351     $evenement
9352     );
9353     $res = $this->f->get_one_result_from_db_query($query, true);
9354     if ($res['code'] === 'KO') {
9355     return false;
9356     }
9357     $ev_parent = $res['result'];
9358     //
9359     $query = sprintf('
9360     SELECT MAX(instruction.instruction) as instruction
9361     FROM %1$sinstruction
9362     WHERE dossier = \'%3$s\'
9363     AND evenement = %2$s
9364     ',
9365     DB_PREFIXE,
9366     $ev_parent,
9367     $dossier
9368     );
9369     $res = $this->f->get_one_result_from_db_query($query, true);
9370     if ($res['code'] === 'KO') {
9371     return false;
9372     }
9373     $result[] = $res['result'];
9374     //
9375     $query = sprintf('
9376     SELECT evenement_retour_ar
9377     FROM %1$sevenement
9378     WHERE evenement = %2$s
9379     AND evenement_retour_ar != %3$s
9380     ',
9381     DB_PREFIXE,
9382     $ev_parent,
9383     $evenement
9384     );
9385     $res = $this->f->get_one_result_from_db_query($query, true);
9386     if ($res['code'] === 'KO') {
9387     return false;
9388     }
9389     $evenements[] = $res['result'];
9390     //
9391     $query = sprintf('
9392     SELECT evenement_retour_signature
9393     FROM %1$sevenement
9394     WHERE evenement = %2$s
9395     AND evenement_retour_signature != %3$s
9396     ',
9397     DB_PREFIXE,
9398     $ev_parent,
9399     $evenement
9400     );
9401     $res = $this->f->get_one_result_from_db_query($query, true);
9402     if ($res['code'] === 'KO') {
9403     return false;
9404     }
9405     $evenements[] = $res['result'];
9406     foreach ($evenements as $value) {
9407     if ($value !== null) {
9408     $query = sprintf('
9409     SELECT MAX(instruction.instruction) as instruction
9410     FROM %1$sinstruction
9411     WHERE dossier = \'%3$s\'
9412     AND evenement = %2$s
9413     ',
9414     DB_PREFIXE,
9415     $value,
9416     $dossier
9417     );
9418     $res = $this->f->get_one_result_from_db_query($query, true);
9419     if ($res['code'] === 'KO') {
9420     return false;
9421     }
9422     $result[] = $res['result'];
9423     }
9424     }
9425     return $result;
9426     }
9427    
9428     protected function getDocumentType($champ = null) {
9429     $evenementId = $this->getVal('evenement');
9430     if (! empty($evenementId)) {
9431     $evenement = $this->f->findObjectById('evenement', $evenementId);
9432     if (! empty($evenement)) {
9433     return __("Instruction").':'.$evenement->getVal('libelle');
9434     }
9435     }
9436     return parent::getDocumentType();
9437     }
9438    
9439 softime 10808 /**
9440     * Récupère à l'aide d'une requête sql la liste des demandeurs
9441     * pouvant être notifié. C'est à dire les demandeurs acceptant
9442     * les notifications et pour lesquels une adresse mail existe.
9443     *
9444     * Dans le cas, d'une notification pour le portail citoyen, seul
9445     * le pétitionnaire principal doit être notifier et uniquement si
9446     * il a une adress mail et qu'il accepte les notifications.
9447     *
9448     * @param string identifiant du dossier
9449     * @param boolean true si il faut récupérer la liste des demandeurs notifiable
9450     * pour une notification de categorie portail
9451     * @return array liste des demandeurs pouvant être notifié
9452     */
9453     protected function get_demandeurs_notifiable($idDossier = null, $portail = false) {
9454     if ($idDossier === null) {
9455     $idDossier = $this->getVal('dossier');
9456     }
9457     // Ajoute une condition sur le where pour ne récupérer que le pétitionnaire principal
9458     // pour une notification depuis le portail citoyen
9459     $sqlPetitionnairePrincipal = '';
9460 softime 12124 // Gestion des champs nécessaires pour la notification d'un demandeur
9461     $condition_demandeur = "AND demandeur.notification = 't'
9462     AND demandeur.courriel IS NOT NULL";
9463 softime 10808 if ($portail === true) {
9464     $sqlPetitionnairePrincipal = 'AND lien_dossier_demandeur.petitionnaire_principal = true';
9465 softime 12124 $condition_demandeur = "AND (
9466     (notification = 't' AND courriel IS NOT NULL)
9467     OR demande.source_depot = 'portal'
9468     )";
9469 softime 10808 }
9470    
9471     $listeDemandeursNotifiable = array();
9472    
9473     // Requête de récupération des demandeurs
9474     $sql = sprintf(
9475     'SELECT
9476     demandeur.demandeur,
9477 softime 10869 CASE
9478     WHEN demandeur.qualite=\'particulier\'
9479     THEN TRIM(CONCAT(demandeur.particulier_nom, \' \', demandeur.particulier_prenom, \' \', demandeur.courriel))
9480     ELSE
9481     TRIM(CONCAT(demandeur.personne_morale_raison_sociale, \' \', demandeur.personne_morale_denomination, \' \', demandeur.courriel))
9482     END AS destinataire,
9483 softime 12124 demandeur.courriel,
9484     petitionnaire_principal
9485 softime 10808 FROM
9486     %1$sdossier
9487     INNER JOIN %1$slien_dossier_demandeur
9488     ON dossier.dossier = lien_dossier_demandeur.dossier
9489     INNER JOIN %1$sdemandeur
9490     ON lien_dossier_demandeur.demandeur = demandeur.demandeur
9491 softime 12124 -- Récupération de la plus ancienne demande associée au dossier (la demande
9492     -- de création du dossier)
9493     INNER JOIN (
9494     SELECT
9495     demande,
9496     dossier_instruction,
9497     source_depot
9498     FROM
9499     %1$sdemande
9500     WHERE
9501     dossier_instruction = \'%2$s\'
9502     ORDER BY
9503     demande ASC
9504     LIMIT 1
9505     ) as demande
9506     ON dossier.dossier = demande.dossier_instruction
9507 softime 10808 WHERE
9508 softime 12124 dossier.dossier = \'%2$s\'
9509     %3$s
9510     %4$s',
9511 softime 10808 DB_PREFIXE,
9512     $idDossier,
9513 softime 12124 $condition_demandeur,
9514 softime 10808 $sqlPetitionnairePrincipal
9515     );
9516     $res = $this->f->db->query($sql);
9517     $this->f->addToLog(__METHOD__."(): db->query(\"".$sql."\")", VERBOSE_MODE);
9518     $this->f->isDatabaseError($res);
9519     // Récupération des infos des demandeurs et stockage dans un tableau
9520     // ayant pour clé les id des demandeurs
9521     while($row = $res->fetchrow(DB_FETCHMODE_ASSOC)) {
9522 softime 10869 $listeDemandeursNotifiable[$row['demandeur']] = $row;
9523 softime 10808 }
9524    
9525     return $listeDemandeursNotifiable;
9526     }
9527    
9528     /**
9529     * Renvoie la liste des notifications liées à l'instruction
9530     *
9531     * @param integer id de l'instruction dont on cherche les notifications
9532     * @return array liste des instruction_notification liés à l'instruction
9533     */
9534 softime 12124 public function get_instruction_notification($id_instruction, $typeNotification = null, $nonLieTache = false) {
9535 softime 11585 $whereTypeTache = '';
9536 softime 12124 $sqlTaskNull = '';
9537     // Défini si on veux que la requête récupère également les notifications qui n'ont pas
9538     // de tâches associées. C'est le cas pour les notifications de demandeurs lorsque la
9539     // notification du demandeur principal n'a pas pu être envoyée à cause d'un mauvais
9540     // paramétrage
9541     if(is_bool($nonLieTache) && $nonLieTache === true) {
9542     $sqlTaskNull = 'OR task.type is null';
9543     }
9544 softime 11585 if ($typeNotification != null) {
9545     if (is_array($typeNotification)) {
9546     $whereTypeTache = sprintf(
9547 softime 12124 'AND (task.type IN (%1$s) %2$s)',
9548     "'".implode("', '", $typeNotification)."'",
9549     $sqlTaskNull
9550 softime 11585 );
9551     } else {
9552     $whereTypeTache = sprintf(
9553 softime 12124 'AND (task.type = \'%1$s\' %2$s)',
9554     $typeNotification,
9555     $sqlTaskNull
9556 softime 11585 );
9557     }
9558     }
9559 softime 10808 $listeInstrNotif = array();
9560     $sql = sprintf('
9561     SELECT
9562     instruction_notification.instruction_notification
9563     FROM
9564     %1$sinstruction_notification
9565 softime 11585 LEFT JOIN %1$stask
9566     ON instruction_notification.instruction_notification::CHARACTER VARYING = task.object_id
9567 softime 10808 WHERE
9568 softime 11585 instruction = %2$s
9569     %3$s',
9570 softime 10808 DB_PREFIXE,
9571 softime 11585 $id_instruction,
9572     $whereTypeTache
9573 softime 10808 );
9574     $res = $this->f->db->query($sql);
9575     $this->f->addToLog(__METHOD__."(): db->query(\"".$sql."\")", VERBOSE_MODE);
9576     $this->f->isDatabaseError($res);
9577     while ($row = $res->fetchrow(DB_FETCHMODE_ASSOC)) {
9578     $listeInstrNotif[] = $row['instruction_notification'];
9579     }
9580     return $listeInstrNotif;
9581     }
9582    
9583     /**
9584     * Crée une clé d'accès unique permettant à un utilisateur
9585     * anonyme de récupérer le document.
9586     *
9587     * @return string clé d'accès du document
9588     */
9589     protected function getCleAccesDocument() {
9590 softime 10869 // Initialisation d'un tableau
9591     $number_list = array();
9592    
9593     // Génération aléatoire d'un nombre sur 4 caractères, 4 fois
9594     for ($i = 0; $i < 4; $i++) {
9595     $number_list[] = str_pad(mt_rand(0, 9999), 4, 0, STR_PAD_LEFT);
9596     }
9597    
9598     // Transformation en chaîne tout en séparant les nombres par un "-"
9599     $result = implode('-', $number_list);
9600    
9601     // Vérifie si la clé existe déjà et si c'est le cas génére une nouvelle clé
9602     if ($this->getUidDocumentInstructionWithKey($result) != null) {
9603     return $this->getCleAccesDocument();
9604     }
9605    
9606     //
9607     return $result;
9608 softime 10808 }
9609    
9610     /**
9611 softime 10869 * Récupère une clé et renvoie l'uid du document liée à cette
9612     * clé. Si la clé n'existe pas renvoie null.
9613     *
9614     * @param string $cleGen clé dont on cherche l'instruction
9615     * @return integer|null
9616     */
9617     protected function getUidDocumentInstructionWithKey($cleGen) {
9618     $query = sprintf(
9619     'SELECT
9620     instruction.om_fichier_instruction
9621     FROM
9622     %1$sinstruction_notification_document
9623     LEFT JOIN %1$sinstruction ON instruction_notification_document.instruction = instruction.instruction
9624     WHERE
9625     instruction_notification_document.cle = \'%2$s\'',
9626     DB_PREFIXE,
9627     $this->f->db->escapeSimple($cleGen)
9628     );
9629    
9630     $res = $this->f->db->getOne($query);
9631     $this->addToLog(__METHOD__.": db->getOne(\"".$query."\");", VERBOSE_MODE);
9632     $this->f->isDatabaseError($res);
9633     return $res;
9634     }
9635    
9636     /**
9637     * Récupère une clé, fait une requête pour récupérer l'id de la notification liée a cette clé.
9638     * Récupère l'instance de instruction_notification dont l'id a été récupéré et la renvoie.
9639     *
9640     * @param string $cleGen
9641     * @return instruction_notification
9642     */
9643     protected function getInstanceNotificationWithKey($key) {
9644     $sql = sprintf(
9645     "SELECT
9646     instruction_notification
9647     FROM
9648     %1\$sinstruction_notification_document
9649     WHERE
9650     cle = '%2\$s'",
9651     DB_PREFIXE,
9652     $this->f->db->escapeSimple($key)
9653     );
9654     $res = $this->f->db->getOne($sql);
9655     $this->addToLog(__METHOD__.": db->getOne(\"".$sql."\");", VERBOSE_MODE);
9656     $this->f->isDatabaseError($res);
9657    
9658     // Récupération de l'instance de notification
9659     $instNotif = $this->f->get_inst__om_dbform(array(
9660     "obj" => "instruction_notification",
9661     "idx" => $res,
9662     ));
9663     return $instNotif;
9664     }
9665    
9666    
9667     /**
9668 softime 10808 * Affiche la page de téléchargement du document de la notification.
9669     *
9670     * @param boolean $content_only Affiche le contenu seulement.
9671     *
9672     * @return void
9673     */
9674 softime 10869 public function view_telecharger_document_anonym() {
9675 softime 10808 // Par défaut on considère qu'on va afficher le formulaire
9676     $idx = 0;
9677     // Flag d'erreur
9678     $error = false;
9679     // Message d'erreur
9680     $message = '';
9681    
9682 softime 10869 // Paramètres GET : récupération de la clé d'accès
9683     $cle_acces_document = $this->f->get_submitted_get_value('key');
9684 softime 10808 $cle_acces_document = $this->f->db->escapeSimple($cle_acces_document);
9685 softime 10869 // Vérification de l'existence de la clé et récupération de l'uid du fichier
9686     $uidFichier = $this->getUidDocumentInstructionWithKey($cle_acces_document);
9687     if ($uidFichier != null) {
9688     // Récupération du document
9689     $file = $this->f->storage->get($uidFichier);
9690 softime 10808
9691 softime 10869 // Headers
9692     header("Cache-Control: no-cache, must-revalidate"); // HTTP/1.1
9693     header("Expires: Sat, 26 Jul 1997 05:00:00 GMT"); // Date dans le passé
9694     header("Content-Type: ".$file['metadata']['mimetype']);
9695     header("Accept-Ranges: bytes");
9696     header("Content-Disposition: inline; filename=\"".$file['metadata']['filename']."\";" );
9697     // Affichage du document
9698     echo $file['file_content'];
9699 softime 10808
9700 softime 10869 // Récupération de la date de premier accès et maj du suivi uniquement
9701     // si la date de 1er accès n'a pas encore été remplis
9702     $inst_notif = $this->getInstanceNotificationWithKey($cle_acces_document);
9703     if ($inst_notif->getVal('date_premier_acces') == null ||
9704     $inst_notif->getVal('date_premier_acces') == '') {
9705     $notif_val = array();
9706     foreach ($inst_notif->champs as $champ) {
9707     $notif_val[$champ] = $inst_notif->getVal($champ);
9708     }
9709     $notif_val['date_premier_acces'] = date("d/m/Y H:i:s");
9710     $notif_val['statut'] = 'vu';
9711     $notif_val['commentaire'] = 'Le document a été vu';
9712     $suivi_notif = $inst_notif->modifier($notif_val);
9713 softime 10808 }
9714    
9715     } else {
9716 softime 10869 // Page vide 404
9717     printf('Ressource inexistante');
9718     header('HTTP/1.0 404 Not Found');
9719 softime 10808 }
9720     }
9721    
9722 softime 11228 /**
9723     * Récupère le titre du document envoyé au parapheur
9724     */
9725 softime 10808 protected function getDocumentTitre($champ = null) {
9726     $title = $this->getTitle();
9727     $dossier = $this->getDossier();
9728     return $dossier.' '.$title;
9729     }
9730    
9731 softime 10869 /**
9732 softime 11228 * Compose le nom du document à transmettre au parapheur.
9733     * Le nom ets composé de cette manière :
9734     * instruction_xxx_libelle_de_la_lettre_type_associee
9735     * ou xxx correspond au numéro de l'instruction
9736     */
9737     protected function getDocumentLibelle() {
9738     // Récupère le champ instruction
9739     $instruction = $this->getVal("instruction");
9740    
9741     // Requête sql servant à récupérer le titre du document
9742     // TO_CHAR() introduit un espace avant l'affichage du nombre
9743     // comme les espaces sont remplacé par des '_' dans le retour de la fonction
9744     // il n'est pas nécessaire de mettre un '_' après le mot instruction.
9745     $sql = sprintf(
9746     'SELECT
9747     CONCAT(
9748     \'instruction\',
9749     TO_CHAR(instruction.instruction, \'000\'),
9750     \'_\',
9751     LOWER(om_lettretype.libelle)
9752     ) as nom_fichier
9753     FROM
9754     %1$sinstruction
9755     LEFT JOIN %1$som_lettretype ON om_lettretype.id = instruction.lettretype
9756     WHERE
9757     instruction = %2$s',
9758     DB_PREFIXE,
9759     $instruction
9760     );
9761     $documentLibelle = $this->f->db->getOne($sql);
9762     $this->addToLog("getDocumentTitre(): db->getOne(\"".$sql."\");", VERBOSE_MODE);
9763     if (database::isError($documentLibelle)) {
9764     die();
9765     }
9766    
9767     // Transforamtion des ' ' en '_', des accents en lettres sans accents et des
9768     // caractères spéciaux en '_'
9769     // La méthode normalize_string est utilisé pour gérer les accents
9770     $documentLibelle = $this->f->normalize_string($documentLibelle);
9771     // TODO : comparer cette liste et celle de la méthode normalize_string
9772     // pour éviter les doublons + vérifier qu'il n'y a pas de doublons dans cette
9773     // liste
9774     $invalid = array('Œ'=>'oe', 'œ'=>'oe', 'Ÿ'=>'y', 'ü'=>'u',
9775     '¢' => '_', 'ß' => '_', '¥' => '_', '£' => '_', '™' => '_', '©' => '_',
9776     '®' => '_', 'ª' => '_', '×' => '_', '÷' => '_', '±' => '_', '²' => '_',
9777     '³' => '_', '¼' => '_', '½' => '_', '¾' => '_', 'µ' => '_', '¿' => '_',
9778     '¶' => '_', '·' => '_', '¸' => '_', 'º' => '_', '°' => '_', '¯' => '_',
9779     '§' => '_', '…' => '_', '¤' => '_', '¦' => '_', '≠' => '_', '¬' => '_',
9780     'ˆ' => '_', '¨' => '_', '‰' => '_', '¤' => '_', '€' => '_', '$' => '_',
9781     '«' => '_', '»' => '_', '‹' => '_', '›' => '_', 'ƒ' => '_', '¥' => '_',
9782     '‘‘' => '_', '‚' => '_', '!' => '_', '¡' => '_', '¢' => '_', '£' => '_',
9783     '?' => '_', '[' => '_', ']' => '_', '´' => '_', '`' => '_', '^' => '_',
9784     '~' => '_', '˜' => '_', '#' => '_', '*' => '_', '.' => '_', ':' => '_',
9785     ';' => '_', '•' => '_', '¯' => '_', '‾' => '_', '–' => '_', '–' => '_',
9786     '—' => '_', '_' => '_', '|' => '_', '¦‌' => '_', '‡' => '_', '§' => '_',
9787     '¶' => '_', '©' => '_', '®' => '_', '™' => '_', '&' => '_', '@' => '_',
9788     '/' => '_', '\\' => '_', '◊' => '_', '♠' => '_', '♣' => '_', '♥' => '_',
9789     '♦' => '_', '←' => '_', '↑' => '_', '→' => '_', '↓' => '_', '↔' => '_',
9790     '°' => '_', 'µ' => '_', '<' => '_', '>' => '_', '≤' => '_', '≥' => '_',
9791     '=' => '_', '≈' => '_', '≠' => '_', '≡' => '_', '±' => '_', '−' => '_',
9792     '+' => '_', '×' => '_', '÷' => '_', '⁄' => '_', '%' => '_', '‰' => '_',
9793     '¼' => '_', '½' => '_', '¾' => '_', '¹' => '_', '²' => '_', '³' => '_',
9794     '' => '_', 'º' => '_', 'ª' => '_', 'ƒ' => '_', '′' => '_', '″' => '_',
9795     '∂' => '_', '∏' => '_', '∑' => '_', '√' => '_', '∞' => '_', '¬' => '_',
9796     '∩' => '_', '∫' => '_', 'α' => '_', 'Α' => '_', 'β' => '_', 'Β' => '_',
9797     'γ' => '_', 'Γ' => '_', 'δ' => '_', 'Δ' => '_', 'ε' => '_', 'Ε' => '_',
9798     'ζ' => '_', 'Ζ' => '_', 'η' => '_', 'Η' => '_', 'θ' => '_', 'Θ' => '_',
9799     'ι' => '_', 'Ι' => '_', 'κ' => '_', 'Κ' => '_', 'λ' => '_', 'Λ' => '_',
9800     'μ' => '_', 'Μ' => '_', 'ν' => '_', 'Ν' => '_', 'ξ' => '_', 'Ξ' => '_',
9801     'ο' => '_', 'Ο' => '_', 'π' => '_', 'Π' => '_', 'ρ' => '_', 'Ρ' => '_',
9802     'σ' => '_', 'ς' => '_', 'Σ' => '_', 'τ' => '_', 'Τ' => '_', 'υ' => '_',
9803     'Υ' => '_', 'φ' => '_', 'Φ' => '_', 'χ' => '_', 'Χ' => '_', 'ψ' => '_',
9804     'Ψ' => '_', 'ω' => '_', 'Ω' => '_', ',' => '_', ' ' => '_'
9805     );
9806    
9807     return str_replace(array_keys($invalid), array_values($invalid), $documentLibelle);
9808     }
9809    
9810     /**
9811 softime 10869 * Surcharge permettant de ne pas afficher le fil d'Ariane dans
9812     * l'overlay de notification des demandeurs.
9813     */
9814     function getSubFormTitle($ent) {
9815 softime 11876 $actionSansPath = array('411', '420', '430');
9816     if (in_array($this->getParameter('maj'), $actionSansPath)) {
9817 softime 10869 return '';
9818     }
9819     return parent::getSubFormTitle($ent);
9820     }
9821 softime 8593 }// fin classe

Properties

Name Value
svn:keywords "Id"

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26