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

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

Parent Directory Parent Directory | Revision Log Revision Log


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

Properties

Name Value
svn:keywords "Id"

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26