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

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

Parent Directory Parent Directory | Revision Log Revision Log


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

Properties

Name Value
svn:keywords "Id"

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26