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

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

Parent Directory Parent Directory | Revision Log Revision Log


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

Properties

Name Value
svn:keywords "Id"

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26