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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 10573 - (hide annotations)
Thu Oct 14 12:43:35 2021 UTC (3 years, 3 months ago) by softime
File size: 323151 byte(s)
* Fusion de la branche d'intégration 5.0.0-develop dans le trunk

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

Properties

Name Value
svn:keywords "Id"

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26