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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 11418 - (hide annotations)
Mon Feb 7 14:59:54 2022 UTC (2 years, 11 months ago) by softime
File size: 380356 byte(s)
* Fusion de la branche d'intégration 5.7.0-develop dans le trunk

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

Properties

Name Value
svn:keywords "Id"

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26