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

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

Parent Directory Parent Directory | Revision Log Revision Log


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

Properties

Name Value
svn:keywords "Id"

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26