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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 10813 - (hide annotations)
Wed Nov 24 20:52:20 2021 UTC (3 years, 2 months ago) by softime
File size: 358098 byte(s)
* Mise à jour des dates de suivi de l'instruction au traitement de la notification

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

Properties

Name Value
svn:keywords "Id"

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26