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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 14542 - (hide annotations)
Thu Apr 20 13:21:47 2023 UTC (21 months, 1 week ago) by softime
File size: 476315 byte(s)
chore(branch): fusion de la branche d'intégration 5.17.0-develop dans le trunk

1 mbroquet 3730 <?php
2     /**
3 softime 7996 * DBFORM - 'instruction' - Surcharge gen.
4     *
5 mbroquet 3730 * specific :
6     * - cle secondaire
7     * destruction autorisée que pour le dernier evenement
8     * [delete the last event ]
9     * - variable globale [global variables]
10     * var $retourformulaire;
11     * var $idxformulaire;
12     * - modification des données dans dossier trigger avant
13     * [modify dossier data with trigger function]
14     * - function mois_date : pour ajouter des mois a une date
15     * [add months (delay) and calculation final date]
16     * - voir script_lang.js : bible ...
17 softime 7996 *
18 mbroquet 3730 * @package openfoncier
19 nhaye 5254 * @version SVN : $Id$
20 mbroquet 3730 */
21    
22     //
23     require_once "../gen/obj/instruction.class.php";
24    
25     //
26     class instruction extends instruction_gen {
27    
28     // Champs contenant les UID des fichiers
29     var $abstract_type = array(
30     "om_fichier_instruction" => "file",
31     );
32 softime 8989
33 mbroquet 3730 var $valEvenement;
34     var $restriction_valid = null;
35     // Tableau contenant une partie des métadonnées arrêtés
36     var $metadonneesArrete;
37    
38 fmichon 3892 /**
39     * Instance de la classe dossier
40     *
41     * @var mixed
42     */
43     var $inst_dossier = null;
44    
45 softime 5169 /**
46     * Instance de la classe instructeur
47     *
48     * @var mixed
49     */
50     var $inst_instructeur = null;
51    
52     /**
53     * Instance de la classe om_utilisateur
54     *
55     * @var mixed
56     */
57     var $inst_om_utilisateur = null;
58    
59 mbroquet 3730 var $metadata = array(
60     "om_fichier_instruction" => array(
61     "dossier" => "getDossier",
62     "dossier_version" => "getDossierVersion",
63     "numDemandeAutor" => "getNumDemandeAutor",
64     "anneemoisDemandeAutor" => "getAnneemoisDemandeAutor",
65     "typeInstruction" => "getTypeInstruction",
66     "statutAutorisation" => "getStatutAutorisation",
67     "typeAutorisation" => "getTypeAutorisation",
68     "dateEvenementDocument" => "getDateEvenementDocument",
69     "groupeInstruction" => 'getGroupeInstruction',
70     "title" => 'getTitle',
71 softime 6272 'concerneERP' => 'get_concerne_erp',
72 softime 10573
73     'date_cloture_metier' => 'getDossierDateDecision',
74     'type' => 'getDocumentType',
75     'dossier_autorisation_type_detaille' => 'getDossierAutorisationTypeDetaille',
76     'dossier_instruction_type' => 'getDossierInstructionTypeLibelle',
77     'region' => 'getDossierRegion',
78     'departement' => 'getDossierDepartement',
79     'commune' => 'getDossierCommune',
80     'annee' => 'getDossierAnnee',
81     'division' => 'getDossierDivision',
82 softime 10808 'collectivite' => 'getDossierServiceOrCollectivite',
83 mbroquet 3730 ),
84     "arrete" => array(
85     "numArrete" => "getNumArrete",
86     "ReglementaireArrete" => "getReglementaireArrete",
87     "NotificationArrete" => "getNotificationArrete",
88     "dateNotificationArrete" => "getDateNotificationArrete",
89     "controleLegalite" => "getControleLegalite",
90     "dateSignature" => "getDateSignature",
91     "nomSignataire" => "getNomSignataire",
92     "qualiteSignataire" => "getQualiteSignataire",
93     "ap_numRue" => "getAp_numRue",
94     "ap_nomDeLaVoie" => "getAp_nomDeLaVoie",
95     "ap_codePostal" => "getAp_codePostal",
96     "ap_ville" => "getAp_ville",
97     "activite" => "getActivite",
98     "dateControleLegalite" => "getDateControleLegalite",
99 softime 10573 )
100 mbroquet 3730 );
101    
102 softime 9245 /**
103     * Flag pour identifier la reprise de l'instruction d'un dossier.
104     * Le statut de l'état passe de "cloture" à "encours".
105     *
106     * @var boolean
107     */
108     var $di_reopened = null;
109    
110 mbroquet 3730 // {{{ Gestion de la confidentialité des données spécifiques
111    
112     /**
113     * Définition des actions disponibles sur la classe.
114     *
115     * @return void
116     */
117     function init_class_actions() {
118    
119     parent::init_class_actions();
120    
121     // ACTION - 000 - ajouter
122     // Modifie la condition d'affichage du bouton ajouter
123 softime 6565 $this->class_actions[0]["condition"] = array("is_addable", "can_user_access_dossier_contexte_ajout");
124 mbroquet 3730
125     // ACTION - 001 - modifier
126     // Modifie la condition et le libellé du bouton modifier
127 softime 6565 $this->class_actions[1]["condition"] = array(
128     "is_editable",
129     "is_finalizable_without_bypass",
130     "can_user_access_dossier_contexte_modification",
131 softime 10573 "is_evenement_modifiable",
132 softime 6565 );
133 mbroquet 3730 $this->class_actions[1]["portlet"]["libelle"] = _("Modifier");
134    
135     // ACTION - 002 - supprimer
136     // Modifie la condition et le libellé du bouton supprimer
137 softime 6565 $this->class_actions[2]["condition"] = array(
138     "is_deletable",
139     "is_finalizable_without_bypass",
140 softime 10573 "can_user_access_dossier_contexte_modification",
141     "is_evenement_supprimable",
142 softime 6565 );
143 mbroquet 3730 $this->class_actions[2]["portlet"]["libelle"] = _("Supprimer");
144    
145 softime 6565 // ACTION - 003 - consulter
146     //
147     $this->class_actions[3]["condition"] = "can_user_access_dossier_contexte_modification";
148    
149 mbroquet 3730 // ACTION - 100 - finaliser
150     // Finalise l'enregistrement
151     $this->class_actions[100] = array(
152     "identifier" => "finaliser",
153     "portlet" => array(
154     "type" => "action-direct",
155     "libelle" => _("Finaliser le document"),
156     "order" => 110,
157     "class" => "finalise",
158     ),
159     "view" => "formulaire",
160     "method" => "finalize",
161     "button" => "finaliser",
162     "permission_suffix" => "finaliser",
163 softime 6565 "condition" => array(
164     "is_finalizable",
165     "is_finalizable_without_bypass",
166     "has_an_edition",
167     "can_user_access_dossier_contexte_modification",
168     ),
169 mbroquet 3730 );
170    
171     // ACTION - 110 - definaliser
172     // Finalise l'enregistrement
173     $this->class_actions[110] = array(
174     "identifier" => "definaliser",
175     "portlet" => array(
176     "type" => "action-direct",
177     "libelle" => _("Reprendre la redaction du document"),
178     "order" => 110,
179     "class" => "definalise",
180     ),
181     "view" => "formulaire",
182     "method" => "unfinalize",
183     "button" => "definaliser",
184     "permission_suffix" => "definaliser",
185 softime 6565 "condition" => array(
186     "is_unfinalizable",
187     "is_unfinalizable_without_bypass",
188     "can_user_access_dossier_contexte_modification",
189 softime 10573 "is_not_sent_for_signature",
190 softime 6565 ),
191 mbroquet 3730 );
192    
193 softime 13137 // ACTION - 115 - Modification d'un document généré par une instruction
194 softime 12847 // Permet à un instructeur de modifier un document généré par une instruction
195     $this->class_actions[115] = array(
196     "identifier" => "modale_selection_document_signe",
197     "portlet" => array(
198     "type" => "action-self",
199     "libelle" => _("Remplacer par le document signé"),
200     "order" => 115,
201     "class" => "selection-document-signé",
202     ),
203     "view" => "view_modale_selection_document_signe",
204     "permission_suffix" => "selection_document_signe",
205     "condition" => array(
206     "is_finalized",
207     "is_not_date_retour_signature_set",
208     ),
209     );
210    
211 mbroquet 3730 // ACTION - 120 - edition
212     // Affiche l'édition
213     $this->class_actions[120] = array(
214     "identifier" => "edition",
215     "portlet" => array(
216     "type" => "action-blank",
217     "libelle" => _("Edition"),
218     "order" => 100,
219     "class" => "pdf-16",
220     ),
221     "view" => "view_edition",
222 softime 6565 "condition" => array("has_an_edition", "can_user_access_dossier_contexte_modification"),
223 mbroquet 3730 "permission_suffix" => "om_fichier_instruction_telecharger",
224     );
225    
226     // ACTION - 125 - modifier_suivi
227     // Suivi des dates
228     $this->class_actions[125] = array(
229     "identifier" => "modifier_suivi",
230     "portlet" => array(
231     "type" => "action-self",
232     "libelle" => _("Suivi des dates"),
233     "order" => 125,
234     "class" => "suivi-dates-16",
235     ),
236     "crud" => "update",
237 softime 6565 "condition" => array("can_monitoring_dates", "can_user_access_dossier_contexte_modification"),
238 mbroquet 3730 "permission_suffix" => "modification_dates",
239     );
240    
241     // ACTION - 130 - bible
242     // Affiche la bible
243     $this->class_actions[130] = array(
244     "identifier" => "bible",
245     "view" => "view_bible",
246     "permission_suffix" => "modifier",
247     );
248    
249     // ACTION - 140 - bible_auto
250     // Active la bible automatique
251     $this->class_actions[140] = array(
252     "identifier" => "bible_auto",
253     "view" => "view_bible_auto",
254     "permission_suffix" => "modifier",
255     );
256    
257     // ACTION - 150 - suivi_bordereaux
258     // Imprimer un bordereau d'envoi
259     $this->class_actions[150] = array(
260     "identifier" => "suivi_bordereaux",
261     "view" => "view_suivi_bordereaux",
262     "permission_suffix" => "consulter",
263     );
264    
265     // ACTION - 160 - suivi_envoi_lettre_rar
266     // Imprimer un bordereau d'envoi
267     $this->class_actions[160] = array(
268     "identifier" => "suivi_envoi_lettre_rar",
269     "view" => "view_suivi_envoi_lettre_rar",
270     "permission_suffix" => "consulter",
271     );
272    
273     // ACTION - 170 - suivi_mise_a_jour_des_dates
274     // Mettre à jour les dates de l'instruction
275     $this->class_actions[170] = array(
276     "identifier" => "suivi_mise_a_jour_des_dates",
277     "view" => "view_suivi_mise_a_jour_des_dates",
278     "permission_suffix" => "consulter",
279     );
280    
281 softime 13528 // ACTION - 175 - edit_by_notification_task
282 softime 13137 // Action à utiliser lors de la mise à jour des instructions par notification
283     $this->class_actions[175] = array(
284 softime 13528 "identifier" => "edit_by_notification_task",
285 softime 13137 "view" => "formulaire",
286     "permission_suffix" => "modifier",
287     "crud" => "update",
288     );
289    
290 softime 14064 // ACTION - 176 - add_by_evenement_retour_after_notification_task
291     // Action à utiliser lors de l'ajout des instructions par événement suivant
292     // suite à une notification par tâche (donc notification dématerialisée)
293     $this->class_actions[176] = array(
294     "identifier" => "add_by_evenement_retour_after_notification_task",
295     "view" => "formulaire",
296     "permission_suffix" => "ajouter",
297     "crud" => "create",
298     );
299    
300 mbroquet 3730 // ACTION - 180 - pdf_lettre_rar
301 softime 8989 // Génère PDF sur bordereaux de lettres AR
302 mbroquet 3730 $this->class_actions[180] = array(
303     "identifier" => "pdf_lettre_rar",
304     "view" => "view_pdf_lettre_rar",
305     "permission_suffix" => "consulter",
306     );
307    
308     // ACTION - 190 - bordereau_envoi_maire
309     // Formulaire pour générer le bordereau d'envoi au maire
310     // Met à jour la date d'envoi à signature du maire
311     $this->class_actions[190] = array(
312     "identifier" => "bordereau_envoi_maire",
313     "view" => "view_bordereau_envoi_maire",
314     "permission_suffix" => "bordereau_envoi_maire",
315     );
316    
317     // ACTION - 200 - generate_bordereau_envoi_maire
318     // Génère PDF bordereau d'envoi au maire
319     $this->class_actions[200] = array(
320     "identifier" => "generate_bordereau_envoi_maire",
321     "view" => "view_generate_bordereau_envoi_maire",
322     "permission_suffix" => "bordereau_envoi_maire",
323     );
324 nmeucci 4108
325     // ACTION - 210 - notifier_commune
326     // Notifie la commune par mail d'un évément d'instruction finalisé
327     $this->class_actions[210] = array(
328     "identifier" => "notifier_commune",
329     "portlet" => array(
330     "type" => "action-direct-with-confirmation",
331     "libelle" => _("Notifier la commune par courriel"),
332     "order" => 210,
333     "class" => "notifier_commune-16",
334     ),
335     "view" => "formulaire",
336     "method" => "notifier_commune",
337     "permission_suffix" => "notifier_commune",
338 softime 6565 "condition" => array("is_notifiable", "can_user_access_dossier_contexte_modification"),
339 nmeucci 4108 );
340 nmeucci 4317
341     // ACTION - 220 - generate_suivi_bordereaux
342     // GénÚre PDF bordereaux
343     $this->class_actions[220] = array(
344     "identifier" => "generate_suivi_bordereaux",
345     "view" => "view_generate_suivi_bordereaux",
346 softime 6565 "permission_suffix" => "consulter",
347     );
348 softime 7521
349     // ACTION - 777 - pdf_temp
350     // Crée un PDF temporaire et affiche son contenu en base64
351     $this->class_actions[777] = array(
352     "identifier" => "pdf_temp",
353     "view" => "view_pdf_temp",
354     "permission_suffix" => "modifier",
355     "condition" => array("can_user_access_dossier_contexte_modification"),
356     );
357 softime 8593
358     // ACTION - 701
359     $this->class_actions[701] = array(
360     "identifier" => "enable-edition-integrale",
361     "portlet" => array(
362     "type" => "action-direct-with-confirmation",
363     "libelle" => _("Rédaction libre"),
364     "order" => 50,
365     "class" => "redac-libre-16",
366     ),
367     "view" => "formulaire",
368     "method" => "enable_edition_integrale",
369     "permission_suffix" => "modifier",
370     "condition" => array(
371     "is_editable",
372     "is_finalizable_without_bypass",
373     "can_user_access_dossier_contexte_modification",
374     "is_edition_integrale_not_enabled",
375     "is_option_redaction_libre_enabled",
376     "has_an_edition",
377     ),
378     );
379     // ACTION - 702
380     $this->class_actions[702] = array(
381     "identifier" => "disable-edition-integrale",
382     "portlet" => array(
383     "type" => "action-direct-with-confirmation",
384     "libelle" => _("Rédaction par compléments"),
385     "order" => 50,
386     "class" => "redac-complement-16",
387     ),
388     "view" => "formulaire",
389     "method" => "disable_edition_integrale",
390     "permission_suffix" => "modifier",
391     "condition" => array(
392     "is_editable",
393     "is_finalizable_without_bypass",
394     "can_user_access_dossier_contexte_modification",
395     "is_edition_integrale_enabled",
396     "is_option_redaction_libre_enabled",
397     "has_an_edition",
398     ),
399     );
400     // ACTION - 300 - evenement_has_an_edition_json
401     //
402     $this->class_actions[300] = array(
403     "identifier" => "evenement_has_an_edition_json",
404     "view" => "view_evenement_has_an_edition_json",
405     "permission_suffix" => "consulter",
406     );
407 softime 10573
408     // ACTION - 301 - evenement_has_a_commentaire
409     //
410     $this->class_actions[301] = array(
411     "identifier" => "evenement_has_a_commentaire_json",
412     "view" => "view_evenement_has_a_commentaire_json",
413     "permission_suffix" => "consulter",
414     );
415    
416     // ACTION - 400 - Envoyer en signature
417     // Cet évenement permet d'envoyer le document au parapheur pour signature
418     $this->class_actions[400] = array(
419     "identifier" => "envoyer_a_signature",
420     "portlet" => array(
421     "libelle" => _("Envoyer à signature"),
422     "type" => "action-direct-with-confirmation",
423     "class" => "envoyer_a_signature-16",
424     ),
425     "view" => "formulaire",
426 softime 10713 "method" => "envoyer_a_signature_sans_relecture",
427 softime 10573 "condition" => array(
428     "can_be_signed",
429     ),
430     "permission_suffix" => "envoyer_a_signature",
431     );
432    
433 softime 10713 // ACTION - 402 - Envoyer en signature avec relecture
434     // Cet évenement permet d'envoyer le document au parapheur pour signature
435     $this->class_actions[402] = array(
436     "identifier" => "envoyer_a_signature_relecture",
437     "portlet" => array(
438     "libelle" => __("Envoyer à signature avec relecture"),
439     "type" => "action-direct-with-confirmation",
440     "class" => "envoyer_a_signature-16",
441     ),
442     "view" => "formulaire",
443     "method" => "envoyer_a_signature_avec_relecture",
444     "condition" => array(
445     "can_be_signed",
446 softime 10808 "is_parapheur_relecture_parameter_enabled"
447 softime 10713 ),
448     "permission_suffix" => "envoyer_a_signature",
449     );
450    
451 softime 11876 // ACTION - 404 - Annuler l'envoi en signature
452     // Cet évenement permet d'annuler l'envoi en signature du document au parapheur
453     $this->class_actions[404] = array(
454     "identifier" => "annuler_envoi_signature",
455     "portlet" => array(
456     "libelle" => __("Annuler l'envoi en signature"),
457     "type" => "action-direct-with-confirmation",
458     "class" => "annuler_envoi_signature-16",
459     ),
460     "view" => "formulaire",
461     "method" => "annuler_envoi_en_signature",
462     "condition" => array(
463 softime 12124 "is_sent_for_signature",
464 softime 11876 "is_parapheur_annulation_parameter_enabled"
465     ),
466     "permission_suffix" => "envoyer_a_signature",
467     );
468    
469 softime 10573 //
470     $this->class_actions[401] = array(
471     "identifier" => "preview_edition",
472     "view" => "formulaire",
473     "permission_suffix" => "tab",
474     );
475    
476 softime 10808 // ACTION - 410 - Notifier les pétitionnaires (mail ou autre)
477     $this->class_actions[410] = array(
478     "identifier" => "overlay_notification_manuelle",
479     "portlet" => array(
480     "libelle" => __("Notifier les pétitionnaires"),
481     "type" => "action-self",
482     "class" => "notifier_commune-16",
483     ),
484     "condition" => array(
485     "is_notifiable_by_task_manual",
486 softime 10869 "is_not_portail_notification_sans_annexe"
487 softime 10808 ),
488     "view" => "view_overlay_notification_manuelle",
489     "permission_suffix" => "modifier",
490     );
491    
492 softime 11585 // ACTION - 411 - Notifier les pétitionnaires (portail citoyen)
493 softime 10808 $this->class_actions[411] = array(
494     "identifier" => "notification_manuelle_portal",
495     "portlet" => array(
496     "libelle" => __("Notifier les pétitionnaires"),
497     "type" => "action-direct-with-confirmation",
498     "class" => "notifier_commune-16",
499     ),
500     "condition" => array(
501     "is_notifiable_by_task_manual",
502 softime 10869 "is_portail_notification_sans_annexe"
503 softime 10808 ),
504 softime 14542 "method" => "notifier_demandeur_principal_via_portal",
505 softime 10808 "permission_suffix" => "modifier",
506     );
507    
508 softime 11585 // ACTION - 420 - Notifier les services consultés (mail)
509     $this->class_actions[420] = array(
510     "identifier" => "overlay_notification_service_consulte",
511     "portlet" => array(
512     "libelle" => __("Notifier les services consultés"),
513     "type" => "action-self",
514     "class" => "notifier_commune-16",
515     ),
516     "condition" => array(
517     "is_service_notifiable"
518     ),
519     "view" => "view_overlay_notification_service_consulte",
520     "permission_suffix" => "tab",
521     );
522    
523     // ACTION - 430 - Notifier les tiers consultés (mail)
524     $this->class_actions[430] = array(
525     "identifier" => "overlay_notification_tiers_consulte",
526     "portlet" => array(
527     "libelle" => __("Notifier les tiers consultés"),
528     "type" => "action-self",
529     "class" => "notifier_commune-16",
530     ),
531     "condition" => array(
532     "is_tiers_notifiable"
533     ),
534     "view" => "view_overlay_notification_tiers_consulte",
535     "permission_suffix" => "tab",
536     );
537    
538 softime 10573 //
539 softime 11418 $this->class_actions[403] = array(
540     "identifier" => "envoyer_au_controle_de_legalite",
541     "portlet" => array(
542     "libelle" => __("Envoyer au contrôle de légalité"),
543     "type" => "action-direct-with-confirmation",
544     "class" => "envoyer_au_controle_de_legalite-16",
545     ),
546     "view" => "formulaire",
547     "method" => "envoyer_au_controle_de_legalite",
548     "condition" => array(
549     "can_be_sended_to_cl"
550     ),
551     "permission_suffix" => "envoyer_au_controle_de_legalite",
552     );
553    
554     //
555 softime 10573 $this->class_actions[998] = array(
556     "identifier" => "json_data",
557     "view" => "view_json_data",
558     "permission_suffix" => "consulter",
559     );
560 mbroquet 3730 }
561    
562 softime 8593 /**
563 softime 8989 * Clause select pour la requête de sélection des données de l'enregistrement.
564     *
565     * @return array
566     */
567     function get_var_sql_forminc__champs() {
568     return array(
569     "instruction",
570     "destinataire",
571     "instruction.evenement",
572 softime 10573 "instruction.commentaire",
573 softime 8989 "date_evenement",
574     "instruction.lettretype",
575     "signataire_arrete",
576     "flag_edition_integrale",
577     "om_final_instruction_utilisateur",
578     "date_finalisation_courrier",
579     "date_envoi_signature",
580     "date_envoi_rar",
581     "date_envoi_controle_legalite",
582    
583     "date_retour_signature",
584     "date_retour_rar",
585     "date_retour_controle_legalite",
586    
587     "numero_arrete",
588    
589     "complement_om_html",
590     "'' as bible_auto",
591     "'' as bible",
592     "complement2_om_html",
593     "'' as bible2",
594     "complement3_om_html",
595     "'' as bible3",
596     "complement4_om_html",
597     "'' as bible4",
598    
599     "titre_om_htmletat",
600     "corps_om_htmletatex",
601    
602     "'' as btn_preview",
603     "'' as btn_redaction",
604    
605     "'' as btn_refresh",
606     "'' as live_preview",
607    
608     "dossier",
609     "instruction.action",
610     "instruction.delai",
611     "instruction.etat",
612     "instruction.autorite_competente",
613     "instruction.accord_tacite",
614     "instruction.delai_notification",
615     "instruction.avis_decision",
616     "archive_delai",
617     "archive_accord_tacite",
618     "archive_etat",
619     "archive_avis",
620     "archive_date_complet",
621     "archive_date_rejet",
622     "archive_date_limite",
623     "archive_date_notification_delai",
624     "archive_date_decision",
625     "archive_date_validite",
626     "archive_date_achevement",
627     "archive_date_conformite",
628     "archive_date_chantier",
629     "archive_date_dernier_depot",
630     "date_depot",
631 softime 10573 "date_depot_mairie",
632 softime 8989 "complement5_om_html",
633     "'' as bible5",
634     "complement6_om_html",
635     "'' as bible6",
636     "complement7_om_html",
637     "'' as bible7",
638     "complement8_om_html",
639     "'' as bible8",
640     "complement9_om_html",
641     "'' as bible9",
642     "complement10_om_html",
643     "'' as bible10",
644     "complement11_om_html",
645     "'' as bible11",
646     "complement12_om_html",
647     "complement13_om_html",
648     "complement14_om_html",
649     "complement15_om_html",
650     "archive_incompletude",
651     "archive_incomplet_notifie",
652     "archive_evenement_suivant_tacite",
653     "archive_evenement_suivant_tacite_incompletude",
654     "archive_etat_pendant_incompletude",
655     "archive_date_limite_incompletude",
656     "archive_delai_incompletude",
657     "archive_autorite_competente",
658     "code_barres",
659     "om_fichier_instruction",
660     "om_final_instruction",
661     "om_fichier_instruction_dossier_final",
662     "document_numerise",
663     "duree_validite_parametrage",
664     "duree_validite",
665     "created_by_commune",
666     "archive_date_cloture_instruction",
667     "archive_date_premiere_visite",
668     "archive_date_derniere_visite",
669     "archive_date_contradictoire",
670     "archive_date_retour_contradictoire",
671     "archive_date_ait",
672     "archive_date_transmission_parquet",
673     "archive_dossier_instruction_type",
674     "archive_date_affichage",
675 softime 10573 "pec_metier",
676     "archive_pec_metier",
677     "archive_a_qualifier",
678     "id_parapheur_signature",
679     "statut_signature",
680     "commentaire_signature",
681     "historique_signature",
682 softime 10808 "'' as suivi_notification",
683 softime 11585 "'' as suivi_notification_service",
684     "'' as suivi_notification_tiers",
685 softime 12654 "'' as suivi_notification_commune",
686 softime 10573
687     "'' as preview_edition",
688 softime 11418 "envoye_cl_platau",
689 softime 12124 "'' as log_instruction"
690 softime 8989 );
691     }
692    
693     /**
694 softime 8593 * CONDITION - is_edition_integrale_enabled
695     *
696     * Vérifie que la rédaction libre est activée sur l'instruction en cours.
697     *
698     * @return boolean
699     */
700     function is_edition_integrale_enabled() {
701     if ($this->getVal("flag_edition_integrale") == 't') {
702     return true;
703     }
704     return false;
705     }
706 mbroquet 3730
707     /**
708 softime 8593 * CONDITION - is_edition_integrale_not_enabled
709     *
710     * Vérifie que la rédaction libre est désactivée sur l'instruction en cours.
711     *
712     * @return boolean
713     */
714     function is_edition_integrale_not_enabled() {
715     return !$this->is_edition_integrale_enabled();
716     }
717    
718     /**
719     * CONDITION - is_option_redaction_libre_enabled
720     *
721     * Vérifie que l'option de rédaction libre est activée.
722     *
723     * @return boolean
724     */
725     function is_option_redaction_libre_enabled() {
726     $collectivite_di = $this->get_dossier_instruction_om_collectivite();
727     return $this->f->is_option_redaction_libre_enabled($collectivite_di);
728     }
729    
730     /**
731 softime 10713 * CONDITION - is_option_parapheur_relecture_enabled
732     *
733     * Vérifie que l'option de relecture lors de l'envoi en signature est activée.
734     *
735     * @return boolean
736     */
737 softime 10808 function is_parapheur_relecture_parameter_enabled() {
738     //Instanciation de la classe electronicsignature
739     $inst_es = $this->get_electronicsignature_instance();
740     if ($inst_es === false) {
741     return false;
742     }
743    
744     if ($inst_es->get_conf('is_forced_view_files') !== 'true' && $inst_es->get_conf('is_forced_view_files') !== true) {
745     return false;
746     }
747    
748     return true;
749 softime 10713 }
750    
751 softime 11876 /**
752     * CONDITION - is_parapheur_annulation_parameter_enabled
753     *
754     * Vérifie que l'option d'annulation de l'envoi en signature est activée.
755     *
756     * @return boolean
757     */
758     function is_parapheur_annulation_parameter_enabled() {
759     //Instanciation de la classe electronicsignature
760     $inst_es = $this->get_electronicsignature_instance();
761     if ($inst_es === false) {
762     return false;
763     }
764 softime 10713
765 softime 11876 if ($inst_es->get_conf('cancel_send') !== 'true' && $inst_es->get_conf('cancel_send') !== true) {
766     return false;
767     }
768    
769     return true;
770     }
771    
772    
773 softime 10713 /**
774 softime 10573 * CONDITION - is_sent_for_signature
775     *
776     * Vérifie que l'instruction a été envoyé à signature
777     *
778     * @return boolean
779     */
780     function is_sent_for_signature() {
781     // Si un parapheur a été configuré
782     // et que le champ id_parapheur_signature n'est pas vide
783     // que le status est différent de "canceled" ou "expired"
784     // alors l'évènement a été envoyé en signature
785     if ($this->has_connector_electronicsignature() === true
786     && empty($this->getVal("id_parapheur_signature")) === false
787     && ($this->getVal("statut_signature") != "canceled"
788 softime 12124 && $this->getVal("statut_signature") != "expired"
789     && $this->getVal("statut_signature") != "finished")) {
790 softime 10573 //
791     return true;
792     }
793    
794     return false;
795     }
796    
797     /**
798     * CONDITION - is_not_sent_for_signature
799     *
800     * Vérifie que l'instruction n'a pas été envoyé à signature
801     *
802     * @return boolean
803     */
804     function is_not_sent_for_signature() {
805 softime 10968 // Contrôle si l'utilisateur possède un bypass
806     $bypass = $this->f->isAccredited($this->get_absolute_class_name()."_definaliser_bypass");
807     if ($bypass == true) {
808     return true;
809     }
810    
811 softime 10573 return !$this->is_sent_for_signature();
812     }
813    
814    
815     /**
816     * CONDITION - is_signed
817     *
818     * Vérifie que l'instruction a été signé
819     *
820     * @return boolean
821     */
822     function is_signed() {
823     // Si un parapheur a été configuré
824     // et que le champ id_parapheur_signature n'est pas vide
825     // et que le statut est égal à "finished"
826     // alors le document de l'instruciton à été signé
827     if ($this->has_connector_electronicsignature() === true
828     && empty($this->getVal("id_parapheur_signature")) === false
829     && $this->getVal("statut_signature") == "finished") {
830     //
831     return true;
832     }
833    
834     return false;
835     }
836    
837 softime 11876
838 softime 12433 /**
839     * is_sent_to_cl
840     *
841     * Vérifie que l'instruction a été envoyé au contrôle de légalité
842     *
843     * @return boolean
844     */
845 softime 11418 function is_sent_to_cl() {
846 softime 12433 // Si la case à cocher de l'instruction envoye_cl_platau est à "t"
847     if ($this->getVal('envoye_cl_platau') === 't') {
848     //
849     return true;
850 softime 11418 }
851     //
852     return false;
853     }
854    
855 softime 10808 /**
856     * CONDITION - is_portail_notification
857     *
858     * Vérifie si la notification est une notification de catégorie portail
859     *
860     * @return boolean
861     */
862 softime 10869 function is_portail_notification_sans_annexe() {
863 softime 10808 $collectiviteDi = $this->get_dossier_instruction_om_collectivite();
864 softime 10869 $ev = $this->get_inst_evenement($this->getVal('evenement'));
865 softime 14064 if ($this->f->get_param_option_notification($collectiviteDi) === PORTAL
866 softime 10869 && $ev->getVal('notification') != 'notification_manuelle_annexe'
867     && $ev->getVal('notification') != 'notification_manuelle_annexe_signature_requise'
868     ) {
869 softime 10808 return true;
870     }
871     return false;
872     }
873 softime 10573
874     /**
875 softime 10808 * CONDITION - is_not_portail_notification
876     *
877     * Vérifie si la notification n'est pas une notification de catégorie portail
878     *
879     * @return boolean
880     */
881 softime 10869 function is_not_portail_notification_sans_annexe() {
882     return (! $this->is_portail_notification_sans_annexe());
883 softime 10808 }
884    
885     /**
886 softime 10573 * CONDITION - can_be_signed
887     *
888     * Vérifie que le document de l'instruction peut être envoyé au parapheur pour signature
889     *
890     * @return boolean
891     */
892     function can_be_signed() {
893     // Instanciation de l'objet signataire_arrete
894     $inst_signataire_arrete = $this->f->get_inst__om_dbform(array(
895     "obj" => "signataire_arrete",
896     "idx" => $this->getVal("signataire_arrete"),
897     ));
898     // Si un parapheur a été configuré, que le document est finalisé, que le signataire
899     // possède une adresse email, on vérifie le champ id_parapheur_signature
900     // S'il est vide l'évènement peut être envoyé en signature
901     // S'il ne l'est pas, alors on vérifie le champ statut_signature
902     // Si la valeur de ce champ est égal à "canceled" ou "expired"
903     // alors l'évènement peut être envoyé en signature
904     if ($this->has_connector_electronicsignature() === true
905     && $this->getVal("om_final_instruction") == 't'
906     && empty($inst_signataire_arrete->getVal('email')) === false) {
907     //
908     if (empty($this->getVal("id_parapheur_signature")) === true
909     || $this->getVal("statut_signature") == "canceled"
910     || $this->getVal("statut_signature") == "expired") {
911     //
912     return true;
913     }
914     }
915    
916     $this->addToLog(__METHOD__."() has_connector_electronicsignature: ".var_export($this->has_connector_electronicsignature(), true), EXTRA_VERBOSE_MODE);
917     $this->addToLog(__METHOD__."() om_final_instruction: ".var_export($this->getVal("om_final_instruction"), true), EXTRA_VERBOSE_MODE);
918     $this->addToLog(__METHOD__."() email: ".var_export($inst_signataire_arrete->getVal('email'), true), EXTRA_VERBOSE_MODE);
919     $this->addToLog(__METHOD__."() id_parapheur_signature: ".var_export($this->getVal("id_parapheur_signature"), true), EXTRA_VERBOSE_MODE);
920     $this->addToLog(__METHOD__."() statut_signature: ".var_export($this->getVal("statut_signature"), true), EXTRA_VERBOSE_MODE);
921    
922     return false;
923     }
924    
925     /**
926     * CONDITION - has_connector_electronicsignature
927     *
928     * Vérifie qu'un parapheur est paramétré
929     *
930     * @return boolean
931     */
932     function has_connector_electronicsignature() {
933     $inst_es = $this->get_electronicsignature_instance(false);
934     if ($inst_es === false) {
935     return false;
936     }
937     return true;
938     }
939    
940     /**
941     * CONDITION - can_display_parapheur
942     *
943     * Vérifie que le fieldset "Suivi Parapheur" soit affichable
944     *
945     * @return boolean
946     */
947     function can_display_parapheur() {
948     $evenement_id = $this->getVal("evenement");
949     $inst_evenement = $this->get_inst_evenement($evenement_id);
950     if ($this->has_connector_electronicsignature() === true
951     && $inst_evenement->getVal('lettretype') !== ''
952     && $inst_evenement->getVal('lettretype') !== null
953     && (empty($this->getVal("id_parapheur_signature")) === false
954     || empty($this->getVal("historique_signature")) === false)) {
955     //
956     return true;
957     }
958    
959     return false;
960     }
961    
962     /**
963 softime 10808 * CONDITION - can_display_notification
964     *
965 softime 11585 * Vérifie que le champs "Suivi notification" est affichable
966 softime 10808 *
967     * @return boolean
968     */
969 softime 11585 function can_display_notification_demandeur() {
970 softime 10808 // Le suivi des notification est affiché si l'événement est notifiable
971     // et si des notifications ont été envoyées
972     $evenement_id = $this->getVal("evenement");
973     $inst_evenement = $this->get_inst_evenement($evenement_id);
974     if ($inst_evenement->getVal('notification') != null &&
975     $inst_evenement->getVal('notification') != '') {
976     // Des notifications ont été envoyé si il existe au moins une notification
977     // liées à l'instruction
978 softime 11585 $idsNotifs = $this->get_instruction_notification(
979     $this->getVal($this->clePrimaire),
980     array(
981     'notification_recepisse',
982     'notification_instruction',
983     'notification_decision',
984 softime 12124 ),
985     true
986 softime 11585 );
987 softime 10808 if (isset($idsNotifs) && $idsNotifs !== array()) {
988     return true;
989     }
990     }
991     return false;
992     }
993    
994     /**
995 softime 11585 * CONDITION - can_display_notification
996     *
997     * Vérifie que le champs "suivi_notification_service" est affichable
998     *
999     * @return boolean
1000     */
1001     function can_display_notification_service() {
1002     // Le suivi des notification est affiché si l'événement est notifiable
1003     // et si des notifications ont été envoyées
1004     $evenement_id = $this->getVal("evenement");
1005     $inst_evenement = $this->get_inst_evenement($evenement_id);
1006     if ($this->get_boolean_from_pgsql_value($inst_evenement->getVal('notification_service')) == true) {
1007     // Des notifications ont été envoyé si il existe au moins une notification
1008     // de type notification_service_consulte liées à l'instruction
1009     $idsNotifs = $this->get_instruction_notification(
1010     $this->getVal($this->clePrimaire),
1011     'notification_service_consulte'
1012     );
1013     if (isset($idsNotifs) && $idsNotifs !== array()) {
1014     return true;
1015     }
1016     }
1017     return false;
1018     }
1019    
1020    
1021     /**
1022     * CONDITION - can_display_notification_tiers
1023     *
1024     * Vérifie que le champs "suivi_notification_tiers" est affichable
1025     *
1026     * @return boolean
1027     */
1028     function can_display_notification_tiers() {
1029     // Le suivi des notification est affiché si l'événement est notifiable
1030     // et si des notifications ont été envoyées
1031     $evenement_id = $this->getVal("evenement");
1032     $inst_evenement = $this->get_inst_evenement($evenement_id);
1033 softime 13137 if (! empty($inst_evenement->getVal('notification_tiers'))) {
1034 softime 11585 // Des notifications ont été envoyé si il existe au moins une notification
1035     // de type notification_tiers_consulte liées à l'instruction
1036     $idsNotifs = $this->get_instruction_notification(
1037     $this->getVal($this->clePrimaire),
1038     'notification_tiers_consulte'
1039     );
1040     if (isset($idsNotifs) && $idsNotifs !== array()) {
1041     return true;
1042     }
1043     }
1044     return false;
1045     }
1046    
1047     /**
1048 softime 12654 * CONDITION - can_display_notification_commune
1049     *
1050     * Vérifie que le champs "suivi_notification_commune" est affichable
1051     *
1052     * @return boolean
1053     */
1054     function can_display_notification_commune() {
1055     // Le suivi des notification si il existe au moins une notification
1056     // de type notification_depot_demat liées à l'instruction
1057     $idsNotifs = $this->get_instruction_notification(
1058     $this->getVal($this->clePrimaire),
1059     array('notification_depot_demat', 'notification_commune')
1060     );
1061     if (isset($idsNotifs) && $idsNotifs !== array()) {
1062     return true;
1063     }
1064     return false;
1065     }
1066    
1067     /**
1068 softime 8593 * TREATMENT - disable_edition_integrale.
1069     *
1070     * Cette methode permet de passer la consultation en "lu"
1071     *
1072     * @return boolean true si maj effectué false sinon
1073     */
1074     function disable_edition_integrale() {
1075     // Cette méthode permet d'exécuter une routine en début des méthodes
1076     // dites de TREATMENT.
1077     $this->begin_treatment(__METHOD__);
1078     $this->correct = true;
1079     $valF = array(
1080     "flag_edition_integrale" => false,
1081     "titre_om_htmletat" => null,
1082     "corps_om_htmletatex" => null,
1083     );
1084     $res = $this->f->db->autoExecute(
1085     DB_PREFIXE.$this->table,
1086     $valF,
1087     DB_AUTOQUERY_UPDATE,
1088     $this->clePrimaire."=".$this->getVal($this->clePrimaire)
1089     );
1090     if ($this->f->isDatabaseError($res, true)) {
1091     // Appel de la methode de recuperation des erreurs
1092     $this->erreur_db($res->getDebugInfo(), $res->getMessage(), '');
1093     $this->correct = false;
1094     // Termine le traitement
1095     return $this->end_treatment(__METHOD__, false);
1096     } else {
1097     $this->addToMessage(_("Rédaction par compléments activé."));
1098     return $this->end_treatment(__METHOD__, true);
1099     }
1100    
1101     // Termine le traitement
1102     return $this->end_treatment(__METHOD__, false);
1103     }
1104    
1105     /**
1106     * TREATMENT - enable_edition_integrale.
1107     *
1108     * Cette methode permet de passer la consultation en "lu"
1109     *
1110     * @return boolean true si maj effectué false sinon
1111     */
1112     function enable_edition_integrale() {
1113     // Cette méthode permet d'exécuter une routine en début des méthodes
1114     // dites de TREATMENT.
1115     $this->begin_treatment(__METHOD__);
1116     $this->correct = true;
1117    
1118     // Récupère la collectivite du dossier d'instruction
1119     $dossier_instruction_om_collectivite = $this->get_dossier_instruction_om_collectivite();
1120     $collectivite = $this->f->getCollectivite($dossier_instruction_om_collectivite);
1121     //
1122     $params = array(
1123     "specific" => array(
1124     "corps" => array(
1125     "mode" => "get",
1126     )
1127     ),
1128     );
1129     $result = $this->compute_pdf_output('lettretype', $this->getVal('lettretype'), $collectivite, null, $params);
1130     $corps = $result['pdf_output'];
1131     //
1132     $params = array(
1133     "specific" => array(
1134     "titre" => array(
1135     "mode" => "get",
1136     )
1137     ),
1138     );
1139     $result = $this->compute_pdf_output('lettretype', $this->getVal('lettretype'), $collectivite, null, $params);
1140     $titre = $result['pdf_output'];
1141     //
1142     $valF = array(
1143     "flag_edition_integrale" => true,
1144     "titre_om_htmletat" => $titre,
1145     "corps_om_htmletatex" => $corps,
1146     );
1147     $res = $this->f->db->autoExecute(
1148     DB_PREFIXE.$this->table,
1149     $valF,
1150     DB_AUTOQUERY_UPDATE,
1151     $this->clePrimaire."=".$this->getVal($this->clePrimaire)
1152     );
1153     if ($this->f->isDatabaseError($res, true)) {
1154     // Appel de la methode de recuperation des erreurs
1155     $this->erreur_db($res->getDebugInfo(), $res->getMessage(), '');
1156     $this->correct = false;
1157     // Termine le traitement
1158     return $this->end_treatment(__METHOD__, false);
1159     } else {
1160     $this->addToMessage(_("Rédaction libre activé."));
1161     return $this->end_treatment(__METHOD__, true);
1162     }
1163    
1164     // Termine le traitement
1165     return $this->end_treatment(__METHOD__, false);
1166     }
1167    
1168     /**
1169 softime 14064 * Cette méthode instancie le dossier à partir de l'identifiant passé
1170     * en paramètre et renvoie l'identifiant du dossier d'autorisation (DA)
1171     * associé au dossier.
1172     * Si l'identifiant du dossier n'est pas fourni alors cette méthode
1173     * renverra NULL
1174     *
1175     * @param string identifiant du dossier
1176     * @return null|string null ou identifiant du DA
1177 mbroquet 3730 */
1178     function getNumDemandeAutorFromDossier($id) {
1179     if (!isset($id)) {
1180     return NULL;
1181     }
1182 softime 14064
1183     $dossier = $this->f->get_inst__om_dbform(array(
1184     'obj' => 'dossier',
1185     'idx' => $id,
1186     ));
1187    
1188     return $dossier->getVal('dossier_autorisation');
1189 mbroquet 3730 }
1190    
1191 softime 14064
1192 mbroquet 3730 function setType(&$form, $maj) {
1193 softime 8593 // Récupération du mode de l'action
1194     $crud = $this->get_action_crud($maj);
1195     // Récupère la collectivité du dossier d'instruction
1196     $collectivite_di = $this->get_dossier_instruction_om_collectivite();
1197 mbroquet 3730
1198 softime 8593 // Cache tous les champs
1199     foreach ($this->champs as $value) {
1200     $form->setType($value, 'hidden');
1201     }
1202 softime 6565
1203 softime 10573 // Les champs historique_signature et statut_signature ne sont pas saisissable dans tous les cas
1204 softime 11228 if ($this->can_display_parapheur() === true && $maj == 3) {
1205 softime 10573 $form->setType('statut_signature', 'selectstatic');
1206     $form->setType('historique_signature', 'jsontotab');
1207     if ($this->getVal('commentaire_signature') == null) {
1208     $form->setType('commentaire_signature', 'hidden');
1209     } else {
1210     $form->setType('commentaire_signature', 'hiddenstatic');
1211     }
1212     }
1213    
1214 softime 11585 // Le champ de suivi des notifications des demandeurs n'est pas affichable dans tous les cas
1215 softime 12654 if ($maj == 3 && $this->can_display_notification_demandeur() === true) {
1216 softime 10808 $form->setType('suivi_notification', 'jsontotab');
1217     }
1218 softime 11585 // Le champ de suivi des notifications des services n'est pas affichable dans tous les cas
1219 softime 12654 if ($maj == 3 && $this->can_display_notification_service() === true) {
1220 softime 11585 $form->setType('suivi_notification_service', 'jsontotab');
1221     }
1222     // Le champ de suivi des notifications des tiers n'est pas affichable dans tous les cas
1223 softime 12654 if ($maj == 3 && $this->can_display_notification_tiers() === true) {
1224 softime 11585 $form->setType('suivi_notification_tiers', 'jsontotab');
1225     }
1226 softime 12654 // Le champ de suivi des notifications des communes n'est pas affichable dans tous les cas
1227     if ($maj == 3 && $this->can_display_notification_commune() === true) {
1228     $form->setType('suivi_notification_commune', 'jsontotab');
1229     }
1230 softime 10808
1231 softime 8593 // MODE AJOUTER
1232     if ($this->getParameter('maj') == 0) {
1233 softime 10573 $form->setType('commentaire', 'textareahidden');
1234     // Si l'option est active passage du champ date en lecture seule
1235     if ($this->f->is_option_date_evenement_instruction_lecture_seule($collectivite_di) === true) {
1236     $form->setType("date_evenement", "hiddenstaticdate");
1237     } else {
1238     $form->setType("date_evenement", "date");
1239     }
1240 softime 8989 if ($this->is_in_context_of_foreign_key("evenement", $this->getParameter("retourformulaire"))) {
1241 softime 8593 $form->setType("evenement", "selecthiddenstatic");
1242     } else {
1243     $form->setType("evenement", "select");
1244     }
1245 softime 8989 if ($this->is_in_context_of_foreign_key("signataire_arrete", $this->getParameter("retourformulaire"))) {
1246 softime 8593 $form->setType("signataire_arrete", "selecthiddenstatic");
1247     } else {
1248     $form->setType("signataire_arrete", "select");
1249     }
1250     if ($this->is_option_redaction_libre_enabled() === true) {
1251     $form->setType("flag_edition_integrale", "select");
1252     }
1253 mbroquet 3730 }
1254    
1255 softime 8593 // MODE MODIFIER
1256     if ($this->getParameter('maj') == 1) {
1257 softime 10573 // Si l'option est active passage du champ date en lecture seule
1258     if ($this->f->is_option_date_evenement_instruction_lecture_seule($collectivite_di) === true) {
1259     $form->setType("date_evenement", "hiddenstaticdate");
1260     } else {
1261     $form->setType("date_evenement", "date");
1262     }
1263 softime 8593 $form->setType("evenement", "selecthiddenstatic");
1264     if ($this->has_an_edition() === true) {
1265     $form->setType('lettretype', 'hiddenstatic');
1266 softime 8989 if ($this->is_in_context_of_foreign_key("signataire_arrete", $this->getParameter("retourformulaire"))) {
1267 softime 8593 $form->setType("signataire_arrete", "selecthiddenstatic");
1268     } else {
1269     $form->setType("signataire_arrete", "select");
1270     }
1271     if ($this->getVal("flag_edition_integrale") == "t") {
1272     $form->setType("titre_om_htmletat", "htmlEtat");
1273     $form->setType("corps_om_htmletatex", "htmlEtatEx");
1274     } else {
1275     $form->setType("complement_om_html", "html");
1276     $form->setType("complement2_om_html", "html");
1277     $form->setType("complement3_om_html", "html");
1278     $form->setType("complement4_om_html", "html");
1279     $form->setType('bible_auto', 'httpclick');
1280     $form->setType('bible', 'httpclick');
1281     $form->setType('bible2', 'httpclick');
1282     $form->setType('bible3', 'httpclick');
1283     $form->setType('bible4', 'httpclick');
1284     }
1285     if ($this->f->is_option_preview_pdf_enabled($collectivite_di) === true) {
1286     //
1287     $form->setType('btn_refresh', 'httpclickbutton');
1288     $form->setType('btn_preview', 'httpclickbutton');
1289     $form->setType('btn_redaction', 'httpclickbutton');
1290 softime 11876 // /!\ le type du champs est utilisé dans un selecteur dans le jscript.js
1291     // pour identifiant le champ de prévisualisation et régler sa taille à
1292     // l'affichage du champ. En cas de modification, le selecteur doit également
1293     // être mis à jour
1294 softime 11418 $form->setType('live_preview', 'previsualiser_pdf');
1295 softime 7521 }
1296 softime 8593
1297 mbroquet 3730 // necessaire pour calcul de date en modification
1298     //$form->setType('delai', 'hiddenstatic');
1299     // les administrateurs technique et fonctionnel peuvent
1300     // modifier tous les champs de date
1301     // si l'instruction a déjà été finalisée au moins une fois
1302 softime 7996 if (($this->f->isAccredited(array($this->get_absolute_class_name(), $this->get_absolute_class_name()."modification_dates"), "OR")
1303 softime 6565 || $this->f->isAccredited(array('instruction', 'instruction_modification_dates'), "OR"))
1304 mbroquet 3730 && $this->getVal("date_finalisation_courrier") != '') {
1305 softime 8593 //
1306 mbroquet 3730 $form->setType('date_envoi_signature', 'date');
1307     $form->setType('date_retour_signature', 'date');
1308 softime 10573 if ($this->is_sent_for_signature() === true
1309     && $this->is_signed() === true) {
1310     //
1311     $form->setType("date_envoi_signature", "datereadonly");
1312     $form->setType("date_retour_signature", "datereadonly");
1313     }
1314 mbroquet 3730 $form->setType('date_envoi_rar', 'date');
1315     $form->setType('date_retour_rar', 'date');
1316     $form->setType('date_envoi_controle_legalite', 'date');
1317 softime 11418 if ($this->is_sent_to_cl() === true) {
1318 softime 12124 $form->setType("date_envoi_controle_legalite", "datedisabled");
1319 softime 11418 }
1320 mbroquet 3730 $form->setType('date_retour_controle_legalite', 'date');
1321     $form->setType('date_finalisation_courrier', 'date');
1322     }
1323     }
1324     }
1325    
1326 softime 10808 // MODE CONSULTER + SUPPRIMER + SUIVI DES DATES 125 + NOTIFICATION MANUELLE
1327 softime 8593 if ($this->getParameter('maj') == 3
1328     || $this->getParameter('maj') == 2
1329 softime 10808 || $this->getParameter('maj') == 125
1330     || $this->getParameter('maj') == 410) {
1331 softime 8593 //
1332     $form->setType("date_evenement", "datestatic");
1333     $form->setType("evenement", "selecthiddenstatic");
1334     if ($this->has_an_edition() === true) {
1335     $form->setType('lettretype', 'hiddenstatic');
1336     $form->setType("signataire_arrete", "selecthiddenstatic");
1337     if ($this->getVal("om_final_instruction") == 't') {
1338     $form->setType('om_final_instruction_utilisateur', 'textareastatic');
1339     } else {
1340     $form->setType('om_final_instruction_utilisateur', 'hidden');
1341     }
1342     }
1343 softime 10573 if ($this->evenement_has_a_commentaire($this->getVal('evenement')) === true ) {
1344     $form->setType('commentaire', 'textareastatic');
1345     }
1346 mbroquet 3730 }
1347    
1348 softime 10808 // MODE CONSULTER + SUPPRIMER + NOTIFICATION MANUELLE
1349     if ($this->getParameter('maj') == 3
1350     || $this->getParameter('maj') == 2
1351     || $this->getParameter('maj') == 410) {
1352 softime 10573 // Si il n'y a pas de lettre type (edition) associé à l'événement
1353     // les dates de suivi ne sont pas affichée
1354 softime 8593 if ($this->has_an_edition() === true) {
1355 softime 10573 $form->setType('date_envoi_signature', 'datestatic');
1356     $form->setType('date_retour_signature', 'datestatic');
1357     $form->setType('date_envoi_rar', 'datestatic');
1358     $form->setType('date_retour_rar', 'datestatic');
1359     $form->setType('date_envoi_controle_legalite', 'datestatic');
1360     $form->setType('date_retour_controle_legalite', 'datestatic');
1361     $form->setType('date_finalisation_courrier', 'datestatic');
1362 softime 8593 if ($this->getVal("flag_edition_integrale") == "t") {
1363     $form->setType("titre_om_htmletat", "htmlstatic");
1364     $form->setType("corps_om_htmletatex", "htmlstatic");
1365     } else {
1366     $form->setType("complement_om_html", "htmlstatic");
1367     $form->setType("complement2_om_html", "htmlstatic");
1368     $form->setType("complement3_om_html", "htmlstatic");
1369     $form->setType("complement4_om_html", "htmlstatic");
1370     }
1371 mbroquet 3730 }
1372     }
1373 softime 8593
1374     // MODE SUIVI DES DATES 125
1375     if ($this->getParameter('maj') == 125) {
1376     $form->setType("date_evenement", "hiddenstaticdate");
1377     $form->setType('om_final_instruction_utilisateur', 'hiddenstatic');
1378     $form->setType('date_envoi_signature', 'date');
1379     $form->setType('date_retour_signature', 'date');
1380 softime 10573 if ($this->is_sent_for_signature() === true
1381     || $this->is_signed() === true) {
1382     //
1383     $form->setType("date_envoi_signature", "datereadonly");
1384     $form->setType("date_retour_signature", "datereadonly");
1385     }
1386 softime 8593 $form->setType('date_envoi_rar', 'date');
1387     $form->setType('date_retour_rar', 'date');
1388     $form->setType('date_envoi_controle_legalite', 'date');
1389 softime 11418 if ($this->is_sent_to_cl() === true) {
1390 softime 12124 $form->setType("date_envoi_controle_legalite", "datedisabled");
1391 softime 11418 }
1392 softime 8593 $form->setType('date_retour_controle_legalite', 'date');
1393     $form->setType('date_finalisation_courrier', 'date');
1394     }
1395 softime 10573
1396     if ($maj == 401) {
1397     foreach ($this->champs as $champ) {
1398     $form->setType($champ, 'hidden');
1399     }
1400 softime 11418 $form->setType('preview_edition', 'previsualiser');
1401 softime 10573 }
1402 softime 12124
1403     // Si l'instruction a été envoyé au contrôle de légalité et que la
1404     // tâche envoi_cl lié n'a pas encore été traité il faut indiquer à
1405     // l'utilisateur que l'envoi au cl est en cours de traitement.
1406     if ($this->is_sent_to_cl() === true
1407     && empty($this->getVal('date_envoi_controle_legalite'))
1408     && $maj == 3) {
1409     $form->setType("date_envoi_controle_legalite", "hiddenstatic");
1410     }
1411 mbroquet 3730 }
1412    
1413 softime 8593 function setOnchange(&$form,$maj){
1414     parent::setOnchange($form,$maj);
1415    
1416     // MODE AJOUTER
1417     if ($this->getParameter('maj') == 0) {
1418 softime 10573 $form->setOnchange(
1419     "evenement",
1420     "manage_instruction_evenement_lettretype(this.value, '".addslashes($this->getParameter('idxformulaire'))."');
1421     manage_instruction_evenement_commentaire(this.value, '".addslashes($this->getParameter('idxformulaire'))."');"
1422     );
1423 softime 8593 }
1424     }
1425    
1426     function evenement_has_an_edition($evenement_id) {
1427     $evenement = $this->get_inst_evenement($evenement_id);
1428     $lettretype = $evenement->getVal('lettretype');
1429     if ($lettretype !== '' && $lettretype !== null) {
1430     return true;
1431     }
1432     return false;
1433     }
1434    
1435     function view_evenement_has_an_edition_json() {
1436     $json_return = array(
1437     "lettretype" => $this->evenement_has_an_edition($this->f->get_submitted_get_value('evenement_id')),
1438     "option_redaction_libre_enabled" => $this->is_option_redaction_libre_enabled(),
1439     );
1440     echo json_encode($json_return);
1441     }
1442    
1443 softime 10573 function evenement_has_a_commentaire($evenement_id) {
1444     $evenement = $this->get_inst_evenement($evenement_id);
1445     return $this->get_boolean_from_pgsql_value($evenement->getVal('commentaire'));
1446     }
1447    
1448     function view_evenement_has_a_commentaire_json() {
1449     $json_return = array(
1450     "commentaire" => $this->evenement_has_a_commentaire($this->f->get_submitted_get_value('evenement_id'))
1451     );
1452     echo json_encode($json_return);
1453     }
1454    
1455 softime 11418
1456 softime 8989 /**
1457 softime 11418 * CONDITION - can_be_sended_to_cl
1458 softime 8989 *
1459 softime 11418 * Vérifie que le contrôle de légalité est disponible
1460     *
1461     * @return boolean
1462     */
1463     function can_be_sended_to_cl() {
1464     // Si l'instruction a une édition
1465     // et que l'événement est paramétré pour envoyer le contrôle de légalité
1466     // par Plat'AU
1467     // et que la date de retour signature est renseignée
1468     // et que la date d'envoi au contrôle légalité n'est pas renseignée
1469     // et qu'il n'existe pas de task envoi_CL en cours (!= done ou canceled)
1470     if ($this->has_an_edition() === true) {
1471     $inst_di = $this->get_inst_dossier($this->getVal('dossier'));
1472     $inst_evenement = $this->get_inst_evenement($this->getVal('evenement'));
1473     if ($inst_evenement->getVal('envoi_cl_platau') === 't'
1474     && empty($this->getVal('date_retour_signature')) === false
1475     && empty($this->getVal('date_envoi_controle_legalite')) === true
1476     && $this->getVal('envoye_cl_platau') === 'f'
1477     && $this->f->is_type_dossier_platau($inst_di->getVal('dossier_autorisation')) === true
1478     && $inst_di->getVal('etat_transmission_platau') !== 'jamais_transmissible') {
1479     //
1480     return true;
1481     }
1482     }
1483     //
1484     return false;
1485     }
1486    
1487     /**
1488     *
1489 softime 8989 * @return string
1490     */
1491     function get_var_sql_forminc__sql_signataire_arrete() {
1492 softime 11585 return sprintf(
1493     "SELECT
1494     signataire_arrete.signataire_arrete,
1495     CONCAT_WS(
1496     ' - ',
1497     CONCAT_WS(' ', signataire_arrete.prenom, signataire_arrete.nom),
1498     signataire_habilitation.libelle,
1499     signataire_arrete.description
1500     )
1501     FROM
1502     %1\$ssignataire_arrete
1503     LEFT JOIN %1\$ssignataire_habilitation
1504     ON signataire_arrete.signataire_habilitation = signataire_habilitation.signataire_habilitation
1505     WHERE
1506     ((signataire_arrete.om_validite_debut IS NULL
1507     AND (signataire_arrete.om_validite_fin IS NULL
1508     OR signataire_arrete.om_validite_fin > CURRENT_DATE))
1509     OR (signataire_arrete.om_validite_debut <= CURRENT_DATE
1510     AND (signataire_arrete.om_validite_fin IS NULL
1511     OR signataire_arrete.om_validite_fin > CURRENT_DATE)))
1512     ORDER BY
1513     signataire_arrete.prenom,
1514     signataire_arrete.nom",
1515     DB_PREFIXE
1516     );
1517 softime 8989 }
1518    
1519     /**
1520     *
1521     * @return string
1522     */
1523     function get_var_sql_forminc__sql_signataire_arrete_by_id() {
1524 softime 11585 return sprintf(
1525     "SELECT
1526     signataire_arrete.signataire_arrete,
1527     CONCAT_WS(
1528     ' - ',
1529     CONCAT_WS(' ', signataire_arrete.prenom, signataire_arrete.nom),
1530     signataire_habilitation.libelle,
1531     signataire_arrete.description
1532     )
1533     FROM
1534     %1\$ssignataire_arrete
1535     LEFT JOIN %1\$ssignataire_habilitation
1536     ON signataire_arrete.signataire_habilitation = signataire_habilitation.signataire_habilitation
1537     WHERE
1538     signataire_arrete.signataire_arrete = <idx>",
1539     DB_PREFIXE
1540     );
1541 softime 8989 }
1542    
1543     /**
1544     *
1545     * @return string
1546     */
1547     function get_var_sql_forminc__sql_signataire_arrete_by_di() {
1548 softime 11585 return sprintf(
1549     "SELECT
1550     signataire_arrete.signataire_arrete,
1551     CONCAT_WS(
1552     ' - ',
1553     CONCAT_WS(' ', signataire_arrete.prenom, signataire_arrete.nom),
1554     signataire_habilitation.libelle,
1555     signataire_arrete.description
1556     )
1557     FROM
1558     %1\$ssignataire_arrete
1559     LEFT JOIN %1\$som_collectivite
1560     ON signataire_arrete.om_collectivite = om_collectivite.om_collectivite
1561     LEFT JOIN %1\$ssignataire_habilitation
1562     ON signataire_arrete.signataire_habilitation = signataire_habilitation.signataire_habilitation
1563     WHERE
1564     ((signataire_arrete.om_validite_debut IS NULL
1565     AND (signataire_arrete.om_validite_fin IS NULL
1566     OR signataire_arrete.om_validite_fin > CURRENT_DATE))
1567     OR (signataire_arrete.om_validite_debut <= CURRENT_DATE
1568     AND (signataire_arrete.om_validite_fin IS NULL
1569     OR signataire_arrete.om_validite_fin > CURRENT_DATE)))
1570     AND (om_collectivite.niveau = '2'
1571     OR signataire_arrete.om_collectivite = <collectivite_di>)
1572     ORDER BY
1573     signataire_arrete.prenom, signataire_arrete.nom",
1574     DB_PREFIXE
1575     );
1576 softime 8989 }
1577    
1578     /**
1579     *
1580     * @return string
1581     */
1582     function get_var_sql_forminc__sql_signataire_arrete_defaut() {
1583 softime 11585 return sprintf(
1584     "SELECT
1585     signataire_arrete.signataire_arrete,
1586     CONCAT_WS(
1587     ' - ',
1588     CONCAT_WS(' ', signataire_arrete.prenom, signataire_arrete.nom),
1589     signataire_habilitation.libelle,
1590     signataire_arrete.description
1591     )
1592     FROM
1593     %1\$ssignataire_arrete
1594     LEFT JOIN %1\$ssignataire_habilitation
1595     ON signataire_arrete.signataire_habilitation = signataire_habilitation.signataire_habilitation
1596     WHERE
1597     ((signataire_arrete.om_validite_debut IS NULL
1598     AND (signataire_arrete.om_validite_fin IS NULL
1599     OR signataire_arrete.om_validite_fin > CURRENT_DATE))
1600     OR (signataire_arrete.om_validite_debut <= CURRENT_DATE
1601     AND (signataire_arrete.om_validite_fin IS NULL
1602     OR signataire_arrete.om_validite_fin > CURRENT_DATE)))
1603     AND signataire_arrete.defaut IS TRUE
1604     ORDER BY
1605     signataire_arrete.prenom, signataire_arrete.nom",
1606     DB_PREFIXE
1607     );
1608 softime 8989 }
1609    
1610     /**
1611     *
1612     * @return string
1613     */
1614     function get_var_sql_forminc__sql_signataire_arrete_defaut_by_di() {
1615 softime 11585 return sprintf(
1616     "SELECT
1617     signataire_arrete.signataire_arrete,
1618     CONCAT_WS(
1619     ' - ',
1620     CONCAT_WS(' ', signataire_arrete.prenom, signataire_arrete.nom),
1621     signataire_habilitation.libelle,
1622     signataire_arrete.description
1623     )
1624     FROM
1625     %1\$ssignataire_arrete
1626     LEFT JOIN %1\$ssignataire_habilitation
1627     ON signataire_arrete.signataire_habilitation = signataire_habilitation.signataire_habilitation
1628     LEFT JOIN %1\$som_collectivite
1629     ON signataire_arrete.om_collectivite = om_collectivite.om_collectivite
1630     WHERE
1631     ((signataire_arrete.om_validite_debut IS NULL
1632     AND (signataire_arrete.om_validite_fin IS NULL
1633     OR signataire_arrete.om_validite_fin > CURRENT_DATE))
1634     OR (signataire_arrete.om_validite_debut <= CURRENT_DATE
1635     AND (signataire_arrete.om_validite_fin IS NULL
1636     OR signataire_arrete.om_validite_fin > CURRENT_DATE)))
1637     AND signataire_arrete.defaut IS TRUE
1638     AND (om_collectivite.niveau = '2'
1639     OR signataire_arrete.om_collectivite = <collectivite_di>)
1640     ORDER BY
1641     signataire_arrete.prenom,
1642     signataire_arrete.nom",
1643     DB_PREFIXE
1644     );
1645 softime 8989 }
1646    
1647     /**
1648 softime 14542 * Renvoie sous la forme d'un tableau la liste des événements pouvant être ajoutés au dossier
1649     * dont l'identifiant a été passé en paramètre dans l'url.
1650     *
1651     * @return array
1652     */
1653     function get_var_sql_forminc__sql_evenement() {
1654     // Récupération du numéro de dossier
1655     $dossier = $this->getParameter("idxformulaire");
1656     // Si changement de décision par instructeur commune
1657     $filter = '';
1658     if ($this->f->isUserInstructeur() === true
1659     && $this->getDivisionFromDossier($dossier) != $_SESSION["division"]
1660     && $this->isInstrCanChangeDecision($dossier) === true) {
1661     $filter = "AND evenement.type IN ('arrete', 'changement_decision')";
1662     }
1663     // Récupération du libellé, de l'identifiant des évènement et d'un booléen permettant
1664     // de déterminer si il s'agit d'évènements suggérés.
1665     $qres = $this->f->get_all_results_from_db_query(
1666     sprintf(
1667     'SELECT
1668     DISTINCT(evenement.evenement),
1669     evenement.libelle,
1670     -- Si l evenement est suggérés alors il sera lié à la table des événements suggérés du dossier
1671     CASE WHEN evenement_suggere_dossier.evenement IS NULL
1672     THEN FALSE
1673     ELSE TRUE
1674     END AS is_suggested
1675     FROM
1676     -- Jointures permettant de récupérer la liste des évènements compatibles avec le dossier
1677     -- selon le type de dossier et l état du dossier.
1678     %1$sevenement
1679     JOIN %1$slien_dossier_instruction_type_evenement
1680     ON evenement.evenement = lien_dossier_instruction_type_evenement.evenement
1681     JOIN %1$stransition
1682     ON evenement.evenement = transition.evenement
1683     JOIN %1$sdossier
1684     ON lien_dossier_instruction_type_evenement.dossier_instruction_type = dossier.dossier_instruction_type
1685     AND transition.etat = dossier.etat
1686     -- Jointures avec une sous requêtes servant à récupérer la liste des évènements suggérés du dossier.
1687     LEFT JOIN (
1688     SELECT
1689     lien_sig_contrainte_evenement.evenement,
1690     dossier.dossier
1691     FROM
1692     %1$slien_sig_contrainte_evenement
1693     JOIN %1$ssig_contrainte
1694     ON lien_sig_contrainte_evenement.sig_contrainte = sig_contrainte.sig_contrainte
1695     JOIN %1$slien_sig_contrainte_dossier_instruction_type
1696     ON sig_contrainte.sig_contrainte = lien_sig_contrainte_dossier_instruction_type.sig_contrainte
1697     JOIN %1$slien_sig_contrainte_om_collectivite
1698     ON sig_contrainte.sig_contrainte = lien_sig_contrainte_om_collectivite.sig_contrainte
1699     JOIN %1$scontrainte
1700     ON sig_contrainte.libelle = contrainte.libelle
1701     JOIN %1$sdossier_contrainte
1702     ON contrainte.contrainte = dossier_contrainte.contrainte
1703     JOIN %1$sdossier
1704     ON dossier_contrainte.dossier = dossier.dossier
1705     AND lien_sig_contrainte_dossier_instruction_type.dossier_instruction_type = dossier.dossier_instruction_type
1706     JOIN %1$som_collectivite
1707     ON lien_sig_contrainte_om_collectivite.om_collectivite = om_collectivite.om_collectivite
1708     AND (dossier.om_collectivite = om_collectivite.om_collectivite
1709     OR om_collectivite.niveau = \'2\')
1710     ) AS evenement_suggere_dossier
1711     ON evenement.evenement = evenement_suggere_dossier.evenement
1712     AND dossier.dossier = evenement_suggere_dossier.dossier
1713     WHERE
1714     dossier.dossier = \'%2$s\'
1715     %3$s
1716     ORDER BY
1717     is_suggested DESC,
1718     evenement.libelle',
1719     DB_PREFIXE,
1720     $this->f->db->escapeSimple($dossier),
1721     $filter
1722     ),
1723     array(
1724     "origin" => __METHOD__
1725     )
1726     );
1727     return $qres['result'];
1728     }
1729    
1730     /**
1731     * Récupère un tableau contenant des évènements de la forme :
1732     * $events = array(
1733     * 1 => array(
1734     * 'libelle' => 'evenement_libelle',
1735     * 'evenement' => 'identifiant_evenement',
1736     * 'is_suggested' => true/false -> booleen indiquant si c'est un événement suggéré
1737     * ))
1738     * Et le transforme pour pouvoir l'utiliser pour le remplissage d'un select de formulaire.
1739     *
1740     * Le format de sorti est le suivant :
1741     * $select = array(
1742     * 0 => array( -> liste des id des événements
1743     * '0' => '',
1744     * '1' => array(
1745     * '0' => array(), -> liste des id des événements suggérés
1746     * '1' => array(), -> liste des libelles des événements suggérés
1747     * ),
1748     * ...,
1749     * n => 'id_evenement_n'
1750     * ),
1751     * 1 => array(
1752     * '0' => '__('choisir')." ".__('evenement')',
1753     * '1' => '💡 Suggestions',
1754     * ...,
1755     * 'n' => 'libelle_evenement_n',
1756     * )
1757     * )
1758     *
1759     * @param array tableau des événements
1760     * @return array
1761     */
1762     protected function convert_events_array_to_select_format($events) {
1763     // Remplissage du tableau du select en incluant le groupe des instructions suggérées.
1764     $contenu = array(
1765     0 => array("",),
1766     1 => array(__('choisir')." ".__('evenement'),)
1767     );
1768    
1769     if (! empty($events)) {
1770     // S'il y a des évènements suggérés extraction de ces événements et mise en place du groupe
1771     $suggested_event_group = array_filter($events, function($a) {
1772     return $a['is_suggested'] === 't';
1773     });
1774     if (! empty($suggested_event_group)) {
1775     // Prépare les données qui permettront d'afficher le groupe des événements
1776     // suggérés.
1777     $values = array();
1778     $labels = array();
1779     foreach ($suggested_event_group as $index => $suggested_event) {
1780     $values[] = $suggested_event['evenement'];
1781     $labels[] = $suggested_event['libelle'];
1782     // Supprime les évènements suggérés de la liste des évènements
1783     unset($events[$index]);
1784     }
1785     // Remplissage du select pour le groupe
1786     $contenu[0][] = array($values, $labels);
1787     $contenu[1][] = __('💡 Suggestions');
1788     }
1789    
1790     // Remplissage du select
1791     foreach ($events as $event) {
1792     $contenu[0][] = $event['evenement'];
1793     $contenu[1][] = $event['libelle'];
1794     }
1795     }
1796     return $contenu;
1797     }
1798    
1799     /**
1800 softime 8989 * SETTER_FORM - setSelect.
1801     *
1802     * @return void
1803     */
1804     function setSelect(&$form, $maj, &$dnu1 = null, $dnu2 = null) {
1805     //parent::setSelect($form, $maj);
1806 mbroquet 3730 /**
1807     * On ne surcharge pas la méthode parent car une requête sur la table
1808     * dossier est mauvaise pour les performances, car la requête qui
1809     * concerne evenement est plus complexe que celle générée et car les
1810     * champs action, avis_decision et etat ne sont pas utilisés comme des
1811     * select
1812     */
1813     //// action
1814 softime 8989 //$this->init_select($form, $this->f->db, $maj, null, "action",
1815 mbroquet 3730 // $sql_action, $sql_action_by_id, false);
1816    
1817     //// avis_decision
1818 softime 8989 //$this->init_select($form, $this->f->db, $maj, null, "avis_decision",
1819 mbroquet 3730 // $sql_avis_decision, $sql_avis_decision_by_id, false);
1820    
1821     //// dossier
1822 softime 8989 //$this->init_select($form, $this->f->db, $maj, null, "dossier",
1823 mbroquet 3730 // $sql_dossier, $sql_dossier_by_id, false);
1824    
1825     //// etat
1826 softime 8989 //$this->init_select($form, $this->f->db, $maj, null, "etat",
1827 mbroquet 3730 // $sql_etat, $sql_etat_by_id, false);
1828    
1829     //// evenement
1830 softime 8989 //$this->init_select($form, $this->f->db, $maj, null, "evenement",
1831 mbroquet 3730 // $sql_evenement, $sql_evenement_by_id, false);
1832    
1833     // signataire_arrete
1834     // si contexte DI
1835     if ($this->getParameter("retourformulaire") == "dossier"
1836 softime 12847 || $this->f->contexte_dossier_instruction()) {
1837 mbroquet 3730 // on recupère les signataires de la multicollectivité et de celle du DI
1838 softime 7996 $di = $this->f->get_inst__om_dbform(array(
1839     "obj" => "dossier_instruction",
1840     "idx" => $this->getParameter('idxformulaire'),
1841     ));
1842 softime 8989 $sql_signataire_arrete_by_di = str_replace(
1843     '<collectivite_di>',
1844     $di->getVal("om_collectivite"),
1845     $this->get_var_sql_forminc__sql("signataire_arrete_by_di")
1846     );
1847     $this->init_select(
1848     $form,
1849     $this->f->db,
1850     $maj,
1851     null,
1852     "signataire_arrete",
1853     $sql_signataire_arrete_by_di,
1854     $this->get_var_sql_forminc__sql("signataire_arrete_by_id"),
1855     true
1856     );
1857 mbroquet 3730 } else {
1858 softime 8989 $this->init_select(
1859     $form,
1860     $this->f->db,
1861     $maj,
1862     null,
1863     "signataire_arrete",
1864     $this->get_var_sql_forminc__sql("signataire_arrete"),
1865     $this->get_var_sql_forminc__sql("signataire_arrete_by_id"),
1866     true
1867     );
1868 mbroquet 3730 }
1869    
1870     /**
1871     * Gestion du filtre sur les événements de workflow disponibles
1872     * On récupère ici en fonction de l'état du dossier d'instruction en
1873     * cours et du type du dossier d'instruction en cours la liste
1874     * événements disponibles.
1875     */
1876     if ($maj == 0) {
1877 softime 14542 $evenements = $this->get_var_sql_forminc__sql_evenement();
1878     $form->setSelect("evenement", $this->convert_events_array_to_select_format($evenements));
1879 mbroquet 3730 } else {
1880 softime 14064 // Instanciation de l'événement pour récupérer son libellé
1881     $evenement = $this->f->get_inst__om_dbform(array(
1882     "obj" => "evenement",
1883     "idx" => $this->getVal("evenement"),
1884     ));
1885    
1886 mbroquet 3730 $contenu = array(
1887     0 => array($this->getVal("evenement"),),
1888 softime 14064 1 => array($evenement->getVal('libelle'),)
1889 mbroquet 3730 );
1890     $form->setSelect("evenement", $contenu);
1891     }
1892    
1893     /**
1894     * Gesion des liens vers la bible
1895     */
1896     // lien bible_auto
1897     $contenu = array(_("automatique"));
1898     $form->setSelect("bible_auto",$contenu);
1899     // lien bible1
1900     $contenu = array(_("bible"));
1901     $form->setSelect("bible",$contenu);
1902     // lien bible2
1903     $contenu = array(_("bible"));
1904     $form->setSelect("bible2",$contenu);
1905     // lien bible3
1906     $contenu = array(_("bible"));
1907     $form->setSelect("bible3",$contenu);
1908     // lien bible4
1909     $contenu = array(_("bible"));
1910     $form->setSelect("bible4",$contenu);
1911 softime 7521
1912     if ($maj == 1) {
1913     $base64 = $this->init_pdf_temp();
1914     $form->setSelect('live_preview', array('base64'=>$base64));
1915 softime 8593 $form->setSelect("btn_refresh", array(_('Prévisualiser')));
1916     $form->setSelect("btn_preview", array(_('Prévisualiser >>')));
1917     $form->setSelect("btn_redaction", array(_('<< Rédiger')));
1918 softime 7521 }
1919 softime 8593
1920     // Selection du type de rédaction à l'ajout
1921     $content = array(
1922     0 => array('f', 't', ),
1923     1 => array(_('Rédaction par compléments'), _('Rédaction libre'), ),
1924     );
1925     $form->setSelect('flag_edition_integrale', $content);
1926 softime 10573
1927     $contenu = array();
1928     foreach(array('waiting', 'in_progress', 'canceled', 'expired', 'finished') as $value) {
1929     $contenu[0][] = $value;
1930     $contenu[1][] = $this->get_trad_for_statut($value);
1931     }
1932     $form->setSelect('statut_signature', $contenu);
1933    
1934    
1935     if ($maj == 401) {
1936     $file = $this->f->storage->get($this->getVal('om_fichier_instruction'));
1937 softime 11418 $form->setSelect('preview_edition', array(
1938     'base64' => base64_encode($file['file_content']),
1939     'mimetype' => $file['metadata']['mimetype'],
1940     'label' => 'instruction_'.$this->getVal($this->clePrimaire),
1941     'href' => sprintf(
1942     '../app/index.php?module=form&snippet=file&obj=instruction&champ=om_fichier_instruction&id=%1$s',
1943     $this->getVal($this->clePrimaire)
1944     )
1945     ));
1946 softime 10573 }
1947 mbroquet 3730 }
1948    
1949 softime 8989 function cleSecondaire($id, &$dnu1 = null, $val = array(), $dnu2 = null) {
1950 mbroquet 3730 //
1951 softime 11228 // Vérifie uniquementla cle secondaire : demande
1952     $this->rechercheTable($this->f->db, "demande", "instruction_recepisse", $id);
1953 mbroquet 3730
1954     $id = $this->getVal($this->clePrimaire);
1955    
1956     //Requête de vérification que cet événement d'instruction n'est pas lié
1957     //à la création d'un dossier d'instruction
1958 softime 14064 $qres = $this->f->get_one_result_from_db_query(
1959     sprintf(
1960     'SELECT
1961     demande_type.dossier_instruction_type
1962     FROM
1963     %1$sdemande_type
1964     LEFT JOIN %1$sdemande
1965     ON demande.demande_type = demande_type.demande_type
1966     WHERE
1967     demande.instruction_recepisse = \'%2$d\'',
1968     DB_PREFIXE,
1969     intval($id)
1970     ),
1971     array(
1972     "origin" => __METHOD__,
1973     )
1974     );
1975 mbroquet 3730
1976     // Aucune clé secondaire n'a été trouvée ou c'est un événement sans
1977     //création de dossier d'instruction, l'événement d'instruction peut être
1978     //supprimé
1979 softime 14064 if ( $this->correct !== false || $qres['result'] == null || $qres['result'] == ""){
1980 mbroquet 3730 // Requête de vérification que cet événement d'instruction est lié
1981     // à une demande
1982 softime 14064 $qres = $this->f->get_one_result_from_db_query(
1983     sprintf(
1984     'SELECT
1985     demande
1986     FROM
1987     %1$sdemande
1988     WHERE
1989     instruction_recepisse = \'%2$d\'',
1990     DB_PREFIXE,
1991     intval($id)
1992     ),
1993     array(
1994     "origin" => __METHOD__,
1995     )
1996     );
1997 mbroquet 3730
1998     //Si c'est un événement d'instruction lié à une demande
1999 softime 14064 if ($qres['result'] != null || $qres['result'] != ""){
2000 softime 7996 $demande = $this->f->get_inst__om_dbform(array(
2001     "obj" => "demande",
2002 softime 14064 "idx" => $qres['result'],
2003 softime 7996 ));
2004 mbroquet 3730
2005 softime 14064 //On met à jour la demande en supprimant la liaison vers
2006 mbroquet 3730 //l'événement d'instruction
2007     $demande->setParameter("maj", 1);
2008     $valF = array();
2009     foreach($demande->champs as $identifiant => $champ) {
2010     $valF[$champ] = $demande->val[$identifiant];
2011     }
2012     $valF['date_demande']=$demande->dateDBToForm($valF['date_demande']);
2013     $valF['instruction_recepisse']=NULL;
2014 softime 8989 $ret = $demande->modifier($valF);
2015 mbroquet 3730 }
2016    
2017     /**
2018     * Vérification que l'élément supprimé est le dernier pour pouvoir
2019     * remodifier les données de manière itérative.
2020     */
2021 softime 14064 $qres = $this->f->get_one_result_from_db_query(
2022     sprintf(
2023     'SELECT
2024     max(instruction)
2025     FROM
2026     %1$sinstruction
2027     WHERE
2028     dossier = \'%2$s\'',
2029     DB_PREFIXE,
2030     $this->f->db->escapeSimple($this->getParameter("idxformulaire"))
2031     ),
2032     array(
2033     "origin" => __METHOD__,
2034     )
2035     );
2036    
2037 mbroquet 3730 // Si on se trouve effectivement sur le dernier evenement d'instruction
2038 softime 14064 // alors on valide la suppression sinon on l'annule
2039     $this->correct = false;
2040     $message = __("Seul le dernier evenement d'instruction peut etre supprime.");
2041     if ($qres['result'] == $id) {
2042 mbroquet 3730 // Alors on valide la suppression
2043     $this->correct = true;
2044 softime 14064 $message = __('Destruction_chronologique');
2045 mbroquet 3730 }
2046 softime 14064 $this->addToMessage($message);
2047 mbroquet 3730 }
2048     }
2049    
2050     /**
2051     * Vérification de la possibilité ou non de modifier des dates de suivi
2052     * @param string $champ champ date à vérifier
2053     */
2054     function updateDate($champ) {
2055    
2056     //Si le retourformulaire est "dossier_instruction"
2057     if ($this->getParameter("retourformulaire") == "dossier"
2058 softime 12847 || $this->f->contexte_dossier_instruction()) {
2059 mbroquet 3730
2060     // Vérification de la possibilité de modifier les dates si déjà éditées
2061     if($this->valF[$champ] != "" AND !$this->f->user_is_admin) {
2062     // si l'utilisateur n'est pas un admin
2063     if($this->getVal($champ) != "" AND $this->getVal($champ) != $this->valF[$champ]) {
2064     $this->correct = false;
2065     $this->addToMessage(_("Les dates de suivis ne peuvent etre modifiees"));
2066     }
2067     }
2068     }
2069    
2070     //
2071     return true;
2072     }
2073    
2074 softime 8989 /**
2075     * SETTER_FORM - setValsousformulaire (setVal).
2076     *
2077     * @return void
2078     */
2079     function setValsousformulaire(&$form, $maj, $validation, $idxformulaire, $retourformulaire, $typeformulaire, &$dnu1 = null, $dnu2 = null) {
2080     // parent::setValsousformulaire($form, $maj, $validation, $idxformulaire, $retourformulaire, $typeformulaire);
2081 mbroquet 3730 //
2082 softime 8989 $this->retourformulaire = $retourformulaire;
2083     //
2084 mbroquet 3730 if ($maj == 0) {
2085 softime 8989 $form->setVal("destinataire", $this->getParameter("idxformulaire"));
2086     $form->setVal("dossier", $this->getParameter("idxformulaire"));
2087 mbroquet 3730 }
2088 softime 12124
2089     // Si l'instruction a été envoyé au contrôle de légalité et que la
2090     // tâche envoi_cl lié n'a pas encore été traité il faut indiquer à
2091     // l'utilisateur que l'envoi au cl est en cours de traitement.
2092     if ($this->is_sent_to_cl() === true
2093     && empty($this->getVal('date_envoi_controle_legalite'))
2094     && $maj == 3) {
2095     $form->setVal("date_envoi_controle_legalite", __("En cours de traitement."));
2096     }
2097 mbroquet 3730 //
2098     $this->set_form_default_values($form, $maj, $validation);
2099     }
2100    
2101     /**
2102 softime 8989 * SETTER_FORM - set_form_default_values (setVal).
2103     *
2104     * @return void
2105 mbroquet 3730 */
2106     function set_form_default_values(&$form, $maj, $validation) {
2107 softime 8989 //
2108 mbroquet 3730 if ($maj == 0) {
2109     // si contexte DI
2110     if ($this->getParameter("retourformulaire") == "dossier"
2111 softime 12847 || $this->f->contexte_dossier_instruction()) {
2112 mbroquet 3730 // on recupère les signataires de la multicollectivité et de celle du DI
2113 softime 7996 $di = $this->f->get_inst__om_dbform(array(
2114     "obj" => "dossier_instruction",
2115 softime 8989 "idx" => $this->getParameter("idxformulaire"),
2116 softime 7996 ));
2117 softime 8989 $sql = str_replace(
2118     "<collectivite_di>",
2119     $di->getVal("om_collectivite"),
2120     $this->get_var_sql_forminc__sql("signataire_arrete_defaut_by_di")
2121     );
2122 mbroquet 3730 } else {
2123 softime 8989 $sql = $this->get_var_sql_forminc__sql("signataire_arrete_defaut");
2124 mbroquet 3730 }
2125 softime 14542
2126     $qres = $this->f->get_all_results_from_db_query($sql, array(
2127     "origin" => __METHOD__));
2128     $row = array_shift($qres['result']);
2129 softime 8989 if (isset($row["signataire_arrete"])
2130     && is_numeric($row["signataire_arrete"])) {
2131     //
2132     $form->setVal("signataire_arrete", $row["signataire_arrete"]);
2133 mbroquet 3730 }
2134 softime 8989 // Date du jour
2135     $form->setVal("date_evenement", date("Y-m-d"));
2136 mbroquet 3730 }
2137 softime 8989 //
2138 mbroquet 3730 if ($maj == 0 || $maj == 1 || $maj == 125) {
2139 softime 8989 $form->setVal("bible_auto", "bible_auto()");
2140     $form->setVal("bible", "bible(1)");
2141     $form->setVal("bible2", "bible(2)");
2142     $form->setVal("bible3", "bible(3)");
2143     $form->setVal("bible4", "bible(4)");
2144 mbroquet 3730 }
2145 softime 8989 //
2146 softime 7521 $collectivite_di = $this->get_dossier_instruction_om_collectivite();
2147 softime 8989 if ($maj == 1
2148     && $this->f->is_option_preview_pdf_enabled($collectivite_di) === true
2149 softime 7521 && $this->has_an_edition() === true) {
2150 softime 8989 //
2151     $form->setVal("live_preview", $this->getVal($this->clePrimaire));
2152     $form->setVal("btn_refresh", "reload_pdf_viewer()");
2153     $form->setVal("btn_preview", "show_instr_preview()");
2154     $form->setVal("btn_redaction", "show_instr_redaction()");
2155 softime 7521 }
2156 softime 10808
2157 softime 12654 // Gestion de l'affichage des suivis de notification des demandeurs, des services, des tiers et
2158     // des communes
2159     if ($maj == 3) {
2160     if ($this->can_display_notification_demandeur()) {
2161     $typeNotification = array(
2162     'notification_recepisse',
2163     'notification_instruction',
2164     'notification_decision',
2165     );
2166     $form->setVal("suivi_notification", $this->get_json_suivi_notification($typeNotification, true));
2167     }
2168     if ($this->can_display_notification_service()) {
2169     $form->setVal("suivi_notification_service", $this->get_json_suivi_notification(array('notification_service_consulte')));
2170     }
2171     if ($this->can_display_notification_tiers()) {
2172     $form->setVal("suivi_notification_tiers", $this->get_json_suivi_notification(array('notification_tiers_consulte')));
2173     }
2174     if ($this->can_display_notification_commune()) {
2175     $form->setVal("suivi_notification_commune", $this->get_json_suivi_notification(array('notification_depot_demat', 'notification_commune')));
2176     }
2177 softime 10808 }
2178 mbroquet 3730 }
2179    
2180     function setLayout(&$form, $maj){
2181 softime 12124 // En consultation, pour les dossiers qui n'ont pas été transmis par le portail
2182     // citoyen, si la notification des demandeurs est activée sur l'évenement
2183     // d'instruction et que le paramétrage du demandeur principal n'est pas
2184     // correct alors un message a destination de l'instructeur est affiché.
2185     if ($maj == 3) {
2186 softime 12847 // Si le dossier n'a pas été déposé sur le portail citoyen (ou si
2187     // la requête permettant de savoir le type de demande à échouée) et si
2188     // la notification se fait par mail vérifie si il y a des erreurs de
2189     // paramétrage et si c'est le cas on affiche un message d'information
2190     $collectivite = $this->get_dossier_instruction_om_collectivite($this->getVal('dossier'));
2191     $categorieNotif = $this->f->get_param_option_notification($collectivite);
2192     if (($this->dossier_depose_sur_portail() == null ||
2193     ! $this->dossier_depose_sur_portail()) &&
2194 softime 14064 $categorieNotif === 'mail' ) {
2195 softime 12124 $erreurParam = $this->get_info_notification_fail();
2196     // Récupération de l'évenement d'instruction
2197     $instEV = $this->get_inst_evenement();
2198     if (! empty($instEV->getVal('notification')) && $erreurParam != array()) {
2199     $class = 'text-info ui-state-highlight ui-state-info';
2200     $message = __("Attention l'envoi de notification automatique n'est pas possible.");
2201     $this->f->display_panel_information(
2202     $class,
2203     $message,
2204     $erreurParam,
2205     __('Veuillez corriger les informations suivantes.'),
2206     'erreur_param_notif'
2207     );
2208     }
2209     }
2210     }
2211 softime 8593 $form->setBloc('evenement','D',"","sousform-instruction-action-".$maj);
2212 mbroquet 3730
2213 softime 8593 $form->setFieldset('evenement','D',_('Evenement'));
2214     $form->setFieldset('om_final_instruction_utilisateur','F','');
2215    
2216     $form->setBloc('om_final_instruction_utilisateur','F');
2217 mbroquet 3730
2218 softime 8593 $form->setBloc('date_finalisation_courrier','D',"","");
2219 mbroquet 3730
2220 softime 8593 $form->setFieldset('date_finalisation_courrier','D',_('Dates'));
2221     $form->setBloc('date_finalisation_courrier','D',"","col_6");
2222     $form->setBloc('date_envoi_controle_legalite','F');
2223 mbroquet 3730
2224 softime 8593 $form->setBloc('date_retour_signature','D',"","col_6");
2225     $form->setBloc('date_retour_controle_legalite','F');
2226     $form->setFieldset('date_retour_controle_legalite','F','');
2227    
2228     $form->setBloc('date_retour_controle_legalite','F');
2229 mbroquet 3730
2230 softime 10573 $form->setBloc('statut_signature','D');
2231     $form->setFieldset('statut_signature','D','Suivi Parapheur');
2232     $form->setBloc('commentaire_signature','F');
2233     $form->setBloc('historique_signature','D');
2234     $form->setFieldset('historique_signature', 'DF', __("Historique"), "collapsible, startClosed");
2235     $form->setBloc('historique_signature','F');
2236     $form->setFieldset('historique_signature','F');
2237    
2238 softime 10808 $form->setFieldset('suivi_notification', 'D', __("Suivi notification"), "collapsible");
2239     $form->setFieldset('suivi_notification','F');
2240 softime 11585 $form->setFieldset('suivi_notification_service', 'D', __("Suivi notification service"), "collapsible");
2241     $form->setFieldset('suivi_notification_service','F');
2242     $form->setFieldset('suivi_notification_tiers', 'D', __("Suivi notification tiers"), "collapsible");
2243     $form->setFieldset('suivi_notification_tiers','F');
2244 softime 12654 $form->setFieldset('suivi_notification_commune', 'D', __("Suivi notification commune"), "collapsible");
2245     $form->setFieldset('suivi_notification_commune','F');
2246 softime 10808
2247 softime 8593 if ($maj == 1) {
2248     // Récupère la collectivité du dossier d'instruction
2249     $collectivite_di = $this->get_dossier_instruction_om_collectivite();
2250 mbroquet 3730
2251 softime 8593 //
2252     if ($this->f->is_option_preview_pdf_enabled($collectivite_di) === true
2253     && $this->has_an_edition() === true) {
2254 softime 7521 //
2255 softime 8593 $form->setBloc('complement_om_html','D',"","container_instr_edition");
2256     $form->setBloc('complement_om_html','D',"","hidelabel box_instr_edition redaction_instr_edition");
2257     $form->setBloc('complement_om_html','D',"","box_instr_edition_main");
2258     $form->setFieldset('complement_om_html','D',_('Complement'));
2259     $form->setFieldset('bible','F','');
2260     $form->setFieldset('complement2_om_html','D',_('Complement 2'));
2261     $form->setFieldset('bible2','F','');
2262     $form->setFieldset('complement3_om_html','D',_('Complement 3'));
2263     $form->setFieldset('bible3','F','');
2264     $form->setFieldset('complement4_om_html','D',_('Complement 4'));
2265     $form->setFieldset('bible4','F','');
2266     $form->setFieldset('titre_om_htmletat','DF',_('Titre'), 'startClosed');
2267     $form->setFieldset('corps_om_htmletatex','DF',_('Corps'));
2268     $form->setBloc('corps_om_htmletatex','F');
2269     $form->setBloc('btn_preview','DF',"","box_instr_edition_btn");
2270     $form->setBloc('btn_preview','F');
2271     $form->setBloc('btn_redaction','D', '',"hidelabel box_instr_edition preview_instr_edition");
2272     $form->setBloc('btn_redaction','DF',"","box_instr_edition_btn");
2273     $form->setFieldset('btn_refresh','D',_('Prévisualisation'), "box_instr_edition_main");
2274     $form->setFieldset('live_preview','F');
2275     $form->setBloc('live_preview','F');
2276     $form->setBloc('live_preview','F');
2277 softime 7521 } else {
2278 softime 8593 $form->setBloc('complement_om_html','D',"","hidelabel");
2279 softime 7521 $form->setFieldset('complement_om_html','D',_('Complement'));
2280     $form->setFieldset('bible','F','');
2281     $form->setFieldset('complement2_om_html','D',_('Complement 2'));
2282     $form->setFieldset('bible2','F','');
2283     $form->setFieldset('complement3_om_html','D',_('Complement 3'));
2284     $form->setFieldset('bible3','F','');
2285     $form->setFieldset('complement4_om_html','D',_('Complement 4'));
2286     $form->setFieldset('bible4','F','');
2287 softime 8593 $form->setFieldset('titre_om_htmletat','DF',_('Titre'), 'startClosed');
2288     $form->setFieldset('corps_om_htmletatex','DF',_('Corps'));
2289     $form->setBloc('corps_om_htmletatex','F');
2290 softime 7521 }
2291 softime 8593 } else {
2292     $form->setBloc('complement_om_html','D',"","hidelabel");
2293     $form->setFieldset('complement_om_html','D',_('Complement'));
2294     $form->setFieldset('bible','F','');
2295     $form->setFieldset('complement2_om_html','D',_('Complement 2'));
2296     $form->setFieldset('bible2','F','');
2297     $form->setFieldset('complement3_om_html','D',_('Complement 3'));
2298     $form->setFieldset('bible3','F','');
2299     $form->setFieldset('complement4_om_html','D',_('Complement 4'));
2300     $form->setFieldset('bible4','F','');
2301     $form->setFieldset('titre_om_htmletat','DF',_('Titre'), 'startClosed');
2302     $form->setFieldset('corps_om_htmletatex','DF',_('Corps'));
2303     $form->setBloc('corps_om_htmletatex','F');
2304 mbroquet 3730 }
2305     }
2306    
2307     function setLib(&$form, $maj) {
2308     //
2309     parent::setLib($form, $maj);
2310     //
2311     $form->setLib('bible_auto', "");
2312     $form->setLib('bible', "");
2313     $form->setLib('bible2', "");
2314     $form->setLib('bible3', "");
2315     $form->setLib('bible4', "");
2316 softime 7521 $form->setLib('btn_refresh', "");
2317 softime 8593 $form->setLib('btn_preview', "");
2318     $form->setLib('btn_redaction', "");
2319 softime 7521 $form->setLib('live_preview', "");
2320 mbroquet 3730 $form->setLib('om_final_instruction_utilisateur', _("finalise par"));
2321 softime 8989 $form->setLib('date_envoi_rar', __("date_envoi_ar"));
2322     $form->setLib('date_retour_rar', __("date_notification"));
2323 softime 10573 $form->setLib('statut_signature', __("statut"));
2324     $form->setLib('commentaire_signature', __("commentaire"));
2325     $form->setLib('historique_signature', '');
2326 softime 10808 $form->setLib('suivi_notification', '');
2327 softime 11585 $form->setLib('suivi_notification_service', '');
2328     $form->setLib('suivi_notification_tiers', '');
2329 softime 12654 $form->setLib('suivi_notification_commune', '');
2330 softime 10573 $form->setLib('preview_edition', "");
2331 softime 8593
2332     // Ajout d'une infobulle d'aide lorsque le formulaire est en mode
2333     // ajout et que l'option de rédaction libre est activée sur la
2334     // collectivité du dossier
2335     if ($maj === '0' && $this->is_option_redaction_libre_enabled() === true) {
2336     //
2337     $help_text_template = '%s <span class="info-16" title="%s"></span>';
2338     $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.");
2339     $form->setLib('flag_edition_integrale', sprintf($help_text_template, _("Type de rédaction"), $help_text));
2340     }
2341     else {
2342     $form->setLib('flag_edition_integrale', _("Type de rédaction"));
2343     }
2344    
2345     // Ajout d'une infobulle d'aide lorsque le formulaire est en mode
2346     // modification et que l'option de prévisualisation de l'édition est
2347     // activée sur la collectivité du dossier
2348     if ($maj === '1'
2349     && $this->f->is_option_preview_pdf_enabled($this->get_dossier_instruction_om_collectivite()) === true) {
2350     //
2351     $help_text_template = '%s <span class="info-16" title="%s"></span>';
2352     $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.");
2353     $form->setLib('date_evenement', sprintf($help_text_template, _('date_evenement'), $help_text));
2354     $form->setLib('signataire_arrete', sprintf($help_text_template, _('signataire_arrete'), $help_text));
2355     }
2356 mbroquet 3730 }
2357    
2358 softime 8989 /**
2359     * TRIGGER - triggerajouter.
2360     *
2361     * @return boolean
2362     */
2363     function triggerajouter($id, &$dnu1 = null, $val = array(), $dnu2 = null) {
2364     $this->addToLog(__METHOD__."(): start", EXTRA_VERBOSE_MODE);
2365 mbroquet 3730 /**
2366     * Le code suivant permet de récupérer des valeurs des tables evenement
2367     * et dossier pour les stocker dans l'instruction :
2368     * DEPUIS L'EVENEMENT
2369     * - action
2370     * - delai
2371     * - accord_tacite
2372     * - etat
2373     * - avis_decision
2374     * - delai_notification
2375     * - lettretype
2376     * - autorite_competente
2377 softime 10573 * - pec_metier
2378 softime 6565 * - complement_om_html
2379     * - complement2_om_html
2380     * - complement3_om_html
2381     * - complement4_om_html
2382     * - complement5_om_html
2383 mbroquet 3730 * DEPUIS LE DOSSIER D'INSTRUCTION
2384     * - archive_delai
2385     * - archive_accord_tacite
2386     * - archive_etat
2387     * - archive_avis
2388     * - date_complet
2389     * - date_rejet
2390     * - date_limite
2391     * - date_notification_delai
2392     * - date_decision
2393     * - date_validite
2394     * - date_achevement
2395     * - date_chantier
2396     * - date_conformite
2397     * - avis_decision
2398     */
2399     // Récupération de tous les paramètres de l'événement sélectionné
2400 softime 14542 // TODO : remplacer cette requête par l'instanciation de l'événement
2401     $qres = $this->f->get_all_results_from_db_query(
2402     sprintf(
2403     'SELECT
2404     *
2405     FROM
2406     %1$sevenement
2407     WHERE
2408     evenement = %2$d',
2409     DB_PREFIXE,
2410     intval($this->valF['evenement'])
2411     ),
2412     array(
2413     "origin" => __METHOD__,
2414     )
2415     );
2416     foreach ($qres['result'] as $row) {
2417 mbroquet 3730 // Récupération de l'identifiant de l'action
2418     // si une action est paramétrée dans l'événement
2419     $this->valF['action'] = NULL;
2420     if (isset($row['action']) and !empty($row['action'])) {
2421     $this->valF['action']=$row['action'];
2422     }
2423     // Récupération de la valeur du délai
2424     $this->valF['delai'] = $row['delai'];
2425     // Récupération de l'identifiant de l'état
2426     // si un état est paramétré dans l'événement
2427     $this->valF['etat']=NULL;
2428     if (isset($row['etat']) and !empty($row['etat'])) {
2429     $this->valF['etat']=$row['etat'];
2430     }
2431     // Récupération de la valeur d'accord tacite
2432     $this->valF['accord_tacite']=$row['accord_tacite'];
2433     // Récupération de la valeur du délai de notification
2434     $this->valF['delai_notification']=$row['delai_notification'];
2435     // Récupération de l'identifiant de l'avis
2436     // si un avis est paramétré dans l'événement
2437     $this->valF['avis_decision'] = NULL;
2438     if(isset($row['avis_decision']) and !empty($row['avis_decision'])) {
2439     $this->valF['avis_decision']=$row['avis_decision'];
2440     }
2441     // Récupération de la valeur de l'autorité compétente
2442     // si l'autorité compétente est paramétré dans l'événement
2443     $this->valF['autorite_competente'] = NULL;
2444     if(isset($row['autorite_competente']) and !empty($row['autorite_competente'])) {
2445     $this->valF['autorite_competente']=$row['autorite_competente'];
2446     }
2447     // Récupération de la valeur de la lettre type
2448     $this->valF['lettretype']=$row['lettretype'];
2449 softime 10573 // Récupération de la valeur de la prise en compte métier
2450     // si la prise en compte métier est paramétrée dans l'événement
2451     $this->valF['pec_metier'] = NULL;
2452     if(isset($row['pec_metier']) === true and empty($row['pec_metier']) === false) {
2453     $this->valF['pec_metier'] = $row['pec_metier'];
2454     }
2455 mbroquet 3730 }
2456     // Récupération de toutes les valeurs du dossier d'instruction en cours
2457 softime 14542 // TODO : remplacer cette requête par l'instanciation de l'objet
2458     $qres = $this->f->get_all_results_from_db_query(
2459     sprintf(
2460     'SELECT
2461     *
2462     FROM
2463     %1$sdossier
2464     WHERE
2465     dossier = \'%2$s\'',
2466     DB_PREFIXE,
2467     $this->f->db->escapeSimple($this->valF['dossier'])
2468     ),
2469     array(
2470     "origin" => __METHOD__,
2471     )
2472     );
2473     $row = array_shift($qres['result']);
2474 mbroquet 3730 $this->updateArchiveData($row);
2475    
2476     // Récupération de la duree de validite du dossier d'autorisation
2477 softime 14064 $qres = $this->f->get_one_result_from_db_query(
2478     sprintf(
2479     'SELECT
2480     duree_validite_parametrage
2481     FROM
2482     %1$sdossier_autorisation_type_detaille
2483     LEFT JOIN %1$sdossier_autorisation
2484     ON dossier_autorisation.dossier_autorisation_type_detaille = dossier_autorisation_type_detaille.dossier_autorisation_type_detaille
2485     LEFT JOIN %1$sdossier
2486     ON dossier.dossier_autorisation = dossier_autorisation.dossier_autorisation
2487     WHERE
2488     dossier.dossier = \'%2$s\'',
2489     DB_PREFIXE,
2490     $this->f->db->escapeSimple($this->valF['dossier'])
2491     ),
2492     array(
2493     "origin" => __METHOD__,
2494     )
2495     );
2496    
2497     if ($qres['result'] != '') {
2498     $this->valF['duree_validite_parametrage'] = $qres['result'];
2499 mbroquet 3730 }
2500    
2501     // Identifiant du type de courrier
2502     $idTypeCourrier = '11';
2503     $idCourrier = str_pad($this->valF["instruction"], 10, "0", STR_PAD_LEFT);
2504     // Code barres
2505     $this->valF["code_barres"] = $idTypeCourrier . $idCourrier;
2506     }
2507    
2508 softime 12124 /**
2509     * Test si une restriction est valide.
2510     *
2511     * @return boolean
2512     */
2513 mbroquet 3730 function restrictionIsValid($restriction){
2514     if($this->restriction_valid != null) {
2515     return $this->restriction_valid;
2516     }
2517     if(empty($restriction)) {
2518     $this->restriction_valid = true;
2519     return $this->restriction_valid;
2520     }
2521 nmeucci 3873 // Liste des opérateurs possibles sans espace
2522     $operateurs = array(">=", "<=", "+", "-", "&&", "||", "==", "!=");
2523     // Liste identique mais avec le marqueur §
2524     $mark = "§";
2525     $operateurs_marked = array();
2526     foreach ($operateurs as $operateur) {
2527     $operateurs_marked[] = $mark.$operateur.$mark;
2528     }
2529 mbroquet 3730
2530     // Supprime tous les espaces de la chaîne de caractère
2531 nmeucci 3873 $restriction = preg_replace('/\s+/', '', $restriction);
2532 mbroquet 3730
2533 nmeucci 3873 // Met un marqueur avant et après les opérateurs
2534     // puis transforme la chaine en un tableau
2535     $restriction = str_replace($operateurs, $operateurs_marked,
2536 mbroquet 3730 $restriction);
2537    
2538 nmeucci 3873 // Pour chaque opérateur logique
2539     foreach (array('&&', '||') as $operator) {
2540    
2541     // S'il est absent on ne fait aucun traitement
2542     if (strpos($restriction, $mark.$operator.$mark) === false) {
2543     continue;
2544     }
2545     // Sinon on vérifie les deux conditions avec le OU/ET logique
2546     $restrictions = explode($mark.$operator.$mark, $restriction);
2547     $restrictions[0] = explode($mark, $restrictions[0]);
2548     $restrictions[1] = explode($mark, $restrictions[1]);
2549     $res_bool = false;
2550     if ($operator == '&&') {
2551     if ($this->is_restriction_satisfied($restrictions[0], $operateurs)
2552     && $this->is_restriction_satisfied($restrictions[1], $operateurs)) {
2553     $res_bool = true;
2554     }
2555     }
2556     if ($operator == '||') {
2557     if ($this->is_restriction_satisfied($restrictions[0], $operateurs)
2558     || $this->is_restriction_satisfied($restrictions[1], $operateurs)) {
2559     $res_bool = true;
2560     }
2561     }
2562     return $res_bool;
2563     }
2564     $tabRestriction = explode($mark, $restriction);
2565     return $this->is_restriction_satisfied($tabRestriction, $operateurs);
2566    
2567     }
2568    
2569     function is_restriction_satisfied($restriction, $operateurs) {
2570 mbroquet 3730 // Tableau comprenant les résultat
2571     $res = array();
2572     // Compteur pour les résultat
2573     // commence à 1 car le 0 doit rester inchangé tout au long du traitement
2574     $j = 1;
2575     // Comparateur du calcul
2576     $comparateur = '';
2577     // Booléen retourné
2578     $res_bool = true;
2579    
2580     // S'il y a un comparateur
2581 nmeucci 3873 if (in_array(">=", $restriction)
2582     || in_array("<=", $restriction)
2583     || in_array("==", $restriction)
2584     || in_array("!=", $restriction)) {
2585 mbroquet 3730
2586     // Si le tableau n'est pas vide
2587 nmeucci 3873 if (count($restriction) > 0) {
2588 mbroquet 3730
2589     // Boucle dans le tableau pour récupérer seulement les valeurs
2590 nmeucci 3873 foreach ($restriction as $key => $value) {
2591 mbroquet 3730 //
2592     if (!in_array($value, $operateurs)) {
2593     if ($this->getRestrictionValue($value) != false) {
2594     $res[] = $this->getRestrictionValue($value);
2595     } else {
2596     // Message d'erreur
2597     $error_message = sprintf(_("Le champ %s de l'instruction %s est vide"), "<span class='bold'>".$value."</span>", "<span class='bold'>".$this->valF["instruction"]."</span>");
2598     $this->addToMessage($error_message);
2599     // Arrête le traitement
2600     return false;
2601     }
2602     }
2603     }
2604    
2605     // Boucle dans le tableau
2606     // commence à 1 car le 0 doit rester inchangé tout au long du
2607     // traitement
2608 nmeucci 3873 for ($i = 1; $i<count($restriction); $i++) {
2609 mbroquet 3730
2610     // Récupère le comparateur
2611 nmeucci 3873 if ($restriction[$i] === ">="
2612     || $restriction[$i] === "<="
2613     || $restriction[$i] === "=="
2614     || $restriction[$i] === "!=") {
2615     $comparateur = $restriction[$i];
2616 mbroquet 3730 }
2617    
2618     // Si l'opérateur qui suit est un "+"
2619 nmeucci 3873 if ($restriction[$i] === "+") {
2620 mbroquet 3730 $dateDep = $res[$j];
2621     unset($res[$j]);$j++;
2622     $duree = $res[$j];
2623     unset($res[$j]);
2624     $res[$j] = $this->f->mois_date($dateDep, $duree, "+");
2625     }
2626    
2627     // Si l'opérateur qui suit est un "-"
2628 nmeucci 3873 if ($restriction[$i] === "-") {
2629 mbroquet 3730 $dateDep = $res[$j];
2630     unset($res[$j]);$j++;
2631     $duree = $res[$j];
2632     unset($res[$j]);
2633     $res[$j] = $this->f->mois_date($dateDep, $duree, "-");
2634     }
2635     }
2636    
2637     }
2638    
2639     // Si les tableau des résultats n'est pas vide
2640     if (count($res) > 0) {
2641     //
2642     $res_bool = false;
2643     // Effectue le test
2644     if ($comparateur === ">=") {
2645     //
2646     if (strtotime($res[0]) >= strtotime($res[$j])) {
2647     $res_bool = true;
2648     }
2649     }
2650     if ($comparateur === "<=") {
2651 nmeucci 3873 //
2652 mbroquet 3730 if (strtotime($res[0]) <= strtotime($res[$j])) {
2653     $res_bool = true;
2654     }
2655     }
2656 nmeucci 3873 if ($comparateur === "==") {
2657     //
2658     if (strtotime($res[0]) == strtotime($res[$j])) {
2659     $res_bool = true;
2660     }
2661     }
2662     if ($comparateur === "!=") {
2663     //
2664     if (strtotime($res[0]) != strtotime($res[$j])) {
2665     $res_bool = true;
2666     }
2667     }
2668 mbroquet 3730 }
2669     // Sinon une erreur s'affiche
2670     } else {
2671    
2672     // Message d'erreur
2673     $error_message = _("Mauvais parametrage de la restriction.")." ".
2674     _("Contactez votre administrateur");
2675     $this->addToMessage($error_message);
2676     // Arrête le traitement
2677     return false;
2678     }
2679    
2680     return $res_bool;
2681    
2682     }
2683    
2684     /**
2685     * Permet de définir si l'événement passé en paramètre est un événement retour.
2686     * @param integer $evenement événement à tester
2687     *
2688     * @return boolean retourne true si événement retour sinon false
2689     */
2690     function is_evenement_retour($evenement) {
2691     if(empty($evenement) || !is_numeric($evenement)) {
2692     return "";
2693     }
2694 softime 14064
2695     $evenement = $this->f->get_inst__om_dbform(array(
2696     "obj" => "evenement",
2697     "idx" => $evenement,
2698     ));
2699    
2700     return $evenement->getVal('retour') == 't';
2701 mbroquet 3730 }
2702    
2703     /**
2704     * Retourne le champ restriction de l'événement passé en paramètre.
2705     *
2706     * @param integer $evenement id de l'événement sur lequel récupérer la restriction
2707     *
2708     * @return string contenu du champ restriction
2709     */
2710     function get_restriction($evenement) {
2711     if(empty($evenement) || !is_numeric($evenement)) {
2712     return "";
2713     }
2714     //Récupère la restriction
2715 softime 14064 $evenement = $this->f->get_inst__om_dbform(array(
2716     "obj" => "evenement",
2717     "idx" => $evenement,
2718     ));
2719    
2720     return $evenement->getVal('restriction');
2721 mbroquet 3730 }
2722    
2723     /**
2724     * Récupère la valeur du champ dans la restriction
2725     * @param string $restrictionValue Nom du champ
2726     * @return mixed Valeur du champ
2727     */
2728     function getRestrictionValue($restrictionValue){
2729    
2730     // Initialisation de la valeur de retour
2731     $return = false;
2732    
2733     // Récupére les valeurs du dossier
2734     $value_dossier = $this->get_dossier_actual();
2735    
2736     //
2737     if (is_numeric($restrictionValue)) {
2738     $return = $restrictionValue;
2739     }elseif (isset($value_dossier[$restrictionValue])) {
2740     $return = $value_dossier[$restrictionValue];
2741     }elseif (isset($this->valF[$restrictionValue])) {
2742     $return = $this->valF[$restrictionValue];
2743     }
2744    
2745     // Retourne la valeur du champ
2746     return $return;
2747     }
2748    
2749 softime 6565
2750 mbroquet 3730 /**
2751 softime 6565 * Calcul des règle d'action selon leur type.
2752     *
2753     * Types de règle :
2754     * - date
2755     * - numeric
2756     * - text
2757     * - bool
2758     * - specific
2759     * - technical_data
2760 mbroquet 3730 *
2761 softime 6565 * @param string $rule Règle d'action.
2762     * @param string $rule_name Nom de la règle.
2763     * @param string $type Type de la règle.
2764     *
2765 mbroquet 3730 * @return mixed Résultat de la règle
2766     */
2767 softime 6565 public function regle($rule, $rule_name, $type = null) {
2768 mbroquet 3730
2769     // Supprime tous les espaces de la chaîne de caractère
2770     $rule = str_replace(' ', '', $rule);
2771     // Coupe la chaîne au niveau de l'opérateur
2772     $operands = explode ("+", $rule);
2773     // Nombre d'opérande
2774     $nb_operands = count($operands);
2775    
2776     // Règle à null
2777     if ($rule == "null") {
2778     return null;
2779     }
2780    
2781     // Tableau des champs de type date
2782     $rule_type_date = array(
2783     "regle_date_limite",
2784     "regle_date_notification_delai",
2785     "regle_date_complet",
2786     "regle_date_validite",
2787     "regle_date_decision",
2788     "regle_date_chantier",
2789     "regle_date_achevement",
2790     "regle_date_conformite",
2791     "regle_date_rejet",
2792     "regle_date_dernier_depot",
2793     "regle_date_limite_incompletude",
2794 softime 6565 "regle_date_cloture_instruction",
2795     "regle_date_premiere_visite",
2796     "regle_date_derniere_visite",
2797     "regle_date_contradictoire",
2798     "regle_date_retour_contradictoire",
2799     "regle_date_ait",
2800     "regle_date_transmission_parquet",
2801 softime 8989 "regle_date_affichage",
2802 mbroquet 3730 );
2803     // Tableau des champs de type numérique
2804     $rule_type_numeric = array(
2805     "regle_delai",
2806     "regle_delai_incompletude",
2807     );
2808 softime 6565 // Tableau des champs de type text
2809     $rule_type_text = array(
2810     );
2811     // Tableau des champs de type booléen
2812     $rule_type_bool = array(
2813 softime 10573 "regle_a_qualifier",
2814     "regle_incompletude",
2815     "regle_incomplet_notifie",
2816     "regle_evenement_suivant_tacite_incompletude",
2817 softime 6565 );
2818     // Tableau des champs spécifiques
2819     $rule_type_specific = array(
2820     "regle_autorite_competente",
2821     "regle_etat",
2822     "regle_accord_tacite",
2823     "regle_avis",
2824 softime 10573 "regle_pec_metier",
2825     "regle_etat_pendant_incompletude",
2826 softime 6565 );
2827     // Tableau des champs de données techniques
2828     $rule_type_technical_data = array(
2829     'regle_donnees_techniques1',
2830     'regle_donnees_techniques2',
2831     'regle_donnees_techniques3',
2832     'regle_donnees_techniques4',
2833     'regle_donnees_techniques5',
2834     );
2835 softime 8593 // Tableau des champs simple
2836     $rule_type_simple = array(
2837     "regle_dossier_instruction_type",
2838     );
2839 mbroquet 3730
2840     // Définit le type du champ
2841     if (in_array($rule_name, $rule_type_date) == true) {
2842     $type = "date";
2843     }
2844     if (in_array($rule_name, $rule_type_numeric) == true) {
2845     $type = "numeric";
2846     }
2847 softime 6565 if (in_array($rule_name, $rule_type_text) === true) {
2848     $type = "text";
2849     }
2850     if (in_array($rule_name, $rule_type_bool) === true) {
2851     $type = "bool";
2852     }
2853     if (in_array($rule_name, $rule_type_specific) === true) {
2854     $type = "specific";
2855     }
2856     if (in_array($rule_name, $rule_type_technical_data) === true) {
2857     $type = 'text';
2858     }
2859 softime 8593 if (in_array($rule_name, $rule_type_simple) === true) {
2860     $type = 'simple';
2861     }
2862 mbroquet 3730
2863 softime 6565 // Si c'est un type spécifique ou booléen alors il n'a qu'un opérande
2864     // Récupère directement la valeur de l'opérande
2865 softime 10573 if ($type === 'specific') {
2866 softime 6565 //
2867     return $this->get_value_for_rule($rule);
2868     }
2869    
2870 mbroquet 3730 // Initialisation des variables
2871     $key_date = 0;
2872     $total_numeric = 0;
2873 softime 6565 $res_text = '';
2874 mbroquet 3730
2875     // Pour chaque opérande
2876     foreach ($operands as $key => $operand) {
2877    
2878     // Si c'est une règle de type date
2879     if ($type == 'date') {
2880     // Vérifie si au moins une des opérandes est une date
2881 softime 6565 if (is_numeric($operand) === false
2882     && $this->get_value_for_rule($operand) !== null
2883     && $this->f->check_date($this->get_value_for_rule($operand)) == true) {
2884 mbroquet 3730 // Récupère la position de la date
2885     $key_date = $key;
2886     }
2887     // Les autres opérandes doivent être que des numériques
2888     if (is_numeric($operand) == true) {
2889     // Ajoute l'opérande au total
2890     $total_numeric += $operand;
2891     }
2892 softime 6565 if (is_numeric($operand) === false
2893     && $this->get_value_for_rule($operand) !== null
2894     && is_numeric($this->get_value_for_rule($operand)) == true) {
2895 mbroquet 3730 // Ajoute l'opérande au total
2896 softime 6565 $total_numeric += $this->get_value_for_rule($operand);
2897 mbroquet 3730 }
2898     }
2899    
2900     // Si c'est une règle de type numérique
2901     if ($type == 'numeric') {
2902     // Les opérandes doivent être que des numériques
2903     if (is_numeric($operand) == true) {
2904     // Ajoute l'opérande au total
2905     $total_numeric += $operand;
2906     }
2907 softime 6565 if (is_numeric($operand) === false
2908     && $this->get_value_for_rule($operand) !== null
2909     && is_numeric($this->get_value_for_rule($operand)) == true) {
2910 mbroquet 3730 // Ajoute l'opérande au total
2911 softime 6565 $total_numeric += $this->get_value_for_rule($operand);
2912 mbroquet 3730 }
2913     }
2914 softime 6565
2915     // Si c'est une règle de type text
2916     if ($type === 'text') {
2917     // Concatène toutes les chaînes de caractère
2918     $res_text .= $this->get_value_for_rule($operand);
2919     }
2920 mbroquet 3730 }
2921    
2922     // Résultat pour une règle de type date
2923     if ($type == 'date') {
2924     // Retourne le calcul de la date
2925     return $this->f->mois_date($this->valF[$operands[$key_date]],
2926     $total_numeric, "+");
2927     }
2928    
2929     // Résultat pour une règle de type numérique
2930     if ($type == 'numeric') {
2931     // Retourne le calcul
2932     return $total_numeric;
2933     }
2934 softime 6565
2935     // Résultat pour une règle de type text
2936     if ($type === 'text') {
2937     // Retourne la chaîne de caractère
2938     return $res_text;
2939     }
2940 softime 10573 if ($type === 'simple' || $type === 'bool') {
2941 softime 8593 // Retourne la valeur du champs rule
2942     return $rule;
2943     }
2944 softime 6565 }
2945    
2946    
2947     /**
2948     * Récupère la valeur du champs dans l'instruction ou dans les données
2949     * techniques.
2950     * Spécifique au calcul des règles.
2951     *
2952     * @param string $field Champ
2953     *
2954     * @return mixed Valeur du champ
2955     */
2956     private function get_value_for_rule($field) {
2957     // Si le champ n'existe pas dans la table instruction
2958     if (array_key_exists($field, $this->valF) === false) {
2959     // Récupère l'instance de la classe donnees_techniques
2960     $inst_donnees_techniques = $this->get_inst_donnees_techniques();
2961     // Retourne la valeur de la donnée technique
2962     return $inst_donnees_techniques->getVal($field);
2963     }
2964    
2965     //
2966     return $this->valF[$field];
2967     }
2968    
2969    
2970     /**
2971     * [get_inst_donnees_techniques description]
2972     *
2973     * @param [type] $donnees_techniques [description]
2974     *
2975     * @return [type] [description]
2976     */
2977     function get_inst_donnees_techniques($donnees_techniques = null) {
2978     //
2979     if (isset($this->inst_donnees_techniques) === false or
2980     $this->inst_donnees_techniques === null) {
2981     //
2982     if (is_null($donnees_techniques)) {
2983     $donnees_techniques = $this->getDonneesTechniques();
2984     }
2985     //
2986 softime 7996 $this->inst_donnees_techniques = $this->f->get_inst__om_dbform(array(
2987     "obj" => "donnees_techniques",
2988     "idx" => $donnees_techniques,
2989     ));
2990 softime 6565 }
2991     //
2992     return $this->inst_donnees_techniques;
2993     }
2994    
2995    
2996     /**
2997     * Retourne l'identifiant des données techniques liées du dossier
2998     * @return string L'identifiant des données techniques liées du dossier
2999     */
3000     function getDonneesTechniques() {
3001 softime 14064
3002     $qres = $this->f->get_one_result_from_db_query(
3003     sprintf(
3004     'SELECT
3005     donnees_techniques
3006     FROM
3007     %1$sdonnees_techniques
3008     WHERE
3009     dossier_instruction = \'%2$s\'',
3010     DB_PREFIXE,
3011     $this->f->db->escapeSimple($this->valF["dossier"])
3012     ),
3013     array(
3014     "origin" => __METHOD__,
3015     )
3016     );
3017 mbroquet 3730
3018 softime 14064 return $qres['result'];
3019 mbroquet 3730 }
3020    
3021 fmichon 4708 /**
3022     * TRIGGER - triggerajouterapres.
3023     *
3024     * - Mise à jour des informations liées au workflow sur le dossier
3025     * - Interface avec le référentiel ERP [105][111]
3026     * - Mise à jour du DA
3027     * - Historisation de la vie du DI
3028     *
3029     * @return boolean
3030     */
3031 softime 8989 function triggerajouterapres($id, &$dnu1 = null, $val = array(), $dnu2 = null) {
3032     $this->addToLog(__METHOD__."(): start", EXTRA_VERBOSE_MODE);
3033 fmichon 4708
3034     // On a besoin de l'instance du dossier lié à l'événement d'instruction
3035     $inst_di = $this->get_inst_dossier($this->valF['dossier']);
3036     // Instance de la classe evenement
3037     $inst_evenement = $this->get_inst_evenement($this->valF['evenement']);
3038 softime 9245 // Instance de l'état courant du dossier d'instruction
3039     $inst_current_etat = $this->f->get_inst__om_dbform(array(
3040     "obj" => "etat",
3041     "idx" => $inst_di->get_id_etat(),
3042     ));
3043 fmichon 4708
3044 mbroquet 3730 /**
3045     * Mise à jour des valeurs du dossier en fonction des valeurs calculées
3046     * par l'action
3047     */
3048 fmichon 4708 // état de complétude actuel du dossier
3049     $incompletude = ($inst_di->getVal('incompletude') == 't' ? true : false);
3050 softime 10573 // L'événement suivant tacite paramétré est destiné à la gestion de l'incomplétude
3051     $ev_suiv_tacite_incompletude = false;
3052 mbroquet 3730 // Initialisation
3053 softime 9245 $valF = array();
3054     $valF_dt = array();
3055 fmichon 4708 //
3056 mbroquet 3730 // Récupération des paramètres de l'action
3057 softime 14542 // TODO : remplacer cette requête par l'instanciation de l'action
3058     $qres = $this->f->get_all_results_from_db_query(
3059     sprintf(
3060     'SELECT
3061     *
3062     FROM
3063     %1$saction
3064     WHERE
3065     action = \'%2$s\'',
3066     DB_PREFIXE,
3067     $this->f->db->escapeSimple($this->valF['action'])
3068     ),
3069     array(
3070     "origin" => __METHOD__
3071     )
3072     );
3073     foreach ($qres['result'] as $row) {
3074 mbroquet 3730
3075     // pour chacune des regles, on applique la regle
3076 softime 6565 if ($row['regle_delai'] != '') {
3077 mbroquet 3730 $valF['delai'] = $this->regle($row['regle_delai'], 'regle_delai');
3078     }
3079 softime 6565 if ($row['regle_accord_tacite'] != '') {
3080 mbroquet 3730 $valF['accord_tacite'] = $this->regle($row['regle_accord_tacite'], 'regle_accord_tacite');
3081     }
3082 softime 6565 if ($row['regle_avis'] != '') {
3083 mbroquet 3730 $valF['avis_decision'] = $this->regle($row['regle_avis'], 'regle_avis');
3084     }
3085 softime 6565 if ($row['regle_date_limite'] != '') {
3086     $valF['date_limite'] = $this->regle($row['regle_date_limite'], 'regle_date_limite');
3087 mbroquet 3730 }
3088 softime 6565 if ($row['regle_date_complet'] != '') {
3089     $valF['date_complet'] = $this->regle($row['regle_date_complet'], 'regle_date_complet');
3090 mbroquet 3730 }
3091 softime 6565 if ($row['regle_date_dernier_depot'] != '') {
3092     $valF['date_dernier_depot'] = $this->regle($row['regle_date_dernier_depot'], 'regle_date_dernier_depot');
3093 mbroquet 3730 }
3094 softime 6565 if ($row['regle_date_notification_delai'] != '') {
3095     $valF['date_notification_delai'] = $this->regle($row['regle_date_notification_delai'], 'regle_date_notification_delai');
3096 mbroquet 3730 }
3097 softime 6565 if ($row['regle_date_decision'] != '') {
3098     $valF['date_decision'] = $this->regle($row['regle_date_decision'], 'regle_date_decision');
3099 mbroquet 3730 }
3100 softime 6565 if ($row['regle_date_rejet'] != '') {
3101     $valF['date_rejet'] = $this->regle($row['regle_date_rejet'], 'regle_date_rejet');
3102 mbroquet 3730 }
3103 softime 6565 if ($row['regle_date_validite'] != '') {
3104     $valF['date_validite'] = $this->regle($row['regle_date_validite'], 'regle_date_validite');
3105 mbroquet 3730 }
3106 softime 6565 if ($row['regle_date_chantier'] != '') {
3107     $valF['date_chantier'] = $this->regle($row['regle_date_chantier'], 'regle_date_chantier');
3108 mbroquet 3730 }
3109 softime 6565 if ($row['regle_date_achevement'] != '') {
3110     $valF['date_achevement'] = $this->regle($row['regle_date_achevement'], 'regle_date_achevement');
3111 mbroquet 3730 }
3112 softime 6565 if ($row['regle_date_conformite'] != '') {
3113     $valF['date_conformite'] = $this->regle($row['regle_date_conformite'], 'regle_date_conformite');
3114 mbroquet 3730 }
3115 softime 6565 if ($row['regle_date_limite_incompletude'] != '') {
3116     $valF['date_limite_incompletude'] = $this->regle($row['regle_date_limite_incompletude'], 'regle_date_limite_incompletude');
3117 mbroquet 3730 }
3118 softime 6565 if ($row['regle_delai_incompletude'] != '') {
3119     $valF['delai_incompletude'] = $this->regle($row['regle_delai_incompletude'], 'regle_delai_incompletude');
3120 mbroquet 3730 }
3121 softime 6565 if ($row['regle_autorite_competente'] != '') {
3122     $valF['autorite_competente'] = $this->regle($row['regle_autorite_competente'], 'regle_autorite_competente');
3123 mbroquet 3730 }
3124 softime 6565 if ($row['regle_etat'] != '') {
3125 softime 10573 $valF['etat'] = $this->regle($row['regle_etat'], 'regle_etat');
3126 mbroquet 3730 }
3127 softime 6565 if ($row['regle_date_cloture_instruction'] !== '') {
3128     $valF['date_cloture_instruction'] = $this->regle($row['regle_date_cloture_instruction'], 'regle_date_cloture_instruction');
3129     }
3130     if ($row['regle_date_premiere_visite'] !== '') {
3131     $valF['date_premiere_visite'] = $this->regle($row['regle_date_premiere_visite'], 'regle_date_premiere_visite');
3132     }
3133     if ($row['regle_date_derniere_visite'] !== '') {
3134     $valF['date_derniere_visite'] = $this->regle($row['regle_date_derniere_visite'], 'regle_date_derniere_visite');
3135     }
3136     if ($row['regle_date_contradictoire'] !== '') {
3137     $valF['date_contradictoire'] = $this->regle($row['regle_date_contradictoire'], 'regle_date_contradictoire');
3138     }
3139     if ($row['regle_date_retour_contradictoire'] !== '') {
3140     $valF['date_retour_contradictoire'] = $this->regle($row['regle_date_retour_contradictoire'], 'regle_date_retour_contradictoire');
3141     }
3142     if ($row['regle_date_ait'] !== '') {
3143     $valF['date_ait'] = $this->regle($row['regle_date_ait'], 'regle_date_ait');
3144     }
3145     if ($row['regle_donnees_techniques1'] !== '') {
3146     $valF_dt[$row['cible_regle_donnees_techniques1']] = $this->regle($row['regle_donnees_techniques1'], 'regle_donnees_techniques1');
3147     }
3148     if ($row['regle_donnees_techniques2'] !== '') {
3149     $valF_dt[$row['cible_regle_donnees_techniques2']] = $this->regle($row['regle_donnees_techniques2'], 'regle_donnees_techniques2');
3150     }
3151     if ($row['regle_donnees_techniques3'] !== '') {
3152     $valF_dt[$row['cible_regle_donnees_techniques3']] = $this->regle($row['regle_donnees_techniques3'], 'regle_donnees_techniques3');
3153     }
3154     if ($row['regle_donnees_techniques4'] !== '') {
3155     $valF_dt[$row['cible_regle_donnees_techniques4']] = $this->regle($row['regle_donnees_techniques4'], 'regle_donnees_techniques4');
3156     }
3157     if ($row['regle_donnees_techniques5'] !== '') {
3158     $valF_dt[$row['cible_regle_donnees_techniques5']] = $this->regle($row['regle_donnees_techniques5'], 'regle_donnees_techniques5');
3159     }
3160     if ($row['regle_date_transmission_parquet'] !== '') {
3161     $valF['date_transmission_parquet'] = $this->regle($row['regle_date_transmission_parquet'], 'regle_date_transmission_parquet');
3162     }
3163 softime 8593 if ($row['regle_dossier_instruction_type'] !== '') {
3164     $valF['dossier_instruction_type'] = $this->regle($row['regle_dossier_instruction_type'], 'regle_dossier_instruction_type');
3165     }
3166 softime 8989 // La date d'affichage est modifiée seulement si le champ n'est pas
3167     // renseigné
3168     if ($row['regle_date_affichage'] !== ''
3169     && ($inst_di->getVal('date_affichage') === ''
3170     || $inst_di->getVal('date_affichage') === null)) {
3171     //
3172     $valF['date_affichage'] = $this->regle($row['regle_date_affichage'], 'regle_date_affichage');
3173     }
3174 softime 10573 //
3175     if ($row['regle_pec_metier'] != '') {
3176     $valF['pec_metier'] = $this->regle($row['regle_pec_metier'], 'regle_pec_metier');
3177     }
3178     if ($row['regle_a_qualifier'] != '') {
3179     $valF['a_qualifier'] = $this->regle($row['regle_a_qualifier'], 'regle_a_qualifier');
3180     }
3181     //
3182     if ($row['regle_incompletude'] != '') {
3183     $valF['incompletude'] = $this->regle($row['regle_incompletude'], 'regle_incompletude');
3184     }
3185     if ($row['regle_incomplet_notifie'] != '') {
3186     $valF['incomplet_notifie'] = $this->regle($row['regle_incomplet_notifie'], 'regle_incomplet_notifie');
3187     }
3188     if ($row['regle_etat_pendant_incompletude'] != '') {
3189     $valF['etat_pendant_incompletude'] = $this->regle($row['regle_etat_pendant_incompletude'], 'regle_etat_pendant_incompletude');
3190     }
3191     if ($row['regle_evenement_suivant_tacite_incompletude'] != '') {
3192     $resti = $this->regle($row['regle_evenement_suivant_tacite_incompletude'], 'regle_evenement_suivant_tacite_incompletude');
3193     if (strtolower($resti) === 't' || strtolower($resti) === 'true') {
3194     $ev_suiv_tacite_incompletude = true;
3195     }
3196     }
3197 mbroquet 3730 }
3198 softime 6063
3199     // Si l'événement a un événement suivant tacite
3200     if($inst_evenement->getVal('evenement_suivant_tacite') != '') {
3201 softime 10573 // En fonction de l'action de l'événement, l'événement suivant tacite ne sera
3202     // pas associé de le même façon au dossier d'instruction
3203     if ($ev_suiv_tacite_incompletude === false) {
3204 softime 6063 $valF['evenement_suivant_tacite'] = $inst_evenement->getVal('evenement_suivant_tacite');
3205 softime 10573 }
3206     if ($ev_suiv_tacite_incompletude === true) {
3207 softime 6063 $valF['evenement_suivant_tacite_incompletude'] = $inst_evenement->getVal('evenement_suivant_tacite');
3208 nhaye 5254 }
3209 mbroquet 3730 }
3210 softime 6565 // Si des valeurs de données techniques ont été calculées alors on met à jour l'enregistrement
3211 softime 9245 if (count($valF_dt) > 0) {
3212 softime 6565 $dt_id = $this->getDonneesTechniques();
3213     // On met à jour le dossier
3214     $cle = " donnees_techniques='".$dt_id."'";
3215 softime 12847 $res1 = $this->f->db->autoexecute(DB_PREFIXE.'donnees_techniques', $valF_dt, DB_AUTOQUERY_UPDATE, $cle);
3216     $this->addToLog(
3217     __METHOD__."(): db->autoexecute(\"".DB_PREFIXE."donnees_techniques\", ".print_r($valF_dt, true).", DB_AUTOQUERY_UPDATE, \"".$cle."\");",
3218     VERBOSE_MODE
3219     );
3220     $this->f->isDatabaseError($res1);
3221 softime 6565 // Affichage d'informations à l'utilisateur
3222 softime 8989 $this->addToMessage(_('enregistrement')." ".$this->valF['dossier']." "._('table')." dossier [".$this->f->db->affectedRows()." "._('enregistrement')." "._('mis_a_jour')."]");
3223 softime 6565 }
3224 mbroquet 3730 // Si des valeurs ont été calculées alors on met à jour l'enregistrement
3225 softime 9245 if (count($valF) > 0) {
3226 softime 10573 //
3227     $inst_dossier = $this->f->get_inst__om_dbform(array(
3228     "obj" => "dossier",
3229     "idx" => $this->valF['dossier'],
3230     ));
3231     $valF['instruction'] = $id;
3232 softime 10968 $valF['crud'] = 'create';
3233 softime 10573 $update_by_instruction = $inst_dossier->update_by_instruction($valF);
3234     if ($update_by_instruction === false) {
3235     $this->cleanMessage();
3236     $this->addToMessage(sprintf('%s %s', __("Une erreur s'est produite lors de la mise à jour du dossier d'instruction."), __("Veuillez contacter votre administrateur.")));
3237     return false;
3238 mbroquet 3730 }
3239     // Affichage d'informations à l'utilisateur
3240 softime 8989 $this->addToMessage(_('enregistrement')." ".$this->valF['dossier']." "._('table')." dossier [".$this->f->db->affectedRows()." "._('enregistrement')." "._('mis_a_jour')."]");
3241 mbroquet 3730 }
3242    
3243     /**
3244 fmichon 4708 * Interface avec le référentiel ERP.
3245     *
3246     * (WS->ERP)[105] Arrêté d'un dossier PC effectué -> PC qui concerne un ERP
3247     * (WS->ERP)[111] Décision de conformité effectuée -> PC qui concerne un ERP
3248     * Déclencheur :
3249     * - L'option ERP est activée
3250     * - Le dossier est marqué comme "connecté au référentiel ERP"
3251     * - Le dossier est de type PC
3252     * - Le formulaire d'ajout d'un événement d'instruction est validé
3253     * avec un événement pour lequel les services ERP doivent être
3254     * informé
3255 mbroquet 3730 */
3256 fmichon 4708 //
3257 softime 7521 if ($this->f->is_option_referentiel_erp_enabled() === true
3258 fmichon 4708 && $inst_di->is_connected_to_referentiel_erp() === true
3259     && $this->f->getDATCode($this->valF['dossier']) == $this->f->getParameter('erp__dossier__nature__pc')
3260     && in_array($inst_evenement->getVal($inst_evenement->clePrimaire), explode(";", $this->f->getParameter('erp__evenements__decision__pc')))) {
3261 mbroquet 3730 //
3262 fmichon 4708 $infos = array(
3263     "dossier_instruction" => $this->valF['dossier'],
3264     "decision" => $inst_evenement->getVal("libelle"),
3265     );
3266 mbroquet 3730 //
3267 fmichon 4708 $ret = $this->f->send_message_to_referentiel_erp(105, $infos);
3268     if ($ret !== true) {
3269     $this->cleanMessage();
3270     $this->addToMessage(_("Une erreur s'est produite lors de la notification (105) du référentiel ERP. Contactez votre administrateur."));
3271     return false;
3272 mbroquet 3730 }
3273 fmichon 4708 $this->addToMessage(_("Notification (105) du référentiel ERP OK."));
3274     }
3275 mbroquet 3730
3276 softime 8989 // Si le mode en rédaction intégrale est activé
3277     if (isset($this->valF['flag_edition_integrale']) === true
3278     && $this->valF['flag_edition_integrale'] === true) {
3279     $redactionIntegraleValF = array();
3280    
3281     // Récupère la collectivite du dossier d'instruction
3282     $dossier_instruction_om_collectivite = $this->get_dossier_instruction_om_collectivite();
3283     $collectivite = $this->f->getCollectivite($dossier_instruction_om_collectivite);
3284     // Récupère le corps de la lettre type
3285     $params = array(
3286     "specific" => array(
3287     "corps" => array(
3288     "mode" => "get",
3289     )
3290     ),
3291     );
3292     $result = $this->compute_pdf_output('lettretype', $this->valF['lettretype'], $collectivite, $id, $params);
3293     $redactionIntegraleValF['corps_om_htmletatex'] = $result['pdf_output'];
3294     // Récupère le titre de la lettre type
3295     $params = array(
3296     "specific" => array(
3297     "titre" => array(
3298     "mode" => "get",
3299     )
3300     ),
3301     );
3302     $result = $this->compute_pdf_output('lettretype', $this->valF['lettretype'], $collectivite, $id, $params);
3303     $redactionIntegraleValF['titre_om_htmletat'] = $result['pdf_output'];
3304    
3305     // mise à jour en base de données
3306     $res = $this->f->db->autoExecute(
3307     DB_PREFIXE.$this->table,
3308     $redactionIntegraleValF,
3309     DB_AUTOQUERY_UPDATE,
3310     $this->clePrimaire."=".$id
3311     );
3312     $this->addToLog(__METHOD__."(): db->autoexecute(\"".DB_PREFIXE.'.'.$this->table."\", ".print_r($redactionIntegraleValF, true).", DB_AUTOQUERY_UPDATE, \"".$this->clePrimaire."=".$id."\");", VERBOSE_MODE);
3313     if ($this->f->isDatabaseError($res, true) === true) {
3314     return false;
3315     }
3316     }
3317    
3318 fmichon 4708 /**
3319 softime 7996 * Finalisation automatique de l'instruction si le paramétrage de l'événement l'autorise
3320     */
3321     // Si la finalisation automatique de l'événement est activée
3322     // ET si l'instruction n'a pas déjà été finalisée
3323     // ET s'il existe une lettre type associée
3324     if ($inst_evenement->getVal('finaliser_automatiquement') === 't'
3325     && $inst_evenement->getVal('om_final_instruction') !== 't'
3326     && $inst_evenement->getVal('lettretype') !== ''
3327     && $inst_evenement->getVal('lettretype') !== null) {
3328    
3329     // On instancie l'instruction
3330     $inst_instruction = $this->f->get_inst__om_dbform(array(
3331     "obj" => "instruction",
3332     "idx" => $this->valF[$this->clePrimaire],
3333     ));
3334    
3335     // On finalise l'instruction dans le contexte de finalisation : action 100
3336     $inst_instruction->setParameter('maj', 100);
3337     $finalize = $inst_instruction->finalize($inst_instruction->valF);
3338    
3339     // Une erreur de finalisation renvoie 'false' : ajout dans les logs
3340     // et dans le message d'erreur
3341     if ($finalize === false) {
3342     $this->f->addToLog(__METHOD__."() : ERROR - Impossible de finaliser l'instruction.", DEBUG_MODE);
3343     $this->addToMessage(_("Erreur lors de la finalisation de l'instruction. Contactez votre administrateur."));
3344     return false;
3345     }
3346     }
3347    
3348     /**
3349 softime 7521 * Finalisation automatique des instructions tacites ou retours.
3350     */
3351 softime 7685 // Si l'option de finalisation automatique des instructions tacites ou
3352     // retours est activée et l'événement d'instruction a une lettre type
3353     // associée
3354     $collectivite_di = $this->get_dossier_instruction_om_collectivite($val['dossier']);
3355     if ($this->f->is_option_finalisation_auto_enabled($collectivite_di) === true
3356     && $inst_evenement->getVal('lettretype') !== ''
3357 softime 7521 && $inst_evenement->getVal('lettretype') !== null) {
3358    
3359     // Rècupère l'identifiant de l'événement
3360     $evenement_id = $inst_evenement->getVal($inst_evenement->clePrimaire);
3361    
3362     // Si l'événement d'instruction est identifié comme un événement
3363     // retour
3364     // OU l'événement d'instruction est l'événement suivant tacite du
3365     // dossier d'instruction (incomplétude prise en compte)
3366 softime 7996 // ET l'événement d'instruction n'a pas déjà été finalisé
3367     if (($inst_evenement->getVal("retour") === 't'
3368 softime 7521 || ($inst_di->getVal('evenement_suivant_tacite_incompletude') === $evenement_id
3369 softime 7996 || $inst_di->getVal('evenement_suivant_tacite') === $evenement_id))
3370     && ($inst_evenement->getVal('om_final_instruction') !== 't')) {
3371 softime 7521
3372     // Finalise l'instruction
3373 softime 7996 $inst_instruction = $this->f->get_inst__om_dbform(array(
3374     "obj" => "instruction",
3375     "idx" => $this->valF[$this->clePrimaire],
3376     ));
3377 softime 7521 $inst_instruction->setParameter('maj', 100);
3378     $finalize = $inst_instruction->finalize($inst_instruction->valF);
3379     if ($finalize === false) {
3380     //
3381     return false;
3382     }
3383     }
3384     }
3385    
3386     /**
3387 softime 9245 * Mise à jour de la version de clôture *version_clos* du dossier si et
3388     * seulement si l'instruction met à jour l'état du dossier.
3389     */
3390     if (isset($valF['etat']) === true
3391     && $valF['etat'] !== null
3392     && $valF['etat'] !== '') {
3393     // Instanciation de l'état appliqué sur le dossier par l'instruction
3394     $inst_etat = $this->f->get_inst__om_dbform(array(
3395     "obj" => "etat",
3396     "idx" => $valF['etat'],
3397     ));
3398     //
3399     $update_version_clos = null;
3400     // En cas d'instruction qui clôture le dossier
3401     if ($inst_etat->getVal('statut') === 'cloture') {
3402     $update_version_clos = $inst_di->update_version_clos('up');
3403     }
3404     // En cas d'instruction qui rouvre le dossier
3405     if ($inst_current_etat->getVal('statut') === 'cloture'
3406     && $inst_etat->getVal('statut') !== 'cloture') {
3407     //
3408     $update_version_clos = $inst_di->update_version_clos('down');
3409     //
3410     $params = array(
3411     'di_reopened' => true,
3412     );
3413     }
3414     //
3415     if ($update_version_clos === false) {
3416     $this->f->addToLog(sprintf(
3417     "%s() : ERREUR - %s %s",
3418     __METHOD__,
3419     sprintf(
3420     __("Impossible de mettre à jour la version de clôture du dossier d'instruction %s."),
3421     $inst_di->getVal($inst_di->clePrimaire)
3422     ),
3423     sprintf(
3424     __("L'instruction tente d'appliquer l'état %s."),
3425     $inst_etat->getVal($inst_etat->clePrimaire)
3426     )
3427     ));
3428     $this->addToMessage(sprintf(
3429     "%s %s",
3430     __("Erreur lors de la mise à jour de la version de clôture du dossier d'instruction."),
3431     __("Veuillez contacter votre administrateur.")
3432     ));
3433     return false;
3434     }
3435     }
3436    
3437     /**
3438 softime 10808 * Notification automatique
3439     */
3440     // Notification automatique à l'ajout de l'instruction si la notification
3441     // automatique est choisie et qu'il n'y a pas de lettretype associée à l'événement
3442     if ($inst_evenement->getVal('notification') === 'notification_automatique' &&
3443     ($inst_evenement->getVal('lettretype') === null ||
3444     $inst_evenement->getVal('lettretype') === '')) {
3445 softime 13137 // Message à afficher dans les logs pour indiquer quelle notification a échouée
3446 softime 13528 $msgLog = sprintf(
3447     '%s %s : %d',
3448     __('Erreur lors de la notification automatique du(des) pétitionnaire(s).'),
3449     __('Instruction notifiée'),
3450     $id
3451     );
3452 softime 13137
3453 softime 10808 // Récupération de la liste des demandeurs à notifier et de la catégorie
3454     $categorie = $this->f->get_param_option_notification($collectivite_di);
3455 softime 14064 $isPortal = $categorie === PORTAL;
3456 softime 10869 $demandeursANotifie = $this->get_demandeurs_notifiable(
3457     $this->valF['dossier'],
3458     $isPortal
3459     );
3460 softime 10808
3461     // Création d'une notification et d'une tâche pour chaque demandeur à notifier
3462 softime 12124 $demandeurPrincipalNotifie = false;
3463 softime 10808 foreach ($demandeursANotifie as $demandeur) {
3464 softime 12124 // Identifie si le demandeur principal a été notifié ou pas
3465     // et récupère ses informations
3466     if ($demandeur['petitionnaire_principal'] == 't') {
3467     $demandeurPrincipalNotifie = true;
3468     // Si le demandeur principal est notifiable mais qu'il y a des erreurs dans
3469     // son paramétrage, on effectue pas le traitement et on passe à l'itération
3470     // suivante. On le considère également comme non notifié pour gérer l'envoie
3471     // des messages d'erreurs
3472     // Si la demande a été déposée via le portail alors le paramétrage n'a pas
3473     // d'impact sur la notification
3474     $erreursParam = $this->get_info_notification_fail($val['dossier']);
3475     if (! $this->dossier_depose_sur_portail($val['dossier']) && $erreursParam != array()) {
3476     $demandeurPrincipalNotifie = false;
3477     continue;
3478     }
3479     }
3480 softime 10808 // Ajout de la notif et récupération de son id
3481     $idNotif = $this->ajouter_notification(
3482     $this->valF[$this->clePrimaire],
3483     $this->f->get_connected_user_login_name(),
3484 softime 10968 $demandeur,
3485     $collectivite_di,
3486 softime 12433 array(),
3487 softime 10968 true
3488 softime 10808 );
3489     if ($idNotif === false) {
3490 softime 13528 $this->addToLog(
3491     sprintf('%s() : %s', __METHOD__, $msgLog),
3492     DEBUG_MODE
3493     );
3494 softime 10808 return false;
3495     }
3496     // Création de la tache en lui donnant l'id de la notification
3497     $notification_by_task = $this->notification_by_task(
3498     $idNotif,
3499     $this->valF['dossier'],
3500     $categorie
3501     );
3502     if ($notification_by_task === false) {
3503 softime 13528 $this->addToLog(
3504     sprintf('%s() : %s', __METHOD__, $msgLog),
3505     DEBUG_MODE
3506     );
3507 softime 10808 $this->addToMessage(
3508     __("Erreur lors de la génération de la notification au(x) pétitionnaire(s).")
3509     );
3510     return false;
3511     }
3512     }
3513 softime 12847 // Pour la notification par mail ou la notification via portal si le dossier a
3514     // été déposés via portal, si le demandeur principal n'est pas notifiable,
3515     // on créé une nouvelle notification en erreur avec en commentaire la raison pour
3516     // laquelle le demandeur principal n'a pas pu être notifié
3517     $depotPortal = $this->dossier_depose_sur_portail();
3518     if (! $demandeurPrincipalNotifie && ($isPortal === false || $depotPortal === true)) {
3519 softime 13137 // Précision dans les logs que le pétitionnaire principal n'est pas notifiable.
3520     // ' ' permet de mettre un espace entre les 2 msg de log.
3521 softime 13528 $msgLog .= sprintf(' %s', __('Le pétitionnaire principale n\'est pas notifiable.'));
3522 softime 12124 // Analyse pour savoir pourquoi le demandeur principal n'est pas notifiable
3523     $erreursParam = $this->get_info_notification_fail($val['dossier']);
3524     $demandeurPrincipal = $this->get_info_petitionnaire_principal_dossier($val['dossier']);
3525     // Ajout de la notif et récupération de son id
3526     $idNotif = $this->ajouter_notification(
3527     $this->valF[$this->clePrimaire],
3528     $this->f->get_connected_user_login_name(),
3529     $demandeurPrincipal,
3530     $collectivite_di,
3531 softime 12433 array(),
3532 softime 12124 true,
3533     'Echec',
3534     implode(' ', $erreursParam)
3535     );
3536     if ($idNotif === false) {
3537 softime 13528 $this->addToLog(
3538     sprintf('%s() : %s', __METHOD__, $msgLog),
3539     DEBUG_MODE
3540     );
3541 softime 12124 $this->addToMessage(
3542     __('Erreur : la création de la notification a échouée.').
3543     __("Veuillez contacter votre administrateur.")
3544     );
3545     return false;
3546     }
3547     // Prépare un message d'alerte à destination de l'instructeur pour l'informer
3548     // de l'échec de la notification
3549     $dossier_message = $this->get_inst_dossier_message(0);
3550     $dossier_message_val = array(
3551     'dossier' => $val['dossier'],
3552     'type' => _('erreur expedition'),
3553     'emetteur' => $this->f->get_connected_user_login_name().' (automatique)',
3554     'login' => $_SESSION['login'],
3555     'date_emission' => date('Y-m-d H:i:s'),
3556     'contenu' => _('Échec lors de la notification de l\'instruction ').
3557     $inst_evenement->getVal('libelle').
3558     '.<br>'.
3559     implode("\n", $erreursParam).
3560     '<br>'.
3561     _('Veuillez corriger ces informations avant de renvoyer la notification.')
3562     );
3563     $add = $dossier_message->add_notification_message($dossier_message_val, true);
3564     // Si une erreur se produit pendant l'ajout
3565     if ($add !== true) {
3566     $this->addToLog(__METHOD__."(): Le message d'alerte concernant l'echec de l'envoi de la notification n'a pas pu être envoyé.", DEBUG_MODE);
3567     return false;
3568     }
3569     }
3570 softime 10808 $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.")));
3571     }
3572    
3573 softime 12654 // Notification automatique en cas de dépôt de dossier dématérialisé
3574     // Vérifie si l'option de notification est active et si il s'agit bien d'une
3575     // instruction de récépissé
3576     if (
3577     $this->f->is_option_notification_depot_demat_enabled($collectivite_di)
3578     && $this->is_instruction_recepisse()
3579     ) {
3580 softime 13137 // Message à afficher dans les logs pour indiquer quelle notification a échouée
3581 softime 13528 $msgLog = sprintf(
3582     __('Erreur lors de la notification de dépôt du dossier dématérialisé : %s.'),
3583     $val['dossier']
3584     );
3585 softime 12654 // Récupère l'instance de la demande
3586     $demande = $inst_di->get_inst_demande();
3587 softime 13137 // Vérifie que le dossier a été déposé via platau ou portal
3588 softime 12654 if (
3589 softime 13137 ($demande->getVal('source_depot') == PLATAU ||
3590     $demande->getVal('source_depot') == PORTAL)
3591 softime 12654 ) {
3592 softime 13137 // Récupère la liste des mails fournis en paramètre. Si aucun adresse n'a été récupéré
3593     // l'envoi de la notification n'est pas effectué et un message d'erreur est affiché.
3594     $listeEmails = $this->f->get_param_courriel_de_notification_commune($collectivite_di);
3595     if (empty($listeEmails)) {
3596     $this->addToLog(
3597 softime 13528 sprintf(
3598     '%s(): %s %s',
3599     __METHOD__,
3600     $msgLog,
3601     __('Aucun courriel paramétré.')
3602     ),
3603 softime 13137 DEBUG_MODE
3604 softime 12654 );
3605 softime 13137 } else {
3606     foreach ($listeEmails as $email) {
3607     // Ajout de la notif et récupération de son id
3608     $destinataire = array(
3609     'destinataire' => $email,
3610     'courriel' => $email
3611 softime 12654 );
3612 softime 13137 $idNotif = $this->ajouter_notification(
3613     $this->valF[$this->clePrimaire],
3614     $this->f->get_connected_user_login_name(),
3615     $destinataire,
3616     $collectivite_di,
3617     array(),
3618     true
3619     );
3620     if ($idNotif === false) {
3621 softime 13528 $this->addToLog(
3622     sprintf('%s(): %s', __METHOD__, $msgLog),
3623     DEBUG_MODE
3624     );
3625 softime 13137 return false;
3626     }
3627     // Création de la tache en lui donnant l'id de la notification
3628     $notification_by_task = $this->notification_by_task(
3629     $idNotif,
3630     $this->valF['dossier'],
3631     'mail',
3632     'notification_depot_demat'
3633     );
3634     if ($notification_by_task === false) {
3635     $this->addToMessage(
3636     __("Erreur lors de la génération de la notification de dépot de dossier par voie dématérialisée.")
3637     );
3638 softime 13528 $this->addToLog(
3639     sprintf('%s(): %s', __METHOD__, $msgLog),
3640     DEBUG_MODE
3641     );
3642 softime 13137 return false;
3643     }
3644 softime 12654 }
3645     }
3646     }
3647     }
3648    
3649 softime 10808 /**
3650 softime 7996 * Mise à jour de la date de dernière modification du dossier
3651     */
3652     $inst_di->update_last_modification_date();
3653    
3654     /**
3655 softime 8640 * Mise à jour des données du DA.
3656     */
3657     $inst_da = $inst_di->get_inst_dossier_autorisation();
3658 softime 9245 $params['di_id'] = $this->valF['dossier'];
3659 softime 8640 if ($inst_da->majDossierAutorisation($params) === false) {
3660     $this->addToMessage(_("Erreur lors de la mise a jour des donnees du dossier d'autorisation. Contactez votre administrateur."));
3661     $this->correct = false;
3662     return false;
3663     }
3664    
3665     /**
3666 fmichon 4708 * Historisation de la vie du DI.
3667     */
3668     //
3669 nmeucci 3963 return $this->add_log_to_dossier($id, array_merge($val, $this->valF));
3670 nmeucci 3876 }
3671 mbroquet 3730
3672 softime 12124 /**
3673     * Cette méthode vérifie si toutes les conditions de l'envoi de la notification
3674     * sont remplies.
3675     * Les conditions vérifiées sont les suivantes :
3676 softime 14064 * - L'option de notification *option_notification* doit être définie
3677 softime 12124 * - Le petitionnaire principal doit accepter les notifications
3678     * - Le pétitionnaire principal doit avoir une adresse mail renseignée
3679     * - Le pétitionnaire principal doit avoir une adresse mail correcte
3680     * Pour chaque vérification effectué un message d'erreur est ajouté si la
3681     * condition n'est pas remplie.
3682     * Renvoie le message d'erreur en sortie.
3683     *
3684     * @param string identifiant du dossier sur lequel les notifications ont échouée
3685     * @return string
3686     */
3687     protected function get_info_notification_fail($dossier = null) {
3688     // Utilise l'identifiant du dossier passé en paramètre et si aucun dossier n'a été récupéré
3689     // utilise celui associé à l'instruction
3690     if ($dossier == null) {
3691     $dossier = $this->getVal('dossier');
3692     }
3693     // Tableau contenant la liste des messages d'erreur
3694     $errorMessage = array();
3695 softime 14064 // Récupère l'option de notification
3696     $collectivite_di = $this->get_dossier_instruction_om_collectivite($dossier);
3697     $option_notification = $this->f->get_param_option_notification($collectivite_di);
3698     if ($option_notification !== PORTAL && $option_notification !== 'mail') {
3699     $errorMessage[] = __("L'option de notification option_notification doit obligatoirement être définie.");
3700     }
3701 softime 12124 // Récupère les informations du demandeurs principal
3702     $infoPetitionnaire = $this->get_info_petitionnaire_principal_dossier($dossier);
3703     // Vérifie si le pétitionnaire principal à bien la case "accepte les notification" cochée
3704     if (isset($infoPetitionnaire['notification']) && $infoPetitionnaire['notification'] != 't') {
3705     $errorMessage[] = __('Le pétitionnaire principal n\'accepte pas les notifications.');
3706     }
3707     // Vérifie si l'adresse mail du pétitionnaire principale est renseignée
3708     if (isset($infoPetitionnaire['courriel']) && ! empty($infoPetitionnaire['courriel'])) {
3709     // Vérifie si le format de l'adresse mail est pas correct et, si ce n'est pas le cas, informe l'utilisateur
3710     // qu'il doit le corriger avant de pouvoir ajouter l'nstruction
3711     if (! $this->f->checkValidEmailAddress($infoPetitionnaire['courriel'])) {
3712     $errorMessage[] = __('Le courriel du pétitionnaire principal n\'est pas correct : ').
3713     $infoPetitionnaire['courriel'].
3714     '.';
3715     }
3716     } else {
3717     // Si le courriel du pétitionnaire principal
3718     $errorMessage[] = __('Le courriel du pétitionnaire principal n\'est pas renseigné.');
3719     }
3720 softime 11585
3721 softime 12124 return $errorMessage;
3722     }
3723    
3724     /**
3725     * Méthode servant à vérifier si un dossier a été déposé sur
3726     * le portail citoyen ou pas.
3727     * La verification se fait via une requête sql dans laquelle
3728     * on va chercher un dossier ayant pour id l'identifiant de
3729     * dossier associé à l'instruction et pour lequel la demande
3730     * associée la plus ancienne est une demande de création de
3731     * dossier via portail
3732     *
3733     * @param string identifiant du dossier. Si non renseigné c'est le dossier
3734     * associé à l'instruction qui est utilisé
3735     * @return boolean|void true : dossier déposé via portail, false : dossier
3736     * non déposé via portail et null : erreur de base de données.
3737     */
3738     protected function dossier_depose_sur_portail($dossier = null) {
3739     if (empty($dossier)) {
3740     $dossier = $this->getVal('dossier');
3741     }
3742 softime 13137 $qres = $this->f->get_one_result_from_db_query(
3743     sprintf(
3744     'SELECT
3745     dossier
3746     FROM
3747     %1$sdossier
3748     -- Récuperation de la première demande associée au dossier
3749     LEFT JOIN (
3750     SELECT
3751     demande,
3752     dossier_instruction,
3753     source_depot
3754     FROM
3755     %1$sdemande
3756     WHERE
3757     dossier_instruction = \'%2$s\'
3758     ORDER BY
3759     demande ASC
3760     LIMIT 1
3761 softime 14064 ) AS demande
3762     ON dossier.dossier = demande.dossier_instruction
3763 softime 13137 WHERE
3764     dossier.dossier = \'%2$s\'
3765     AND demande.source_depot = \'portal\'',
3766     DB_PREFIXE,
3767     $this->f->db->escapeSimple($dossier)
3768     ),
3769     array(
3770     "origin" => __METHOD__,
3771     "force_return" => true,
3772     )
3773 softime 12124 );
3774 softime 13137 if ($qres["code"] !== "OK") {
3775 softime 12124 $this->addToMessage(__('Erreur : La vérification du mode de dépôt du dossier à échoué'));
3776     return;
3777     }
3778     // Si on a un résultat c'est que le dossier a été déposé via le portail
3779 softime 13137 return ! empty($qres["result"]);
3780 softime 12124 }
3781    
3782 softime 11585 public function is_service_notifiable() {
3783     $evenement = $this->get_inst_evenement($this->getVal('evenement'));
3784    
3785     // Si l'instruction a une édition non finalisé quel que soit
3786     // le type de notification, il n'est pas notifiable
3787     if ($this->has_an_edition() === true) {
3788     if ($this->is_unfinalizable_without_bypass() === false) {
3789     return false;
3790     }
3791     }
3792     // Vérifie si la notification des tiers est active pour l'évènement
3793     return $this->get_boolean_from_pgsql_value($evenement->getVal('notification_service'));
3794     }
3795    
3796     public function is_tiers_notifiable() {
3797     $evenement = $this->get_inst_evenement($this->getVal('evenement'));
3798    
3799     // Si l'instruction a une édition non finalisé quel que soit
3800     // le type de notification, il n'est pas notifiable
3801     if ($this->has_an_edition() === true) {
3802     if ($this->is_unfinalizable_without_bypass() === false) {
3803     return false;
3804     }
3805     }
3806     // Vérifie si la notification des tiers est active pour l'évènement
3807 softime 13137 return ! empty($evenement->getVal('notification_tiers'));
3808 softime 11585 }
3809    
3810 softime 12124 /**
3811     * Méthode permettant de savoir si une instruction peut
3812     * être notifiée manuellement selon les différents types
3813     * de notification.
3814     *
3815     * Si l'instruction a une édition non finalisée alors elle n'est pas
3816     * manuellement notifiable.
3817     * Si l'instruction est associé à un événement de notification pour
3818     * lequel un retour signature est recquis, elle n'est notifiable que
3819     * si la date de retour de signature est remplie.
3820     * Par défaut si le type de notification n'est pas connu alors l'instruction
3821     * n'est pas notifiable.
3822     * Pour tous les autres cas l'instruction est manuellement notifiable.
3823     *
3824     * @return boolean true : notifiable | false : non notifiable
3825     */
3826 softime 10808 public function is_notifiable_by_task_manual() {
3827     $ev = $this->get_inst_evenement($this->getVal('evenement'));
3828    
3829     // Si l'instruction a une édition non finalisé quel que soit
3830     // le type de notification, il n'est pas notifiable
3831     if ($this->has_an_edition() === true) {
3832     if ($this->is_unfinalizable_without_bypass() === false) {
3833     return false;
3834     }
3835     }
3836    
3837     // Gestion des différents cas selon la valeur du champs notification
3838 softime 12124 if ($ev->getVal('notification') == 'notification_manuelle' ||
3839     $ev->getVal('notification') == 'notification_manuelle_annexe' ||
3840     $ev->getVal('notification') == 'notification_automatique'
3841     ) {
3842     return true;
3843     } elseif (($ev->getVal('notification') == 'notification_auto_signature_requise' ||
3844     $ev->getVal('notification') == 'notification_manuelle_signature_requise' ||
3845     $ev->getVal('notification') == 'notification_manuelle_annexe_signature_requise') &&
3846     $this->getVal('date_retour_signature') != null &&
3847     $this->getVal('date_retour_signature') != ''
3848     ) {
3849     return true ;
3850 softime 10808 }
3851 softime 12124 return false;
3852 softime 10808 }
3853    
3854 softime 8989 /**
3855 softime 14542 * Crée une instance de notification et une tache notification_instruction de catégorie portal
3856     * pour le demandeur principal.
3857 softime 10808 *
3858     * @return boolean true si le traitement à réussi
3859     */
3860 softime 14542 protected function notifier_demandeur_principal_via_portal() {
3861 softime 10808 $this->begin_treatment(__METHOD__);
3862     $message = '';
3863     // Récupération des informations concernant le demandeur
3864     $dossier = $this->getVal('dossier');
3865 softime 10968 $collectivite_di = $this->get_dossier_instruction_om_collectivite($dossier);
3866 softime 10808 $demandeur = $this->get_demandeurs_notifiable(
3867     $dossier,
3868     true
3869     );
3870     if ($demandeur !== array()) {
3871 softime 10869 $destinataire = array_values($demandeur);
3872 softime 10808 // Ajout de la notif et récupération de son id
3873     $idNotification = $this->ajouter_notification(
3874     $this->getVal($this->clePrimaire),
3875     $this->f->get_connected_user_login_name(),
3876 softime 10968 $destinataire[0],
3877     $collectivite_di,
3878 softime 12433 array(),
3879 softime 10968 true
3880 softime 10808 );
3881     if ($idNotification === false) {
3882     return $this->end_treatment(__METHOD__, false);
3883     }
3884     // Création de la tâche en lui donnant l'id de la notification
3885 softime 14542 $notification_by_task = $this->notification_by_task($idNotification, $dossier, PORTAL);
3886 softime 10808 if ($notification_by_task === false) {
3887     $this->addToMessage(
3888     __("Erreur lors de la génération de la notification au(x) pétitionnaire(s).")
3889     );
3890     return $this->end_treatment(__METHOD__, false);
3891     }
3892     $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.")));
3893     return $this->end_treatment(__METHOD__, true);
3894     }
3895     $this->addToMessage( __("Le demandeur principal n'est pas notifiable."));
3896 softime 12124 return $this->end_treatment(__METHOD__, false);
3897 softime 10808 }
3898    
3899     public function notification_by_task($object_id, $dossier, $category = null, $type = null) {
3900     // Si le type n'est pas correctement spécifié, alors il est calculé
3901 softime 11585 if ($type !== 'notification_recepisse'
3902     && $type !== 'notification_instruction'
3903     && $type !== 'notification_decision'
3904     && $type !== 'notification_service_consulte'
3905 softime 12654 && $type !== 'notification_tiers_consulte'
3906     && $type !== 'notification_depot_demat'
3907     && $type !== 'notification_commune') {
3908 softime 10808 //
3909     $type = 'notification_instruction';
3910     // Vérifie si l'instruction est un récépissé
3911 softime 12654 if ($this->is_instruction_recepisse()) {
3912     $type = 'notification_recepisse';
3913    
3914 softime 10808 }
3915     // Vérifie si l'instruction est une décision
3916     if ($type !== 'notification_recepisse') {
3917     $avis_decision = $this->getVal('avis_decision') !== null ? $this->getVal('avis_decision') : $this->valF['avis_decision'];
3918     if ($avis_decision !== null && $avis_decision !== '') {
3919     $type = 'notification_decision';
3920     }
3921     }
3922     }
3923 softime 14064 // Préparation des valeurs de la tâche
3924 softime 10808 $task_val = array(
3925     'type' => $type,
3926     'object_id' => $object_id,
3927     'dossier' => $dossier,
3928     'category' => $category,
3929     );
3930 softime 14064 // Préparation de la tache de notification
3931     $inst_task = $this->f->get_inst__om_dbform(array(
3932     "obj" => "task",
3933     "idx" => 0,
3934     ));
3935 softime 10808
3936     $add_task = $inst_task->add_task(array('val' => $task_val));
3937     if ($add_task === false) {
3938 softime 13528 $this->addToLog(
3939     sprintf(
3940     '%s(): %s %s : %s',
3941     __METHOD__,
3942     __('Echec de l\'ajout de la tâche de notification.'),
3943     __('Paramétrage de la tâche'),
3944     var_export($task_val, true)
3945     ),
3946     DEBUG_MODE
3947     );
3948 softime 10808 return false;
3949     }
3950    
3951     return true;
3952     }
3953    
3954 softime 10968 /**
3955 softime 12654 * Cette méthode permet de savoir si l'instruction est une instruction
3956     * de recepisse (instruction lié à l'ajout du dossier).
3957     *
3958     * Pour cela, on récupère la liste des actions qui ont menées à la création
3959     * de l'instruction. Si une de ces actions est lié à un objet "demande" on
3960     * en deduis que c'est l'ajout d'une demande qui a déclenché la création de
3961     * l'instruction et donc qu'il s'agit d'un recepisse.
3962     *
3963     * @return boolean
3964     */
3965     protected function is_instruction_recepisse() {
3966     // Récupère la liste des actions qui ont mené à la création de
3967     // l'instruction
3968     $trace = debug_backtrace();
3969     // Parcours la liste des actions et si une de ces actions est lié
3970     // à la classe demande on cosidère que l'instruction est un recepisse
3971     foreach ($trace as $key => $value) {
3972     if (isset($trace[$key]['class']) === true
3973     && empty($trace[$key]['class']) === false) {
3974     if (strtolower($trace[$key]['class']) === 'demande') {
3975     return true;
3976     }
3977     }
3978     }
3979     return false;
3980     }
3981    
3982     /**
3983 softime 10968 * A partir des informations passée en argument ajoute un nouvel élément
3984     * dans la table instruction_notification.
3985     * Avant l'ajout vérifie en utilisant l'id de la collectivité passée en
3986     * paramètre si le paramétrage attendus est ok.
3987     * Ajoute également un nouvel élement dans instruction_notification_document
3988     * si l'instruction possède une lettretype.
3989     * Si un identifiant d'une instruction annexe est donnée ajoute un deuxième
3990     * élement dans la table instruction_notification_document qui correspondra
3991     * à l'annexe de la notification.
3992     *
3993     * @param integer identifiant de l'instruction notifiée
3994     * @param string information concernant l'emetteur
3995     * @param array tableau contenant 2 entrées
3996     * - destinatire : nom, prenom ou raison sociale, dénomination et courriel
3997     * - courriel : adresse mail de la personne à notifier
3998     * @param integer identifiant de la collectivité permettant de récupèrer les
3999     * paramètres à valider
4000     * @param boolean indique si la notification est automatique ou manuelle
4001     * @param integer identifiant d'une instruction dont l'édition sera annexé
4002     * à la notification
4003     *
4004     * @return integer|boolean identifiant de la notification créée si le traitement
4005     * a réussie, false sinon.
4006     */
4007 softime 10869 protected function ajouter_notification(
4008     $idInstruction,
4009     $emetteur,
4010     $destinataire,
4011 softime 10968 $collectiviteId,
4012 softime 12433 $annexes = array(),
4013 softime 10968 $demandeAuto = false,
4014 softime 12124 $statut = 'en cours d\'envoi',
4015 softime 12433 $commentaire = 'Notification en cours de traitement'
4016 softime 10869 ) {
4017 softime 10968 // Vérification que les paramètres nécessaires à l'envoi de la notification existe avant
4018     // de créer la notification
4019     if (! $this->is_parametrage_notification_correct($collectiviteId)) {
4020 softime 13137 $msgErreur = __("Erreur de paramétrage. L'url d'accès au(x) document(s) notifié(s) n'est pas paramétrée.");
4021     $this->addToMessage($msgErreur);
4022 softime 13528 $this->addToLog(
4023     sprintf('%s() : %s', __METHOD__, $msgErreur),
4024     DEBUG_MODE
4025     );
4026 softime 10968 return false;
4027     }
4028 softime 10808 // Préparation de la notification
4029     $inst_notif = $this->f->get_inst__om_dbform(array(
4030     "obj" => "instruction_notification",
4031     "idx" => "]",
4032     ));
4033     $notif_val = array(
4034     'instruction_notification' => null,
4035     'instruction' => $idInstruction,
4036     'automatique' => $demandeAuto,
4037     'emetteur' => $emetteur,
4038     'date_envoi' => null,
4039 softime 10869 'destinataire' => $destinataire['destinataire'],
4040     'courriel' => $destinataire['courriel'],
4041 softime 10808 'date_premier_acces' => null,
4042 softime 12124 'statut' => $statut,
4043     'commentaire' => $commentaire
4044 softime 10808 );
4045    
4046     // Création de la notification
4047     $add_notif = $inst_notif->ajouter($notif_val);
4048     if ($add_notif === false) {
4049 softime 10968 $this->addToMessage(__("Erreur lors de la génération de la notification au(x) pétitionnaire(s)."));
4050 softime 13528 $this->addToLog(
4051     sprintf(
4052     '%s() : %s %s : %s',
4053     __METHOD__,
4054     __("Echec de l'ajout de la notification en base de données."),
4055     __('Paramétrage de la notification'),
4056     var_export($notif_val, true)
4057     ),
4058     DEBUG_MODE
4059     );
4060 softime 10808 return false;
4061     }
4062    
4063 softime 10869 // Si il y a une lettretype finalisé stockage de la clé d'accès au documents
4064     if ($this->evenement_has_an_edition($this->getVal('evenement')) === true) {
4065 softime 12433 $add_notif_doc = $this->ajouter_notification_document(
4066     $inst_notif->getVal($inst_notif->clePrimaire),
4067 softime 10869 $this->getVal($this->clePrimaire),
4068 softime 12433 'instruction'
4069 softime 10808 );
4070     if ($add_notif_doc === false) {
4071 softime 10968 $this->addToMessage(__("Erreur lors de la génération de la notification du document."));
4072 softime 10808 return false;
4073     }
4074 softime 10869 }
4075     // Si une annexe a été choisie stockage de la clé d'accès à l'annexe
4076 softime 12433 if (! empty($annexes) && is_array($annexes)) {
4077     $add_notif_annexe = $this->ajouter_notification_document_multiple(
4078 softime 10869 $inst_notif->getVal($inst_notif->clePrimaire),
4079 softime 12433 $annexes
4080 softime 10869 );
4081     if ($add_notif_annexe === false) {
4082 softime 10968 $this->addToMessage(__("Erreur lors de la génération de la notification de l'annexe."));
4083 softime 10869 return false;
4084     }
4085     }
4086 softime 10808
4087     // Renvoie l'id de la nouvelle instance de instruction_notification
4088     return $inst_notif->getVal($inst_notif->clePrimaire);
4089     }
4090    
4091     /**
4092 softime 11585 * Pour chaque élément du tableau passé en paramètre ajoute une nouvelle
4093     * instance dans la table instruction_notification_document lié a la
4094     * notification dont l'id est passé en paramètre.
4095     *
4096     * @param array tableau contenant les informations nécessaires pour créer les annexes
4097     *
4098     * @return integer|boolean identifiant de la notification créée si le traitement
4099     * a réussie, false sinon.
4100     */
4101     protected function ajouter_notification_document_multiple($idNotification, $listeDocument) {
4102 softime 12433 foreach ($listeDocument as $paramDoc) {
4103     if (! $this->ajouter_notification_document($idNotification, $paramDoc['id'], $paramDoc['tableDocument'], $paramDoc['isAnnexe'])) {
4104 softime 11585 $this->addToMessage(__("Erreur lors de la génération des documents à notifier."));
4105     return false;
4106     }
4107     }
4108     return true;
4109     }
4110    
4111     /**
4112     * Ajoute un élément dans la table instruction_notification_document en utilisant
4113     * les éléments fourni en paramètre
4114     *
4115     * @param integer $idNotification : id de la notification à laquelle on associe le document
4116     * @param integer $idDocument : id de l'objet auquel est rattaché le document
4117     * @param string $tableDocument : nom de la table a laquelle est rattaché le document
4118     * @param boolean $isAnnexe : indique si le document est une annexe ou pas
4119     *
4120     * @return boolean indique si le traitement a réussi
4121     */
4122     protected function ajouter_notification_document($idNotification, $idDocument, $tableDocument, $isAnnexe = false) {
4123     $inst_notif_doc = $this->f->get_inst__om_dbform(array(
4124     "obj" => "instruction_notification_document",
4125     "idx" => "]",
4126     ));
4127     // l'attribut instruction doit obligatoirement être renseigné
4128     // pour éviter toutes confusion avec d'autres instruction l'id
4129     // 0 est donné au document n'appartenant pas aux instructions
4130     $notif_doc_val = array(
4131     'instruction_notification_document' => null,
4132     'instruction_notification' => $idNotification,
4133     'instruction' => $tableDocument == 'instruction' ? $idDocument : 0,
4134     'document_type' => $tableDocument,
4135     'document_id' => $idDocument,
4136     'cle' => $this->getCleAccesDocument(),
4137     'annexe' => $isAnnexe
4138     );
4139    
4140     $add_notif_doc = $inst_notif_doc->ajouter($notif_doc_val);
4141     if ($add_notif_doc === false) {
4142 softime 13528 $this->addToLog(
4143     sprintf(
4144     '%s() : %s %s : %s',
4145     __METHOD__,
4146     __('Echec de l\'ajout du paramétrage du document notifié en base de données.'),
4147     __('Paramétrage du document'),
4148     var_export($notif_doc_val, true)
4149     ),
4150     DEBUG_MODE
4151     );
4152 softime 11585 return false;
4153     }
4154     return true;
4155     }
4156    
4157     /**
4158 softime 10968 * Vérifie si le paramétrage de la notification des demandeurs est correct.
4159     *
4160     * @param integer identifiant de la collectivité
4161     * @return boolean
4162     */
4163     protected function is_parametrage_notification_correct($collectiviteId) {
4164     $categorie = $this->f->get_param_option_notification($collectiviteId);
4165     $urlAccesNotif = $this->f->get_parametre_notification_url_acces($collectiviteId);
4166 softime 14064 if ($categorie === 'mail' && $urlAccesNotif === null) {
4167 softime 10968 return false;
4168     }
4169     return true;
4170     }
4171    
4172     /**
4173 softime 8989 * TRIGGER - triggermodifierapres.
4174     *
4175     * @return boolean
4176     */
4177     function triggermodifierapres($id, &$dnu1 = null, $val = array(), $dnu2 = null) {
4178     $this->addToLog(__METHOD__."(): start", EXTRA_VERBOSE_MODE);
4179 softime 10808 $collectivite_di = $this->get_dossier_instruction_om_collectivite($val['dossier']);
4180     $message = '';
4181 mbroquet 3730
4182 softime 13137 // Définit si le dossier d'instruction doit être mis à jour
4183     $update_dossier = true;
4184     // Les actions de mise à jour des dates ne doivent pas appliquer
4185     // l'action de l'événement et donc ne pas mettre à jour le dossier
4186     if ($this->getParameter("maj") == 125
4187     || $this->getParameter("maj") == 170
4188     || $this->getParameter("maj") == 175) {
4189     $update_dossier = false;
4190     }
4191    
4192     // Traitement en cas de mise à jour du dossier
4193     if ($update_dossier === true) {
4194     /**
4195     * L'objectif ici est d'effectuer les recalculs de date dans le dossier
4196     * si la date de l'evenement est modifiee
4197     */
4198     // Initialisation
4199     $valF = array();
4200     $valF_dt = array();
4201     // Initialisation du type d'événement
4202     $type_evmt = "";
4203     // Récupération de l'action correspondante à l'événement
4204 softime 14064 $evenement = $this->f->get_inst__om_dbform(array(
4205     "obj" => "evenement",
4206     "idx" => $this->valF['evenement']
4207     ));
4208 softime 13137
4209     // Récupération des paramètres de l'action
4210 softime 14542 // TODO : remplacer cette requête par l'instanciation de l'action
4211     $qres = $this->f->get_all_results_from_db_query(
4212     sprintf(
4213     'SELECT
4214     *
4215     FROM
4216     %1$saction
4217     WHERE
4218     action = \'%2$s\'',
4219     DB_PREFIXE,
4220     $this->f->db->escapeSimple($evenement->getVal('action'))
4221     ),
4222     array(
4223     "origin" => __METHOD__
4224     )
4225 softime 14064 );
4226 softime 14542 foreach ($qres['result'] as $row) {
4227 softime 13137 // application des regles sur le courrier + delai
4228     if(preg_match("/date_evenement/",$row['regle_date_limite'])){
4229     $valF['date_limite']= $this->regle($row['regle_date_limite'], 'regle_date_limite');
4230     }
4231     if(preg_match("/date_evenement/",$row['regle_date_complet'])){
4232     $valF['date_complet']= $this->regle($row['regle_date_complet'], 'regle_date_complet');
4233     }
4234     if(preg_match("/date_evenement/",$row['regle_date_dernier_depot'])){
4235     $valF['date_dernier_depot']= $this->regle($row['regle_date_dernier_depot'], 'regle_date_dernier_depot');
4236     }
4237     if(preg_match("/date_evenement/",$row['regle_date_notification_delai'])){
4238     $valF['date_notification_delai']= $this->regle($row['regle_date_notification_delai'], 'regle_date_notification_delai');
4239     }
4240     if(preg_match("/date_evenement/",$row['regle_date_decision'])){
4241     $valF['date_decision']= $this->regle($row['regle_date_decision'], 'regle_date_decision');
4242     }
4243     if(preg_match("/date_evenement/",$row['regle_date_rejet'])){
4244     $valF['date_rejet']= $this->regle($row['regle_date_rejet'], 'regle_date_rejet');
4245     }
4246     if(preg_match("/date_evenement/",$row['regle_date_validite'])){
4247     $valF['date_validite']= $this->regle($row['regle_date_validite'], 'regle_date_validite');
4248     }
4249     if(preg_match("/date_evenement/",$row['regle_date_chantier'])){
4250     $valF['date_chantier']= $this->regle($row['regle_date_chantier'], 'regle_date_chantier');
4251     }
4252     if(preg_match("/date_evenement/",$row['regle_date_achevement'])){
4253     $valF['date_achevement']= $this->regle($row['regle_date_achevement'], 'regle_date_achevement');
4254     }
4255     if(preg_match("/date_evenement/",$row['regle_date_conformite'])){
4256     $valF['date_conformite']= $this->regle($row['regle_date_conformite'], 'regle_date_conformite');
4257     }
4258     if(preg_match("/date_evenement/",$row['regle_date_cloture_instruction'])){
4259     $valF['date_cloture_instruction']= $this->regle($row['regle_date_cloture_instruction'], 'regle_date_cloture_instruction');
4260     }
4261     if(preg_match("/date_evenement/",$row['regle_date_premiere_visite'])){
4262     $valF['date_premiere_visite']= $this->regle($row['regle_date_premiere_visite'], 'regle_date_premiere_visite');
4263     }
4264     if(preg_match("/date_evenement/",$row['regle_date_derniere_visite'])){
4265     $valF['date_derniere_visite']= $this->regle($row['regle_date_derniere_visite'], 'regle_date_derniere_visite');
4266     }
4267     if(preg_match("/date_evenement/",$row['regle_date_contradictoire'])){
4268     $valF['date_contradictoire']= $this->regle($row['regle_date_contradictoire'], 'regle_date_contradictoire');
4269     }
4270     if(preg_match("/date_evenement/",$row['regle_date_retour_contradictoire'])){
4271     $valF['date_retour_contradictoire']= $this->regle($row['regle_date_retour_contradictoire'], 'regle_date_retour_contradictoire');
4272     }
4273     if(preg_match("/date_evenement/",$row['regle_date_ait'])){
4274     $valF['date_ait']= $this->regle($row['regle_date_ait'], 'regle_date_ait');
4275     }
4276     if(preg_match("/date_evenement/",$row['regle_date_transmission_parquet'])){
4277     $valF['date_transmission_parquet']= $this->regle($row['regle_date_transmission_parquet'], 'regle_date_transmission_parquet');
4278     }
4279     if ($row['regle_donnees_techniques1'] !== '') {
4280     $valF_dt[$row['cible_regle_donnees_techniques1']] = $this->regle($row['regle_donnees_techniques1'], 'regle_donnees_techniques1');
4281     }
4282     if ($row['regle_donnees_techniques2'] !== '') {
4283     $valF_dt[$row['cible_regle_donnees_techniques2']] = $this->regle($row['regle_donnees_techniques2'], 'regle_donnees_techniques2');
4284     }
4285     if ($row['regle_donnees_techniques3'] !== '') {
4286     $valF_dt[$row['cible_regle_donnees_techniques3']] = $this->regle($row['regle_donnees_techniques3'], 'regle_donnees_techniques3');
4287     }
4288     if ($row['regle_donnees_techniques4'] !== '') {
4289     $valF_dt[$row['cible_regle_donnees_techniques4']] = $this->regle($row['regle_donnees_techniques4'], 'regle_donnees_techniques4');
4290     }
4291     if ($row['regle_donnees_techniques5'] !== '') {
4292     $valF_dt[$row['cible_regle_donnees_techniques5']] = $this->regle($row['regle_donnees_techniques5'], 'regle_donnees_techniques5');
4293     }
4294     if ($row['regle_dossier_instruction_type'] !== '') {
4295     $valF['dossier_instruction_type'] = $this->regle($row['regle_dossier_instruction_type'], 'regle_dossier_instruction_type');
4296     }
4297 mbroquet 3730 }
4298 softime 13137 // Si des valeurs de données techniques ont été calculées alors on met à jour l'enregistrement
4299     if (count($valF_dt) > 0) {
4300     $dt_id = $this->getDonneesTechniques();
4301     // On met à jour le dossier
4302     $cle = " donnees_techniques='".$dt_id."'";
4303     $res1 = $this->f->db->autoExecute(DB_PREFIXE.'donnees_techniques', $valF_dt, DB_AUTOQUERY_UPDATE, $cle);
4304     $this->addToLog(
4305     __METHOD__."(): db->autoexecute(\"".DB_PREFIXE."donnees_techniques\", ".print_r($valF_dt, true).", DB_AUTOQUERY_UPDATE, \"".$cle."\");",
4306     VERBOSE_MODE
4307     );
4308     $this->f->isDatabaseError($res1);
4309     // Affichage d'informations à l'utilisateur
4310     $this->addToMessage(_('enregistrement')." ".$this->valF['dossier']." "._('table')." dossier [".$this->f->db->affectedRows()." "._('enregistrement')." "._('mis_a_jour')."]");
4311 mbroquet 3730 }
4312 softime 13137 // Si des valeurs ont été calculées alors on met à jour l'enregistrement
4313     if (count($valF) > 0) {
4314     $inst_dossier = $this->f->get_inst__om_dbform(array(
4315     "obj" => "dossier",
4316     "idx" => $this->valF['dossier'],
4317     ));
4318     $valF['instruction'] = $id;
4319     $valF['crud'] = 'update';
4320     $update_by_instruction = $inst_dossier->update_by_instruction($valF);
4321     if ($update_by_instruction === false) {
4322     $this->cleanMessage();
4323     $this->addToMessage(sprintf('%s %s', __("Une erreur s'est produite lors de la mise à jour du dossier d'instruction."), __("Veuillez contacter votre administrateur.")));
4324     return false;
4325     }
4326     // Affichage d'informations à l'utilisateur
4327     $this->addToMessage(_('enregistrement')." ".$this->valF['dossier']." "._('table')." dossier [".$this->f->db->affectedRows()." "._('enregistrement')." "._('mis_a_jour')."]");
4328 mbroquet 3730 }
4329     }
4330    
4331 softime 14064 // Par défaut les instructions à ajouter suite à la saisie d'une date
4332     // de retour signature ou de notification, utilisent l'action 0
4333     // Si la création d'événement d'instruction suivant est déclenchée par
4334     // une notification suite au traitement d'une tâche (démat') alors l'ajout
4335     // de la nouvelle instruction se fait avec l'action 176
4336     // Cela permet de ne pas contrôler la restriction lors de l'ajout de la
4337     // nouvelle instruction, depuis la méthode verifier()
4338     $code_action_add = 0;
4339     if ($this->getParameter("maj") == 175) {
4340     $code_action_add = 176;
4341     }
4342 mbroquet 3730 $restriction = $this->get_restriction($val['evenement']);
4343     $this->restriction_valid = $this->restrictionIsValid($restriction);
4344    
4345     if($restriction == "" || $this->restriction_valid ){
4346     // Récupération de tous les paramètres de l'événement sélectionné
4347 softime 14542 // TODO : remplacer cette requête par l'instanciation de l'evenement
4348     $qres = $this->f->get_all_results_from_db_query(
4349     sprintf(
4350     'SELECT
4351     *
4352     FROM
4353     %1$sevenement
4354     WHERE
4355     evenement = %2$d',
4356     DB_PREFIXE,
4357     intval($this->valF['evenement'])
4358     ),
4359     array(
4360     "origin" => __METHOD__
4361     )
4362     );
4363 nmeucci 3965 $current_id = $this->getVal($this->clePrimaire);
4364 softime 14542 foreach ($qres['result'] as $row) {
4365 mbroquet 3730 // Si la date de retour signature est éditée on vérifie si il existe un événement automatique
4366     if ($this->getVal('date_retour_signature') == "" AND
4367     $this->valF['date_retour_signature'] != "" AND
4368     $row['evenement_retour_signature'] != "") {
4369 softime 7996 $new_instruction = $this->f->get_inst__om_dbform(array(
4370     "obj" => "instruction",
4371     "idx" => "]",
4372     ));
4373 mbroquet 3730 // Création d'un tableau avec la liste des champs de l'instruction
4374     foreach($new_instruction->champs as $champ) {
4375     $valNewInstr[$champ] = "";
4376     }
4377     // Définition des valeurs de la nouvelle instruction
4378     $valNewInstr["evenement"] = $row['evenement_retour_signature'];
4379     $valNewInstr["destinataire"] = $this->valF['destinataire'];
4380     $valNewInstr["dossier"] = $this->valF['dossier'];
4381     $valNewInstr["date_evenement"] = $this->f->formatDate($this->valF['date_retour_signature']);
4382     $valNewInstr["date_envoi_signature"] = $this->f->formatDate($this->valF['date_envoi_signature']);
4383     $valNewInstr["date_retour_signature"] = $this->f->formatDate($this->valF['date_retour_signature']);
4384     $valNewInstr["date_envoi_rar"] = $this->f->formatDate($this->valF['date_envoi_rar']);
4385     $valNewInstr["date_retour_rar"] = $this->f->formatDate($this->valF['date_retour_rar']);
4386     $valNewInstr["date_envoi_controle_legalite"] = $this->f->formatDate($this->valF['date_envoi_controle_legalite']);
4387     $valNewInstr["date_retour_controle_legalite"] = $this->f->formatDate($this->valF['date_retour_controle_legalite']);
4388 softime 14064 $new_instruction->setParameter("maj", $code_action_add);
4389     $new_instruction->class_actions[$code_action_add]["identifier"] =
4390 softime 13528 sprintf(
4391     __("Ajout suite au retour signature de l'instruction %s"),
4392     $current_id
4393     );
4394 softime 8989 $retour = $new_instruction->ajouter($valNewInstr);
4395 mbroquet 3730
4396     //Si une erreur s'est produite et qu'il s'agit d'un problème
4397     //de restriction
4398     if ($retour == false && !$new_instruction->restriction_valid){
4399     $error_message = $this->get_restriction_error_message($restriction);
4400     $this->f->displayMessage("error", $error_message);
4401 softime 8989 $this->addToLog(__METHOD__."(): evenement retour ".
4402 mbroquet 3730 "instruction ".$this->valF[$this->clePrimaire]." : ".
4403     $new_instruction->msg);
4404     }
4405     //Si une erreur s'est produite après le test de la restriction
4406     elseif ($retour == false && $new_instruction->restriction_valid){
4407     $this->correct = false ;
4408     $this->msg .= $new_instruction->msg;
4409     return false;
4410     }
4411     }
4412     // Si la date de retour AR est éditée on vérifie si il existe un événement automatique
4413     if ($this->getVal('date_retour_rar') == "" AND
4414     $this->valF['date_retour_rar'] != "") {
4415    
4416     if($row['evenement_retour_ar'] != "") {
4417 softime 7996 $new_instruction = $this->f->get_inst__om_dbform(array(
4418     "obj" => "instruction",
4419     "idx" => "]",
4420     ));
4421 mbroquet 3730 // Création d'un tableau avec la liste des champs de l'instruction
4422     foreach($new_instruction->champs as $champ) {
4423     $valNewInstr[$champ] = "";
4424     }
4425     // Définition des valeurs de la nouvelle instruction
4426     $valNewInstr["evenement"] = $row['evenement_retour_ar'];
4427     $valNewInstr["destinataire"] = $this->valF['destinataire'];
4428     $valNewInstr["dossier"] = $this->valF['dossier'];
4429     $valNewInstr["date_evenement"] = $this->f->formatDate($this->valF['date_retour_rar']);
4430     $valNewInstr["date_envoi_signature"] = $this->f->formatDate($this->valF['date_envoi_signature']);
4431     $valNewInstr["date_retour_signature"] = $this->f->formatDate($this->valF['date_retour_signature']);
4432     $valNewInstr["date_envoi_rar"] = $this->f->formatDate($this->valF['date_envoi_rar']);
4433     $valNewInstr["date_retour_rar"] = $this->f->formatDate($this->valF['date_retour_rar']);
4434     $valNewInstr["date_envoi_controle_legalite"] = $this->f->formatDate($this->valF['date_envoi_controle_legalite']);
4435     $valNewInstr["date_retour_controle_legalite"] = $this->f->formatDate($this->valF['date_retour_controle_legalite']);
4436 softime 14064 $new_instruction->setParameter("maj", $code_action_add);
4437     $new_instruction->class_actions[$code_action_add]["identifier"] =
4438 softime 13137 sprintf(__("Ajout suite à la notification de l'instruction %s"), $current_id);
4439 softime 8989 $retour = $new_instruction->ajouter($valNewInstr);
4440 mbroquet 3730
4441     //Si une erreur s'est produite et qu'il s'agit d'un problème
4442     //de restriction
4443     if ($retour == false && !$new_instruction->restriction_valid) {
4444     $error_message = $this->get_restriction_error_message($restriction);
4445     $this->f->displayMessage("error", $error_message);
4446     $this->addToLog(
4447 softime 8989 __METHOD__."(): evenement retour instruction ".
4448 mbroquet 3730 $this->valF[$this->clePrimaire]." : ".
4449     $new_instruction->msg
4450     );
4451     }
4452     //Si une erreur s'est produite après le test de la restriction
4453     elseif ($retour == false && $new_instruction->restriction_valid){
4454     $this->correct = false ;
4455     $this->msg .= $new_instruction->msg;
4456     return false;
4457     }
4458     }
4459     }
4460     }
4461     }
4462    
4463 softime 13137 // Traitement en cas de mise à jour du dossier
4464     if ($update_dossier === true) {
4465     /**
4466     * Mise à jour de la date de dernière modification du dossier
4467     * d'instruction
4468     */
4469     $inst_di = $this->get_inst_dossier($this->getVal('dossier'));
4470     $inst_di->update_last_modification_date();
4471 softime 8640
4472 softime 13137 // Mise à jour des données du dossier d'autorisation
4473     $da = $this->f->get_inst__om_dbform(array(
4474     "obj" => "dossier_autorisation",
4475     "idx" => $this->getNumDemandeAutorFromDossier($this->valF['dossier']),
4476     ));
4477     $params = array(
4478     'di_id' => $this->getVal('dossier'),
4479     );
4480     if($da->majDossierAutorisation($params) === false) {
4481     $this->addToMessage(_("Erreur lors de la mise a jour des donnees du dossier d'autorisation. Contactez votre administrateur."));
4482     $this->correct = false;
4483     return false;
4484     }
4485 mbroquet 3730 }
4486 softime 7996
4487 softime 10573 // mise à jour des métadonnées issues des dates de suivi
4488     $dateRetourSignatureModified = ($this->valF['date_retour_signature'] != $this->getVal('date_retour_signature'));
4489     $dateRetourRARModified = ($this->valF['date_retour_rar'] != $this->getVal('date_retour_rar'));
4490     if ($dateRetourSignatureModified || $dateRetourRARModified) {
4491    
4492     // Calculs des nouvelles métadonnées
4493     $metadata = $this->getMetadata("om_fichier_instruction");
4494    
4495     // On vérifie si l'instruction à finaliser a un événement de type arrete
4496 softime 14064 // TODO : A voir pour remplacer par une instanciation de l'événement.
4497     // Voir également si l'événement ne dois pas être instancié en début de
4498     // méthode pour pouvoir être réutilisé.
4499     $qres = $this->f->get_one_result_from_db_query(
4500     sprintf(
4501     'SELECT
4502     type
4503     FROM
4504     %1$sevenement
4505     WHERE
4506     evenement = \'%2$d\'',
4507     DB_PREFIXE,
4508     intval($this->getVal("evenement"))
4509     ),
4510     array(
4511     "origin" => __METHOD__,
4512     "force_return" => true,
4513     )
4514     );
4515    
4516     if ($qres["code"] !== "OK") {
4517 softime 10573 $this->correct = false;
4518     $this->addToMessage(__("Erreur de traitement de fichier."));
4519 softime 14064 $this->addToLog(__METHOD__."() erreur BDD: ".var_export($qres['message'], true), DEBUG_MODE);
4520 softime 10573 return false;
4521     }
4522    
4523     // Si l'événement est de type arrete, on ajoute les métadonnées spécifiques
4524 softime 14064 if ($qres['result'] == 'arrete'){
4525 softime 10573 $metadata = array_merge($metadata, $this->getMetadata("arrete"));
4526     }
4527    
4528     // Filtre pour conserver uniquement les métadonnées liées aux dates
4529     $metadataToKeep = array(
4530     "statutAutorisation",
4531     "dateEvenementDocument",
4532     'date_cloture_metier',
4533     "NotificationArrete",
4534     "dateNotificationArrete",
4535     "controleLegalite",
4536     "dateSignature",
4537     "nomSignataire",
4538     "qualiteSignataire",
4539     "dateControleLegalite",
4540     );
4541     $metadata = array_filter(
4542     $metadata,
4543     function($key) use ($metadataToKeep) { return in_array($key, $metadataToKeep); },
4544     ARRAY_FILTER_USE_KEY
4545     );
4546    
4547     // Mise à jour des métadonnées du document en GED
4548     $docUid = $this->getVal("om_fichier_instruction");
4549     $operationOrUID = $this->f->storage->update_metadata($docUid, $metadata);
4550     if ($operationOrUID == 'OP_FAILURE') {
4551     $this->correct = false;
4552     $this->addToMessage(__("Erreur de traitement de fichier."));
4553     $this->addToLog(__METHOD__."() failed to update metadata: ".var_export($operationOrUID, true), DEBUG_MODE);
4554     return false;
4555     }
4556    
4557     // mise à jour de l'UID du document en BDD
4558     else {
4559     $valF = array('om_fichier_instruction' => $operationOrUID);
4560     $res = $this->f->db->autoExecute(DB_PREFIXE.$this->table, $valF, DB_AUTOQUERY_UPDATE, $this->getCle($id));
4561     $this->addToLog(__METHOD__.'() : db->autoExecute("'.DB_PREFIXE.$this->table.'", '.print_r($valF, true).', DB_AUTOQUERY_UPDATE, "'.$this->getCle($id).'")', VERBOSE_MODE);
4562     if ($this->f->isDatabaseError($res, true) === true) {
4563     $this->correct = false;
4564     $this->addToMessage(__("Erreur de traitement de fichier."));
4565     $this->addToLog(__METHOD__."() erreur BDD: ".var_export($res->getMessage(), true), DEBUG_MODE);
4566     return false;
4567     }
4568     $this->addToMessage(__("La mise a jour du document s'est effectuee avec succes."));
4569     }
4570     }
4571    
4572 softime 13137 // Déclenchement des notifications automatique après finalisation et
4573     // retour de signature
4574 softime 10808 if ($dateRetourSignatureModified === true
4575     && $this->valF['date_retour_signature'] !== ''
4576     && $this->valF['date_retour_signature'] !== null) {
4577 softime 13137
4578     // Message à afficher dans les logs pour indiquer quelle notification a échouée
4579 softime 13528 $msgLog = sprintf(
4580     '%s %s : %d',
4581     __('Erreur lors de la notification automatique du(des) pétitionnaire(s) après retour signature.'),
4582     __('Instruction notifiée'),
4583     $id
4584     );
4585 softime 13137
4586     // Récupération de l'instance de l'événement pour accéder au paramètrage
4587     // des notifications
4588 softime 10808 $ev = $this->get_inst_evenement($this->valF['evenement']);
4589 softime 13137 // Si la notification automatique des tiers consulté est active
4590     // déclenche le traitement de notification.
4591     // Ce traitement va envoyer des courriels de notification à tous les tiers concernés
4592     $typeNotifTiers = $ev->getVal('notification_tiers');
4593     $inst_di = $this->get_inst_dossier($this->getVal('dossier'));
4594     if ($typeNotifTiers === 'notification_automatique') {
4595     if ($this->traitement_notification_automatique_tiers_consulte($ev, $inst_di) === false) {
4596     $this->addToMessage(__('Le traitement de la notification automatique de tiers à échoué.'));
4597     $this->correct = false;
4598     }
4599     }
4600    
4601 softime 10808 if ($ev->getVal('notification') === 'notification_auto_signature_requise') {
4602     // Récupération de la liste des demandeurs à notifier et de la catégorie
4603     $categorie = $this->f->get_param_option_notification($collectivite_di);
4604 softime 14064 $isPortal = $categorie === PORTAL;
4605 softime 10869 $demandeursANotifie = $this->get_demandeurs_notifiable(
4606     $this->valF['dossier'],
4607     $isPortal
4608     );
4609 softime 10808
4610     // Création d'une notification et d'une tâche pour chaque demandeur à notifier
4611 softime 12124 $demandeurPrincipalNotifie = false;
4612 softime 10808 foreach ($demandeursANotifie as $demandeur) {
4613 softime 12124 // Identifie si le demandeur principal a été notifié ou pas
4614     // et récupère ses informations
4615     if ($demandeur['petitionnaire_principal'] == 't') {
4616     $demandeurPrincipalNotifie = true;
4617     // Si le demandeur principal est notifiable mais qu'il y a des erreurs dans
4618     // son paramétrage, on effectue pas le traitement et on passe à l'itération
4619     // suivante. On le considère également comme non notifié pour gérer l'envoie
4620     // des messages d'erreurs
4621     // Si la demande a été déposée via le portail alors le paramétrage n'a pas
4622     // d'impact sur la notification
4623     $erreursParam = $this->get_info_notification_fail();
4624     if (! $this->dossier_depose_sur_portail() && $erreursParam != array()) {
4625     $demandeurPrincipalNotifie = false;
4626     continue;
4627     }
4628     }
4629 softime 10808 // Ajout de la notif et récupération de son id
4630     $idNotif = $this->ajouter_notification(
4631     $this->valF[$this->clePrimaire],
4632     $this->f->get_connected_user_login_name(),
4633 softime 10968 $demandeur,
4634     $collectivite_di,
4635 softime 12433 array(),
4636 softime 10968 true
4637 softime 10808 );
4638     if ($idNotif === false) {
4639 softime 13528 $this->addToLog(
4640     sprintf('%s() : %s',__METHOD__, $msgLog),
4641     DEBUG_MODE
4642     );
4643 softime 10808 return false;
4644     }
4645     // Création de la tache en lui donnant l'id de la notification
4646     $notification_by_task = $this->notification_by_task(
4647     $idNotif,
4648     $this->valF['dossier'],
4649     $categorie
4650     );
4651     if ($notification_by_task === false) {
4652 softime 13528 $this->addToLog(
4653     sprintf('%s() : %s',__METHOD__, $msgLog),
4654     DEBUG_MODE
4655     );
4656 softime 10808 $this->addToMessage(
4657     __("Erreur lors de la génération de la notification au(x) pétitionnaire(s).")
4658     );
4659     return false;
4660     }
4661     }
4662 softime 12847 // Pour la notification par mail ou la notification via portal si le dossier a
4663     // été déposés via portal, si le demandeur principal n'est pas notifiable,
4664     // on créé une nouvelle notification en erreur avec en commentaire la raison pour
4665     // laquelle le demandeur principal n'a pas pu être notifié
4666     $depotPortal = $this->dossier_depose_sur_portail();
4667     if (! $demandeurPrincipalNotifie && ($isPortal === false || $depotPortal === true)) {
4668 softime 13137 // Précise dans les logs que le pétitionnaire principal n'a pas été notifié
4669 softime 13528 $msgLog .= sprintf(' %s', __('Le pétitionnaire principale n\'est pas notifiable.'));
4670 softime 12124 // Analyse pour savoir pourquoi le demandeur principal n'est pas notifiable
4671     $erreursParam = $this->get_info_notification_fail();
4672     $demandeurPrincipal = $this->get_info_petitionnaire_principal_dossier($this->getVal('dossier'));
4673     // Ajout de la notif et récupération de son id
4674     $idNotif = $this->ajouter_notification(
4675     $this->valF[$this->clePrimaire],
4676     $this->f->get_connected_user_login_name(),
4677     $demandeurPrincipal,
4678     $collectivite_di,
4679 softime 12433 array(),
4680 softime 12124 true,
4681     'Echec',
4682     implode(' ', $erreursParam)
4683     );
4684     if ($idNotif === false) {
4685 softime 13528 $this->addToLog(
4686     sprintf('%s() : %s', __METHOD__, $msgLog),
4687     DEBUG_MODE
4688     );
4689 softime 12124 $this->addToMessage(
4690     __('Erreur : la création de la notification a échouée.').
4691     __("Veuillez contacter votre administrateur.")
4692     );
4693     return false;
4694     }
4695     // Prépare un message d'alerte à destination de l'instructeur pour l'informer
4696     // de l'échec de la notification
4697     $dossier_message = $this->get_inst_dossier_message(0);
4698     $dossier_message_val = array(
4699     'dossier' => $this->getVal('dossier'),
4700     'type' => _('erreur expedition'),
4701     'emetteur' => $this->f->get_connected_user_login_name(),
4702     'login' => $_SESSION['login'],
4703     'date_emission' => date('Y-m-d H:i:s'),
4704     'contenu' => _('Échec lors de la notification de l\'instruction ').
4705     $ev->getVal('libelle').
4706     '.<br>'.
4707     implode("\n", $erreursParam).
4708     '<br>'.
4709     _('Veuillez corriger ces informations avant de renvoyer la notification.')
4710     );
4711     $add = $dossier_message->add_notification_message($dossier_message_val, true);
4712     // Si une erreur se produit pendant l'ajout
4713     if ($add !== true) {
4714 softime 13528 $this->addToLog(
4715     sprintf(
4716     '%s() : %s',
4717     __METHOD__,
4718     __("Le message d'alerte concernant l'echec de l'envoi de la notification n'a pas pu être envoyé.")
4719     ),
4720     DEBUG_MODE
4721     );
4722 softime 12124 return false;
4723     }
4724     }
4725 softime 10808 $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.")));
4726     }
4727     }
4728    
4729 nmeucci 3933 return $this->add_log_to_dossier($id, $val);
4730 fmichon 4708 }
4731 mbroquet 3730
4732 softime 8989 /**
4733     * TRIGGER - triggersupprimer.
4734     *
4735     * @return boolean
4736     */
4737     function triggersupprimer($id, &$dnu1 = null, $val = array(), $dnu2 = null) {
4738     $this->addToLog(__METHOD__."(): start", EXTRA_VERBOSE_MODE);
4739 mbroquet 3730 /**
4740     * L'objectif ici est de repositionner les valeurs récupérées en
4741     * archive dans le dossier d'instruction avant de supprimer l'événement
4742 softime 10573 * d'instruction si les valeurs du dossier sont différentes
4743 mbroquet 3730 */
4744 softime 10573 $valF = array();
4745     $inst_di = $this->get_inst_dossier($this->getVal('dossier'));
4746     foreach ($inst_di->champs as $key => $champ) {
4747     // Si le champ du DI à une archive dans l'instruction
4748     if (isset($val[sprintf('archive_%s', $champ)]) === true) {
4749     // Si la valeur entre le champ du DI et son archive dans instruction
4750     // est différente
4751     if ($inst_di->getVal($champ) !== $val[sprintf('archive_%s', $champ)]) {
4752     $val[sprintf('archive_%s', $champ)] === '' ? $valF[$champ] = null : $valF[$champ] = $val[sprintf('archive_%s', $champ)];
4753     }
4754     }
4755 softime 5024 }
4756 softime 10573 // Spécificité du champ avis_decision dont le champ archive est nommé
4757     // différemment
4758     if ($inst_di->getVal('avis_decision') !== $val['archive_avis']) {
4759     $val['archive_avis'] === '' ? $valF['avis_decision'] = null : $valF['avis_decision'] = $val['archive_avis'];
4760 softime 5024 }
4761 softime 10573 // Spécificité de la date d'affichage dont la valeur n'ai jamais modifiée
4762     // par l'archive
4763     unset($valF['date_affichage']);
4764 softime 6565
4765 softime 9245 /**
4766     * Mise à jour de la version de clôture *version_clos* du dossier si et
4767     * seulement si l'instruction met à jour l'état du dossier.
4768     */
4769 softime 10573 if (isset($valF['etat']) === true
4770     && $valF['etat'] !== null
4771 softime 9245 && $valF['etat'] !== '') {
4772 softime 10573 // Récupère l'état actuel du dossier d'instruction
4773     $inst_current_etat = $this->f->get_inst__om_dbform(array(
4774     "obj" => "etat",
4775     "idx" => $inst_di->get_id_etat(),
4776     ));
4777 softime 9245 // Instanciation de l'état archivé appliqué sur le dossier
4778     $inst_etat = $this->f->get_inst__om_dbform(array(
4779     "obj" => "etat",
4780     "idx" => $valF['etat'],
4781     ));
4782     //
4783     $update_version_clos = null;
4784     // En cas de clôture du dossier par l'état archivé
4785     if ($inst_etat->getVal('statut') === 'cloture') {
4786     $update_version_clos = $inst_di->update_version_clos('up');
4787     }
4788     // En cas de réouverture du dossier par l'état archivé
4789     if ($inst_current_etat->getVal('statut') === 'cloture'
4790     && $inst_etat->getVal('statut') !== 'cloture') {
4791     //
4792     $update_version_clos = $inst_di->update_version_clos('down');
4793     //
4794     $this->set_att_di_reopened(true);
4795     }
4796     //
4797     if ($update_version_clos === false) {
4798     $this->f->addToLog(sprintf(
4799     "%s() : ERREUR - %s %s",
4800     __METHOD__,
4801     sprintf(
4802     __("Impossible de mettre à jour la version de clôture du dossier d'instruction %s."),
4803     $inst_di->getVal($inst_di->clePrimaire)
4804     ),
4805     sprintf(
4806     __("L'instruction tente d'appliquer l'état %s."),
4807     $inst_etat->getVal($inst_etat->clePrimaire)
4808     )
4809     ));
4810     $this->addToMessage(sprintf(
4811     "%s %s",
4812     __("Erreur lors de la mise à jour de la version de clôture du dossier d'instruction."),
4813     __("Veuillez contacter votre administrateur.")
4814     ));
4815     return false;
4816     }
4817     }
4818 softime 10808 // On supprime toutes les notications liées à l'instruction
4819 softime 12654 $notifASupprimer = $this->get_instruction_notification(
4820     $this->getVal($this->clePrimaire),
4821     array(
4822     'notification_recepisse',
4823     'notification_instruction',
4824     'notification_decision',
4825     'notification_service_consulte',
4826     'notification_tiers_consulte',
4827 softime 13137 'notification_depot_demat',
4828     'notification_commune'
4829 softime 12654 ),
4830     true
4831     );
4832    
4833 softime 10808 foreach ($notifASupprimer as $idNotif) {
4834     $inst_notif = $this->f->get_inst__om_dbform(array(
4835     "obj" => "instruction_notification",
4836     "idx" => $idNotif,
4837     ));
4838     $val_notif = array();
4839     foreach ($inst_notif->champs as $champ) {
4840     $val_notif[$champ] = $inst_notif->getVal($champ);
4841     }
4842     // La suppression des notifications entrainera la suppression des tâches qui y sont
4843     // liées
4844     $supprNotif = $inst_notif->supprimer($val_notif);
4845     if ($supprNotif == false) {
4846     $this->addToMessage(sprintf(
4847     "%s %s",
4848     __("Erreur lors de la suppression des notifications de l'instruction."),
4849     __("Veuillez contacter votre administrateur.")
4850     ));
4851     return false;
4852     }
4853     }
4854 softime 9245
4855 softime 10573 // On met à jour le dossier
4856     $valF['instruction'] = $id;
4857 softime 10968 $valF['crud'] = 'delete';
4858 softime 10573 $update_by_instruction = $inst_di->update_by_instruction($valF);
4859     if ($update_by_instruction === false) {
4860     $this->cleanMessage();
4861     $this->addToMessage(sprintf('%s %s', __("Une erreur s'est produite lors de la mise à jour du dossier d'instruction."), __("Veuillez contacter votre administrateur.")));
4862     return false;
4863     }
4864    
4865 softime 5024 // Affichage d'informations à l'utilisateur
4866 softime 8989 $this->addToMessage(_("Suppression de l'instruction")." [".$this->f->db->affectedRows()." "._('enregistrement')." "._('mis_a_jour')."]");
4867 softime 5024
4868     // Mise à jour de la demande si un récépissé d'instruction correspond à l'instruction à supprimer
4869 mbroquet 3730 }
4870    
4871 softime 8989 /**
4872     * TRIGGER - triggersupprimerapres.
4873     *
4874     * @return boolean
4875     */
4876     function triggersupprimerapres($id, &$dnu1 = null, $val = array(), $dnu2 = null) {
4877     $this->addToLog(__METHOD__."(): start", EXTRA_VERBOSE_MODE);
4878 softime 8640 /**
4879     * Mise à jour de la date de dernière modification du dossier
4880     * d'instruction
4881     */
4882     $inst_di = $this->get_inst_dossier($this->getVal('dossier'));
4883     $inst_di->update_last_modification_date();
4884    
4885     /**
4886     * Mise à jour des données du dossier d'autorisation
4887     */
4888 softime 7996 $da = $this->f->get_inst__om_dbform(array(
4889     "obj" => "dossier_autorisation",
4890     "idx" => $this->getNumDemandeAutorFromDossier($val["dossier"]),
4891     ));
4892 softime 8640 $params = array(
4893     'di_id' => $this->getVal('dossier'),
4894 softime 9245 'di_reopened' => $this->get_att_di_reopened(),
4895 softime 8640 );
4896     if($da->majDossierAutorisation($params) === false) {
4897 mbroquet 3730 $this->addToMessage(_("Erreur lors de la mise a jour des donnees du dossier d'autorisation. Contactez votre administrateur."));
4898     $this->correct = false;
4899     return false;
4900     }
4901 softime 7996
4902 softime 10573 /**
4903     * Gestion des tâches pour la dématérialisation
4904     */
4905     $inst_task_empty = $this->f->get_inst__om_dbform(array(
4906     "obj" => "task",
4907     "idx" => 0,
4908     ));
4909     foreach ($inst_di->task_types as $task_type) {
4910     $task_exists = $inst_task_empty->task_exists($task_type, $id);
4911     if ($task_exists !== false) {
4912     $inst_task = $this->f->get_inst__om_dbform(array(
4913     "obj" => "task",
4914     "idx" => $task_exists,
4915     ));
4916     if ($inst_task->getVal('state') === $inst_task::STATUS_NEW || $inst_task->getVal('state') === $inst_task::STATUS_DRAFT) {
4917     $task_val = array(
4918     'state' => $inst_task::STATUS_CANCELED,
4919     );
4920     $update_task = $inst_task->update_task(array('val' => $task_val));
4921     if ($update_task === false) {
4922     $this->addToMessage(sprintf('%s %s',
4923     sprintf(__("Une erreur s'est produite lors de la modification de la tâche %."), $inst_task->getVal($inst_task->clePrimaire)),
4924     __("Veuillez contacter votre administrateur.")
4925     ));
4926     $this->correct = false;
4927     return false;
4928     }
4929     }
4930     }
4931     }
4932    
4933 softime 7996 //
4934 softime 8640 $val['evenement'] = $this->getVal('evenement');
4935 nmeucci 3933 return $this->add_log_to_dossier($id, $val);
4936 mbroquet 3730 }
4937    
4938     /**
4939 softime 9245 * Permet de mettre la valeur passée en paramètre dans l'attribut de classe
4940     * "di_reopened".
4941     *
4942     * @param boolean $val
4943     */
4944     function set_att_di_reopened($val) {
4945     $this->di_reopened = $val;
4946     }
4947    
4948     /**
4949     * Permet de récupérer la valeur de l'attribut de classe "di_reopened".
4950     *
4951     * @return boolean
4952     */
4953     function get_att_di_reopened() {
4954     return $this->di_reopened;
4955     }
4956    
4957     /**
4958 mbroquet 3730 * Permet de composer un message d'erreur sur restriction non valide en
4959     * fonction du contexte.
4960     *
4961     * @param string $restriction formule de la restriction
4962     *
4963     * @return string message d'erreur
4964     */
4965     function get_restriction_error_message($restriction) {
4966     // Affichage du message si la restriction s'applique
4967     // Contexte du suivi des dates (message simple)
4968     $message_restrict = _("Probleme de dates :");
4969     // Split restriction
4970     $champs_restrict = preg_split(
4971     '/(\W+)/',
4972     $restriction,
4973     null,
4974     PREG_SPLIT_NO_EMPTY|PREG_SPLIT_DELIM_CAPTURE
4975     );
4976     $formated_restrict = "";
4977     // Ajout des chaînes à traduire
4978     foreach ($champs_restrict as $value) {
4979     $formated_restrict .= _($value)." ";
4980     }
4981     $formated_restrict = substr($formated_restrict, 0, -1);
4982     // Message d'erreur dans le contexte du suivi des dates
4983     if($this->getParameter("maj") == 170) {
4984     $message_restrict .= " "._("contactez l'instructeur du dossier");
4985     $message_restrict .= "<br/>(".$formated_restrict.")";
4986     } else {
4987     // Affichage du message si la restriction s'applique
4988     // Contexte instruction
4989     $message_restrict .= "<br/>".$formated_restrict;
4990     }
4991    
4992     return $message_restrict;
4993     }
4994    
4995     /**
4996 softime 12124 * Surcharge de la méthode verifier() de la classe om_dbform pour y ajouter
4997     * les vérifications suivantes :
4998     * - Si l'instruction à un événement associé et que cet événement à des restrictions :
4999     * 1. vérifie si la restriction est valide, si ce n'est pas le cas récupère et affiche
5000     * le message d'erreur associé à la restriction
5001     * 2. vérifie si les restrictions sont respectées. Si ce n'est pas le cas bloque l'ajout
5002     * et / ou la modification et affiche un message d'erreur
5003     * -
5004     * -
5005     * -
5006     * -
5007     * -
5008     * -
5009     *
5010     * @param array val : tableau contenant les valeurs issues du formulaire.
5011     * @param - dnu1 : Paramètre déprécié et non utilisé.
5012     * @param - dnu2 : Paramètre déprécié et non utilisé.
5013     *
5014 softime 8989 * @return void
5015 mbroquet 3730 */
5016 softime 8989 function verifier($val = array(), &$dnu1 = null, $dnu2 = null) {
5017     parent::verifier($val);
5018     //
5019 mbroquet 3730 if ( isset($val['evenement']) && is_numeric($val['evenement'])){
5020     $restriction = $this->get_restriction($val['evenement']);
5021    
5022     //Test qu'une restriction est présente
5023     if ($restriction != "" ){
5024    
5025 softime 14064 // Vérifie le contexte de la modification et test si la restriction est valide.
5026     // Si l'instruction est modifiée par une tache le dossier n'est pas impacté.
5027     // Il n'est donc pas nécessaire de vérifier les restrictions.
5028 mbroquet 3730 $this->restriction_valid = $this->restrictionIsValid($restriction);
5029 softime 14064 if ($this->getParameter("maj") != 176
5030     && !$this->restriction_valid) {
5031 mbroquet 3730
5032     // Affichage du message si la restriction s'applique
5033     $this->addToMessage(
5034     $this->get_restriction_error_message($restriction)
5035     );
5036     $this->correct=false;
5037     return false;
5038     }
5039    
5040     // Liste des opérateurs possible
5041 nmeucci 3873 $operateurs = array(">=", "<=", "+", "-", "&&", "||", "==", "!=");
5042 mbroquet 3730 // Supprime tous les espaces de la chaîne de caractère
5043     $restriction = str_replace(' ', '', $restriction);
5044    
5045     // Met des espace avant et après les opérateurs puis transforme la
5046     // chaine en un tableau
5047     $tabRestriction = str_replace($operateurs, " ", $restriction);
5048     // Tableau des champ
5049     $tabRestriction = explode(" ", $tabRestriction);
5050     // Supprime les numériques du tableau
5051     foreach ($tabRestriction as $key => $value) {
5052     if (is_numeric($value)) {
5053     unset($tabRestriction[$key]);
5054     }
5055     }
5056    
5057     // Vérifie les champs utilisés pour la restriction
5058     $check_field_exist = $this->f->check_field_exist($tabRestriction, 'instruction');
5059     if ($check_field_exist !== true) {
5060    
5061     // Liste des champs en erreur
5062     $string_error_fields = implode(", ", $check_field_exist);
5063    
5064     // Message d'erreur
5065     $error_message = _("Le champ %s n'est pas utilisable pour le champ %s");
5066     if (count($check_field_exist) > 1) {
5067     $error_message = _("Les champs %s ne sont pas utilisable pour le champ %s");
5068     }
5069    
5070     // Affiche l'erreur
5071     $this->correct=false;
5072     $this->addToMessage(sprintf($error_message, $string_error_fields, _("restriction")));
5073     $this->addToMessage(_("Veuillez contacter votre administrateur."));
5074     }
5075     }
5076    
5077     }
5078     if(!$this->updateDate("date_envoi_signature")) {
5079     return false;
5080     }
5081     if(!$this->updateDate("date_retour_signature")) {
5082     return false;
5083     }
5084     if(!$this->updateDate("date_envoi_rar")) {
5085     return false;
5086     }
5087     if(!$this->updateDate("date_retour_rar")) {
5088     return false;
5089     }
5090     if(!$this->updateDate("date_envoi_controle_legalite")) {
5091     return false;
5092     }
5093     if(!$this->updateDate("date_retour_controle_legalite")) {
5094     return false;
5095     }
5096    
5097     }
5098 softime 12124
5099     /**
5100     * Récupère et stocket dans un tableau toutes les infos du pétitionnaire
5101     * principal du dossier auquel appartiens l'instruction.
5102     * Renvoie un tableau contenant les informations du pétitionnaire principal.
5103     *
5104     * Si l'identifiant de l'instruction n'a pas pu etre récupéré renvoie false
5105     * et affiche un message dans les logs.
5106     * En cas d'erreur de base de donnée renvoie false et affiche un message d'erreur.
5107     *
5108     * @param string identifiant du dossier
5109     * @return array|boolean
5110     */
5111     protected function get_info_petitionnaire_principal_dossier($dossier = null) {
5112     // Si l'identifiant de l'instruction n'a pas été fournit on récupère celui de
5113     // l'objet courant
5114     if (empty($dossier)) {
5115     $dossier = $this->getVal('dossier');
5116     // Si la récupération de l'identifiant de l'instruction a échoué la méthode renvoie
5117     // false et on affiche un message d'erreur dans les logs
5118     if (empty($dossier)) {
5119     $this->addToLog(__METHOD__.' : L\'identifiant du dossier n\'a pas pu être récupéré');
5120     return false;
5121     }
5122     }
5123    
5124     // Requête sql servant à récupérer toutes les informations relatives au demandeurs
5125     // principal
5126 softime 13137 $qres = $this->f->get_all_results_from_db_query(
5127     sprintf(
5128     'SELECT
5129     -- Récupère toutes les informations du demandeur principal
5130     demandeur.*,
5131     CASE
5132     WHEN demandeur.qualite=\'particulier\'
5133     THEN TRIM(CONCAT(demandeur.particulier_nom, \' \', demandeur.particulier_prenom, \' \', demandeur.courriel))
5134     ELSE
5135     TRIM(CONCAT(demandeur.personne_morale_raison_sociale, \' \', demandeur.personne_morale_denomination, \' \', demandeur.courriel))
5136     END AS destinataire
5137     FROM
5138     %1$sdossier
5139     LEFT JOIN %1$slien_dossier_demandeur
5140     ON lien_dossier_demandeur.dossier = dossier.dossier
5141     LEFT JOIN %1$sdemandeur
5142     ON demandeur.demandeur = lien_dossier_demandeur.demandeur
5143     WHERE
5144     dossier.dossier = \'%2$s\'
5145     AND lien_dossier_demandeur.petitionnaire_principal IS TRUE',
5146     DB_PREFIXE,
5147     $this->f->db->escapeSimple($dossier)
5148     ),
5149     array(
5150     "origin" => __METHOD__,
5151     )
5152 softime 12124 );
5153 softime 13137 if (is_array($qres["result"]) === true
5154     && array_key_exists(0, $qres["result"]) === true) {
5155     //
5156     return $qres["result"][0];
5157 softime 12124 }
5158 softime 13137 return null;
5159 softime 12124 }
5160    
5161    
5162 mbroquet 3730
5163     /**
5164     * Finalisation des documents.
5165     * @param string $champ champ du fichier à finaliser
5166     * @param booleen $status permet de définir si on finalise ou définalise
5167     * @param string $sousform permet de savoir si se trouve dans un sousformulaire (passé au javascript)
5168     */
5169     function manage_finalizing($mode = null, $val = array()) {
5170 softime 5024 //
5171     $this->begin_treatment(__METHOD__);
5172 mbroquet 3730
5173 softime 5024 //
5174     $id_inst = $this->getVal($this->clePrimaire);
5175 mbroquet 3730
5176 softime 5024 //
5177     $admin_msg_error = _("Veuillez contacter votre administrateur.");
5178     $file_msg_error = _("Erreur de traitement de fichier.")
5179     ." ".$admin_msg_error;
5180     $bdd_msg_error = _("Erreur de base de données.")
5181     ." ".$admin_msg_error;
5182 softime 5169 $log_msg_error = "Finalisation non enregistrée - id instruction = %s - uid fichier = %s";
5183 mbroquet 3730
5184     // Si on finalise le document
5185     if ($mode == "finalize"){
5186 softime 5024 //
5187     $etat = _('finalisation');
5188 mbroquet 3730
5189     // Récupère la collectivite du dossier d'instruction
5190     $dossier_instruction_om_collectivite = $this->get_dossier_instruction_om_collectivite();
5191    
5192     //
5193     $collectivite = $this->f->getCollectivite($dossier_instruction_om_collectivite);
5194 softime 8593
5195     //
5196     $params = array(
5197     "specific" => array(),
5198     );
5199     // Si la rédaction libre est activée sur l'instruction
5200     if ($this->getVal("flag_edition_integrale") == 't') {
5201     $params["specific"]["corps"] = array(
5202     "mode" => "set",
5203     "value" => $this->getVal("corps_om_htmletatex"),
5204     );
5205     $params["specific"]["titre"] = array(
5206     "mode" => "set",
5207     "value" => $this->getVal("titre_om_htmletat"),
5208     );
5209     }
5210 mbroquet 3730 // Génération du PDF
5211 softime 8593 $result = $this->compute_pdf_output('lettretype', $this->getVal('lettretype'), $collectivite, null, $params);
5212 mbroquet 3730 $pdf_output = $result['pdf_output'];
5213 softime 10573
5214 mbroquet 3730 //Métadonnées du document
5215     $metadata = array(
5216 softime 5024 'filename' => 'instruction_'.$id_inst.'.pdf',
5217 mbroquet 3730 'mimetype' => 'application/pdf',
5218     'size' => strlen($pdf_output)
5219     );
5220    
5221     // Récupération des métadonnées calculées après validation
5222     $spe_metadata = $this->getMetadata("om_fichier_instruction");
5223    
5224     //On vérifie si l'instruction à finaliser a un événement de type arrete
5225 softime 14064 // TODO : A voir pour remplacer par une instanciation de l'événement.
5226     // Voir également si l'événement ne dois pas être instancié en début de
5227     // méthode pour pouvoir être réutilisé.
5228     $qres = $this->f->get_one_result_from_db_query(
5229     sprintf(
5230     'SELECT
5231     type
5232     FROM
5233     %1$sevenement
5234     WHERE
5235     evenement = \'%2$d\'',
5236     DB_PREFIXE,
5237     intval($this->getVal("evenement"))
5238     ),
5239     array(
5240     "origin" => __METHOD__,
5241     "force_return" => true,
5242     )
5243     );
5244    
5245     if ($qres["code"] !== "OK") {
5246 softime 5024 $this->correct = false;
5247     $this->addToMessage($bdd_msg_error);
5248     return $this->end_treatment(__METHOD__, false);
5249 mbroquet 3730 }
5250    
5251     //Initialisation de la variable
5252     $arrete_metadata = array();
5253     // Si l'événement est de type arrete, on ajoute les métadonnées spécifiques
5254 softime 14064 if ($qres['result'] === 'arrete'){
5255 mbroquet 3730 $arrete_metadata = $this->getMetadata("arrete");
5256     }
5257    
5258     $metadata = array_merge($metadata, $spe_metadata, $arrete_metadata);
5259    
5260 softime 10573 /*
5261     // transforme le tableau de métadonnées en objet
5262     $mdf = new MetadataFactory();
5263     $md = $mdf->build('Instruction', $metadata);
5264     */
5265    
5266 softime 5024 // Si le document a déjà été finalisé on le met à jour
5267     // en conservant son UID
5268 mbroquet 3730 if ($this->getVal("om_fichier_instruction") != ''){
5269     $uid = $this->f->storage->update(
5270     $this->getVal("om_fichier_instruction"), $pdf_output, $metadata);
5271     }
5272 softime 5024 // Sinon on crée un nouveau document et dont on récupère l'UID
5273 mbroquet 3730 else {
5274 softime 10573 $uid = $this->f->storage->create($pdf_output, $metadata, "from_content", $this->table.".om_fichier_instruction");
5275 mbroquet 3730 }
5276     }
5277    
5278 softime 5024 // Si on définalise le document
5279 mbroquet 3730 if ($mode == "unfinalize") {
5280 softime 5024 //
5281     $etat = _('définalisation');
5282 mbroquet 3730 // Récupération de l'uid du document finalisé
5283     $uid = $this->getVal("om_fichier_instruction");
5284     }
5285 softime 5024
5286     // Si on définalise l'UID doit être défini
5287     // Si on finalise la création/modification du fichier doit avoir réussi
5288 mbroquet 3730 if ($uid == '' || $uid == 'OP_FAILURE' ) {
5289 softime 5024 $this->correct = false;
5290     $this->addToMessage($file_msg_error);
5291 softime 8989 $this->addToLog(sprintf($log_msg_error, $id_inst, $uid), DEBUG_MODE);
5292 softime 5024 return $this->end_treatment(__METHOD__, false);
5293 mbroquet 3730 }
5294    
5295     //
5296     foreach ($this->champs as $key => $champ) {
5297     //
5298     $val[$champ] = $this->val[$key];
5299     }
5300    
5301     //
5302 softime 6565 $val['date_evenement'] = $this->dateDBToForm($val['date_evenement']);
5303     $val['archive_date_complet'] = $this->dateDBToForm($val['archive_date_complet']);
5304     $val['archive_date_rejet'] = $this->dateDBToForm($val['archive_date_rejet']);
5305     $val['archive_date_limite'] = $this->dateDBToForm($val['archive_date_limite']);
5306     $val['archive_date_notification_delai'] = $this->dateDBToForm($val['archive_date_notification_delai']);
5307     $val['archive_date_decision'] = $this->dateDBToForm($val['archive_date_decision']);
5308     $val['archive_date_validite'] = $this->dateDBToForm($val['archive_date_validite']);
5309     $val['archive_date_achevement'] = $this->dateDBToForm($val['archive_date_achevement']);
5310     $val['archive_date_chantier'] = $this->dateDBToForm($val['archive_date_chantier']);
5311     $val['archive_date_conformite'] = $this->dateDBToForm($val['archive_date_conformite']);
5312     $val['archive_date_dernier_depot'] = $this->dateDBToForm($val['archive_date_dernier_depot']);
5313     $val['archive_date_limite_incompletude'] = $this->dateDBToForm($val['archive_date_limite_incompletude']);
5314     $val['date_finalisation_courrier'] = $this->dateDBToForm($val['date_finalisation_courrier']);
5315     $val['date_envoi_signature'] = $this->dateDBToForm($val['date_envoi_signature']);
5316     $val['date_retour_signature'] = $this->dateDBToForm($val['date_retour_signature']);
5317     $val['date_envoi_rar'] = $this->dateDBToForm($val['date_envoi_rar']);
5318     $val['date_retour_rar'] = $this->dateDBToForm($val['date_retour_rar']);
5319     $val['date_envoi_controle_legalite'] = $this->dateDBToForm($val['date_envoi_controle_legalite']);
5320     $val['date_retour_controle_legalite'] = $this->dateDBToForm($val['date_retour_controle_legalite']);
5321     $val['archive_date_cloture_instruction'] = $this->dateDBToForm($val['archive_date_cloture_instruction']);
5322     $val['archive_date_premiere_visite'] = $this->dateDBToForm($val['archive_date_premiere_visite']);
5323     $val['archive_date_derniere_visite'] = $this->dateDBToForm($val['archive_date_derniere_visite']);
5324     $val['archive_date_contradictoire'] = $this->dateDBToForm($val['archive_date_contradictoire']);
5325     $val['archive_date_retour_contradictoire'] = $this->dateDBToForm($val['archive_date_retour_contradictoire']);
5326     $val['archive_date_ait'] = $this->dateDBToForm($val['archive_date_ait']);
5327     $val['archive_date_transmission_parquet'] = $this->dateDBToForm($val['archive_date_transmission_parquet']);
5328 softime 8989 $val['archive_date_affichage'] = $this->dateDBToForm($val['archive_date_affichage']);
5329 mbroquet 3730 $this->setvalF($val);
5330    
5331     // Verification de la validite des donnees
5332 softime 8989 $this->verifier($this->val);
5333 mbroquet 3730 // Si les verifications precedentes sont correctes, on procede a
5334     // la modification, sinon on ne fait rien et on retourne une erreur
5335 softime 5024 if ($this->correct === true) {
5336 mbroquet 3730 //
5337     $valF = array(
5338     "om_fichier_instruction" => $uid,
5339     "date_finalisation_courrier" => date('Y-m-d')
5340     );
5341     //
5342     if($mode=="finalize") {
5343     // état finalisé vrai
5344 softime 5024 $valF["om_final_instruction"] = true;
5345 mbroquet 3730 // ajout log utilisateur
5346     $login = $_SESSION['login'];
5347     $nom = "";
5348     $this->f->getUserInfos();
5349     if (isset($this->f->om_utilisateur["nom"])
5350     && !empty($this->f->om_utilisateur["nom"])) {
5351     $nom = $this->f->om_utilisateur["nom"];
5352     }
5353     $valF["om_final_instruction_utilisateur"] = $_SESSION['login'];
5354     if ($nom != "") {
5355     $valF["om_final_instruction_utilisateur"] .= " (".$nom.")";
5356     }
5357     } else {
5358     // état finalisé faux
5359 softime 5024 $valF["om_final_instruction"] = false;
5360 mbroquet 3730 // suppression log utilisateur
5361     $valF["om_final_instruction_utilisateur"] = '';
5362     }
5363    
5364     // Execution de la requête de modification des donnees de l'attribut
5365     // valF de l'objet dans l'attribut table de l'objet
5366 softime 8989 $res = $this->f->db->autoExecute(DB_PREFIXE.$this->table, $valF,
5367 softime 5024 DB_AUTOQUERY_UPDATE, $this->getCle($id_inst));
5368     $this->addToLog(__METHOD__."() : db->autoExecute(\"".DB_PREFIXE.$this->table."\", ".print_r($valF, true).", DB_AUTOQUERY_UPDATE, \"".$this->getCle($id_inst)."\")", VERBOSE_MODE);
5369     //
5370     if ($this->f->isDatabaseError($res, true) === true) {
5371     $this->correct = false;
5372     $this->addToMessage($bdd_msg_error);
5373     return $this->end_treatment(__METHOD__, false);
5374     }
5375 mbroquet 3730
5376 softime 5024 //
5377     $this->addToMessage(sprintf(_("La %s du document s'est effectuee avec succes."), $etat));
5378     //
5379     if ($this->add_log_to_dossier($id_inst, $val) === false) {
5380     return $this->end_treatment(__METHOD__, false);
5381     }
5382     //
5383     return $this->end_treatment(__METHOD__, true);
5384 mbroquet 3730 }
5385 softime 5024 // L'appel de verifier() a déjà positionné correct à false
5386     // et défini un message d'erreur.
5387 softime 8989 $this->addToLog(sprintf($log_msg_error, $id_inst, $uid), DEBUG_MODE);
5388 softime 5024 return $this->end_treatment(__METHOD__, false);
5389 mbroquet 3730 }
5390    
5391     /**
5392     * Récupération du numéro de dossier d'instruction à ajouter aux métadonnées
5393     * @return string numéro de dossier d'instruction
5394     */
5395 softime 10573 protected function getDossier($champ = null) {
5396 mbroquet 3730 if(empty($this->specificMetadata)) {
5397     $this->getSpecificMetadata();
5398     }
5399     return $this->specificMetadata->dossier;
5400     }
5401     /**
5402     * Récupération la version du dossier d'instruction à ajouter aux métadonnées
5403     * @return int Version
5404     */
5405     protected function getDossierVersion() {
5406     if(empty($this->specificMetadata)) {
5407     $this->getSpecificMetadata();
5408     }
5409     return $this->specificMetadata->version;
5410     }
5411     /**
5412     * Récupération du numéro de dossier d'autorisation à ajouter aux métadonnées
5413     * @return string numéro de dossier d'autorisation
5414     */
5415     protected function getNumDemandeAutor() {
5416     if(empty($this->specificMetadata)) {
5417     $this->getSpecificMetadata();
5418     }
5419     return $this->specificMetadata->dossier_autorisation;
5420     }
5421     /**
5422     * Récupération de la date de demande initiale du dossier à ajouter aux métadonnées
5423     * @return date de la demande initiale
5424     */
5425     protected function getAnneemoisDemandeAutor() {
5426     if(empty($this->specificMetadata)) {
5427     $this->getSpecificMetadata();
5428     }
5429     return $this->specificMetadata->date_demande_initiale;
5430     }
5431     /**
5432     * Récupération du type de dossier d'instruction à ajouter aux métadonnées
5433     * @return string type du dossier d'instruction
5434     */
5435     protected function getTypeInstruction() {
5436     if(empty($this->specificMetadata)) {
5437     $this->getSpecificMetadata();
5438     }
5439     return $this->specificMetadata->dossier_instruction_type;
5440     }
5441     /**
5442     * Récupération du statut du dossier d'autorisation à ajouter aux métadonnées
5443     * @return string avis
5444     */
5445     protected function getStatutAutorisation() {
5446     if(empty($this->specificMetadata)) {
5447     $this->getSpecificMetadata();
5448     }
5449     return $this->specificMetadata->statut;
5450     }
5451     /**
5452     * Récupération du type de dossier d'autorisation à ajouter aux métadonnées
5453     * @return string type du dossier d'autorisation
5454     */
5455     protected function getTypeAutorisation() {
5456     if(empty($this->specificMetadata)) {
5457     $this->getSpecificMetadata();
5458     }
5459     return $this->specificMetadata->dossier_autorisation_type;
5460     }
5461     /**
5462     * Récupération de la date d'ajout de document à ajouter aux métadonnées
5463     * @return date de l'évènement
5464     */
5465     protected function getDateEvenementDocument() {
5466     return date("Y-m-d");
5467     }
5468     /**
5469     * Récupération du groupe d'instruction à ajouter aux métadonnées
5470     * @return string Groupe d'instruction
5471     */
5472     protected function getGroupeInstruction() {
5473     if(empty($this->specificMetadata)) {
5474     $this->getSpecificMetadata();
5475     }
5476     return $this->specificMetadata->groupe_instruction;
5477     }
5478     /**
5479     * Récupération du libellé du type du document à ajouter aux métadonnées
5480     * @return string Groupe d'instruction
5481     */
5482     protected function getTitle() {
5483    
5484     // Récupère le champ événement
5485     if (isset($this->valF["evenement"]) AND $this->valF["evenement"] != "") {
5486     $evenement = $this->valF["evenement"];
5487     } else {
5488     $evenement = $this->getVal("evenement");
5489     }
5490    
5491     // Requête sql
5492 softime 14064 $evenement = $this->f->get_inst__om_dbform(array(
5493     "obj" => "evenement",
5494     "idx" => $evenement
5495     ));
5496    
5497 mbroquet 3730 // Retourne le libelle de l'événement
5498 softime 14064 return $evenement->getVal('libelle');
5499 mbroquet 3730 }
5500    
5501 softime 6272
5502 mbroquet 3730 /**
5503 softime 6272 * Récupération du champ ERP du dossier d'instruction.
5504     *
5505     * @return boolean
5506     */
5507     public function get_concerne_erp() {
5508     //
5509     if(empty($this->specificMetadata)) {
5510     $this->getSpecificMetadata();
5511     }
5512     //
5513     return $this->specificMetadata->erp;
5514     }
5515    
5516    
5517     /**
5518 mbroquet 3730 * Cette méthode permet de stocker en attribut toutes les métadonnées
5519     * nécessaire à l'ajout d'un document.
5520     */
5521     public function getSpecificMetadata() {
5522     if (isset($this->valF["dossier"]) AND $this->valF["dossier"] != "") {
5523     $dossier = $this->valF["dossier"];
5524     } else {
5525     $dossier = $this->getVal("dossier");
5526     }
5527     //Requête pour récupérer les informations essentiels sur le dossier d'instruction
5528 softime 14542 $qres = $this->f->get_all_results_from_db_query(
5529     sprintf(
5530     'SELECT
5531     dossier.dossier AS dossier,
5532     dossier_autorisation.dossier_autorisation AS dossier_autorisation,
5533     to_char(dossier.date_demande, \'YYYY/MM\') AS date_demande_initiale,
5534     dossier_instruction_type.code AS dossier_instruction_type,
5535     etat_dossier_autorisation.libelle AS statut,
5536     dossier_autorisation_type.code AS dossier_autorisation_type,
5537     groupe.code AS groupe_instruction,
5538     CASE WHEN dossier.erp IS TRUE
5539     THEN \'true\'
5540     ELSE \'false\'
5541     END AS erp
5542     FROM
5543     %1$sdossier
5544     LEFT JOIN %1$sdossier_instruction_type
5545 mbroquet 3730 ON dossier.dossier_instruction_type = dossier_instruction_type.dossier_instruction_type
5546 softime 14542 LEFT JOIN %1$sdossier_autorisation
5547 mbroquet 3730 ON dossier.dossier_autorisation = dossier_autorisation.dossier_autorisation
5548 softime 14542 LEFT JOIN %1$setat_dossier_autorisation
5549 mbroquet 3730 ON dossier_autorisation.etat_dossier_autorisation = etat_dossier_autorisation.etat_dossier_autorisation
5550 softime 14542 LEFT JOIN %1$sdossier_autorisation_type_detaille
5551 mbroquet 3730 ON dossier_autorisation.dossier_autorisation_type_detaille = dossier_autorisation_type_detaille.dossier_autorisation_type_detaille
5552 softime 14542 LEFT JOIN %1$sdossier_autorisation_type
5553 mbroquet 3730 ON dossier_autorisation_type_detaille.dossier_autorisation_type = dossier_autorisation_type.dossier_autorisation_type
5554 softime 14542 LEFT JOIN %1$sgroupe
5555 mbroquet 3730 ON dossier_autorisation_type.groupe = groupe.groupe
5556 softime 14542 WHERE
5557     dossier.dossier = \'%2$s\'',
5558     DB_PREFIXE,
5559     $this->f->db->escapeSimple($dossier)
5560     ),
5561     array(
5562     "origin" => __METHOD__,
5563     )
5564     );
5565     $row = array_shift($qres['result']);
5566 mbroquet 3730
5567     //Si il y a un résultat
5568 softime 14542 if (! empty($row)) {
5569 mbroquet 3730
5570 fmichon 3892 // Instrance de la classe dossier
5571     $inst_dossier = $this->get_inst_dossier($dossier);
5572 softime 14542 // TODO : améliorer ce code
5573     //
5574     // Avant l e résultat été récupéré dans un objet à partir de la requête mais en modifiant pour
5575     // utiliser la méthode get_all_results_from_db_query() c'est maintenant un tableau
5576     // qu'on obtiens. Pour garder le même fonctionnement on transforme le tableau des
5577     // valeurs issues de la requête en objet.
5578     $metadata = (object)$row;
5579 fmichon 3892 // Insère l'attribut version à l'objet
5580 softime 14542 $metadata->version = $inst_dossier->get_di_numero_suffixe();
5581 fmichon 3892
5582 mbroquet 3730 //Alors on créé l'objet dossier_instruction
5583 softime 14542 $this->specificMetadata = $metadata;
5584 mbroquet 3730
5585     }
5586     }
5587    
5588     /**
5589     * Retourne le statut du dossier d'instruction
5590     * @param string $idx Identifiant du dossier d'instruction
5591     * @return string Le statut du dossier d'instruction
5592     */
5593     function getStatutAutorisationDossier($idx){
5594    
5595     $statut = '';
5596    
5597     //Si l'identifiant du dossier d'instruction fourni est correct
5598     if ( $idx != '' ){
5599    
5600     //On récupère le statut de l'état du dossier à partir de l'identifiant du
5601     //dossier
5602 softime 14064 $qres = $this->f->get_one_result_from_db_query(
5603     sprintf(
5604     'SELECT
5605     etat.statut
5606     FROM
5607     %1$sdossier
5608     LEFT JOIN
5609     %1$setat
5610     ON
5611     dossier.etat = etat.etat
5612     WHERE
5613     dossier = \'%2$s\'',
5614     DB_PREFIXE,
5615     $this->f->db->escapeSimple($idx)
5616     ),
5617     array(
5618     "origin" => __METHOD__,
5619     )
5620     );
5621 mbroquet 3730 }
5622 softime 14064
5623     return $qres['result'];
5624 mbroquet 3730 }
5625    
5626     /**
5627     * Récupère les données du dossier
5628     * @return array
5629     */
5630     function get_dossier_actual() {
5631    
5632     // Initialisation de la valeur de retour
5633     $return = array();
5634    
5635     // Récupération de toutes les valeurs du dossier d'instruction en cours
5636 softime 14542 // TODO : remplacer cette requête par une instanciation de l'objet
5637     $qres = $this->f->get_all_results_from_db_query(
5638     sprintf(
5639     'SELECT
5640     *
5641     FROM
5642     %1$sdossier
5643     WHERE
5644     dossier = \'%2$s\'',
5645     DB_PREFIXE,
5646     $this->f->db->escapeSimple($this->valF['dossier'])
5647     ),
5648     array(
5649     'origin' => __METHOD__
5650     )
5651     );
5652 mbroquet 3730
5653 softime 14542 foreach ($qres['result'] as $row) {
5654 mbroquet 3730
5655     // Récupération de la valeur actuelle du délai, de l'accord tacite,
5656     // de l'état et de l'avis du dossier d'instruction
5657 softime 6565 $return['archive_delai'] = $row['delai'];
5658     $return['archive_accord_tacite'] = $row['accord_tacite'];
5659     $return['archive_etat'] = $row['etat'];
5660     $return['archive_avis'] = $row['avis_decision'];
5661     // Récupération de la valeur actuelle des dates du dossier
5662 mbroquet 3730 // d'instruction
5663 softime 6565 $return['archive_date_complet'] = $row['date_complet'];
5664     $return['archive_date_dernier_depot'] = $row['date_dernier_depot'];
5665     $return['archive_date_rejet'] = $row['date_rejet'];
5666     $return['archive_date_limite'] = $row['date_limite'];
5667     $return['archive_date_notification_delai'] = $row['date_notification_delai'];
5668     $return['archive_date_decision'] = $row['date_decision'];
5669     $return['archive_date_validite'] = $row['date_validite'];
5670     $return['archive_date_achevement'] = $row['date_achevement'];
5671     $return['archive_date_chantier'] = $row['date_chantier'];
5672     $return['archive_date_conformite'] = $row['date_conformite'];
5673     $return['archive_incompletude'] = $row['incompletude'];
5674     $return['archive_incomplet_notifie'] = $row['incomplet_notifie'];
5675     $return['archive_evenement_suivant_tacite'] = $row['evenement_suivant_tacite'];
5676     $return['archive_evenement_suivant_tacite_incompletude'] = $row['evenement_suivant_tacite_incompletude'];
5677     $return['archive_etat_pendant_incompletude'] = $row['etat_pendant_incompletude'];
5678     $return['archive_date_limite_incompletude'] = $row['date_limite_incompletude'];
5679     $return['archive_delai_incompletude'] = $row['delai_incompletude'];
5680     $return['archive_autorite_competente'] = $row['autorite_competente'];
5681 softime 8593 $return['archive_dossier_instruction_type'] = $row['dossier_instruction_type'];
5682 softime 6565 $return['duree_validite'] = $row['duree_validite'];
5683     $return['date_depot'] = $row['date_depot'];
5684 softime 10573 $return['date_depot_mairie'] = $row['date_depot_mairie'];
5685 softime 6565 $return['archive_date_cloture_instruction'] = $row['date_cloture_instruction'];
5686     $return['archive_date_premiere_visite'] = $row['date_premiere_visite'];
5687     $return['archive_date_derniere_visite'] = $row['date_derniere_visite'];
5688     $return['archive_date_contradictoire'] = $row['date_contradictoire'];
5689     $return['archive_date_retour_contradictoire'] = $row['date_retour_contradictoire'];
5690     $return['archive_date_ait'] = $row['date_ait'];
5691     $return['archive_date_transmission_parquet'] = $row['date_transmission_parquet'];
5692 softime 8989 $return['archive_date_affichage'] = $row['date_affichage'];
5693 softime 10573 $return['archive_pec_metier'] = $row['pec_metier'];
5694     $return['archive_a_qualifier'] = $row['a_qualifier'];
5695 mbroquet 3730 }
5696    
5697     // Retour de la fonction
5698     return $return;
5699    
5700     }
5701    
5702     /**
5703     * Permet de vérifier qu'un événement est verrouillable
5704     * @param integer $idx Identifiant de l'instruction
5705     * @return boolean
5706     */
5707     function checkEvenementNonVerrouillable($idx) {
5708     // Si la condition n'est pas vide
5709     if ($idx != "") {
5710    
5711     // Requête SQL
5712 softime 14064 $qres = $this->f->get_one_result_from_db_query(
5713     sprintf(
5714     'SELECT
5715     evenement.non_verrouillable
5716     FROM
5717     %1$sevenement
5718     LEFT JOIN %1$sinstruction
5719     ON instruction.evenement = evenement.evenement
5720     WHERE
5721     instruction.instruction = \'%2$s\'',
5722     DB_PREFIXE,
5723     intval($idx)
5724     ),
5725     array(
5726     "origin" => __METHOD__,
5727     )
5728     );
5729 mbroquet 3730 }
5730    
5731 softime 14064 // Si on a un résultat et que ce résultat indique que l'événement n'est
5732     // pas vérrouillable renvoie true, sinon renvoie false
5733     return isset($qres) && isset($qres['result']) && $qres['result'] == 't';
5734 mbroquet 3730 }
5735    
5736     /**
5737     * Mise à jour des champs archive_*
5738     * @param mixed $row La ligne de données
5739     */
5740     public function updateArchiveData($row){
5741    
5742     // Récupération de la valeur actuelle du délai, de l'accord tacite,
5743     // de l'état et de l'avis du dossier d'instruction
5744     $this->valF['archive_delai']=$row['delai'];
5745     $this->valF['archive_accord_tacite']=$row['accord_tacite'];
5746     $this->valF['archive_etat']=$row['etat'];
5747     $this->valF['archive_avis']=$row['avis_decision'];
5748     // Récupération de la valeur actuelle des 9 dates du dossier
5749     // d'instruction
5750     if ($row['date_complet'] != '') {
5751     $this->valF['archive_date_complet']=$row['date_complet'];
5752     }
5753     if ($row['date_dernier_depot'] != '') {
5754     $this->valF['archive_date_dernier_depot']=$row['date_dernier_depot'];
5755     }
5756 softime 6565 if ($row['date_rejet'] != '') {
5757 mbroquet 3730 $this->valF['archive_date_rejet']= $row['date_rejet'];
5758     }
5759 softime 6565 if ($row['date_limite'] != '') {
5760 mbroquet 3730 $this->valF['archive_date_limite']= $row['date_limite'];
5761     }
5762 softime 6565 if ($row['date_notification_delai'] != '') {
5763 mbroquet 3730 $this->valF['archive_date_notification_delai']= $row['date_notification_delai'];
5764     }
5765 softime 6565 if ($row['date_decision'] != '') {
5766 mbroquet 3730 $this->valF['archive_date_decision']= $row['date_decision'];
5767     }
5768 softime 6565 if ($row['date_validite'] != '') {
5769 mbroquet 3730 $this->valF['archive_date_validite']= $row['date_validite'];
5770     }
5771 softime 6565 if ($row['date_achevement'] != '') {
5772 mbroquet 3730 $this->valF['archive_date_achevement']= $row['date_achevement'];
5773     }
5774 softime 6565 if ($row['date_chantier'] != '') {
5775 mbroquet 3730 $this->valF['archive_date_chantier']= $row['date_chantier'];
5776     }
5777 softime 6565 if ($row['date_conformite'] != '') {
5778 mbroquet 3730 $this->valF['archive_date_conformite']= $row['date_conformite'];
5779     }
5780 softime 6565 if ($row['incompletude'] != '') {
5781 mbroquet 3730 $this->valF['archive_incompletude']= $row['incompletude'];
5782     }
5783 softime 6565 if ($row['incomplet_notifie'] != '') {
5784 mbroquet 3730 $this->valF['archive_incomplet_notifie']= $row['incomplet_notifie'];
5785     }
5786 softime 6565 if ($row['evenement_suivant_tacite'] != '') {
5787 mbroquet 3730 $this->valF['archive_evenement_suivant_tacite']= $row['evenement_suivant_tacite'];
5788     }
5789 softime 6565 if ($row['evenement_suivant_tacite_incompletude'] != '') {
5790 mbroquet 3730 $this->valF['archive_evenement_suivant_tacite_incompletude']= $row['evenement_suivant_tacite_incompletude'];
5791     }
5792 softime 6565 if ($row['etat_pendant_incompletude'] != '') {
5793 mbroquet 3730 $this->valF['archive_etat_pendant_incompletude']= $row['etat_pendant_incompletude'];
5794     }
5795 softime 6565 if ($row['date_limite_incompletude'] != '') {
5796 mbroquet 3730 $this->valF['archive_date_limite_incompletude']= $row['date_limite_incompletude'];
5797     }
5798 softime 6565 if ($row['delai_incompletude'] != '') {
5799 mbroquet 3730 $this->valF['archive_delai_incompletude']= $row['delai_incompletude'];
5800     }
5801 softime 6565 if ($row['autorite_competente'] != '') {
5802 mbroquet 3730 $this->valF['archive_autorite_competente']= $row['autorite_competente'];
5803     }
5804 softime 6565 if ($row['duree_validite'] != '') {
5805 mbroquet 3730 $this->valF['duree_validite']= $row['duree_validite'];
5806     }
5807 softime 6565 if ($row['date_depot'] != '') {
5808 nmeucci 3873 $this->valF['date_depot']= $row['date_depot'];
5809     }
5810 softime 10573 if ($row['date_depot_mairie'] != '') {
5811     $this->valF['date_depot_mairie']= $row['date_depot_mairie'];
5812     }
5813 softime 6565 // Dates concernant les dossiers contentieux
5814     if ($row['date_cloture_instruction'] != '') {
5815     $this->valF['archive_date_cloture_instruction']= $row['date_cloture_instruction'];
5816     }
5817     if ($row['date_premiere_visite'] != '') {
5818     $this->valF['archive_date_premiere_visite']= $row['date_premiere_visite'];
5819     }
5820     if ($row['date_derniere_visite'] != '') {
5821     $this->valF['archive_date_derniere_visite']= $row['date_derniere_visite'];
5822     }
5823     if ($row['date_contradictoire'] != '') {
5824     $this->valF['archive_date_contradictoire']= $row['date_contradictoire'];
5825     }
5826     if ($row['date_retour_contradictoire'] != '') {
5827     $this->valF['archive_date_retour_contradictoire']= $row['date_retour_contradictoire'];
5828     }
5829     if ($row['date_ait'] != '') {
5830     $this->valF['archive_date_ait']= $row['date_ait'];
5831     }
5832     if ($row['date_transmission_parquet'] != '') {
5833     $this->valF['archive_date_transmission_parquet']= $row['date_transmission_parquet'];
5834     }
5835 softime 8989 //
5836 softime 8593 if ($row['dossier_instruction_type'] != '') {
5837     $this->valF['archive_dossier_instruction_type']= $row['dossier_instruction_type'];
5838     }
5839 softime 8989 if ($row['date_affichage'] != '') {
5840     $this->valF['archive_date_affichage']= $row['date_affichage'];
5841     }
5842 softime 10573 if (isset($row['pec_metier']) === true && $row['pec_metier'] != '') {
5843     $this->valF['archive_pec_metier']= $row['pec_metier'];
5844     }
5845     if (isset($row['a_qualifier']) === true && $row['a_qualifier'] != '') {
5846     $this->valF['archive_a_qualifier']= $row['a_qualifier'];
5847     }
5848 mbroquet 3730 }
5849    
5850     // {{{
5851     // Méthodes de récupération des métadonnées arrêté
5852     /**
5853     * @return string Retourne le numéro d'arrêté
5854     */
5855     function getNumArrete() {
5856     return $this->getVal("numero_arrete");
5857     }
5858     /**
5859     * @return chaîne vide
5860     */
5861     function getReglementaireArrete() {
5862     return 'true';
5863     }
5864     /**
5865     * @return boolean de notification au pétitionnaire
5866     */
5867     function getNotificationArrete() {
5868     return 'true';
5869     }
5870     /**
5871     * @return date de notification au pétitionnaire
5872     */
5873     function getDateNotificationArrete() {
5874     if (empty($this->metadonneesArrete)) {
5875     $this->getArreteMetadata();
5876     }
5877     return $this->metadonneesArrete["datenotification"];
5878     }
5879     /**
5880     * @return boolean check si le document est passé au contrôle de légalité
5881     */
5882     function getControleLegalite() {
5883     return 'true';
5884     }
5885     /**
5886     * @return date de signature de l'arrêté
5887     */
5888     function getDateSignature() {
5889     if (empty($this->metadonneesArrete)) {
5890     $this->getArreteMetadata();
5891     }
5892     return $this->metadonneesArrete["datesignaturearrete"];
5893     }
5894     /**
5895     * @return string nom du signataire
5896     */
5897     function getNomSignataire() {
5898     if (empty($this->metadonneesArrete)) {
5899     $this->getArreteMetadata();
5900     }
5901     return $this->metadonneesArrete["nomsignataire"];
5902     }
5903     /**
5904     * @return string qualité du signataire
5905     */
5906     function getQualiteSignataire() {
5907     if (empty($this->metadonneesArrete)) {
5908     $this->getArreteMetadata();
5909     }
5910     return $this->metadonneesArrete["qualitesignataire"];
5911     }
5912     /**
5913     * @return string numéro du terrain
5914     */
5915     function getAp_numRue() {
5916     if (empty($this->metadonneesArrete)) {
5917     $this->getArreteMetadata();
5918     }
5919     return $this->metadonneesArrete["ap_numrue"];
5920     }
5921     /**
5922     * @return string nom de la rue du terrain
5923     */
5924     function getAp_nomDeLaVoie() {
5925     if (empty($this->metadonneesArrete)) {
5926     $this->getArreteMetadata();
5927     }
5928     return $this->metadonneesArrete["ap_nomdelavoie"];
5929     }
5930     /**
5931     * @return string code postal du terrain
5932     */
5933     function getAp_codePostal() {
5934     if (empty($this->metadonneesArrete)) {
5935     $this->getArreteMetadata();
5936     }
5937     return $this->metadonneesArrete["ap_codepostal"];
5938     }
5939     /**
5940     * @return string ville du terrain
5941     */
5942     function getAp_ville() {
5943     if (empty($this->metadonneesArrete)) {
5944     $this->getArreteMetadata();
5945     }
5946     return $this->metadonneesArrete["ap_ville"];
5947     }
5948     /**
5949     * @return string activité
5950     */
5951     function getActivite() {
5952     return "Droit du sol";
5953     }
5954     /**
5955     * @return string date du retour de controle légalité
5956     */
5957     function getDateControleLegalite() {
5958     if (empty($this->metadonneesArrete)) {
5959     $this->getArreteMetadata();
5960     }
5961     return $this->metadonneesArrete["datecontrolelegalite"];
5962     }
5963    
5964     // Fin des méthodes de récupération des métadonnées
5965     // }}}
5966    
5967     /**
5968     * Méthode de récupération des métadonnées arrêtés dans la base de données,
5969     * les données sont stockés dans l'attribut $this->metadonneesArrete
5970     */
5971     function getArreteMetadata() {
5972    
5973 softime 14542 //Récupération de la dernière instruction dont l'événement est de type 'arrete'
5974     $this->metadonneesArrete = array("nomsignataire"=>"", "qualitesignataire"=>"",
5975     "decisionarrete"=>"", "datenotification"=>"", "datesignaturearrete"=>"",
5976     "datecontrolelegalite"=>"", "ap_numrue"=>"", "ap_nomdelavoie"=>"",
5977     "ap_codepostal"=>"", "ap_ville"=>"");
5978 mbroquet 3730
5979 softime 14542 $qres = $this->f->get_all_results_from_db_query(
5980     sprintf(
5981     'SELECT
5982     signataire_arrete.prenom || \' \' ||signataire_arrete.nom as nomsignataire,
5983     signataire_arrete.qualite as qualitesignataire,
5984     instruction.etat as decisionarrete,
5985     instruction.date_retour_rar as datenotification,
5986     instruction.date_retour_signature as datesignaturearrete,
5987     instruction.date_retour_controle_legalite as datecontrolelegalite,
5988     dossier.terrain_adresse_voie_numero as ap_numrue,
5989     dossier.terrain_adresse_voie as ap_nomdelavoie,
5990     dossier.terrain_adresse_code_postal as ap_codepostal,
5991     dossier.terrain_adresse_localite as ap_ville
5992     FROM
5993     %1$sinstruction
5994     LEFT JOIN %1$ssignataire_arrete
5995     ON instruction.signataire_arrete = signataire_arrete.signataire_arrete
5996     LEFT JOIN %1$sdossier
5997     ON instruction.dossier = dossier.dossier
5998     LEFT JOIN %1$sdonnees_techniques
5999     ON donnees_techniques.dossier_instruction = dossier.dossier
6000     WHERE
6001     instruction.instruction = %2$d',
6002     DB_PREFIXE,
6003     intval($this->getVal('instruction'))
6004     ),
6005     array(
6006     'origin' => __METHOD__
6007     )
6008     );
6009     $this->metadonneesArrete = array_shift($qres['result']);
6010 mbroquet 3730 }
6011    
6012     /**
6013     * CONDITION - has_an_edition.
6014     *
6015     * Condition pour afficher le bouton de visualisation de l'édition.
6016     *
6017     * @return boolean
6018     */
6019     function has_an_edition() {
6020     // Récupère la valeur du champ lettretype
6021     $lettretype = $this->getVal("lettretype");
6022     // Si le champ est vide
6023 softime 7521 if ($lettretype !== '' && $lettretype !== null) {
6024 mbroquet 3730 //
6025 softime 7521 return true;
6026 mbroquet 3730 }
6027    
6028     //
6029 softime 7521 return false;
6030 mbroquet 3730 }
6031    
6032     /**
6033 softime 10573 * CONDITION - is_modifiable.
6034     *
6035     * Controle si l'évenement est modifiable.
6036     *
6037     * @return boolean
6038     */
6039     function is_evenement_modifiable() {
6040     $evenement = $this->get_inst_evenement($this->getVal('evenement'));
6041     return ! $this->get_boolean_from_pgsql_value($evenement->getVal('non_modifiable'));
6042     }
6043    
6044     /**
6045 mbroquet 3730 * CONDITION - is_editable.
6046     *
6047     * Condition pour la modification.
6048     *
6049     * @return boolean
6050     */
6051     function is_editable() {
6052 softime 10573
6053     // XXX
6054     // 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é)
6055     // Si cette tâche identifiée est DONE alors la suppression/modification de cette intruction est impossible
6056    
6057 mbroquet 3730 // Contrôle si l'utilisateur possède un bypass
6058 softime 7996 $bypass = $this->f->isAccredited($this->get_absolute_class_name()."_modifier_bypass");
6059 mbroquet 3730 //
6060     if ($bypass == true) {
6061     //
6062     return true;
6063     }
6064 softime 6565
6065 mbroquet 3730 // Si l'utilisateur est un instructeur, que le dossier est cloturé et
6066     // que l'événement n'est pas identifié comme non verrouillable
6067     if ($this->f->isUserInstructeur()
6068     && $this->getStatutAutorisationDossier($this->getParameter("idxformulaire")) == "cloture"
6069     && $this->checkEvenementNonVerrouillable($this->getVal("instruction")) === false) {
6070     //
6071     return false;
6072     }
6073    
6074 softime 6565 // Si l'utilisateur est un intructeur qui correspond à la division du
6075     // dossier
6076     if ($this->is_instructeur_from_division_dossier() === true) {
6077     //
6078     return true;
6079     }
6080    
6081     // Si l'utilisateur est instructeur de la commune du dossier et que
6082     // l'instruction est créée par un instructeur de la commune
6083     if ($this->is_instructeur_from_collectivite_dossier() === true and
6084     $this->getVal('created_by_commune') === 't') {
6085     return true;
6086     }
6087    
6088 mbroquet 3730 //
6089 softime 6565 return false;
6090 mbroquet 3730 }
6091    
6092     /**
6093 softime 10573 * Vérifie si l'événement est supprimable ou pas.
6094     *
6095     * @return boolean
6096     */
6097     function is_evenement_supprimable() {
6098     // Controle si l'évenement est supprimable
6099     $evenement = $this->get_inst_evenement($this->getVal('evenement'));
6100     return ! $this->get_boolean_from_pgsql_value($evenement->getVal('non_supprimable'));
6101     }
6102    
6103     /**
6104 mbroquet 3730 * CONDITION - is_deletable.
6105     *
6106 softime 6864 * Condition pour la suppression.
6107 mbroquet 3730 *
6108     * @return boolean
6109     */
6110     function is_deletable() {
6111 softime 10573
6112     // XXX
6113     // 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é)
6114     // Si cette tâche identifiée est DONE alors la suppression/modification de cette intruction est impossible
6115    
6116 softime 6864 // Contrôle si l'utilisateur possède un bypass intégral
6117 softime 7996 $bypass = $this->f->isAccredited($this->get_absolute_class_name()."_supprimer_bypass");
6118 mbroquet 3730 //
6119     if ($bypass == true) {
6120    
6121     //
6122     return true;
6123     }
6124    
6125     // Si l'utilisateur est un intructeur qui ne correspond pas à la
6126 softime 6864 // division du dossier et si l'utilisateur n'a pas la permission bypass
6127     // de la division
6128     if ($this->is_instructeur_from_division_dossier() === false
6129 softime 7996 && $this->f->isAccredited($this->get_absolute_class_name()."_supprimer_bypass_division") === false) {
6130 mbroquet 3730
6131     //
6132     return false;
6133     }
6134 softime 5024
6135     // l'événement est-il le dernier ?
6136     $dernier_evenement = false;
6137     // instanciation dossier
6138 softime 7996 $dossier = $this->f->get_inst__om_dbform(array(
6139     "obj" => "dossier",
6140     "idx" => $this->getVal('dossier'),
6141     ));
6142 softime 5024 // récupération dernier événement
6143     $id_dernier_evenement = $dossier->get_dernier_evenement();
6144     if ($id_dernier_evenement == $this->getVal($this->clePrimaire)) {
6145     $dernier_evenement = true;
6146     }
6147 mbroquet 3730
6148 softime 5024 // Si dossier cloturé ou si pas dernier événement
6149     // ou de type retour ou si une date est renseignée
6150     // ET utilisateur non administrateur
6151     if ($this->getStatutAutorisationDossier($this->getVal('dossier')) == 'cloture'
6152     || $dernier_evenement == false
6153     || $this->is_evenement_retour($this->getVal("evenement")) == true
6154     || $this->getVal('date_envoi_signature') != ''
6155     || $this->getVal('date_retour_signature') != ''
6156     || $this->getVal('date_envoi_rar') != ''
6157     || $this->getVal('date_retour_rar') != ''
6158     || $this->getVal('date_envoi_controle_legalite') != ''
6159     || $this->getVal('date_retour_controle_legalite') != '') {
6160     // pas le droit de supprimer
6161     return false;;
6162     }
6163    
6164 mbroquet 3730 //
6165     return true;
6166     }
6167 softime 6565
6168    
6169 mbroquet 3730 /**
6170 softime 6565 * Vérifie que l'utilisateur est instructeur et qu'il est de la division du
6171     * dossier.
6172     *
6173     * @return, boolean true/false
6174     */
6175     function is_instructeur_from_collectivite_dossier() {
6176     if ($this->f->isUserInstructeur() === true and
6177     $this->f->om_utilisateur["om_collectivite"] == $this->get_dossier_instruction_om_collectivite()) {
6178     return true;
6179     }
6180     return false;
6181     }
6182    
6183     /**
6184 mbroquet 3730 * CONDITION - is_addable.
6185     *
6186     * Condition pour afficher les boutons modifier et supprimer.
6187     *
6188     * @return boolean
6189     */
6190     function is_addable() {
6191     // Contrôle si l'utilisateur possède un bypass
6192 softime 7996 $bypass = $this->f->isAccredited($this->get_absolute_class_name()."_ajouter_bypass");
6193 mbroquet 3730 //
6194     if ($bypass == true) {
6195    
6196     //
6197     return true;
6198     }
6199 softime 6565 // Si l'utilisateur est un intructeur qui correspond à la
6200     // division du dossier ou qu'il peut changer la décision
6201     if ($this->is_instructeur_from_division_dossier() === true or
6202     $this->isInstrCanChangeDecision($this->getParameter('idxformulaire')) === true) {
6203 mbroquet 3730 //
6204 softime 6565 return true;
6205 mbroquet 3730 }
6206    
6207     //
6208 softime 6565 return false;
6209 mbroquet 3730 }
6210    
6211     /**
6212     * CONDITION - is_finalizable.
6213     *
6214     * Condition pour afficher le bouton.
6215     *
6216     * @return boolean
6217     */
6218     function is_finalizable() {
6219     // Contrôle si l'utilisateur possède un bypass
6220 softime 7996 $bypass = $this->f->isAccredited($this->get_absolute_class_name()."_finaliser_bypass");
6221 mbroquet 3730 //
6222     if ($bypass == true) {
6223     //
6224     return true;
6225     }
6226 softime 6565
6227 mbroquet 3730 // Si l'utilisateur est un instructeur, que le dossier est cloturé et
6228     // que l'événement n'est pas identifié comme non verrouillable
6229     if ($this->f->isUserInstructeur()
6230     && $this->getStatutAutorisationDossier($this->getParameter("idxformulaire")) == "cloture"
6231     && $this->checkEvenementNonVerrouillable($this->getVal("instruction")) === false) {
6232     //
6233     return false;
6234     }
6235 softime 6565
6236     // Si l'utilisateur est un intructeur qui correspond à la division du
6237     // dossier
6238     if ($this->is_instructeur_from_division_dossier() === true) {
6239     //
6240     return true;
6241     }
6242 mbroquet 3730
6243 softime 6565 // Si l'utilisateur est instructeur de la commune du dossier et que
6244     // l'instruction est créée par un instructeur de la commune
6245     if ($this->is_instructeur_from_collectivite_dossier() === true and
6246     $this->getVal('created_by_commune') === 't') {
6247     return true;
6248     }
6249    
6250 mbroquet 3730 //
6251 softime 6565 return false;
6252 mbroquet 3730 }
6253    
6254     /**
6255     * CONDITION - is_finalize_without_bypass.
6256     *
6257     * Condition pour afficher le bouton sans le bypass.
6258     *
6259     * @return boolean [description]
6260     */
6261     function is_finalizable_without_bypass() {
6262     // Récupère la valeur du champ finalisé
6263     $om_final_instruction = $this->getVal('om_final_instruction');
6264    
6265     // Si le rapport n'est pas finalisé
6266     if (empty($om_final_instruction)
6267     || $om_final_instruction == 'f') {
6268     //
6269     return true;
6270     }
6271    
6272     //
6273     return false;
6274     }
6275    
6276     /**
6277     * CONDITION - is_unfinalizable.
6278     *
6279     * Condition pour afficher le bouton.
6280     *
6281     * @return boolean
6282     */
6283     function is_unfinalizable(){
6284     // Contrôle si l'utilisateur possède un bypass
6285 softime 7996 $bypass = $this->f->isAccredited($this->get_absolute_class_name()."_definaliser_bypass");
6286 mbroquet 3730 //
6287     if ($bypass == true) {
6288     //
6289     return true;
6290     }
6291 softime 6565
6292     // Si l'utilisateur est un instructeur, que le dossier est cloturé et
6293     // que l'événement n'est pas identifié comme non verrouillable
6294 mbroquet 3730 if ($this->f->isUserInstructeur()
6295 softime 6565 && $this->getStatutAutorisationDossier($this->getParameter("idxformulaire")) == "cloture"
6296     && $this->checkEvenementNonVerrouillable($this->getVal("instruction")) === false) {
6297 mbroquet 3730 //
6298     return false;
6299     }
6300    
6301 softime 6565 // Si l'utilisateur est un intructeur qui correspond à la division du
6302     // dossier
6303     if ($this->is_instructeur_from_division_dossier() === true) {
6304     //
6305     return true;
6306 mbroquet 3730 }
6307    
6308 softime 6565 // Si l'utilisateur est instructeur de la commune du dossier et que
6309     // l'instruction est créée par un instructeur de la commune
6310     if ($this->is_instructeur_from_collectivite_dossier() === true and
6311     $this->getVal('created_by_commune') === 't') {
6312     return true;
6313 mbroquet 3730 }
6314    
6315     //
6316 softime 6565 return false;
6317 mbroquet 3730 }
6318    
6319     /**
6320     * CONDITION - is_unfinalizable_without_bypass.
6321     *
6322     * Condition pour afficher le bouton sans le bypass.
6323     *
6324     * @return boolean
6325     */
6326     function is_unfinalizable_without_bypass() {
6327     // Récupère la valeur du champ finalisé
6328     $om_final_instruction = $this->getVal('om_final_instruction');
6329    
6330     // Si l'instruction est finalisée
6331     if ($om_final_instruction == 't') {
6332     //
6333     return true;
6334     }
6335    
6336     //
6337     return false;
6338     }
6339    
6340 softime 5169
6341 mbroquet 3730 /**
6342 softime 6565 * Permet de définir si un instructeur commune peut editer une instruction
6343     *
6344     * @return boolean true si il peut
6345     */
6346     function isInstrCanChangeDecision($idx) {
6347    
6348     if ($this->f->isAccredited(array("instruction", "instruction_changer_decision"), "OR") !== true or
6349     $this->f->isUserInstructeur() !== true) {
6350     return false;
6351     }
6352    
6353    
6354    
6355     // Sinon on vérifie l'éligibilité du dossier au changement de décision
6356 softime 11876 // /!\ Requête lié à celles du widget indiquant les dossiers éligible au changement
6357     // de décision :
6358     // * dossier_instruction.class.php : view_widget_dossiers_evenement_retour_finalise()
6359     // * dossier_instruction.inc.php : si le paramètre filtre_decision = true
6360     $sql = sprintf(
6361     'SELECT
6362 softime 6565 dossier.dossier
6363     FROM
6364 softime 11876 %1$sdossier
6365     JOIN %1$setat
6366     ON dossier.etat = etat.etat AND etat.statut = \'encours\'
6367     JOIN %1$slien_dossier_demandeur
6368     ON dossier.dossier = lien_dossier_demandeur.dossier AND lien_dossier_demandeur.petitionnaire_principal IS TRUE
6369     JOIN %1$sdossier_instruction_type
6370     ON dossier.dossier_instruction_type=dossier_instruction_type.dossier_instruction_type
6371     JOIN %1$sinstruction
6372     -- Recherche de la dernière instruction qui ne soit pas liée à un événement retour
6373     ON instruction.instruction = (
6374     SELECT instruction
6375     FROM %1$sinstruction
6376     JOIN %1$sevenement ON instruction.evenement=evenement.evenement
6377     AND evenement.retour IS FALSE
6378     WHERE instruction.dossier = dossier.dossier
6379     ORDER BY date_evenement DESC, instruction DESC
6380     LIMIT 1
6381     )
6382     -- On ne garde que les dossiers pour lesquels la dernière instruction est finalisée
6383     -- ou alors pour laquelle l instruction a été ajouté par la commune et est
6384     -- non signée, non notifié, etc.
6385     AND (instruction.om_final_instruction IS TRUE
6386     OR instruction.created_by_commune IS TRUE)
6387     AND instruction.date_retour_signature IS NULL
6388     AND instruction.date_envoi_rar IS NULL
6389     AND instruction.date_retour_rar IS NULL
6390     AND instruction.date_envoi_controle_legalite IS NULL
6391     AND instruction.date_retour_controle_legalite IS NULL
6392     -- On vérifie que l instruction soit un arrêté ou un changement de décision
6393     JOIN %1$sevenement
6394     ON instruction.evenement=evenement.evenement
6395     AND (evenement.type = \'arrete\'
6396     OR evenement.type = \'changement_decision\')
6397     -- Recherche les informations du pétitionnaire principal pour l affichage
6398     JOIN %1$sdemandeur
6399     ON lien_dossier_demandeur.demandeur = demandeur.demandeur
6400     -- Recherche la collectivité rattachée à l instructeur
6401     JOIN %1$sinstructeur
6402     ON dossier.instructeur=instructeur.instructeur
6403     JOIN %1$sdivision
6404     ON instructeur.division=division.division
6405     JOIN %1$sdirection
6406     ON division.direction=direction.direction
6407     JOIN %1$som_collectivite
6408     ON direction.om_collectivite=om_collectivite.om_collectivite
6409 softime 6565 WHERE
6410 softime 11876 -- Vérification que la décision a été prise par l agglo
6411     om_collectivite.niveau = \'2\'
6412     AND dossier.dossier = \'%2$s\'
6413     ',
6414     DB_PREFIXE,
6415 softime 14064 $this->f->db->escapeSimple($idx)
6416 softime 11876 );
6417 softime 6565
6418    
6419     // Si collectivité de l'utilisateur niveau mono alors filtre sur celle-ci
6420     if ($this->f->isCollectiviteMono($_SESSION['collectivite']) === true) {
6421 softime 11876 $sql .= sprintf(
6422 softime 14064 ' AND dossier.om_collectivite = %1$d',
6423     intval($_SESSION['collectivite'])
6424 softime 11876 );
6425 softime 6565 }
6426 softime 14064 $qres = $this->f->get_one_result_from_db_query(
6427     $sql,
6428     array(
6429     "origin" => __METHOD__,
6430     )
6431     );
6432    
6433     return $qres['result'] !== null;
6434 softime 6565 }
6435    
6436    
6437     /**
6438 softime 5169 * CONDITION - can_monitoring_dates.
6439     *
6440     * Condition pour afficher le bouton de suivi des dates.
6441     *
6442     * @return boolean
6443     */
6444     public function can_monitoring_dates() {
6445     // Récupère la valeur du champ finalisé
6446     $om_final_instruction = $this->getVal('om_final_instruction');
6447    
6448     // Si l'instruction n'est pas finalisée
6449     if ($om_final_instruction !== 't') {
6450     //
6451     return false;
6452     }
6453    
6454     // Contrôle si l'utilisateur possède un bypass
6455 softime 7996 $bypass = $this->f->isAccredited($this->get_absolute_class_name()."_modification_dates_bypass");
6456 softime 5169 if ($bypass === true) {
6457     return true;
6458     }
6459    
6460 softime 8989 // Permission de modifier le suivi des dates sur un dossier cloturé pour
6461     // un utilisateur lié à un instructeur
6462     $perm_moni_dates_d_closed = $this->f->isAccredited($this->get_absolute_class_name()."_modification_dates_cloture");
6463    
6464     // On vérifie en premier lieu que le DI n'est pas clôturé et que
6465     // l'utilisateur ne possède pas la permission de modifier le suivi des
6466     // dates sur un dossier clôturé
6467 softime 5169 $inst_dossier = $this->get_inst_dossier();
6468 softime 8989 if ($inst_dossier->getStatut() === 'cloture'
6469     && $perm_moni_dates_d_closed === false) {
6470 softime 5169 //
6471     return false;
6472     }
6473     // On récupère ses infos
6474     $coll_di = $inst_dossier->getVal('om_collectivite');
6475     $div_di = $this->getDivisionFromDossier();
6476     // et celles de son éventuel instructeur
6477     $instr_di = $inst_dossier->getVal('instructeur');
6478    
6479 softime 6565 // Il faut disposer d'une entrée instructeur
6480     if ($this->f->isUserInstructeur() === false) {
6481     return false;
6482     }
6483    
6484 softime 5169 // Par défaut on prétend que l'instructeur n'est pas multi
6485     $instr_di_coll_multi = false;
6486     // Si un instructeur est affecté au dossier
6487     if ($instr_di !== '' && $instr_di !== null) {
6488     // Vérifie si l'instructeur est de la collectivité de niveau 2
6489 softime 5295 $instr_di_coll = $this->get_instructeur_om_collectivite($instr_di);
6490 softime 5169 if ($this->f->isCollectiviteMono($instr_di_coll) === false) {
6491     //
6492     $instr_di_coll_multi = true;
6493     }
6494     }
6495    
6496 softime 6565 // Il faut qu'il instruise le dossier ou soit de la même division
6497     if ($this->f->om_utilisateur['instructeur'] === $instr_di
6498     || $this->f->om_utilisateur['division'] === $div_di) {
6499 softime 5169 //
6500     return true;
6501     }
6502    
6503 softime 6565 // On donne également le droit s'il est de la même collectivité que
6504     // le dossier ET si l'instruction est déléguée à la communauté
6505     if ($this->f->isCollectiviteMono($this->f->om_utilisateur['om_collectivite']) === true
6506     && $this->f->om_utilisateur['om_collectivite'] === $coll_di
6507     && $instr_di_coll_multi === true) {
6508 softime 5169 //
6509     return true;
6510     }
6511    
6512 softime 6565 // Si l'instructeur ne rentre pas dans les deux cas précédents
6513 softime 5169 return false;
6514     }
6515    
6516    
6517     /**
6518 softime 12847 * CONDITION - is_finalized.
6519     *
6520     * Condition pour vérifier si une instruction est finalisée.
6521     *
6522     * @return boolean
6523     */
6524     public function is_finalized() {
6525    
6526     return $this->getVal('om_final_instruction') === "t";
6527     }
6528    
6529     /**
6530     * CONDITION - is_not_date_retour_signature_set.
6531     *
6532     * Condition pour vérifier si une date de retour signature n'est pas définie.
6533     *
6534     * @return boolean
6535     */
6536     public function is_not_date_retour_signature_set() {
6537    
6538     return $this->getVal('date_retour_signature') == null;
6539    
6540     }
6541    
6542    
6543     /**
6544 mbroquet 3730 * TREATMENT - finalize.
6545     *
6546     * Permet de finaliser un enregistrement.
6547     *
6548     * @param array $val valeurs soumises par le formulaire
6549     *
6550     * @return boolean
6551     */
6552     function finalize($val = array()) {
6553    
6554     // Cette méthode permet d'exécuter une routine en début des méthodes
6555     // dites de TREATMENT.
6556     $this->begin_treatment(__METHOD__);
6557 softime 10808 $message = '';
6558 softime 11585 $ev = $this->get_inst_evenement($this->getVal('evenement'));
6559 mbroquet 3730
6560 softime 11585 // Controle du signataire
6561     if (! $this->controle_signataire($ev)) {
6562     $this->addToMessage(__("Le document ne peut pas être finalisé car aucun signataire n'a été sélectionné."));
6563     // Termine le traitement
6564     return $this->end_treatment(__METHOD__, false);
6565     }
6566    
6567 mbroquet 3730 // Traitement de la finalisation
6568     $ret = $this->manage_finalizing("finalize", $val);
6569    
6570     // Si le traitement retourne une erreur
6571     if ($ret !== true) {
6572    
6573     // Termine le traitement
6574 softime 5024 return $this->end_treatment(__METHOD__, false);
6575 mbroquet 3730 }
6576    
6577 softime 10808 // Envoi des notifications aux demandeurs si la notification est automatique
6578     // et que la signature n'est pas requise
6579     if ($ev->getVal('notification') === 'notification_automatique') {
6580 softime 13137 // Préparation du message de log en cas d'erreur de notification
6581 softime 13528 $msgLog = sprintf(
6582     '%s %s : %d',
6583     __('Erreur lors de la notification automatique du(des) pétitionnaire(s) suite à la finalisation de l\'instruction.'),
6584     __('Instruction notifiée'),
6585     $this->getVal($this->clePrimaire)
6586     );
6587 softime 10808 // Récupération de la catégorie et envoie des notifications au(x) demandeur(s)
6588     $collectivite_di = $this->get_dossier_instruction_om_collectivite($this->getVal('dossier'));
6589     // Récupération de la liste des demandeurs à notifier et de la catégorie
6590     $categorie = $this->f->get_param_option_notification($collectivite_di);
6591 softime 14064 $isPortal = $categorie === PORTAL;
6592 softime 10869 $demandeursANotifie = $this->get_demandeurs_notifiable(
6593     $this->getVal('dossier'),
6594     $isPortal
6595     );
6596 softime 10808
6597     // Création d'une notification et d'une tâche pour chaque demandeur à notifier
6598 softime 12124 $demandeurPrincipalNotifie = false;
6599 softime 10813 if (count($demandeursANotifie) > 0) {
6600     foreach ($demandeursANotifie as $demandeur) {
6601 softime 12124 // Identifie si le demandeur principal a été notifié ou pas
6602     // et récupère ses informations
6603     if ($demandeur['petitionnaire_principal'] == 't') {
6604     $demandeurPrincipalNotifie = true;
6605     // Si le demandeur principal est notifiable mais qu'il y a des erreurs dans
6606     // son paramétrage, on effectue pas le traitement et on passe à l'itération
6607     // suivante. On le considère également comme non notifié pour gérer l'envoie
6608     // des messages d'erreurs
6609     // Si la demande a été déposée via le portail alors le paramétrage n'a pas
6610     // d'impact sur la notification
6611     $erreursParam = $this->get_info_notification_fail();
6612     if (! $this->dossier_depose_sur_portail() && $erreursParam != array()) {
6613     $demandeurPrincipalNotifie = false;
6614     continue;
6615     }
6616     }
6617 softime 10813 // Ajout de la notif et récupération de son id
6618     $idNotif = $this->ajouter_notification(
6619     $this->getVal($this->clePrimaire),
6620     $this->f->get_connected_user_login_name(),
6621 softime 10968 $demandeur,
6622     $collectivite_di,
6623 softime 12433 array(),
6624 softime 10968 true
6625 softime 10808 );
6626 softime 10813 if ($idNotif === false) {
6627     // Termine le traitement
6628 softime 13528 $this->addToLog(
6629     sprintf('%s() : %s', __METHOD__, $msgLog),
6630     DEBUG_MODE
6631     );
6632 softime 10813 return $this->end_treatment(__METHOD__, false);
6633     }
6634     $notification_by_task = $this->notification_by_task(
6635     $idNotif,
6636     $this->getVal('dossier'),
6637     $categorie
6638 softime 10808 );
6639 softime 10813 if ($notification_by_task === false) {
6640 softime 13528 $this->addToLog(
6641     sprintf('%s() : %s', __METHOD__, $msgLog),
6642     DEBUG_MODE
6643     );
6644 softime 10813 $this->addToMessage(
6645     __("Erreur lors de la génération de la notification au(x) pétitionnaire(s).")
6646     );
6647     // Termine le traitement
6648     return $this->end_treatment(__METHOD__, false);
6649     }
6650 softime 12124 $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.")));
6651 softime 10808 }
6652     }
6653 softime 12847 // Pour la notification par mail ou la notification via portal si le dossier a
6654     // été déposés via portal, si le demandeur principal n'est pas notifiable,
6655     // on créé une nouvelle notification en erreur avec en commentaire la raison pour
6656     // laquelle le demandeur principal n'a pas pu être notifié
6657     $depotPortal = $this->dossier_depose_sur_portail();
6658     if (! $demandeurPrincipalNotifie && ($isPortal === false || $depotPortal === true)) {
6659 softime 13137 // Préparation des logs pour indiquer que le pétitionnaire principale n'est pas notifiable
6660 softime 13528 $msgLog .= sprintf(' %s', __('Le pétitionnaire principale n\'est pas notifiable.'));
6661 softime 12124 // Analyse pour savoir pourquoi le demandeur principal n'est pas notifiable
6662     $erreursParam = $this->get_info_notification_fail();
6663     $demandeurPrincipal = $this->get_info_petitionnaire_principal_dossier($this->getVal('dossier'));
6664     // Ajout de la notif et récupération de son id
6665     $idNotif = $this->ajouter_notification(
6666     $this->valF[$this->clePrimaire],
6667     $this->f->get_connected_user_login_name(),
6668     $demandeurPrincipal,
6669     $collectivite_di,
6670 softime 12433 array(),
6671 softime 12124 true,
6672     'Echec',
6673     implode(' ', $erreursParam)
6674     );
6675     if ($idNotif === false) {
6676     $this->addToMessage(
6677     __('Erreur : la création de la notification a échouée.').
6678     __("Veuillez contacter votre administrateur.")
6679     );
6680 softime 13528 $this->addToLog(
6681     sprintf('%s() : %s', __METHOD__, $msgLog),
6682     DEBUG_MODE
6683     );
6684 softime 12124 return false;
6685     }
6686     // Prépare un message d'alerte à destination de l'instructeur pour l'informer
6687     // de l'échec de la notification
6688     $dossier_message = $this->get_inst_dossier_message(0);
6689     $dossier_message_val = array(
6690     'dossier' => $this->getVal('dossier'),
6691     'type' => _('erreur expedition'),
6692     'emetteur' => $this->f->get_connected_user_login_name(),
6693     'login' => $_SESSION['login'],
6694     'date_emission' => date('Y-m-d H:i:s'),
6695     'contenu' => _('Échec lors de la notification de l\'instruction ').
6696     $ev->getVal('libelle').
6697     '.<br>'.
6698     implode("\n", $erreursParam).
6699     '<br>'.
6700     _('Veuillez corriger ces informations avant de renvoyer la notification.')
6701     );
6702     $add = $dossier_message->add_notification_message($dossier_message_val, true);
6703     // Si une erreur se produit pendant l'ajout
6704     if ($add !== true) {
6705     $this->addToLog(__METHOD__."(): Le message d'alerte concernant l'echec de l'envoi de la notification n'a pas pu être envoyé.", DEBUG_MODE);
6706     return false;
6707     }
6708     }
6709 softime 10808 }
6710    
6711 mbroquet 3730 // Termine le traitement
6712     return $this->end_treatment(__METHOD__, true);
6713     }
6714    
6715     /**
6716 softime 12124 * Récupère l'instance de dossier message.
6717     *
6718     * @param string $dossier_message Identifiant du message.
6719     *
6720     * @return object
6721     */
6722     private function get_inst_dossier_message($dossier_message = null) {
6723     //
6724     return $this->get_inst_common("dossier_message", $dossier_message);
6725     }
6726    
6727     /**
6728 softime 11585 * Vérifie si le signataire est obligatoire pour finaliser
6729     * le document apartir du paramétrage de l'événement.
6730     * Si c'est le cas, vérifie si il y a bien un signataire
6731     * renseigné.
6732     * Si c'est le cas renvoie true, sinon renvoie false.
6733     *
6734     * @param evenement évenement de l'instruction permettant de
6735     * récupérer le paramétrage
6736     * @return boolean
6737     */
6738     protected function controle_signataire($evenement) {
6739     // Vérifie si le signataire est obligatoire et si c'est le cas
6740     // vérifie si il y a bien un signataire pour le document
6741     if ($evenement->is_signataire_obligatoire() &&
6742     ($this->getVal('signataire_arrete') === null ||
6743     $this->getVal('signataire_arrete') === '')) {
6744     return false;
6745     }
6746     return true;
6747     }
6748    
6749     /**
6750 mbroquet 3730 * TREATMENT - unfinalize.
6751     *
6752     * Permet de définaliser un enregistrement.
6753     *
6754     * @param array $val valeurs soumises par le formulaire
6755     *
6756     * @return boolean
6757     */
6758     function unfinalize($val = array()) {
6759    
6760     // Cette méthode permet d'exécuter une routine en début des méthodes
6761     // dites de TREATMENT.
6762     $this->begin_treatment(__METHOD__);
6763    
6764     // Traitement de la finalisation
6765     $ret = $this->manage_finalizing("unfinalize", $val);
6766    
6767     // Si le traitement retourne une erreur
6768     if ($ret !== true) {
6769    
6770     // Termine le traitement
6771 softime 5024 return $this->end_treatment(__METHOD__, false);
6772 mbroquet 3730 }
6773    
6774     // Termine le traitement
6775     return $this->end_treatment(__METHOD__, true);
6776     }
6777    
6778     /**
6779     * VIEW - view_edition
6780     *
6781     * Edite l'édition de l'instruction ou affiche celle contenue dans le stockage.
6782     *
6783     * @return null Si l'action est incorrecte
6784     */
6785     function view_edition() {
6786    
6787     // Si l'instruction est finalisée
6788     if($this->getVal("om_final_instruction") == 't'
6789     && $this->getVal("om_final_instruction") != null) {
6790    
6791     // Ouvre le document
6792 softime 7996 $lien = '../app/index.php?module=form&snippet=file&obj='.$this->table.'&'.
6793 mbroquet 3730 'champ=om_fichier_instruction&id='.$this->getVal($this->clePrimaire);
6794     //
6795     header("Location: ".$lien);
6796     } else {
6797    
6798     // Récupère la collectivite du dossier d'instruction
6799     $dossier_instruction_om_collectivite = $this->get_dossier_instruction_om_collectivite();
6800    
6801     //
6802     $collectivite = $this->f->getCollectivite($dossier_instruction_om_collectivite);
6803    
6804     // Paramètre du PDF
6805     $params = array(
6806     "watermark" => true,
6807     "specific" => array(
6808     "mode" => "previsualisation",
6809     ),
6810     );
6811 softime 8593 // Si la rédaction libre est activée sur l'instruction
6812     if ($this->getVal("flag_edition_integrale") == 't') {
6813     $params["specific"]["corps"] = array(
6814     "mode" => "set",
6815     "value" => $this->getVal("corps_om_htmletatex"),
6816     );
6817     $params["specific"]["titre"] = array(
6818     "mode" => "set",
6819     "value" => $this->getVal("titre_om_htmletat"),
6820     );
6821     }
6822 mbroquet 3730
6823     // Génération du PDF
6824     $result = $this->compute_pdf_output('lettretype', $this->getVal("lettretype"), $collectivite, null, $params);
6825     // Affichage du PDF
6826     $this->expose_pdf_output(
6827     $result['pdf_output'],
6828     $result['filename']
6829     );
6830     }
6831     }
6832    
6833     /**
6834     * Récupère la collectivité du dossier d'instruction.
6835     *
6836 softime 7685 * @param string $dossier_instruction_id Identifiant du DI.
6837     *
6838 mbroquet 3730 * @return integer
6839     */
6840 softime 7685 function get_dossier_instruction_om_collectivite($dossier_instruction_id = null) {
6841 mbroquet 3730
6842 softime 7685 // Si l'identifiant n'est pas renseigné
6843     if ($dossier_instruction_id === null) {
6844 softime 8593 // Récupère la valeur
6845     if ($this->getVal('dossier') !== null && $this->getVal('dossier') !== '') {
6846     $dossier_instruction_id = $this->getVal('dossier');
6847     } elseif ($this->getParameter('idxformulaire') !== null
6848     && $this->getParameter('idxformulaire') !== '') {
6849     //
6850     $dossier_instruction_id = $this->getParameter('idxformulaire');
6851     } elseif ($this->f->get_submitted_get_value('idxformulaire') !== null
6852     && $this->f->get_submitted_get_value('idxformulaire') !== '') {
6853     //
6854     $dossier_instruction_id = $this->f->get_submitted_get_value('idxformulaire');
6855     }
6856 softime 7685 }
6857    
6858 mbroquet 3730 //
6859 softime 7996 $dossier_instruction = $this->f->get_inst__om_dbform(array(
6860     "obj" => "dossier_instruction",
6861     "idx" => $dossier_instruction_id,
6862     ));
6863 mbroquet 3730
6864     //
6865     return $dossier_instruction->getVal('om_collectivite');
6866     }
6867    
6868     /**
6869     * VIEW - view_bible
6870     *
6871     * Affiche la bible manuelle.
6872     *
6873     * @return void
6874     */
6875     function view_bible() {
6876     // Vérification de l'accessibilité sur l'élément
6877     $this->checkAccessibility();
6878    
6879     /**
6880     * Affichage de la structure HTML
6881     */
6882     //
6883 softime 8989 if ($this->f->isAjaxRequest()) {
6884 mbroquet 3730 //
6885     header("Content-type: text/html; charset=".HTTPCHARSET."");
6886     } else {
6887     //
6888 softime 8989 $this->f->setFlag("htmlonly");
6889     $this->f->display();
6890 mbroquet 3730 }
6891     //
6892 softime 8989 $this->f->displayStartContent();
6893 mbroquet 3730 //
6894 softime 8989 $this->f->setTitle(_("Liste des éléments de la bible en lien avec un evenement"));
6895     $this->f->displayTitle();
6896 mbroquet 3730
6897     /**
6898     *
6899     */
6900     //
6901 softime 8989 ($this->f->get_submitted_get_value("ev") ? $evenement = $this->f->get_submitted_get_value("ev") : $evenement = "");
6902 mbroquet 3730 $evenement = intval($evenement);
6903     //
6904 softime 8989 ($this->f->get_submitted_get_value("idx") ? $idx = $this->f->get_submitted_get_value("idx") : $idx = "");
6905 softime 5169 // Récupération du code du type de DA
6906     $code_da_type = '';
6907     if (preg_match('/[A-Za-z]{2,3}/', $idx, $matches) !== false) {
6908     $code_da_type = $matches[0];
6909     }
6910 mbroquet 3730 //
6911 softime 8989 ($this->f->get_submitted_get_value("complement") ? $complement = $this->f->get_submitted_get_value("complement") : $complement = "1");
6912 mbroquet 3730
6913     // Récupération de la collectivité du dossier
6914 softime 7996 $dossier = $this->f->get_inst__om_dbform(array(
6915     "obj" => "dossier",
6916     "idx" => $idx,
6917     ));
6918 mbroquet 3730
6919 softime 14542 $qres = $this->f->get_all_results_from_db_query(
6920     sprintf(
6921     'SELECT
6922     *,
6923     bible.libelle as bible_lib
6924     FROM
6925     %1$sbible
6926     LEFT OUTER JOIN %1$sdossier_autorisation_type
6927     ON bible.dossier_autorisation_type = dossier_autorisation_type.dossier_autorisation_type
6928     LEFT JOIN %1$som_collectivite
6929     ON bible.om_collectivite = om_collectivite.om_collectivite
6930     WHERE
6931     (evenement = %2$d
6932     OR evenement IS NULL)
6933     AND (complement = %3$d
6934     OR complement IS NULL)
6935     AND (bible.dossier_autorisation_type IS NULL
6936     OR dossier_autorisation_type.code = \'%4$s\')
6937     AND (om_collectivite.niveau = \'2\'
6938     OR bible.om_collectivite = %5$d)
6939     ORDER BY
6940     bible_lib ASC',
6941     DB_PREFIXE,
6942     intval($evenement),
6943     intval($complement),
6944     $this->f->db->escapeSimple($code_da_type),
6945     intval($dossier->getVal("om_collectivite"))
6946     ),
6947     array(
6948     'origin' => __METHOD__
6949     )
6950     );
6951 mbroquet 3730 //
6952     echo "<form method=\"post\" name=\"f3\" action=\"#\">\n";
6953     //
6954 softime 14542 if (count($qres['result']) > 0) {
6955 mbroquet 3730 //
6956     echo "\t<table id='tab-bible' width='100%'>\n";
6957     //
6958     echo "\t\t<tr class=\"ui-tabs-nav ui-accordion ui-state-default tab-title\">";
6959     echo "<th>"._("Choisir")."</th>";
6960     echo "<th>"._("Libelle")."</th>";
6961     echo "</tr>\n";
6962     //
6963     $i = 0;
6964     //
6965 softime 14542 foreach ($qres['result'] as $row) {
6966 mbroquet 3730 //
6967     echo "\t\t<tr";
6968     echo " class=\"".($i % 2 == 0 ? "odd" : "even")."\"";
6969     echo ">";
6970     //
6971     echo "<td class=\"center\"><input type=\"checkbox\" name=\"choix[]\" value=\"".$i."\" id=\"checkbox".$i."\" /></td>";
6972     // XXX utilisation de l'attribut titre pour afficher une infobulle
6973     echo "<td><span class=\"content\" title=\"".htmlentities($row['contenu'])."\" id=\"content".$i."\">".$row['bible_lib']."</span></td>";
6974     //
6975     echo "</tr>\n";
6976     //
6977     $i++;
6978     }
6979     echo "\t</table>\n";
6980     //
6981     echo "<div class=\"formControls\">\n";
6982 softime 8989 $this->f->layout->display_form_button(array(
6983 mbroquet 3730 "value" => _("Valider"),
6984     "onclick" => "bible_return('f2', 'complement".($complement == "1" ? "" : $complement)."_om_html'); return false;",
6985     ));
6986 softime 8989 $this->f->displayLinkJsCloseWindow();
6987 mbroquet 3730 echo "</div>\n";
6988    
6989     } else {
6990     //
6991     $message_class = "error";
6992     $message = _("Aucun element dans la bible pour l'evenement")." : ".$evenement;
6993 softime 8989 $this->f->displayMessage($message_class, $message);
6994 mbroquet 3730 //
6995     echo "<div class=\"formControls\">\n";
6996 softime 8989 $this->f->displayLinkJsCloseWindow();
6997 mbroquet 3730 echo "</div>\n";
6998     }
6999     //
7000     echo "</form>\n";
7001    
7002     /**
7003     * Affichage de la structure HTML
7004     */
7005     //
7006 softime 8989 $this->f->displayEndContent();
7007 mbroquet 3730 }
7008    
7009     /**
7010 softime 5169 * VIEW - view_bible_auto
7011 mbroquet 3730 *
7012 softime 5169 * Renvoie les valeurs de la bible à placer dans les compléments de l'instruction.
7013 mbroquet 3730 *
7014     * @return void
7015     */
7016     function view_bible_auto() {
7017     // Vérification de l'accessibilité sur l'élément
7018     $this->checkAccessibility();
7019     //
7020 softime 8989 $this->f->disableLog();
7021 mbroquet 3730
7022     $formatDate="AAAA-MM-JJ";
7023    
7024     // Récupération des paramètres
7025 softime 8989 $idx = $this->f->get_submitted_get_value('idx');
7026     $evenement = $this->f->get_submitted_get_value('ev');
7027 mbroquet 3730
7028     // Initialisation de la variable de retour
7029     $retour['complement_om_html'] = '';
7030     $retour['complement2_om_html'] = '';
7031     $retour['complement3_om_html'] = '';
7032     $retour['complement4_om_html'] = '';
7033 softime 14064
7034 mbroquet 3730 // Vérification d'une consultation liée à l'événement
7035 softime 14064 $instEvenement = $this->f->get_inst__om_dbform(array(
7036     "obj" => "evenement",
7037     "idx" => $evenement,
7038     ));
7039    
7040 mbroquet 3730 // Si consultation liée, récupération du retour d'avis
7041 softime 14064 if($instEvenement->getVal('consultation') == 'Oui'){
7042 softime 14542
7043     $qres = $this->f->get_all_results_from_db_query(
7044     sprintf(
7045     'SELECT
7046     date_retour,
7047     avis_consultation.libelle as avis_consultation,
7048     COALESCE(service.libelle, tiers_consulte.libelle) as service
7049     FROM
7050     %1$sconsultation
7051     LEFT JOIN %1$stiers_consulte
7052     ON consultation.tiers_consulte = tiers_consulte.tiers_consulte
7053     LEFT JOIN %1$sservice
7054     ON consultation.service = service.service
7055     LEFT JOIN %1$savis_consultation
7056     ON consultation.avis_consultation = avis_consultation.avis_consultation
7057     WHERE
7058     dossier = \'%2$s\'
7059     AND consultation.visible',
7060     DB_PREFIXE,
7061     $this->f->db->escapeSimple($idx)
7062     ),
7063     array(
7064     'origin' => __METHOD__
7065     )
7066 softime 11876 );
7067 mbroquet 3730 // Récupération des consultations
7068 softime 14542 foreach ($qres['result'] as $row) {
7069 mbroquet 3730 $correct=false;
7070     // date retour
7071     if ($row['date_retour']<>""){
7072     if ($formatDate=="AAAA-MM-JJ"){
7073     $date = explode("-", $row['date_retour']);
7074     // controle de date
7075     if (count($date) == 3 and
7076     checkdate($date[1], $date[2], $date[0])) {
7077     $date_retour_f= $date[2]."/".$date[1]."/".$date[0];
7078     $correct=true;
7079     }else{
7080     $msg= $msg."<br>La date ".$row['date_retour']." n'est pas une date.";
7081     $correct=false;
7082     }
7083     }
7084     }
7085     //
7086     $temp="Vu l'avis ".$row['avis_consultation']." du service ".$row['service'];
7087     if($correct == true){
7088     $temp=$temp." du ".$date_retour_f;
7089     }
7090     // Concaténation des retours d'avis de consultation
7091 softime 7067 $retour['complement_om_html'] .= $temp . "<br/><br/>";
7092 mbroquet 3730 } // while
7093    
7094     } // consultation
7095     // Récupération des bibles automatiques pour le champ complement_om_html
7096 softime 8989 $retour['complement_om_html'] .= $this->getBible($evenement, $idx, '1');
7097 mbroquet 3730 // Récupération des bibles automatiques pour le champ complement2_om_html
7098 softime 8989 $retour['complement2_om_html'] .= $this->getBible($evenement, $idx, '2');
7099 mbroquet 3730 // Récupération des bibles automatiques pour le champ complement3_om_html
7100 softime 8989 $retour['complement3_om_html'] .= $this->getBible($evenement, $idx, '3');
7101 mbroquet 3730 // Récupération des bibles automatiques pour le champ complement4_om_html
7102 softime 8989 $retour['complement4_om_html'] .= $this->getBible($evenement, $idx, '4');
7103 mbroquet 3730
7104    
7105    
7106     echo json_encode($retour);
7107     }
7108    
7109     /**
7110 softime 7521 * VIEW - view_pdf_temp
7111     *
7112     * @return void
7113     */
7114     function view_pdf_temp() {
7115     $this->checkAccessibility();
7116 softime 8593 // Utilisation de $_POST pour ne pas que les textes soient altérés.
7117 softime 7521 $this->f->set_submitted_value();
7118 softime 8593 $merge_fields = array();
7119     //
7120     if (array_key_exists('c1', $_POST) === true) {
7121 softime 11876 $merge_fields['[complement_instruction]'] = $_POST['c1'];
7122     $merge_fields['[complement1_instruction]'] = $_POST['c1'];
7123 softime 8593 }
7124     if (array_key_exists('c2', $_POST) === true) {
7125 softime 11876 $merge_fields['[complement2_instruction]'] = $_POST['c2'];
7126 softime 8593 }
7127     if (array_key_exists('c3', $_POST) === true) {
7128 softime 11876 $merge_fields['[complement3_instruction]'] = $_POST['c3'];
7129 softime 8593 }
7130     if (array_key_exists('c4', $_POST) === true) {
7131 softime 11876 $merge_fields['[complement4_instruction]'] = $_POST['c4'];
7132 softime 8593 }
7133 softime 7521 $params = array(
7134     "watermark" => true,
7135     "specific" => array(
7136     "merge_fields" => $merge_fields,
7137     ),
7138     );
7139 softime 8593 //
7140     if (array_key_exists('corps', $_POST) === true) {
7141     $params["specific"]["corps"] = array(
7142     "mode" => "set",
7143 softime 11876 "value" => $_POST['corps'],
7144 softime 8593 );
7145     }
7146     if (array_key_exists('titre', $_POST) === true) {
7147     $params["specific"]["titre"] = array(
7148     "mode" => "set",
7149 softime 11876 "value" => $_POST['titre'],
7150 softime 8593 );
7151     }
7152 softime 7521 $dossier_instruction_om_collectivite = $this->get_dossier_instruction_om_collectivite();
7153     $collectivite = $this->f->getCollectivite($dossier_instruction_om_collectivite);
7154     $result = $this->compute_pdf_output('lettretype', $this->getVal('lettretype'), $collectivite, null, $params);
7155     $retour = array(
7156     'base' => base64_encode($result['pdf_output']),
7157     );
7158     echo json_encode($retour);
7159     }
7160    
7161     /**
7162     * Dans le contexte de prévisualisation des éditions, génère le rendu du
7163     * PDF sans prise en compte de la valeur des compléments et le retourne en
7164     * base 64.
7165     *
7166     * @return string Rendu PDF converti en base 64.
7167     */
7168     function init_pdf_temp() {
7169     $params = array(
7170     "watermark" => true,
7171     );
7172 softime 8593 // Si la rédaction libre est activée sur l'instruction
7173     if ($this->getVal("flag_edition_integrale") == 't') {
7174     $params["specific"]["corps"] = array(
7175     "mode" => "set",
7176     "value" => $this->getVal("corps_om_htmletatex"),
7177     );
7178     $params["specific"]["titre"] = array(
7179     "mode" => "set",
7180     "value" => $this->getVal("titre_om_htmletat"),
7181     );
7182     }
7183 softime 7521 $dossier_instruction_om_collectivite = $this->get_dossier_instruction_om_collectivite();
7184     $collectivite = $this->f->getCollectivite($dossier_instruction_om_collectivite);
7185     $result = $this->compute_pdf_output('lettretype', $this->getVal('lettretype'), $collectivite, null, $params);
7186    
7187     return base64_encode($result['pdf_output']);
7188     }
7189    
7190     /**
7191 mbroquet 3730 * Récupération des éléments de bible.
7192     *
7193     * @param integer $event id de l'événement
7194     * @param string $idx id du dossier
7195     * @param integer $compnb numéro du champ complement
7196     *
7197     * @return string Chaîne de texte à insérer dans le champ complement
7198     */
7199 softime 8989 function getBible($event, $idx, $compnb) {
7200 mbroquet 3730 // Récupération de la collectivité du dossier
7201 softime 7996 $dossier = $this->f->get_inst__om_dbform(array(
7202     "obj" => "dossier",
7203     "idx" => $idx,
7204     ));
7205 softime 5169 // Récupération du code du type de DA
7206     $code_da_type = '';
7207     if (preg_match('/[A-Za-z]{2,3}/', $idx, $matches) !== false) {
7208     $code_da_type = $matches[0];
7209     }
7210 mbroquet 3730
7211 softime 14542 $qres = $this->f->get_all_results_from_db_query(
7212     sprintf(
7213     'SELECT
7214     *
7215     FROM
7216     %1$sbible
7217     LEFT OUTER JOIN %1$sdossier_autorisation_type
7218     ON bible.dossier_autorisation_type =
7219     dossier_autorisation_type.dossier_autorisation_type
7220     LEFT JOIN %1$som_collectivite
7221     ON bible.om_collectivite = om_collectivite.om_collectivite
7222     WHERE
7223     (evenement = %2$d
7224     OR evenement IS NULL)
7225     AND (complement = %3$d
7226     OR complement IS NULL)
7227     AND automatique = \'Oui\'
7228     AND (dossier_autorisation_type.code = \'%4$s\'
7229     OR bible.dossier_autorisation_type IS NULL)
7230     AND (om_collectivite.niveau = \'2\'
7231     OR bible.om_collectivite = %5$d)',
7232     DB_PREFIXE,
7233     intval($event),
7234     intval($compnb),
7235     $this->f->db->escapeSimple($code_da_type),
7236     intval($dossier->getVal("om_collectivite"))
7237     ),
7238     array(
7239     "origin" => __METHOD__
7240     )
7241     );
7242 mbroquet 3730 $temp = "";
7243 softime 14542 foreach ($qres['result'] as $row) {
7244 mbroquet 3730 // Remplacement des retours à la ligne par des br
7245     $temp .= preg_replace(
7246     '#(\\\r|\\\r\\\n|\\\n)#', '<br/>', $row['contenu']
7247     );
7248 softime 7521 // Ajout d'un saut de ligne entre chaque bible.
7249     $temp .= '<br/>';
7250 mbroquet 3730 } // fin while
7251     return $temp;
7252     }
7253    
7254     /**
7255     * VIEW - view_suivi_bordereaux.
7256     *
7257 nmeucci 4317 * Formulaire de choix du bordereau de suivi, permettant de générer les 4 bordereaux.
7258     * Si l'utilisateur est d'une collectivité de niveau 2 il a le choix de la
7259     * collectivité des dossiers affichés.
7260 mbroquet 3730 *
7261     * @return void
7262     */
7263     function view_suivi_bordereaux() {
7264     // Vérification de l'accessibilité sur l'élément
7265     $this->checkAccessibility();
7266    
7267     /**
7268     * Validation du formulaire
7269     */
7270     // Si le formulaire a été validé
7271 softime 8989 if ($this->f->get_submitted_post_value("validation") !== null) {
7272 mbroquet 3730 // Si un bordereau à été sélectionné
7273 softime 8989 if ($this->f->get_submitted_post_value("bordereau") !== null && $this->f->get_submitted_post_value("bordereau") == "" ) {
7274 mbroquet 3730 // Si aucun bordereau n'a été sélectionné
7275     $message_class = "error";
7276     $message = _("Veuillez selectionner un bordereau.");
7277     }
7278     // Sinon si les dates ne sont pas valide
7279 softime 8989 elseif (($this->f->get_submitted_post_value("date_bordereau_debut") !== null
7280     && $this->f->get_submitted_post_value("date_bordereau_debut") == "")
7281     || ($this->f->get_submitted_post_value("date_bordereau_fin") !== null
7282     && $this->f->get_submitted_post_value("date_bordereau_fin") == "")) {
7283 mbroquet 3730 // Si aucune date n'a été saisie
7284     $message_class = "error";
7285     $message = _("Veuillez saisir une date valide.");
7286     }
7287 softime 7366 // Sinon si les dates ne sont pas valides
7288 softime 8989 elseif ($this->f->get_submitted_post_value("bordereau") === "bordereau_avis_maire_prefet"
7289     && $this->f->getParameter("id_evenement_bordereau_avis_maire_prefet") == null) {
7290 softime 7366 // Si aucune date n'a été saisie
7291     $message_class = "error";
7292     $message = _("Erreur de parametrage. Contactez votre administrateur.");
7293     }
7294 mbroquet 3730 // Affiche le message de validation
7295     else {
7296     // On récupère le libellé du bordereau pour l'afficher à l'utilisateur
7297 softime 14064 $etat = $this->f->get_inst__om_dbform(array(
7298     "obj" => "om_etat",
7299     "idx" => $this->f->get_submitted_post_value("bordereau")
7300     ));
7301     $qres = $this->f->get_one_result_from_db_query(
7302     sprintf(
7303     'SELECT
7304     om_etat.libelle
7305     FROM
7306     %som_etat
7307     WHERE
7308     om_etat.id = \'%s\'',
7309     DB_PREFIXE,
7310     $this->f->db->escapeSimple($this->f->get_submitted_post_value("bordereau"))
7311     ),
7312     array(
7313     "origin" => __METHOD__,
7314     )
7315     );
7316    
7317 mbroquet 3730 //
7318     $message_class = "valid";
7319     $message = _("Cliquez sur le lien ci-dessous pour telecharger votre bordereau");
7320     $message .= " : <br/><br/>";
7321     $message .= "<a class='om-prev-icon pdf-16'";
7322     $message .= " title=\""._("Bordereau")."\"";
7323 softime 7996 $message .= "href='".OM_ROUTE_FORM."&obj=instruction";
7324 nmeucci 4317 $message .= "&action=220";
7325     $message .= "&idx=0";
7326 softime 8989 $message .= "&type_bordereau=".$this->f->get_submitted_post_value("bordereau");
7327     $message .= "&date_bordereau_debut=".$this->f->get_submitted_post_value("date_bordereau_debut");
7328     $message .= "&date_bordereau_fin=".$this->f->get_submitted_post_value("date_bordereau_fin");
7329 mbroquet 3730 // Si l'utilisateur est MULTI alors on ajoute le paramètre collectivite
7330 softime 8989 if ($this->f->get_submitted_post_value("om_collectivite") !== null) {
7331     $message .= "&collectivite=".$this->f->get_submitted_post_value("om_collectivite");
7332 mbroquet 3730 }
7333     $message .= "'"." target='_blank'>";
7334 softime 14064 $message .= $qres['result']." "._("du")." ".$this->f->get_submitted_post_value("date_bordereau_debut")
7335 softime 8989 ." "._("au")." ".$this->f->get_submitted_post_value("date_bordereau_fin");
7336 mbroquet 3730 $message .= "</a>";
7337     }
7338     }
7339    
7340     /**
7341     * Affichage des messages et du formulaire
7342     */
7343     // Affichage du message de validation ou d'erreur
7344     if (isset($message) && isset($message_class) && $message != "") {
7345 softime 8989 $this->f->displayMessage($message_class, $message);
7346 mbroquet 3730 }
7347     // Ouverture du formulaire
7348     printf("\t<form");
7349     printf(" method=\"post\"");
7350     printf(" id=\"suivi_bordereaux_form\"");
7351     printf(" action=\"\"");
7352     printf(">\n");
7353     // Paramétrage des champs du formulaire
7354     $champs = array("date_bordereau_debut", "date_bordereau_fin", "bordereau");
7355 softime 8989 // Si l'utilisateur est d'une collectivité de niveau 2 on affiche un select
7356 mbroquet 3730 // collectivité dans le formulaire
7357 softime 8989 if ($_SESSION["niveau"] == 2) {
7358 mbroquet 3730 array_push($champs, "om_collectivite");
7359     }
7360     // Création d'un nouvel objet de type formulaire
7361 softime 7996 $form = $this->f->get_inst__om_formulaire(array(
7362     "validation" => 0,
7363     "maj" => 0,
7364     "champs" => $champs,
7365     ));
7366 mbroquet 3730 // Paramétrage du champ date_bordereau_debut
7367     $form->setLib("date_bordereau_debut", _("date_bordereau_debut"));
7368     $form->setType("date_bordereau_debut", "date");
7369     $form->setTaille("date_bordereau_debut", 12);
7370     $form->setMax("date_bordereau_debut", 12);
7371     $form->setRequired("date_bordereau_debut");
7372     $form->setOnchange("date_bordereau_debut", "fdate(this)");
7373     $form->setVal("date_bordereau_debut", date("d/m/Y"));
7374     // Paramétrage du champ date_bordereau_fin
7375     $form->setLib("date_bordereau_fin", _("date_bordereau_fin"));
7376     $form->setType("date_bordereau_fin", "date");
7377     $form->setTaille("date_bordereau_fin", 12);
7378     $form->setMax("date_bordereau_fin", 12);
7379     $form->setRequired("date_bordereau_fin");
7380     $form->setOnchange("date_bordereau_fin", "fdate(this)");
7381     $form->setVal("date_bordereau_fin", date("d/m/Y"));
7382     // Paramétrage du champ bordereau
7383     $form->setLib("bordereau", _("bordereau"));
7384     $form->setType("bordereau", "select");
7385     $form->setRequired("bordereau");
7386     // Valeurs des champs
7387 softime 8989 if ($this->f->get_submitted_post_value("validation") !== null) {
7388     $form->setVal("date_bordereau_debut", $this->f->get_submitted_post_value("date_bordereau_debut"));
7389     $form->setVal("date_bordereau_fin", $this->f->get_submitted_post_value("date_bordereau_fin"));
7390     $form->setVal("bordereau", $this->f->get_submitted_post_value("bordereau"));
7391     $form->setVal("om_collectivite", $this->f->get_submitted_post_value("om_collectivite"));
7392 mbroquet 3730 }
7393     // Données du select - On récupère ici la liste de tous les états disponibles
7394     // dans la table om_etat qui ont un id qui commence par la cahine de caractères
7395     // 'bordereau_'
7396 softime 14542 $qres = $this->f->get_all_results_from_db_query(
7397     sprintf(
7398     'SELECT
7399     om_etat.id,
7400     om_etat.libelle
7401     FROM
7402     %1$som_etat
7403     WHERE
7404     om_etat.id LIKE \'bordereau_%%\'
7405     ORDER BY
7406     om_etat.id',
7407     DB_PREFIXE
7408     ),
7409     array(
7410     "origin" => __METHOD__
7411     )
7412     );
7413 mbroquet 3730 // Données du select
7414     $contenu = array(
7415     0 => array("", ),
7416     1 => array(_("choisir bordereau")),
7417     );
7418 softime 14542 foreach ($qres['result'] as $row) {
7419 mbroquet 3730 $contenu[0][] = $row['id'];
7420     $contenu[1][] = $row['libelle'];
7421     }
7422     $form->setSelect("bordereau", $contenu);
7423 softime 8989 //
7424     if ($_SESSION["niveau"] == 2) {
7425     $form->setLib("om_collectivite", _("collectivite"));
7426     $form->setType("om_collectivite", "select");
7427 mbroquet 3730
7428 softime 8989 // Données du select - On récupère ici la liste de tous toutes les collectivités
7429     // de niveau 1
7430 softime 14542 $qres = $this->f->get_all_results_from_db_query(
7431     sprintf(
7432     'SELECT
7433     om_collectivite,
7434     libelle
7435     FROM
7436     %1$som_collectivite
7437     WHERE
7438     niveau = \'1\'
7439     ORDER BY
7440     libelle',
7441     DB_PREFIXE
7442     ),
7443     array(
7444     "origin" => __METHOD__
7445     )
7446     );
7447 softime 8989 // La valeur par défaut du select est Toutes
7448     $list_collectivites = array(
7449     0 => array("", ),
7450     1 => array(_("toutes"))
7451     );
7452 mbroquet 3730
7453 softime 8989 $id_colls = "";
7454     // On stocke dans $id_colls l'id de toutes les collectivités de niveau 1 séparées
7455     // par des virgules, pour un traitement plus facile dans la requête de sous-état
7456 softime 14542 foreach ($qres['result'] as $row) {
7457 softime 8989 if ($id_colls != "") {
7458     $id_colls .= ",";
7459     }
7460     $id_colls .= $row['om_collectivite'];
7461     $list_collectivites[0][] = $row['om_collectivite'];
7462     $list_collectivites[1][] = $row['libelle'];
7463 mbroquet 3730 }
7464 softime 8989 // On affecte la liste d'identifiants à l'option Toutes
7465     $list_collectivites[0][0] = $id_colls ;
7466     $form->setSelect("om_collectivite", $list_collectivites);
7467 mbroquet 3730 }
7468     // Affichage du formulaire
7469     $form->entete();
7470     $form->afficher($champs, 0, false, false);
7471     $form->enpied();
7472     // Affichage du bouton
7473     printf("\t<div class=\"formControls\">\n");
7474 softime 8989 $this->f->layout->display_form_button(array("value" => _("Valider"), "name" => "validation"));
7475 mbroquet 3730 printf("\t</div>\n");
7476     // Fermeture du formulaire
7477     printf("\t</form>\n");
7478     }
7479    
7480 nmeucci 4317
7481     /**
7482     * VIEW - view_generate_suivi_bordereaux.
7483     *
7484     * Génère et affiche les bordereaux de suivi.
7485     *
7486     * @return [void]
7487     */
7488     function view_generate_suivi_bordereaux() {
7489     // Vérification de l'accessibilité sur l'élément
7490     $this->checkAccessibility();
7491     // Récupération du type de bordereau
7492     $bordereau = $this->f->get_submitted_get_value('type_bordereau');
7493     // Génération du PDF
7494     $result = $this->compute_pdf_output('etat', $bordereau, null, $this->getVal($this->clePrimaire));
7495     // Affichage du PDF
7496     $this->expose_pdf_output(
7497     $result['pdf_output'],
7498     $result['filename']
7499     );
7500     }
7501    
7502    
7503 mbroquet 3730 /**
7504     * VIEW - view_suivi_envoi_lettre_rar.
7505     *
7506 softime 8989 * Vue pour imprimer les AR.
7507 mbroquet 3730 *
7508     * @return void
7509     */
7510     function view_suivi_envoi_lettre_rar() {
7511     // Vérification de l'accessibilité sur l'élément
7512     $this->checkAccessibility();
7513    
7514     //
7515 softime 8989 if ($this->f->get_submitted_post_value("date") !== null) {
7516     $date = $this->f->get_submitted_post_value("date");
7517 mbroquet 3730 } else {
7518     $date = "";
7519     }
7520     //
7521 softime 8989 if ($this->f->get_submitted_post_value("liste_code_barres_instruction") !== null) {
7522     $liste_code_barres_instruction = $this->f->get_submitted_post_value("liste_code_barres_instruction");
7523 mbroquet 3730 } else {
7524     $liste_code_barres_instruction = "";
7525     }
7526    
7527     // Compteur du nombre de page générées
7528     $nbLettres = 0;
7529     // Liste d'id des instructions
7530     $id4Gen = array();
7531     //
7532     $error = "";
7533    
7534 softime 5504 // Initialisation du tableau qui va contenir les DI pour lister les liens
7535     $dossierTab = array();
7536     // On vérifie que l'utilisateur ait les droits pour afficher des consultations
7537     $isAccredited = $this->f->isAccredited(array("dossier_instruction","dossier_instruction_consulter"), "OR");
7538     $hasHidden = true;
7539     // S'il ne peut pas les consulter il aura des dossiers caché
7540     if ($isAccredited === true) {
7541     $hasHidden = false;
7542     }
7543    
7544 mbroquet 3730 /**
7545     * Validation du formulaire
7546     */
7547     // Si le formulaire a été validé
7548 softime 8989 if ($this->f->get_submitted_post_value('validation') !== null) {
7549 mbroquet 3730 //
7550     if (empty($date) || empty($liste_code_barres_instruction)) {
7551     //
7552     $message_class = "error";
7553     $message = _("Tous les champs doivent etre remplis.");
7554     } else {
7555     // Création d'un tableau d'instruction
7556 softime 8989 $liste = explode("\r\n", $this->f->get_submitted_post_value("liste_code_barres_instruction"));
7557 mbroquet 3730 //
7558     foreach ($liste as $code_barres) {
7559     // On enlève les éventuels espaces saisis
7560     $code_barres = trim($code_barres);
7561     // Vérification de l'existence de l'instruction
7562     if ($code_barres != "") {
7563     // Si la valeur transmise est numérique
7564     if (is_numeric($code_barres)) {
7565     //
7566 softime 6565 $sql = "SELECT count(*)
7567     FROM ".DB_PREFIXE."instruction
7568     INNER JOIN ".DB_PREFIXE."dossier
7569     ON dossier.dossier=instruction.dossier
7570     INNER JOIN ".DB_PREFIXE."dossier_instruction_type
7571     ON dossier.dossier_instruction_type = dossier_instruction_type.dossier_instruction_type
7572     INNER JOIN ".DB_PREFIXE."dossier_autorisation_type_detaille
7573     ON dossier_instruction_type.dossier_autorisation_type_detaille = dossier_autorisation_type_detaille.dossier_autorisation_type_detaille
7574     INNER JOIN ".DB_PREFIXE."dossier_autorisation_type
7575     ON dossier_autorisation_type_detaille.dossier_autorisation_type = dossier_autorisation_type.dossier_autorisation_type
7576     INNER JOIN ".DB_PREFIXE."groupe
7577     ON dossier_autorisation_type.groupe = groupe.groupe
7578     WHERE code_barres='".$this->f->db->escapesimple($code_barres)."'";
7579 softime 7067
7580     // Ajout d'un filtre sur les groupes auxquels l'utilisateur a accès
7581     $group_clause = array();
7582     foreach ($_SESSION["groupe"] as $key => $value) {
7583     $group_clause[$key] = "(groupe.code = '".$key."'";
7584     if($value["confidentiel"] !== true) {
7585     $group_clause[$key] .= " AND dossier_autorisation_type.confidentiel IS NOT TRUE";
7586     }
7587     $group_clause[$key] .= ")";
7588     }
7589     $conditions = implode(" OR ", $group_clause);
7590     $sql .= " AND (" . $conditions . ")";
7591    
7592 softime 14064 $qres = $this->f->get_one_result_from_db_query(
7593     $sql,
7594     array(
7595     "origin" => __METHOD__,
7596     )
7597     );
7598    
7599     if ($qres['result'] == "1") {
7600 mbroquet 3730 // Récupération de la date d'envoi de l'instruction bippé
7601 softime 14542 $qres = $this->f->get_all_results_from_db_query(
7602     sprintf(
7603     'SELECT
7604     to_char(date_envoi_rar, \'DD/MM/YYYY\') as date_envoi_rar,
7605     instruction
7606     FROM
7607     %1$sinstruction
7608     WHERE
7609     code_barres = \'%2$s\'',
7610     DB_PREFIXE,
7611     $this->f->db->escapeSimple($code_barres)
7612     ),
7613     array(
7614     'origin' => __METHOD__
7615     )
7616     );
7617     $row = array_shift($qres['result']);
7618 mbroquet 3730 // Si pas de date ou correspond à la date du formulaire on
7619     // effectue le traitement
7620     if ($row["date_envoi_rar"] == "" || $row["date_envoi_rar"] == $date) {
7621 softime 7996 $instr = $this->f->get_inst__om_dbform(array(
7622     "obj" => "instruction",
7623     "idx" => $row['instruction'],
7624     ));
7625 mbroquet 3730 $valF = array();
7626     foreach($instr->champs as $id => $champ) {
7627     $valF[$champ] = $instr->val[$id];
7628     }
7629 softime 5504
7630     # Si on peut consulter les dossiers et que le dossier n'existe pas déjà dans la liste
7631     if ($isAccredited === true
7632     && array_key_exists($instr->getVal("dossier"), $dossierTab) === false) {
7633 softime 7996 $dossier = $this->f->get_inst__om_dbform(array(
7634     "obj" => "dossier",
7635     "idx" => $instr->getVal("dossier"),
7636     ));
7637 softime 5504 if ($dossier->is_user_from_allowed_collectivite()){
7638     $dossierTab[$instr->getVal("dossier")] = $dossier;
7639     } else {
7640     $hasHidden = true;
7641     }
7642     }
7643    
7644 mbroquet 3730 $valF['date_evenement']=
7645     $instr->dateDBToForm($valF['date_evenement']);
7646     $valF['archive_date_complet']=
7647     $instr->dateDBToForm($valF['archive_date_complet']);
7648     $valF['archive_date_rejet']=
7649     $instr->dateDBToForm($valF['archive_date_rejet']);
7650     $valF['archive_date_limite']=
7651     $instr->dateDBToForm($valF['archive_date_limite']);
7652     $valF['archive_date_notification_delai']=
7653     $instr->dateDBToForm($valF['archive_date_notification_delai']);
7654     $valF['archive_date_decision']=
7655     $instr->dateDBToForm($valF['archive_date_decision']);
7656     $valF['archive_date_validite']=
7657     $instr->dateDBToForm($valF['archive_date_validite']);
7658     $valF['archive_date_achevement']=
7659     $instr->dateDBToForm($valF['archive_date_achevement']);
7660     $valF['archive_date_chantier']=
7661     $instr->dateDBToForm($valF['archive_date_chantier']);
7662     $valF['archive_date_conformite']=
7663     $instr->dateDBToForm($valF['archive_date_conformite']);
7664     $valF['archive_date_dernier_depot']=
7665     $instr->dateDBToForm($valF['archive_date_dernier_depot']);
7666     $valF['archive_date_limite_incompletude']=
7667     $instr->dateDBToForm($valF['archive_date_limite_incompletude']);
7668     $valF['date_finalisation_courrier']=
7669     $instr->dateDBToForm($valF['date_finalisation_courrier']);
7670     $valF['date_envoi_signature']=
7671     $instr->dateDBToForm($valF['date_envoi_signature']);
7672     $valF['date_retour_signature']=
7673     $instr->dateDBToForm($valF['date_retour_signature']);
7674     $valF['date_envoi_rar']=
7675     $instr->dateDBToForm($valF['date_envoi_rar']);
7676     $valF['date_retour_rar']=
7677     $instr->dateDBToForm($valF['date_retour_rar']);
7678     $valF['date_envoi_controle_legalite']=
7679     $instr->dateDBToForm($valF['date_envoi_controle_legalite']);
7680     $valF['date_retour_controle_legalite']=
7681     $instr->dateDBToForm($valF['date_retour_controle_legalite']);
7682     $valF['date_envoi_rar'] = $date;
7683    
7684     // Vérification de la finalisation du document
7685     // correspondant au code barres
7686     if($instr->getVal("om_final_instruction") === 't') {
7687     $instr->setParameter('maj', 1);
7688 nmeucci 3971 $instr->class_actions[1]["identifier"] =
7689     "envoi lettre RAR (depuis le menu suivi des pièces)";
7690 softime 8989 if ($instr->modifier($valF) == true) {
7691 mbroquet 3730 $id4Gen[] = $code_barres;
7692     $nbLettres ++;
7693     } else {
7694     //
7695     if ($error != "") {
7696     $error .= "<br/>";
7697     }
7698     $error .= sprintf(_("Une erreur s'est produite lors de la modification de l'instruction %s."),
7699     $code_barres);
7700     $error .= " ";
7701     $error .= _("Veuillez contacter votre administrateur.");
7702     }
7703     } else {
7704     //
7705     if ($error != "") {
7706     $error .= "<br/>";
7707     }
7708     $error .= sprintf(_("Le document correspondant au
7709     code barres %s n'est pas finalise,
7710     le bordereau ne sera pas genere."),
7711     $code_barres);
7712     }
7713    
7714     } else {
7715     //
7716     if ($error != "") {
7717     $error .= "<br/>";
7718     }
7719     $error .= _("Une lettre correspondante a l'instruction ayant pour code barres")." ".$code_barres." "._("a deja ete envoyee, le bordereau ne sera pas genere.");
7720     }
7721     } else {
7722     //
7723     if ($error != "") {
7724     $error .= "<br/>";
7725     }
7726     $error .= _("Le numero")." ".$code_barres." "._("ne correspond a aucun code barres d'instruction.");
7727     }
7728     } else {
7729     //
7730     if ($error != "") {
7731     $error .= "<br/>";
7732     }
7733     $error .= _("Le code barres d'instruction")." ".$code_barres." "._("n'est pas valide.");
7734     }
7735     }
7736     }
7737     }
7738     }
7739    
7740     /**
7741     * Affichage des messages et du formulaire
7742     */
7743     // Affichage du message de validation ou d'erreur
7744     if (isset($message) && isset($message_class) && $message != "") {
7745 softime 8989 $this->f->displayMessage($message_class, $message);
7746 mbroquet 3730 }
7747     // Affichage du message d'erreur
7748     if(!empty($error)) {
7749 softime 8989 $this->f->displayMessage("error", $error);
7750 mbroquet 3730 }
7751     // Affichage du message de validation de la saisie
7752     if ($nbLettres > 0) {
7753     //
7754 softime 5504 echo "\n<div class=\"message ui-widget ui-corner-all ui-state-highlight ui-state-valid\" >";
7755     echo "\n<p>";
7756     echo "\n<span class=\"ui-icon ui-icon-info\"></span>";
7757     echo "\n<span class=\"text\">";
7758     echo _("Cliquez sur le lien ci-dessous pour telecharger votre document");
7759     echo " : \n<br/><br/>";
7760     echo "\n<a class='om-prev-icon pdf-16'";
7761 softime 8989 echo "\n title=\""._("imprimer les AR")."\"";
7762 softime 7996 echo "\n href=\"".OM_ROUTE_FORM."&obj=instruction&action=180&idx=0&liste=".implode(",",$id4Gen)."\"";
7763 softime 5504 echo "\n target='_blank'>";
7764 softime 8989 echo _("Telecharger le document pour")." ".$nbLettres." "._("AR");
7765 softime 5504 echo "\n</a>";
7766     echo "\n</span>";
7767     echo "\n</p>";
7768     echo "\n<br/>\n";
7769     if ($isAccredited === true) {
7770     echo '<fieldset id="fieldset-form-rar-lien_di" class="cadre ui-corner-all startClosed" style="background-color: inherite;">';
7771     echo "\n<legend class=\"ui-corner-all ui-widget-content ui-state-active\" style=\"background-color: transparent; color: inherit;\">\n";
7772     echo _('Dossiers concernés par ce traitement');
7773     echo "\n</legend>";
7774     echo "\n<div class=\"fieldsetContent\" style=\"display: none;background-color: inherite\">";
7775    
7776     if ($hasHidden === true) {
7777     echo "\n<br/>";
7778     echo "\n<p>";
7779     echo "\n<span class='text'>";
7780     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.");
7781     echo "</span>";
7782     echo "\n</p>";
7783     echo "\n<br/>";
7784     }
7785     foreach ($dossierTab as $dossier) {
7786 softime 7067
7787     $inst_da = $this->get_inst_common("dossier_autorisation", $dossier->getVal('dossier_autorisation'));
7788     $inst_datd = $this->get_inst_common("dossier_autorisation_type_detaille", $inst_da->getVal('dossier_autorisation_type_detaille'));
7789     $code_datd = $inst_datd->getVal('code');
7790    
7791     $obj = "dossier_instruction";
7792     if ($code_datd === 'REC' OR $code_datd === 'REG') {
7793     $obj = "dossier_contentieux_tous_recours";
7794     }
7795     if ($code_datd === 'IN') {
7796     $obj = "dossier_contentieux_toutes_infractions";
7797     }
7798    
7799 softime 5504 echo "\n<div class=\"bloc group\">";
7800     echo "\n<div class=\"field field-type-text\">";
7801    
7802     echo "\n<p>";
7803     echo "\n<span class='text'>";
7804     echo "\n<a class=\"om-icon om-icon-16 consult-16\" title=\"" . _('Consulter') . "\"";
7805 softime 7996 echo "\n href=\"".OM_ROUTE_FORM."&obj=dossier_instruction&action=3&idx=";
7806 softime 5504 echo $dossier->getVal("dossier");
7807     echo "\">";
7808     echo "\n</a>";
7809    
7810     echo "\n<a title=\""._("Consulter")."\" style=\"vertical-align:middle;\"";
7811 softime 7996 echo " href=\"".OM_ROUTE_FORM."&obj=";
7812 softime 7067 echo $obj;
7813     echo "&action=3&idx=";
7814 softime 5504 echo $dossier->getVal("dossier");
7815     echo "\">";
7816     echo $dossier->getVal("dossier_libelle");
7817     echo "\n</a>";
7818     echo "\n</span>";
7819     echo "\n</p>";
7820    
7821     echo "\n</div>";
7822     echo "\n</div>";
7823     }
7824     echo "\n</div>";
7825     echo "\n</fieldset>";
7826     }
7827     echo "\n</div>";
7828     echo "\n</div>";
7829 mbroquet 3730 }
7830     // Ouverture du formulaire
7831     echo "\t<form";
7832     echo " method=\"post\"";
7833     echo " id=\"suivi_envoi_lettre_rar_form\"";
7834     echo " action=\"\"";
7835     echo ">\n";
7836     // Paramétrage des champs du formulaire
7837     $champs = array("date", "liste_code_barres_instruction");
7838     // Création d'un nouvel objet de type formulaire
7839 softime 7996 $form = $this->f->get_inst__om_formulaire(array(
7840     "validation" => 0,
7841     "maj" => 0,
7842     "champs" => $champs,
7843     ));
7844 mbroquet 3730 // Paramétrage du champ date du formulaire
7845     $form->setLib("date", _("Date")."* :");
7846     $form->setType("date", "date");
7847     $form->setOnchange("date", "fdate(this)");
7848     $form->setVal("date", ($date == "" ? date("d/m/Y") : $date));
7849     $form->setTaille("date", 10);
7850     $form->setMax("date", 10);
7851     // Paramétrage du champ liste_code_barres_instruction du formulaire
7852     $form->setLib("liste_code_barres_instruction", _("Liste des codes barres d'instructions scannes")."* :");
7853     $form->setType("liste_code_barres_instruction", "textarea");
7854     $form->setVal("liste_code_barres_instruction", $liste_code_barres_instruction);
7855     $form->setTaille("liste_code_barres_instruction", 20);
7856     $form->setMax("liste_code_barres_instruction", 20);
7857     // Affichage du formulaire
7858     $form->entete();
7859     $form->afficher($champs, 0, false, false);
7860     $form->enpied();
7861     // Affichage du bouton
7862     echo "\t<div class=\"formControls\">\n";
7863 softime 8989 $this->f->layout->display_form_button(array("value" => _("Valider"), "name" => "validation"));
7864 mbroquet 3730 echo "\t</div>\n";
7865     // Fermeture du formulaire
7866     echo "\t</form>\n";
7867     }
7868    
7869     /**
7870     * VIEW - view_suivi_mise_a_jour_des_dates.
7871     *
7872     * Vu pour mettre à jour les dates de suivi de l'instruction.
7873     *
7874     * @return void
7875     */
7876     function view_suivi_mise_a_jour_des_dates() {
7877     // Vérification de l'accessibilité sur l'élément
7878     $this->checkAccessibility();
7879    
7880     // Récupération des valeur passées en POST ou GET
7881 softime 8989 if($this->f->get_submitted_post_value("type_mise_a_jour") !== null) {
7882     $type_mise_a_jour = $this->f->get_submitted_post_value("type_mise_a_jour");
7883     } elseif($this->f->get_submitted_get_value('type_mise_a_jour') !== null) {
7884     $type_mise_a_jour = $this->f->get_submitted_get_value('type_mise_a_jour');
7885 mbroquet 3730 } else {
7886     $type_mise_a_jour = "";
7887     }
7888 softime 8989 if($this->f->get_submitted_post_value('date') !== null) {
7889     $date = $this->f->get_submitted_post_value('date');
7890     } elseif($this->f->get_submitted_get_value('date') !== null) {
7891     $date = $this->f->get_submitted_get_value('date');
7892 mbroquet 3730 } else {
7893     $date = "";
7894     }
7895 softime 8989 if($this->f->get_submitted_post_value('code_barres') !== null) {
7896     $code_barres = $this->f->get_submitted_post_value('code_barres');
7897     } elseif($this->f->get_submitted_get_value('code_barres') !== null) {
7898     $code_barres = $this->f->get_submitted_get_value('code_barres');
7899 mbroquet 3730 } else {
7900     $code_barres = "";
7901     }
7902     // Booléen permettant de définir si un enregistrement à eu lieu
7903     $correct = false;
7904     // Booléen permettant de définir si les dates peuvent êtres enregistrées
7905     $date_error = false;
7906     // Champs date à mettre à jour
7907     $liste_champs=array();
7908    
7909     // Si le formulaire a été validé
7910 softime 8989 if ($this->f->get_submitted_post_value('validation') !== null) {
7911 mbroquet 3730 if(!empty($type_mise_a_jour) and !empty($date) and !empty($code_barres)) {
7912    
7913 softime 7067 // Ajout d'un filtre sur les groupes auxquels l'utilisateur a accès
7914     $group_clause = array();
7915     foreach ($_SESSION["groupe"] as $key => $value) {
7916     $group_clause[$key] = "(groupe.code = '".$key."'";
7917     if($value["confidentiel"] !== true) {
7918     $group_clause[$key] .= " AND dossier_autorisation_type.confidentiel IS NOT TRUE";
7919     }
7920     $group_clause[$key] .= ")";
7921     }
7922     $conditions = implode(" OR ", $group_clause);
7923 softime 14542 $groupFilter = " AND (" . $conditions . ")";
7924 softime 7067
7925 softime 14542 $qres = $this->f->get_all_results_from_db_query(
7926     sprintf(
7927     'SELECT
7928     instruction
7929     FROM
7930     %1$sinstruction
7931     INNER JOIN %1$sdossier
7932     ON dossier.dossier = instruction.dossier
7933     INNER JOIN %1$sdossier_instruction_type
7934     ON dossier.dossier_instruction_type = dossier_instruction_type.dossier_instruction_type
7935     INNER JOIN %1$sdossier_autorisation_type_detaille
7936     ON dossier_instruction_type.dossier_autorisation_type_detaille = dossier_autorisation_type_detaille.dossier_autorisation_type_detaille
7937     INNER JOIN %1$sdossier_autorisation_type
7938     ON dossier_autorisation_type_detaille.dossier_autorisation_type = dossier_autorisation_type.dossier_autorisation_type
7939     INNER JOIN %1$sgroupe
7940     ON dossier_autorisation_type.groupe = groupe.groupe
7941     WHERE
7942     code_barres = \'%2$s\'
7943     %3$s',
7944     DB_PREFIXE,
7945     $this->f->db->escapeSimple($code_barres),
7946     $groupFilter
7947     ),
7948     array(
7949     'origin' => __METHOD__
7950     )
7951     );
7952     if(count($qres['result']) === 1) {
7953 mbroquet 3730 $liste_champs = explode(";", $type_mise_a_jour);
7954 softime 14542 $row = array_shift($qres['result']);
7955 softime 11418 $instr = $this->f->get_inst__om_dbform(array(
7956     "obj" => "instruction",
7957     "idx" => $row['instruction'],
7958     ));
7959 mbroquet 3730 // Mise à jour des dates après l'écran de verification
7960 softime 8989 if($this->f->get_submitted_post_value('is_valid') !== null and $this->f->get_submitted_post_value('is_valid') == "true") {
7961 mbroquet 3730 $valF = array();
7962     foreach($instr->champs as $id => $champ) {
7963     $valF[$champ] = $instr->val[$id];
7964     }
7965 softime 6565 $valF['date_evenement'] = $instr->dateDBToForm($valF['date_evenement']);
7966     $valF['archive_date_complet'] = $instr->dateDBToForm($valF['archive_date_complet']);
7967     $valF['archive_date_rejet'] = $instr->dateDBToForm($valF['archive_date_rejet']);
7968     $valF['archive_date_limite'] = $instr->dateDBToForm($valF['archive_date_limite']);
7969     $valF['archive_date_notification_delai'] = $instr->dateDBToForm($valF['archive_date_notification_delai']);
7970     $valF['archive_date_decision'] = $instr->dateDBToForm($valF['archive_date_decision']);
7971     $valF['archive_date_validite'] = $instr->dateDBToForm($valF['archive_date_validite']);
7972     $valF['archive_date_achevement'] = $instr->dateDBToForm($valF['archive_date_achevement']);
7973     $valF['archive_date_chantier'] = $instr->dateDBToForm($valF['archive_date_chantier']);
7974     $valF['archive_date_conformite'] = $instr->dateDBToForm($valF['archive_date_conformite']);
7975     $valF['archive_date_dernier_depot'] = $instr->dateDBToForm($valF['archive_date_dernier_depot']);
7976     $valF['archive_date_limite_incompletude'] = $instr->dateDBToForm($valF['archive_date_limite_incompletude']);
7977     $valF['date_finalisation_courrier'] = $instr->dateDBToForm($valF['date_finalisation_courrier']);
7978     $valF['date_envoi_signature'] = $instr->dateDBToForm($valF['date_envoi_signature']);
7979     $valF['date_retour_signature'] = $instr->dateDBToForm($valF['date_retour_signature']);
7980     $valF['date_envoi_rar'] = $instr->dateDBToForm($valF['date_envoi_rar']);
7981     $valF['date_retour_rar'] = $instr->dateDBToForm($valF['date_retour_rar']);
7982     $valF['date_envoi_controle_legalite'] = $instr->dateDBToForm($valF['date_envoi_controle_legalite']);
7983     $valF['date_retour_controle_legalite'] = $instr->dateDBToForm($valF['date_retour_controle_legalite']);
7984     $valF['archive_date_cloture_instruction'] = $instr->dateDBToForm($valF['archive_date_cloture_instruction']);
7985     $valF['archive_date_premiere_visite'] = $instr->dateDBToForm($valF['archive_date_premiere_visite']);
7986     $valF['archive_date_derniere_visite'] = $instr->dateDBToForm($valF['archive_date_derniere_visite']);
7987     $valF['archive_date_contradictoire'] = $instr->dateDBToForm($valF['archive_date_contradictoire']);
7988     $valF['archive_date_retour_contradictoire'] = $instr->dateDBToForm($valF['archive_date_retour_contradictoire']);
7989     $valF['archive_date_ait'] = $instr->dateDBToForm($valF['archive_date_ait']);
7990     $valF['archive_date_transmission_parquet'] = $instr->dateDBToForm($valF['archive_date_transmission_parquet']);
7991 mbroquet 3730
7992     foreach(explode(";", $type_mise_a_jour) as $maj_date) {
7993     $valF[$maj_date]=$date;
7994     }
7995    
7996     // Vérification de la finalisation du document
7997     // correspondant au code barres
7998     if($valF["om_final_instruction"] === 't' or
7999     $valF["lettretype"] == '') {
8000     $code_barres = "";
8001    
8002     //Désactivation de l'autocommit
8003 softime 8989 $this->f->db->autoCommit(false);
8004 mbroquet 3730
8005     //On modifie les valeurs de l'instruction
8006     $instr->setParameter('maj', 170);
8007 nmeucci 3965 $instr->class_actions[170]["identifier"] =
8008 nmeucci 3972 "mise à jour des dates (depuis le menu suivi des pièces)";
8009 softime 8989 $retour = $instr->modifier($valF);
8010 mbroquet 3730
8011     //Si une erreur s'est produite, on défait les modifications
8012     //qui ont été faites
8013     if (!$retour){
8014     $instr->undoValidation();
8015     }
8016     //Sinon, on valide en base de données les modifications
8017     else {
8018 softime 8989 $this->f->db->commit();
8019 mbroquet 3730 }
8020    
8021     // Variable correct retourné depuis la classe instruction
8022     $correct = $instr->correct;
8023    
8024     // Si la modification sur l'instruction a échoué
8025     if ($correct === false) {
8026    
8027     // Message d'erreur de la classe instruction
8028     $error = $instr->msg;
8029     }
8030    
8031     } else {
8032     // Indique que le traitement est en erreur
8033     $correct = false;
8034     // Message d'erreur
8035     $error = sprintf(_("Le document n'est pas finalise."),
8036     "<span class='bold'>".$code_barres."</span>");
8037     }
8038     } else {
8039     // Récupération des infos du dossier
8040 softime 14542 $qres = $this->f->get_all_results_from_db_query(
8041     sprintf(
8042     'SELECT
8043     dossier.dossier_libelle,
8044     evenement.libelle as evenement,
8045     autorite_competente.code as autorite_competente_code,
8046     autorite_competente.libelle as autorite_competente,
8047     evenement.type as evenement_type,
8048     to_char(date_envoi_signature,\'DD/MM/YYYY\') as date_envoi_signature,
8049     to_char(date_retour_signature,\'DD/MM/YYYY\') as date_retour_signature,
8050     to_char(date_envoi_controle_legalite,\'DD/MM/YYYY\') as date_envoi_controle_legalite,
8051     to_char(date_retour_controle_legalite,\'DD/MM/YYYY\') as date_retour_controle_legalite,
8052     to_char(date_envoi_rar,\'DD/MM/YYYY\') as date_envoi_rar,
8053     to_char(date_retour_rar,\'DD/MM/YYYY\') as date_retour_rar
8054     FROM
8055     %1$sinstruction
8056     INNER JOIN %1$sdossier
8057     ON dossier.dossier=instruction.dossier
8058     LEFT JOIN %1$sautorite_competente
8059     ON dossier.autorite_competente=autorite_competente.autorite_competente
8060     INNER JOIN %1$sevenement
8061     ON instruction.evenement=evenement.evenement
8062     WHERE
8063     code_barres = \'%2$s\'',
8064     DB_PREFIXE,
8065     $this->f->db->escapeSimple($code_barres)
8066     ),
8067     array(
8068     "origin" => __METHOD__
8069     )
8070     );
8071     $infos = array_shift($qres['result']);
8072 mbroquet 3730
8073     // Vérification de la non modification des dates de suivi
8074     foreach(explode(";", $type_mise_a_jour) as $champ) {
8075 softime 11418 if ($champ === 'date_envoi_controle_legalite') {
8076     if ($instr->is_sent_to_cl() === true) {
8077     $error = __("Les dates de suivis ne peuvent etre modifiees");
8078     $date_error = true;
8079     break;
8080     }
8081     }
8082 mbroquet 3730 if($infos[$champ] != "" AND $infos[$champ] != $date) {
8083     $error = _("Les dates de suivis ne peuvent etre modifiees");
8084     $date_error = true;
8085 softime 11418 break;
8086 mbroquet 3730 }
8087     }
8088     }
8089     } else {
8090     $error = _("Le numero saisi ne correspond a aucun code barres d'instruction.");
8091     }
8092    
8093     } else {
8094     $error = _("Tous les champs doivent etre remplis.");
8095     }
8096     }
8097    
8098     /**
8099     * Affichage des messages et du formulaire
8100     */
8101     // Affichage du message de validation ou d'erreur
8102     if (isset($message) && isset($message_class) && $message != "") {
8103 softime 8989 $this->f->displayMessage($message_class, $message);
8104 mbroquet 3730 }
8105     // Affichage du message d'erreur
8106     if(!empty($error)) {
8107 softime 8989 $this->f->displayMessage("error", $error);
8108 mbroquet 3730 }
8109    
8110     // Affichage du message de validation de la saisie
8111     if($correct === true) {
8112 softime 8989 $this->f->displayMessage("ok", _("Saisie enregistree"));
8113 mbroquet 3730 }
8114     // Ouverture du formulaire
8115     echo "\t<form";
8116     echo " method=\"post\"";
8117     echo " id=\"suivi_mise_a_jour_des_dates_form\"";
8118     echo " action=\"\"";
8119     echo ">\n";
8120     // Paramétrage des champs du formulaire
8121     if(isset($infos)) {
8122     $champs = array("type_mise_a_jour", "date", "code_barres", "dossier_libelle", "evenement"
8123     , "autorite_competente", "date_envoi_signature",
8124     "date_retour_signature", "date_envoi_controle_legalite",
8125     "date_retour_controle_legalite", "date_envoi_rar",
8126     "date_retour_rar", "is_valid");
8127     } else {
8128     $champs = array("type_mise_a_jour", "date", "code_barres");
8129     }
8130     // Création d'un nouvel objet de type formulaire
8131 softime 7996 $form = $this->f->get_inst__om_formulaire(array(
8132     "validation" => 0,
8133     "maj" => 0,
8134     "champs" => $champs,
8135     ));
8136 mbroquet 3730 // Paramétrage des champs du formulaire
8137     // Parametrage du champ type_mise_a_jour
8138     $form->setLib("type_mise_a_jour", _("Date a mettre a jour")."* :");
8139     if(isset($infos)) {
8140     $form->setType("type_mise_a_jour", "selecthiddenstatic");
8141    
8142     } else {
8143     $form->setType("type_mise_a_jour", "select");
8144    
8145     }
8146     $form->setVal("type_mise_a_jour", $type_mise_a_jour);
8147     $contenu = array();
8148    
8149     $contenu[0][0] = "date_envoi_signature";
8150     $contenu[1][0] = _("date d'envoi pour signature Mairie/Prefet");
8151    
8152     $contenu[0][1] = "date_retour_signature";
8153     $contenu[1][1] = _("date de retour de signature Mairie/Prefet");
8154    
8155     $contenu[0][2] = "date_retour_signature;date_envoi_controle_legalite";
8156     $contenu[1][2] = _("date de retour de signature + Envoi controle legalite");
8157    
8158     $contenu[0][3] = "date_envoi_controle_legalite";
8159     $contenu[1][3] = _("date d'envoi au controle de legalite");
8160    
8161     $contenu[0][4] = "date_retour_controle_legalite";
8162     $contenu[1][4] = _("date de retour de controle de legalite");
8163    
8164     $contenu[0][5] = "date_retour_rar";
8165 softime 8989 $contenu[1][5] = __("date de notification du correspondant");
8166 mbroquet 3730
8167     $form->setSelect("type_mise_a_jour", $contenu);
8168    
8169     // Parametrage du champ date
8170     $form->setLib("date", _("Date")."* :");
8171     if(isset($infos)) {
8172     $form->setType("date", "hiddenstaticdate");
8173    
8174     } else {
8175     $form->setType("date", "date");
8176     }
8177     $form->setVal("date", $date);
8178     $form->setTaille("date", 10);
8179     $form->setMax("date", 10);
8180    
8181     // Parametrage du champ code_barres
8182     $form->setLib("code_barres", _("Code barres d'instruction")."* :");
8183     if(isset($infos)) {
8184     $form->setType("code_barres", "hiddenstatic");
8185     } else {
8186     $form->setType("code_barres", "text");
8187     }
8188     $form->setVal("code_barres", $code_barres);
8189     $form->setTaille("code_barres", 20);
8190     $form->setMax("code_barres", 20);
8191    
8192     // Ajout des infos du dossier correspondantes à l'instruction séléctionnée
8193     if(isset($infos)) {
8194    
8195     // Tous les champs sont défini par defaut à static
8196     foreach ($infos as $key => $value) {
8197     $form->setType($key, "static");
8198     if(in_array($key, $liste_champs)) {
8199     $form->setVal($key, $date);
8200     } else {
8201     $form->setVal($key, $value);
8202     }
8203     }
8204    
8205     // Les champs dont on viens de définir la valeur sont en gras
8206     foreach ($liste_champs as $value) {
8207     $form->setBloc($value,'DF',"",'bold');
8208     }
8209    
8210     // Parametrage du champ dossier
8211     $form->setLib("dossier_libelle", _("dossier_libelle")." :");
8212     $form->setType("dossier_libelle", "static");
8213     $form->setVal("dossier_libelle", $infos['dossier_libelle']);
8214    
8215     // Parametrage du champ evenement
8216     $form->setLib("evenement", _("evenement")." :");
8217     $form->setType("evenement", "static");
8218     $form->setVal("evenement", $infos['evenement']);
8219    
8220     // Parametrage du champ autorite_competente
8221     $form->setLib("autorite_competente", _("Autorite competente")." :");
8222     $form->setType("autorite_competente", "static");
8223     $form->setVal("autorite_competente", $infos['autorite_competente']);
8224    
8225 softime 8989 // Parametrage des libellés d'envoi avec AR
8226     $form->setLib("date_envoi_rar", __("date_envoi_ar")." :");
8227     $form->setLib("date_retour_rar", __("date_notification")." :");
8228 mbroquet 3730
8229     $form->setLib("date_envoi_signature", _("date_envoi_signature")." :");
8230     $form->setLib("date_retour_signature", _("date_retour_signature")." :");
8231     $form->setLib("date_envoi_controle_legalite", _("date_envoi_controle_legalite")." :");
8232     $form->setLib("date_retour_controle_legalite", _("date_retour_controle_legalite")." :");
8233     // Configuration des libellé en fonction de l'autorité compétente
8234     if($infos['autorite_competente_code'] == 'ETAT') {
8235     $form->setType("date_envoi_controle_legalite", "hiddendate");
8236     $form->setType("date_retour_controle_legalite", "hiddendate");
8237     }
8238    
8239     // Ajout d'un champ hidden permettant de savoir que le formulaire précédant est celui de vérification
8240     $form->setLib("is_valid", _("Valide")." :");
8241     $form->setType("is_valid", "hidden");
8242     $form->setVal("is_valid", 'true');
8243    
8244     $form->setFieldset('dossier_libelle','D',_('Synthese'));
8245     $form->setFieldset('is_valid','F');
8246    
8247     }
8248    
8249    
8250     // Création du fieldset regroupant les champs permettant la mise à jour des date
8251     $form->setFieldset('type_mise_a_jour','D',_('Mise a jour'));
8252     $form->setFieldset('code_barres','F');
8253     // Affichage du formulaire
8254     $form->entete();
8255     $form->afficher($champs, 0, false, false);
8256     $form->enpied();
8257     // Affichage du bouton
8258     echo "\t<div class=\"formControls\">\n";
8259     //
8260     if(!$date_error) {
8261 softime 8989 $this->f->layout->display_form_button(array("value" => _("Valider"), "name" => "validation"));
8262 mbroquet 3730 }
8263     // Si pas sur l'écran de validation
8264     if(isset($infos)) {
8265 softime 7996 echo "<a class=\"retour\" href=\"".OM_ROUTE_FORM."&obj=instruction_suivi_mise_a_jour_des_dates&action=170&idx=0";
8266 mbroquet 3730 echo "&amp;type_mise_a_jour=".$type_mise_a_jour."&amp;date=".$date."&amp;code_barres=".$code_barres;
8267     echo "\">Retour</a>";
8268     }
8269     echo "\t</div>\n";
8270     // Fermeture du formulaire
8271     echo "\t</form>\n";
8272     }
8273    
8274     /**
8275     * [view_pdf_lettre_rar description]
8276     *
8277     * @return [type] [description]
8278     */
8279     function view_pdf_lettre_rar() {
8280     // Vérification de l'accessibilité sur l'élément
8281     $this->checkAccessibility();
8282 softime 8989 //
8283     $this->f->disableLog();
8284 mbroquet 3730
8285 softime 8989 if($this->f->get_submitted_get_value('liste') != null) {
8286     $listeCodeBarres = explode(',',$this->f->get_submitted_get_value('liste'));
8287 mbroquet 3730
8288     // Classe permettant la mise en page de l'édition pdf
8289     require_once "../obj/pdf_lettre_rar.class.php";
8290     $pdf_lettre_rar = new pdf_lettre_rar('P', 'mm', 'A4');
8291     // Initialisation de la mise en page
8292 softime 8989 $pdf_lettre_rar->init($this->f);
8293 mbroquet 3730
8294     foreach ($listeCodeBarres as $code_barres) {
8295    
8296 softime 7067 // On récupère le dossier
8297 softime 14064 $qres = $this->f->get_one_result_from_db_query(
8298     sprintf(
8299     'SELECT
8300     dossier
8301     FROM
8302     %1$sinstruction
8303     WHERE
8304     code_barres = \'%2$s\'',
8305     DB_PREFIXE,
8306     $this->f->db->escapeSimple($code_barres)
8307     ),
8308     array(
8309     "origin" => __METHOD__,
8310     )
8311     );
8312    
8313 softime 7996 $inst_dossier = $this->f->get_inst__om_dbform(array(
8314     "obj" => "dossier",
8315 softime 14064 "idx" => $qres['result'],
8316 softime 7996 ));
8317 softime 7067
8318     // En fonction du type de dossier, on récupère un demandeur différent dans les requêtes
8319     $groupe = $inst_dossier->get_type_affichage_formulaire();
8320     switch ($groupe) {
8321     case 'CTX IN':
8322     $sql_demandeur = "(lien_dossier_demandeur.petitionnaire_principal IS TRUE AND demandeur.type_demandeur='plaignant')";
8323     break;
8324     case 'CTX RE':
8325     $sql_demandeur = "(lien_dossier_demandeur.petitionnaire_principal IS TRUE AND demandeur.type_demandeur='requerant')";
8326     break;
8327     case 'ADS':
8328     case 'DPC':
8329 softime 10573 case 'CONSULTATION ENTRANTE':
8330 softime 7067 default:
8331     $sql_demandeur = "((lien_dossier_demandeur.petitionnaire_principal IS TRUE AND demandeur.type_demandeur='petitionnaire') OR demandeur.type_demandeur='delegataire')";
8332     break;
8333     }
8334    
8335 mbroquet 3730 // Test si l'evenement est de type arrete et si un délégataire a été nommé
8336 softime 14542 $qres = $this->f->get_all_results_from_db_query(
8337     sprintf(
8338     'SELECT
8339 mbroquet 3730 dossier.dossier_libelle,
8340     evenement.type,
8341 softime 3834 count(lien_dossier_demandeur) as nbdemandeur,
8342     CASE
8343     WHEN division.libelle IS NOT NULL AND phase.code IS NOT NULL
8344 softime 14542 THEN CONCAT(phase.code, \' - \', division.libelle)
8345 softime 3834 ELSE
8346     phase.code
8347     END AS code_phase
8348 softime 14542 FROM
8349     %1$sinstruction
8350     LEFT JOIN %1$sdossier
8351     ON instruction.dossier = dossier.dossier
8352     LEFT JOIN %1$sdivision
8353     ON dossier.division = division.division
8354     INNER JOIN %1$sevenement
8355     ON instruction.evenement=evenement.evenement
8356     LEFT JOIN %1$sphase
8357     ON evenement.phase = phase.phase
8358     inner JOIN %1$slien_dossier_demandeur
8359     ON instruction.dossier=lien_dossier_demandeur.dossier
8360     inner join %1$sdemandeur
8361     ON demandeur.demandeur=lien_dossier_demandeur.demandeur
8362     WHERE
8363     code_barres = \'%2$s\'
8364     AND %3$s
8365     GROUP BY
8366     dossier.dossier_libelle,
8367     evenement.type,
8368     phase.code,
8369     division.libelle',
8370     DB_PREFIXE,
8371     $this->f->db->escapeSimple($code_barres),
8372     $sql_demandeur
8373     ),
8374     array(
8375     "origin" => __METHOD__
8376     )
8377     );
8378     $testDemandeur = array_shift($qres['result']);
8379 mbroquet 3730
8380    
8381     // Recuperation de l'adresse de destination
8382     // Envoi pour delegataire ou petitionnaire principal selon le type d'evenement
8383 softime 14542 $sqlAdresse = " AND demandeur.type_demandeur='petitionnaire' AND lien_dossier_demandeur.petitionnaire_principal IS TRUE";
8384 mbroquet 3730 if($testDemandeur['type'] != 'arrete' AND $testDemandeur['nbdemandeur'] > 1) {
8385 softime 14542 $sqlAdresse = " AND demandeur.type_demandeur='delegataire'";
8386 mbroquet 3730 }
8387    
8388 softime 14542 $qres = $this->f->get_all_results_from_db_query(
8389     sprintf(
8390     'SELECT
8391     CASE WHEN demandeur.qualite = \'particulier\'
8392     THEN TRIM(CONCAT_WS(\' \', pc.libelle, demandeur.particulier_nom, demandeur.particulier_prenom))
8393     ELSE TRIM(demandeur.personne_morale_denomination)
8394     END as ligne1,
8395     CASE WHEN demandeur.qualite = \'personne_morale\'
8396     THEN TRIM(demandeur.personne_morale_raison_sociale)
8397     ELSE \'\'
8398     END as ligne1_1,
8399     CASE WHEN demandeur.qualite = \'personne_morale\' AND (demandeur.personne_morale_nom IS NOT NULL OR demandeur.personne_morale_prenom IS NOT NULL)
8400     THEN TRIM(CONCAT_WS(\' \', \'rep. par\', demandeur.personne_morale_nom, demandeur.personne_morale_prenom))
8401     ELSE \'\'
8402     END as ligne1_2,
8403     trim(concat(demandeur.numero,\' \',demandeur.voie)) as ligne2,
8404     CASE demandeur.complement
8405     WHEN null THEN \'\'
8406     ELSE trim(demandeur.complement)
8407     END as ligne3,
8408     CASE demandeur.lieu_dit
8409     WHEN null THEN \'\'
8410     ELSE trim(demandeur.lieu_dit)
8411     END as ligne4,
8412     CONCAT_WS(\' \', demandeur.code_postal, demandeur.localite,
8413     (CASE WHEN demandeur.bp IS NOT NULL
8414     THEN CONCAT_WS(\' \', \'BP\', demandeur.bp)
8415     ELSE \'\'
8416     END),
8417     (CASE WHEN demandeur.cedex IS NOT NULL
8418     THEN CONCAT_WS(\' \', \'CEDEX\', demandeur.cedex)
8419     ELSE \'\'
8420     END))
8421     as ligne5,
8422     code_barres as code_barres
8423     FROM
8424     %1$sinstruction
8425     INNER JOIN %1$sdossier
8426     ON dossier.dossier = instruction.dossier
8427     INNER JOIN %1$slien_dossier_demandeur
8428     ON dossier.dossier = lien_dossier_demandeur.dossier
8429     INNER JOIN %1$sdemandeur
8430     ON lien_dossier_demandeur.demandeur = demandeur.demandeur
8431     LEFT OUTER JOIN %1$scivilite AS pc
8432     ON demandeur.particulier_civilite = pc.civilite
8433     OR demandeur.personne_morale_civilite = pc.civilite
8434     WHERE
8435     instruction.code_barres = \'%2$s\'
8436     %3$s',
8437     DB_PREFIXE,
8438     $this->f->db->escapeSimple($code_barres),
8439     $sqlAdresse
8440     ),
8441     array(
8442     "origin" => __METHOD__
8443     )
8444     );
8445     $adresse_dest = array_shift($qres['result']);
8446 mbroquet 3730
8447     // Création adresse destinataire sans ligne vide
8448     $adresse_destinataire = array();
8449     if (!empty($adresse_dest['ligne1'])) {
8450     $adresse_destinataire[] = $adresse_dest['ligne1'];
8451     }
8452     if (!empty($adresse_dest['ligne1_1'])) {
8453     $adresse_destinataire[] = $adresse_dest['ligne1_1'];
8454     }
8455     if (!empty($adresse_dest['ligne1_2'])) {
8456     $adresse_destinataire[] = $adresse_dest['ligne1_2'];
8457     }
8458     $adresse_destinataire[] = $adresse_dest['ligne2'];
8459     if (!empty($adresse_dest['ligne3'])) {
8460     $adresse_destinataire[] = $adresse_dest['ligne3'];
8461     }
8462     if (!empty($adresse_dest['ligne4'])) {
8463     $adresse_destinataire[] = $adresse_dest['ligne4'];
8464     }
8465     $adresse_destinataire[] = $adresse_dest['ligne5'];
8466    
8467     // Création du champ specifique
8468     $specifique_content = array();
8469     $specifique_content[] = $adresse_dest['ligne1'];
8470     $specifique_content[] = $adresse_dest['ligne1_1'];
8471     $specifique_content[] = $adresse_dest['ligne1_2'];
8472     $specifique_content[] = $testDemandeur['dossier_libelle'];
8473     $specifique_content[] = "|||||".$adresse_dest['code_barres']."|||||";
8474     unset($adresse_dest['code_barres']);
8475     // Ajout d'une page aux pdf
8476 softime 3834 $pdf_lettre_rar->addLetter($adresse_destinataire, $specifique_content, $testDemandeur['code_phase']);
8477 mbroquet 3730
8478     }
8479     $pdf_output = $pdf_lettre_rar->output("lettre_rar".date("dmYHis").".pdf","S");
8480 softime 7685 $om_edition = $this->f->get_inst__om_edition();
8481 mbroquet 3730 $om_edition->expose_pdf_output($pdf_output, "lettre_rar".date("dmYHis").".pdf");
8482     }
8483     }
8484    
8485     /**
8486     * VIEW - view_bordereau_envoi_maire.
8487     *
8488     * Formulaire demandant :
8489     * - le code-barres de l'événement d'instruction
8490     * - la date d'envoi du courrier pour signature par le maire
8491     *
8492     * Lors de la validation :
8493     * => met à jour cette date dans l'événement d'instruction
8494     * => crée un lien permettant de générer en PDF le bordereau
8495     *
8496     * @return void
8497     */
8498     function view_bordereau_envoi_maire() {
8499     // Vérification de l'accessibilité sur l'élément
8500     $this->checkAccessibility();
8501    
8502     // Récupération des valeur passées en POST ou GET
8503     $code_barres = "";
8504     if($this->f->get_submitted_post_value('code_barres') !== null) {
8505     $code_barres = $this->f->get_submitted_post_value('code_barres');
8506     } elseif($this->f->get_submitted_get_value('code_barres')!==null) {
8507     $code_barres = $this->f->get_submitted_get_value('code_barres');
8508     }
8509     $date = "";
8510     if($this->f->get_submitted_post_value('date') !== null) {
8511     $date = $this->f->get_submitted_post_value('date');
8512     } elseif($this->f->get_submitted_get_value('date') !== null) {
8513     $date = $this->f->get_submitted_get_value('date');
8514     }
8515     $validation = 0;
8516     if($this->f->get_submitted_post_value('validation') !== null) {
8517     $validation = $this->f->get_submitted_post_value('validation');
8518     } elseif($this->f->get_submitted_get_value('validation') !== null) {
8519     $validation = $this->f->get_submitted_get_value('validation');
8520     }
8521    
8522     // Si le formulaire a été validé
8523     if ($this->f->get_submitted_post_value('validation') !== null) {
8524     // Tous les champs doivent obligatoirement être remplis
8525     if (!empty($date) && !empty($code_barres)) {
8526     $date_en = $this->dateDB($date);
8527     // Si date valide
8528     if ($date_en != "") {
8529     $id_instruction = $this->get_instruction_by_barcode($code_barres);
8530     // Si un événement d'instruction a été trouvé pour ce code-barres
8531     if ($id_instruction !== null) {
8532     $ret = $this->update_date_envoi_signature($id_instruction, $date_en);
8533     // Si mise à jour réussie de la date d'envoi du courrier
8534     // pour signature par l'autorité compétente
8535     if($ret === true) {
8536     // Message de validation avec lien PDF
8537     $message_class = "valid";
8538     $message = '&bullet; '._("Veuillez cliquer sur le lien ci-dessous pour telecharger votre bordereau");
8539     $message .= " : <br/><br/>";
8540     $message .= "<a class='om-prev-icon pdf-16'";
8541     $message .= " id=\"generer_bordereau_envoi_maire\"";
8542     $message .= " title=\""._("Bordereau")."\"";
8543 softime 7996 $message .= " href='".OM_ROUTE_FORM."&obj=instruction";
8544 mbroquet 3730 $message .= "&action=200";
8545     $message .= "&idx=".$id_instruction."'";
8546     $message .= " target='_blank'>";
8547     $message .= _("Bordereau d'envoi au maire");
8548     $message .= "</a><br/><br/>";
8549     $message .= '&bullet; '._("Rappel des informations saisies")." :<br/><br/>";
8550     $message .= _("Code du courrier")." : ".$code_barres."<br/>";
8551     $message .= _("Date d'envoi du courrier pour signature par le maire")." : ".$date;
8552    
8553     } else {
8554     // Message d'erreur
8555     $message_class = "error";
8556     $message = sprintf(_("Erreur lors de la mise a jour de l'evenement d'instruction correspondant au code barres %s."),
8557     $code_barres);
8558     }
8559     }
8560     else {
8561     $message_class = "error";
8562     $message = _("Le numero saisi ne correspond a aucun code-barres d'evenement d'instruction.");
8563     }
8564     }
8565     else {
8566     $message_class = "error";
8567     $message = _("La date est invalide.");
8568     }
8569     } else {
8570     $message_class = "error";
8571     $message = _("Tous les champs doivent etre remplis.");
8572     }
8573     }
8574    
8575     /**
8576     * Affichage des messages et du formulaire
8577     */
8578    
8579     // Affichage du message de validation ou d'erreur
8580     if (isset($message) && isset($message_class) && $message != "") {
8581     $this->f->displayMessage($message_class, $message);
8582     }
8583    
8584     // Ouverture du formulaire
8585     $datasubmit = $this->getDataSubmit();
8586     echo "\n<!-- ########## START DBFORM ########## -->\n";
8587     echo "<form";
8588     echo " id=\"bordereau_envoi_maire\"";
8589     echo " method=\"post\"";
8590     echo " name=\"f1\"";
8591     echo " action=\"";
8592     echo $datasubmit;
8593     echo "\"";
8594     echo ">\n";
8595    
8596     // Paramétrage des champs du formulaire
8597     $champs = array("code_barres","date");
8598    
8599     // Création d'un nouvel objet de type formulaire
8600 softime 7996 $form = $this->f->get_inst__om_formulaire(array(
8601     "validation" => 0,
8602     "maj" => 0,
8603     "champs" => $champs,
8604     ));
8605 mbroquet 3730
8606     $template_required_label = '%s *';
8607     // Parametrage du champ code_barres
8608     $form->setLib("code_barres", sprintf($template_required_label,_("Code du courrier")));
8609     $form->setType("code_barres", "text");
8610     $form->setVal("code_barres", $code_barres);
8611     $form->setTaille("code_barres", 20);
8612     $form->setMax("code_barres", 20);
8613     // Parametrage du champ date
8614     $form->setLib("date", sprintf($template_required_label,_("Date d'envoi du courrier pour signature par le maire")));
8615     $form->setType("date", "date") ;
8616     if (empty($date)) {
8617     $date = date('d/m/Y');
8618     }
8619     $form->setVal("date", $date);
8620     $form->setTaille("date", 10);
8621     $form->setMax("date", 10);
8622    
8623     // Création du bloc regroupant les champs
8624     $form->setBloc('code_barres','D');
8625     $form->setBloc('date','F');
8626     // Affichage du formulaire
8627     $form->entete();
8628     $form->afficher($champs, 0, false, false);
8629     $form->enpied();
8630     // Affichage du bouton
8631     printf("\t<div class=\"formControls\">\n");
8632     //
8633     $this->f->layout->display_form_button(array("value" => _("Valider"), "name" => "validation"));
8634     printf("\t</div>\n");
8635     // Fermeture du formulaire
8636     printf("\t</form>\n");
8637     }
8638    
8639     /**
8640     * VIEW - view_bordereau_envoi_maire.
8641     *
8642     * PDF de bordereau d'envoi au maire pour l'événement d'instruction instancié
8643     *
8644     * @return [void]
8645     */
8646     function view_generate_bordereau_envoi_maire() {
8647     // Vérification de l'accessibilité sur l'élément
8648     $this->checkAccessibility();
8649     // Récupération de la collectivité du dossier d'instruction
8650     $collectivite_di = $this->get_dossier_instruction_om_collectivite();
8651     // Récupération de ses paramètres
8652     $collectivite = $this->f->getCollectivite($collectivite_di);
8653     // Génération du PDF
8654     $result = $this->compute_pdf_output('etat', 'communaute_bordereau_envoi_maire', $collectivite, $this->getVal(($this->clePrimaire)));
8655     // Affichage du PDF
8656     $this->expose_pdf_output(
8657     $result['pdf_output'],
8658     $result['filename']
8659     );
8660     }
8661    
8662     /**
8663 softime 10808 * VIEW - view_rapport_instruction.
8664     *
8665     * Ouvre le sous-formulaire en ajaxIt dans un overlay.
8666     * Cette action est bindée pour utiliser la fonction popUpIt.
8667     *
8668     * @return void
8669     */
8670     function view_overlay_notification_manuelle() {
8671    
8672     // Vérification de l'accessibilité sur l'élément
8673     $this->checkAccessibility();
8674    
8675     printf(
8676     '<script type="text/javascript" >
8677     overlayIt(\'%1$s\',\'%2$s&objsf=%1$s&idxformulaire=%4$s&retourformulaire=dossier_instruction&obj=%1$s&action=411&idx=%3$s\', 1);
8678     </script>',
8679     'instruction_notification_manuelle',
8680     OM_ROUTE_SOUSFORM,
8681     $this->getVal($this->clePrimaire),
8682     $this->getVal('dossier')
8683     );
8684     }
8685    
8686     /**
8687 softime 11585 * VIEW - view_overlay_notification_service_consulte.
8688     *
8689     * Ouvre le sous-formulaire de notification des services consulte
8690     * en ajaxIt dans un overlay.
8691     * Cette action est bindée pour utiliser la fonction popUpIt.
8692     *
8693     * @return void
8694     */
8695     function view_overlay_notification_service_consulte() {
8696    
8697     // Vérification de l'accessibilité sur l'élément
8698     $this->checkAccessibility();
8699    
8700     printf(
8701     '<script type="text/javascript" >
8702     overlayIt(\'%1$s\',\'%2$s&objsf=%1$s&idxformulaire=%4$s&retourformulaire=dossier_instruction&obj=%1$s&action=420&idx=%3$s\', 1);
8703     </script>',
8704     'instruction_notification_manuelle',
8705     OM_ROUTE_SOUSFORM,
8706     $this->getVal($this->clePrimaire),
8707     $this->getVal('dossier')
8708     );
8709     }
8710    
8711     /**
8712     * VIEW - overlay_notification_tiers_consulte.
8713     *
8714     * Ouvre le sous-formulaire de notification des tiers consulte
8715     * en ajaxIt dans un overlay.
8716     * Cette action est bindée pour utiliser la fonction popUpIt.
8717     *
8718     * @return void
8719     */
8720     function view_overlay_notification_tiers_consulte() {
8721    
8722     // Vérification de l'accessibilité sur l'élément
8723     $this->checkAccessibility();
8724    
8725     printf(
8726     '<script type="text/javascript" >
8727     overlayIt(\'%1$s\',\'%2$s&objsf=%1$s&idxformulaire=%4$s&retourformulaire=dossier_instruction&obj=%1$s&action=430&idx=%3$s\', 1);
8728     </script>',
8729     'instruction_notification_manuelle',
8730     OM_ROUTE_SOUSFORM,
8731     $this->getVal($this->clePrimaire),
8732     $this->getVal('dossier')
8733     );
8734     }
8735 softime 12847
8736 softime 11585 /**
8737 softime 12847 * VIEW - view_modale_selection_document_signe
8738     *
8739     * Ouvre le sous-formulaire de notification des services consulte
8740     * en ajaxIt dans un overlay.
8741     * Cette action est bindée pour utiliser la fonction popUpIt.
8742     *
8743     * @return void
8744     */
8745     function view_modale_selection_document_signe() {
8746    
8747     // Vérification de l'accessibilité sur l'élément
8748     $this->checkAccessibility();
8749    
8750     printf(
8751     '<script type="text/javascript" >
8752     overlayIt(\'%1$s\',\'%2$s&objsf=%1$s&idxformulaire=%4$s&retourformulaire=dossier_instruction&obj=%1$s&action=115&idx=%3$s\', 1);
8753     </script>',
8754     'instruction_modale',
8755     OM_ROUTE_SOUSFORM,
8756     $this->getVal($this->clePrimaire),
8757     $this->getVal('dossier')
8758     );
8759     }
8760    
8761     /**
8762 softime 6565 * Retourne l'événement d'instruction dont on donne le code-barres, avec un filtre
8763     * pour exclure les dossiers du groupe contentieux.
8764 mbroquet 3730 *
8765     * @param [string] $barcode numéro du code-barres
8766     * @return [mixed] ID de son instruction ou null si aucun code
8767     */
8768     function get_instruction_by_barcode($barcode) {
8769     // Begin
8770     $this->begin_treatment(__METHOD__);
8771 softime 14064
8772 mbroquet 3730 // Vérification de l'existence de l'événement d'instruction
8773 softime 6565 // pour le code-barres donné, en excluant les dossiers liés au groupe CTX
8774 softime 14064 $qres = $this->f->get_one_result_from_db_query(
8775     sprintf(
8776     'SELECT
8777     instruction
8778     FROM
8779     %1$sinstruction
8780     INNER JOIN %1$sdossier
8781 softime 6565 ON dossier.dossier=instruction.dossier
8782 softime 14064 INNER JOIN %1$sdossier_instruction_type
8783 softime 6565 ON dossier.dossier_instruction_type = dossier_instruction_type.dossier_instruction_type
8784 softime 14064 INNER JOIN %1$sdossier_autorisation_type_detaille
8785 softime 6565 ON dossier_instruction_type.dossier_autorisation_type_detaille = dossier_autorisation_type_detaille.dossier_autorisation_type_detaille
8786 softime 14064 INNER JOIN %1$sdossier_autorisation_type
8787 softime 6565 ON dossier_autorisation_type_detaille.dossier_autorisation_type = dossier_autorisation_type.dossier_autorisation_type
8788 softime 14064 INNER JOIN %1$sgroupe
8789 softime 6565 ON dossier_autorisation_type.groupe = groupe.groupe
8790 softime 14064 AND groupe.code != \'CTX\'
8791     WHERE
8792     code_barres = \'%2$s\'',
8793     DB_PREFIXE,
8794     $this->f->db->escapeSimple($barcode)
8795     ),
8796     array(
8797     "origin" => __METHOD__,
8798     )
8799     );
8800    
8801 mbroquet 3730 // Retourne résultat
8802 softime 14064 return $this->end_treatment(__METHOD__, $qres['result']);
8803 mbroquet 3730 }
8804    
8805     /**
8806     * Met à jour le champ date d'envoi signature
8807     * avec la date fournie et pour l'instruction donnée
8808     *
8809     * @param [string] $id ID de l'événement d'instruction
8810     * @param [string] $date date au format EN
8811     * @return [boolean] true si mise à jour avec succès
8812     */
8813     function update_date_envoi_signature($id, $date) {
8814     // Préparation du tableau
8815     $valF = array();
8816     $valF['date_envoi_signature'] = $date;
8817     // Begin
8818     $this->begin_treatment(__METHOD__);
8819     // Requête
8820 softime 12847 $res = $this->f->db->autoexecute(
8821 mbroquet 3730 DB_PREFIXE.$this->table,
8822     $valF,
8823     DB_AUTOQUERY_UPDATE,
8824     $this->getCle($id)
8825     );
8826 softime 12847 $this->addToLog(
8827     __METHOD__."(): db->autoexecute(\"".DB_PREFIXE.'.'.$this->table."\", ".print_r($valF, true).", DB_AUTOQUERY_UPDATE, \"".$this->getCle($id)."\");",
8828     VERBOSE_MODE
8829     );
8830     if ($this->f->isDatabaseError($res, true) !== false) {
8831 mbroquet 3730 $this->end_treatment(__METHOD__, false);
8832     }
8833     //
8834     return $this->end_treatment(__METHOD__, true);
8835     }
8836    
8837     /**
8838     * Méthode permettant de définir des valeurs à envoyer en base après
8839     * validation du formulaire d'ajout.
8840     * @param array $val tableau des valeurs retournées par le formulaire
8841     */
8842 softime 6929 function setValFAjout($val = array()) {
8843 mbroquet 3730 // Mise à jour du flag created_by_commune lors d'un changement de décision
8844     // par un utilisateur de commune sur un dossier instruit par la comcom
8845 softime 6565 if ($this->isInstrCanChangeDecision($this->valF["dossier"])) {
8846 mbroquet 3730 $this->valF['created_by_commune'] = true;
8847     }
8848 softime 8593
8849     //
8850     if ($this->evenement_has_an_edition($this->valF['evenement']) === false) {
8851     if (isset($this->valF['flag_edition_integrale']) === true) {
8852     unset($this->valF['flag_edition_integrale']);
8853     }
8854     if (isset($this->valF['signataire_arrete']) === true) {
8855     unset($this->valF['signataire_arrete']);
8856     }
8857     }
8858 mbroquet 3730 }
8859 nmeucci 3876
8860 fmichon 3892
8861 fmichon 4708 /**
8862     * Récupère l'instance d'un événement de workflow.
8863     *
8864     * @param mixed $evenement Identifiant de l'événement.
8865     *
8866     * @return object
8867     */
8868     function get_inst_evenement($evenement = null) {
8869     //
8870     return $this->get_inst_common("evenement", $evenement);
8871     }
8872 softime 3976
8873 fmichon 3892 /**
8874 softime 3976 * Logue l'action de l'instruction dans son DI.
8875 nmeucci 3933 *
8876 softime 3976 * @param string $id Clé primaire de l'instruction.
8877     * @param array $val Valeurs de l'instruction.
8878     *
8879     * @return bool Vrai si traitement effectué avec succès
8880 nmeucci 3876 */
8881 softime 3976 private function add_log_to_dossier($id, array $val) {
8882 nmeucci 3933 $maj = $this->getParameter("maj");
8883 nmeucci 3943 // Action = Trace par défaut
8884     $action = $this->get_backtrace();
8885     // Action = Identifant de l'action si contexte connu
8886     if (empty($maj) === false
8887     || (empty($maj) === true && $maj === 0)) {
8888     $action = $this->get_action_param($maj, 'identifier');
8889 nmeucci 3965 if ($action === 'modifier_suivi') {
8890     $action = "modifier (via l'action suivi des dates)";
8891     }
8892 nmeucci 4108 if ($action === 'notifier_commune'
8893     && isset($val['mails_destinataires']) === true) {
8894     $action = "notification de la commune (courriels : ";
8895     $action .= $val['mails_destinataires'].")";
8896     }
8897 nmeucci 3943 }
8898 nmeucci 3876 // Création du log
8899     $log = array(
8900     'date' => date('Y-m-d H:i:s'),
8901     'user' => $_SESSION['login'],
8902     'action' => $action,
8903     'values' => array(
8904     'date_evenement' => $this->dateDB($val['date_evenement']),
8905     'date_retour_rar' => $this->dateDB($val['date_retour_rar']),
8906     'date_retour_signature' => $this->dateDB($val['date_retour_signature']),
8907     'evenement' => $val['evenement'],
8908     'action' => $val['action'],
8909 nmeucci 3963 'instruction' => $id,
8910 nmeucci 3876 'etat' => $val['etat'],
8911     ),
8912     );
8913     // Ajout du log
8914 softime 3976 $di = $this->get_inst_dossier($val['dossier']);
8915 nmeucci 3876 $ret = $di->add_log_instructions($log);
8916     if ($ret === false) {
8917     $this->correct = false;
8918     $this->msg = '';
8919     $this->addToMessage($di->msg);
8920     }
8921     return $ret;
8922     }
8923 nmeucci 3943
8924 softime 3976
8925 nmeucci 3943 /**
8926 softime 3976 * Retourne le contexte de déboguage formaté en HTML.
8927 nmeucci 3943 *
8928 softime 3976 * @return string Une ligne par trace
8929 nmeucci 3943 */
8930     private function get_backtrace() {
8931     $trace = debug_backtrace();
8932 nmeucci 3957 $backtrace = '';
8933     $i = 1;
8934 nmeucci 3943 foreach ($trace as $key => $value) {
8935 nmeucci 3957 $func = $trace[$key]['function'];
8936     // On ne s'autolog pas
8937     if ($func === 'get_backtrace'
8938     || $func === 'add_log_to_dossier') {
8939     continue;
8940     }
8941     $backtrace .= $i.') ';
8942     // Si dans une classe
8943     if (isset($trace[$key]['class']) === true
8944     && empty($trace[$key]['class']) === false) {
8945 nmeucci 3963 $backtrace .= $trace[$key]['class'].'->'.$func;
8946 nmeucci 3957 }
8947     // Si procédural
8948     else {
8949     $file = $trace[$key]['file'];
8950 nmeucci 3963 $line = $trace[$key]['line'];
8951 softime 3976 $truncated_file = $this->f->get_relative_path($file);
8952 nmeucci 3963 if ($truncated_file !== false) {
8953     $file = $truncated_file;
8954     }
8955     $backtrace .= $func.' IN<br/>&nbsp;&nbsp;&nbsp;&nbsp; '.$file.':'.$line;
8956 nmeucci 3957 }
8957     $backtrace .= '<br/>';
8958     $i++;
8959 nmeucci 3943 }
8960 nmeucci 3957 return $backtrace;
8961 nmeucci 3943 }
8962 nmeucci 3963
8963 nmeucci 4108 /**
8964     * CONDITION - is_notifiable.
8965     *
8966     * Condition pour afficher l'action notifier_commune.
8967     *
8968     * @return boolean
8969     */
8970     public function is_notifiable() {
8971     // L'instruction doit être finalisée, ce qui revient à dire
8972     // définalisable sans bypass
8973     if ($this->is_unfinalizable_without_bypass() === false) {
8974     return false;
8975     }
8976     // La collectivité de l'utilisateur doit être de niveau multi
8977     if ($this->f->has_collectivite_multi() === false) {
8978     return false;
8979     }
8980     // Le paramètre multi de l'objet du courriel doit exister
8981     if ($this->f->getParameter('param_courriel_de_notification_commune_objet_depuis_instruction') === NULL) {
8982     return false;
8983     }
8984     // Le paramètre multi du modèle du courriel doit exister
8985     if ($this->f->getParameter('param_courriel_de_notification_commune_modele_depuis_instruction') === NULL) {
8986     return false;
8987     }
8988     // A ce stade toutes les conditions sont satisfaites
8989     return true;
8990     }
8991 nmeucci 3963
8992 nmeucci 4108 /**
8993     * TREATMENT - notifier_commune.
8994     *
8995     * Notifie aux communes et par courriel la finalisation d'une instruction.
8996     *
8997     * @return boolean
8998     */
8999     public function notifier_commune() {
9000     // Cette méthode permet d'exécuter une routine en début des méthodes
9001     // dites de TREATMENT.
9002     $this->begin_treatment(__METHOD__);
9003 softime 14542 $message = __('Erreur de paramétrage :');
9004 softime 12654 $erreurParametrage = false;
9005     // Récupération du paramétrage de la collectivité du dossier
9006 nmeucci 4108 $id_di = $this->getVal('dossier');
9007     $di = $this->get_inst_dossier($id_di);
9008     $collectivite_di = $di->getVal('om_collectivite');
9009 softime 12654 // Récupération de l'url permettant d'accèder à l'instruction et au dossier
9010     $urlAcces = $this->f->get_parametre_notification_url_acces($collectivite_di);
9011     if (empty($urlAcces) && empty(PATH_BASE_URL)) {
9012     $erreurParametrage = true;
9013     $message .= '<br>'.__("* l'url de notification n'est pas correctement paramétré");
9014 nmeucci 4108 }
9015 softime 12654
9016     // Récupération de la liste des mails
9017     $adresses = $this->f->get_param_courriel_de_notification_commune($collectivite_di);
9018     if (empty($adresses)) {
9019     $erreurParametrage = true;
9020     $message .= '<br>'.__("* aucun courriel valide de destinataire de la commune");
9021 nmeucci 4108 }
9022 softime 12654
9023     // Vérification du paramétrage des mails
9024     $paramMail = $this->f->get_notification_commune_parametre_courriel_type($collectivite_di);
9025     if (empty($paramMail) || empty($paramMail['parametre_courriel_type_message'])) {
9026     $erreurParametrage = true;
9027     $message .= '<br>'.__("* le modèle du courriel envoyé aux communes est vide");
9028 nmeucci 4108 }
9029 softime 12654 if (empty($paramMail) || empty($paramMail['parametre_courriel_type_titre'])) {
9030     $erreurParametrage = true;
9031     $message .= '<br>'.__("* l'objet du courriel envoyé aux communes est vide");
9032 nmeucci 4108 }
9033 softime 12654
9034     // Si il y a des erreurs de paramétrage on ne déclenche pas la notification et
9035     // un message a destination de l'utilisateur est affiché
9036     if ($erreurParametrage) {
9037     $message .= '<br>'.__("Veuillez contacter votre administrateur.");
9038     $this->addToMessage($message);
9039 nmeucci 4108 return $this->end_treatment(__METHOD__, false);
9040     }
9041 softime 12654
9042     // Création d'un notification et de sa tâche associé pour chaque mail
9043     foreach ($adresses as $adresse) {
9044     // Ajout de la notif et récupération de son id
9045     $destinataire = array(
9046     'destinataire' => $adresse,
9047     'courriel' => $adresse
9048     );
9049     $idNotif = $this->ajouter_notification(
9050     $this->getVal($this->clePrimaire),
9051     $this->f->get_connected_user_login_name(),
9052     $destinataire,
9053     $collectivite_di
9054     );
9055     if ($idNotif === false) {
9056     $this->addToMessage(__("Veuillez contacter votre administrateur."));
9057     return $this->end_treatment(__METHOD__, false);
9058 nmeucci 4108 }
9059 softime 12654 // Création de la tache en lui donnant l'id de la notification
9060     $notification_by_task = $this->notification_by_task(
9061     $idNotif,
9062     $this->getVal('dossier'),
9063     'mail',
9064     'notification_commune'
9065     );
9066     if ($notification_by_task === false) {
9067     $this->addToMessage(__("Erreur lors de la préparation de la notification des communes."));
9068     $this->addToMessage(__("Veuillez contacter votre administrateur."));
9069     return $this->end_treatment(__METHOD__, false);
9070     }
9071 nmeucci 4108 }
9072 softime 12654 $this->addToMessage(__('La commune a été notifiée.'));
9073 nmeucci 4108 return $this->end_treatment(__METHOD__, true);
9074     }
9075    
9076     /**
9077 softime 5169 * Récupère l'instance de l'instructeur
9078     *
9079     * @param integer $instructeur Identifiant de l'instructeur.
9080     *
9081     * @return object
9082     */
9083     protected function get_inst_instructeur($instructeur) {
9084     //
9085     return $this->get_inst_common("instructeur", $instructeur);
9086     }
9087    
9088    
9089     /**
9090     * Récupère l'instance de l'utilisateur
9091     *
9092     * @param integer $om_utilisateur Identifiant de l'utilisateur.
9093     *
9094     * @return object
9095     */
9096     protected function get_inst_om_utilisateur($om_utilisateur) {
9097     //
9098     return $this->get_inst_common("om_utilisateur", $om_utilisateur);
9099     }
9100    
9101    
9102 softime 6565 /**
9103 softime 5295 * Récupère l'instance de la division.
9104     *
9105     * @param integer $division Identifiant de la division.
9106     *
9107     * @return object
9108     */
9109     protected function get_inst_division($division) {
9110     //
9111     return $this->get_inst_common("division", $division);
9112     }
9113    
9114    
9115     /**
9116     * Récupère l'instance de la direction.
9117     *
9118     * @param integer $direction Identifiant de la direction.
9119     *
9120     * @return object
9121     */
9122     protected function get_inst_direction($direction) {
9123     //
9124     return $this->get_inst_common("direction", $direction);
9125     }
9126    
9127    
9128     /**
9129     * Récupère la collectivité d'un instructeur en passant par sa division puis
9130     * par sa direction.
9131     *
9132     * @param integer $instructeur Identifiant de l'instructeur.
9133     *
9134     * @return integer
9135     */
9136     protected function get_instructeur_om_collectivite($instructeur) {
9137     // Chemin vers la collectivité d'un instructeur
9138     $inst_instr = $this->get_inst_instructeur($instructeur);
9139     $inst_division = $this->get_inst_division($inst_instr->getVal('division'));
9140     $inst_direction = $this->get_inst_direction($inst_division->getVal('direction'));
9141    
9142     // Collectivité
9143     $om_collectivite = $inst_direction->getVal('om_collectivite');
9144    
9145     //
9146     return $om_collectivite;
9147     }
9148    
9149 softime 6565 /*
9150     * CONDITION - can_user_access_dossier_contexte_ajout
9151     *
9152     * Vérifie que l'utilisateur a bien accès au dossier d'instruction passé dans le
9153     * formulaire d'ajout.
9154     * Cette méthode vérifie que l'utilisateur est lié au groupe du dossier, et si le
9155     * dossier est confidentiel qu'il a accès aux confidentiels de ce groupe.
9156     *
9157     */
9158     function can_user_access_dossier_contexte_ajout() {
9159 softime 5295
9160 softime 6565 ($this->f->get_submitted_get_value('idxformulaire') !== null ? $id_dossier =
9161     $this->f->get_submitted_get_value('idxformulaire') : $id_dossier = "");
9162     //
9163     if ($id_dossier !== "") {
9164 softime 7996 $dossier = $this->f->get_inst__om_dbform(array(
9165     "obj" => "dossier_instruction",
9166     "idx" => $id_dossier,
9167     ));
9168 softime 6565 //
9169     return $dossier->can_user_access_dossier();
9170     }
9171     return false;
9172     }
9173    
9174     /*
9175     * CONDITION - can_user_access_dossier
9176     *
9177     * Vérifie que l'utilisateur a bien accès au dossier lié à l'instruction instanciée.
9178     * Cette méthode vérifie que l'utilisateur est lié au groupe du dossier, et si le
9179     * dossier est confidentiel qu'il a accès aux confidentiels de ce groupe.
9180     *
9181     */
9182     function can_user_access_dossier_contexte_modification() {
9183    
9184     $id_dossier = $this->getVal('dossier');
9185     //
9186     if ($id_dossier !== "" && $id_dossier !== null) {
9187 softime 7996 $dossier = $this->f->get_inst__om_dbform(array(
9188     "obj" => "dossier_instruction",
9189     "idx" => $id_dossier,
9190     ));
9191 softime 6565 //
9192     return $dossier->can_user_access_dossier();
9193     }
9194     return false;
9195     }
9196    
9197 softime 8593 /**
9198 softime 10713 * TREATMENT - envoyer_a_signature_sans_relecture
9199     *
9200     * Permet d'envoyer le document de l'instruction au parapheur pour signature sans relecture
9201     *
9202     * @return boolean true si l'envoi a été effectué avec succès false sinon
9203     */
9204     function envoyer_a_signature_sans_relecture() {
9205     return $this->envoyer_a_signature();
9206     }
9207    
9208     /**
9209     * TREATMENT - envoyer_a_signature_avec_relecture
9210     *
9211     * Permet d'envoyer le document de l'instruction au parapheur pour signature avec relecture
9212     *
9213     * @return boolean true si l'envoi a été effectué avec succès false sinon
9214     */
9215     function envoyer_a_signature_avec_relecture() {
9216 softime 10808 $is_forced_view_files = true;
9217     return $this->envoyer_a_signature($is_forced_view_files);
9218 softime 10713 }
9219    
9220     /**
9221 softime 10573 * TREATMENT - envoyer_a_signature
9222     *
9223     * Permet d'envoyer le document de l'instruction au parapheur pour signature
9224 softime 10713 *
9225     * @param boolean $is_forced_view_files Indique si il y a une relecture (true) ou non (false)
9226 softime 10573 *
9227     * @return boolean true si l'envoi a été effectué avec succès false sinon
9228     */
9229 softime 10713 function envoyer_a_signature($is_forced_view_files = false) {
9230 softime 10573 $this->begin_treatment(__METHOD__);
9231     $this->correct = true;
9232    
9233     // Instanciation de l'objet signataire_arrete
9234     $inst_signataire_arrete = $this->f->get_inst__om_dbform(array(
9235     'obj' => 'signataire_arrete',
9236     'idx' => $this->getVal('signataire_arrete'),
9237     ));
9238    
9239     // Instanciation de l'objet dossier
9240     $inst_dossier = $this->f->get_inst__om_dbform(array(
9241     'obj' => 'dossier',
9242     'idx' => $this->getVal('dossier'),
9243     ));
9244    
9245     // Récupération du document à signer
9246     $file = $this->f->storage->get($this->getVal('om_fichier_instruction'));
9247     if ($file === OP_FAILURE) {
9248     $this->correct = false;
9249     $this->addToMessage(__("Une erreur est survenue lors de la récupération du contenu du document de l'instruction."));
9250     // Termine le traitement
9251     return $this->end_treatment(__METHOD__, false);
9252     }
9253    
9254     // Initialisation des paramètre à passer pour l'envoi en signature
9255 softime 10808 $data = array(
9256 softime 10573 "om_utilisateur_email" => $this->f->om_utilisateur['email'],
9257     "om_utilisateur_nom" => $this->f->om_utilisateur['nom'],
9258     "signataire_arrete_email" => $inst_signataire_arrete->getVal('email'),
9259     "signataire_arrete_nom" => $inst_signataire_arrete->getVal('nom'),
9260     "signataire_arrete_prenom" => $inst_signataire_arrete->getVal('prenom'),
9261 softime 11876 // Permet d'envoyer en signature l'instruction le jour de la date limite
9262 softime 14064 "date_limite_instruction" => $this->compute_date_limite(1) != null ? $this->compute_date_limite(1) : null,
9263 softime 10573 "dossier" => $this->getVal('dossier'),
9264 softime 10713 "is_forced_view_files" => $is_forced_view_files,
9265     'commentaire_signature' => $is_forced_view_files === true ? __('relecture demandee.') : null
9266 softime 10573 );
9267    
9268 softime 10808 // Initialisation des métadonnées
9269     $metadonnee_dossier = $file['metadata'];
9270 softime 11228 // récupération de l'extension du fichier
9271     $extension = substr($metadonnee_dossier['filename'], strrpos($metadonnee_dossier['filename'], '.'));
9272     // Modification du libellé du document transmis au parapheur
9273     // pour le mettre sous la forme : instruction_xxx_libelle_lettretype.extension
9274     $metadonnee_dossier['filename'] = $this->getDocumentLibelle().$extension;
9275     $metadonnee_dossier['titre_document'] = $this->getDocumentTitre();
9276 softime 10808
9277     $metadonnee_dossier['url_di'] = sprintf(
9278     '%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',
9279 softime 11418 $this->f->get_param_base_path_metadata_url_di() !== null ? $this->f->get_param_base_path_metadata_url_di() : PATH_BASE_URL,
9280 softime 10808 $this->getVal($this->clePrimaire)
9281     );
9282    
9283     $optional_data = null;
9284     // Si il y a des paramètres supplémentaire spécifié dans le signataire alors on les récupère
9285     if ($inst_signataire_arrete->getVal('parametre_parapheur') !== null && $inst_signataire_arrete->getVal('parametre_parapheur') !== '') {
9286     $optional_data = json_decode($inst_signataire_arrete->getVal('parametre_parapheur'), true);
9287     if (json_last_error() !== JSON_ERROR_NONE) {
9288     $this->correct = false;
9289     $this->addToMessage(__("Les paramètres supplémentaires envoyés au parapheur ne sont pas au bon format."));
9290     $this->addToLog(__METHOD__."(): ".
9291     __("Erreur lors du décodage du format json des paramètres supplémentaires envoyé au parapheur.
9292     Tableau : ").var_export($inst_signataire_arrete->getVal('parametre_parapheur'), true)
9293     );
9294     // Termine le traitement
9295     return $this->end_treatment(__METHOD__, false);
9296     }
9297     }
9298    
9299 softime 10573 //Instanciation de la classe electronicsignature
9300     $inst_es = $this->get_electronicsignature_instance();
9301     if ($inst_es === false) {
9302     $this->correct = false;
9303     return $this->end_treatment(__METHOD__, false);
9304     }
9305    
9306     // Appel de la méthode de l'abstracteur send_for_signature()
9307     // Cette méthode doit retourner un tableau de valeur
9308     try {
9309 softime 10808 $result = $inst_es->send_for_signature($data, $file['file_content'], $metadonnee_dossier, $optional_data);
9310 softime 10573 } catch (electronicsignature_exception $e) {
9311     $this->handle_electronicsignature_exception($e);
9312     return $this->end_treatment(__METHOD__, false);
9313     }
9314    
9315     // Après avoir reçu le résultat du parapheur, il faut mettre à jour les champs
9316     $valF = array();
9317    
9318     // Pour appeler la fonction modifier il faut traiter tous les champs de l'objet
9319     foreach($this->champs as $identifiant => $champ) {
9320     $valF[$champ] = $this->val[$identifiant];
9321     }
9322     // On fait ensuite nos modifications spécifiques
9323     $valF['id_parapheur_signature'] = $result['id_parapheur_signature'];
9324     $valF['statut_signature'] = $result['statut'];
9325     $valF['commentaire_signature'] = isset($result['commentaire_signature']) == true ? $result['commentaire_signature'] : null;
9326     $valF['date_envoi_signature'] = date("Y-m-d", strtotime($result['date_envoi_signature']));
9327     $valF['historique_signature'] = $this->get_updated_historique_signature($result);
9328    
9329     $ret = $this->modifier($valF);
9330    
9331     if ($ret === false) {
9332     $this->correct = false;
9333     $this->addToMessage(__("Une erreur est survenue lors de la mise à jour des champs."));
9334     // Termine le traitement
9335     return $this->end_treatment(__METHOD__, false);
9336     }
9337    
9338     // Message
9339     $this->addToMessage(__("Le document a été envoyé pour signature dans le parapheur."));
9340     if (array_key_exists('signature_page_url', $result) === true) {
9341     $this->addToMessage(sprintf(
9342 softime 11228 '<br> > <a href="%1$s" title="%2$s" target="_blank">%2$s</a>',
9343     $result['signature_page_url'],
9344     __("Signez directement le document")
9345 softime 10573 ));
9346     }
9347    
9348     // Tout s'est bien passé, on termine le traitement
9349     return $this->end_treatment(__METHOD__, true);
9350     }
9351    
9352     /**
9353 softime 11876 * Permet de récupérer la bonne date limite en fonction de si l'instruction
9354     * est en incomplet notifié ou non.
9355     * On peut ajouter des jours à cette date grâce au paramètre "delay".
9356     * Cette fonction est utilisée dans un cas spécifique où on veut envoyer
9357     * l'instruction en signature le jour de la date limite.
9358     *
9359     * @param int $delay Le nombre de jour à ajouter à la date limite.
9360     *
9361     * @return string $date_limite la date limite calculé ou false
9362     */
9363     private function compute_date_limite($delay) {
9364     // Instanciation de l'objet dossier
9365     $inst_dossier = $this->f->get_inst__om_dbform(array(
9366     'obj' => 'dossier',
9367     'idx' => $this->getVal('dossier'),
9368     ));
9369    
9370     $date_to_compute = null;
9371     if ($inst_dossier->getVal('incomplet_notifie') === 't') {
9372     $date_to_compute = $inst_dossier->getVal('date_limite_incompletude');
9373     } else {
9374     $date_to_compute = $inst_dossier->getVal('date_limite');
9375     }
9376 softime 14064 if ($date_to_compute != null) {
9377     return date("Y-m-d", strtotime($date_to_compute."+ $delay days"));
9378     }
9379 softime 11876
9380 softime 14064 return null;
9381 softime 11876 }
9382    
9383     /**
9384 softime 10573 * Permet de récupérer la traduction de la valeur de statut_signature
9385     *
9386     * @return string la valeur de statut_signature traduite | false
9387     */
9388     function get_trad_for_statut($value_to_trad){
9389     $statut_signature_tab = array(
9390     'waiting' => __('en préparation'),
9391     'in_progress' => __('en cours de signature'),
9392     'canceled' => __('signature annulée'),
9393 softime 10808 'expired' => __('délai de signature expiré'),
9394 softime 10573 'finished' => __('signé')
9395     );
9396     if (array_key_exists($value_to_trad, $statut_signature_tab) === true) {
9397     return $statut_signature_tab[$value_to_trad];
9398     }
9399    
9400     return false;
9401     }
9402    
9403     /**
9404     * Permet de mettre à jour le tableau json sotcké dans le champ historique_signature
9405     *
9406     * @return string (json) la valeur de historique_signature mis à jour | false
9407     */
9408     function get_updated_historique_signature($historique_signature_values) {
9409    
9410     $historique_signature_value_tab = $this->get_historique_signature_decoded();
9411    
9412     if ($historique_signature_value_tab === false) {
9413     $this->addToLog(__METHOD__."(): erreur historique signature", DEBUG_MODE);
9414     return false;
9415     }
9416    
9417     $last_val_historique_signature = array();
9418    
9419     // Si la tableau récupéré n'est pas vide alors
9420     // on récupère la dernière ligne du tableau
9421     if (empty($historique_signature_value_tab) === false) {
9422     $last_val_historique_signature = end($historique_signature_value_tab);
9423     }
9424    
9425     $format_date = '';
9426     $format_date_hour = '';
9427     $date_converted=array();
9428    
9429     $date_to_convert = array(
9430     'date_envoi_signature' => $historique_signature_values['date_envoi_signature'],
9431 softime 11876 'date_limite_instruction' => $this->compute_date_limite(0),
9432 softime 10573 'date_retour_signature' => $historique_signature_values['date_retour_signature']
9433     );
9434    
9435     // Conversion des dates en fonction de leur format
9436     foreach ($date_to_convert as $key => $value) {
9437     $date_converted[$key] = null;
9438     if ($value != null) {
9439     $format_date = 'd/m/Y';
9440     $format_date_hour = 'd/m/Y H:i:s';
9441     $date_converted[$key] = empty(date_parse($value)['hour']) === false ? date($format_date_hour, strtotime($value)) : date($format_date, strtotime($value));
9442     }
9443     }
9444    
9445     // Ce tableau permet de lister les colonnes de historique_signature et de les rendre traduisibles.
9446     // Il faut en effet mettre les gettext avec l'intitulé explicite au moins
9447     // une fois afin qu'il puisse être reconnu par le logiciel de traduction.
9448     $tab_for_columns_trad = array(
9449     __('entry_date'),
9450     __('id_parapheur_signature'),
9451     __('emetteur'),
9452     __('signataire'),
9453     __('date_envoi'),
9454     __('date_limite'),
9455     __('date_retour'),
9456     __('statut_signature'),
9457     __('commentaire_signature')
9458     );
9459    
9460     array_push($historique_signature_value_tab, array(
9461     'entry_date' => date('d/m/Y H:i:s'),
9462     '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'],
9463     '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'],
9464     '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'],
9465     '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'],
9466     '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'],
9467     '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'],
9468     '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']),
9469     'commentaire_signature' => isset($historique_signature_values['commentaire_signature']) === false || $historique_signature_values['commentaire_signature'] == null ? null : $historique_signature_values['commentaire_signature'],
9470     ));
9471    
9472     return json_encode($historique_signature_value_tab, JSON_HEX_APOS);
9473     }
9474 softime 11876
9475     /**
9476     * TREATMENT - annuler_envoi_en_signature
9477     *
9478     * Permet d'annuler l'envoi du document de l'instruction au parapheur pour signature
9479     *
9480     * @return boolean true si l'annulation a été effectué avec succès false sinon
9481     */
9482     function annuler_envoi_en_signature() {
9483     $this->begin_treatment(__METHOD__);
9484     $this->correct = true;
9485 softime 10573
9486 softime 11876 //Instanciation de la classe electronicsignature
9487     $inst_es = $this->get_electronicsignature_instance();
9488     if ($inst_es === false) {
9489     $this->correct = false;
9490     return $this->end_treatment(__METHOD__, false);
9491     }
9492 softime 10573
9493 softime 11876 $data = array();
9494     if (! empty($this->getVal('id_parapheur_signature'))) {
9495     $data['id_parapheur_signature'] = $this->getVal('id_parapheur_signature');
9496     } else {
9497     $this->correct = false;
9498     $this->addToMessage(__("Il n'y a pas d'identifiant de parapheur."));
9499     return $this->end_treatment(__METHOD__, false);
9500     }
9501    
9502     // Appel de la méthode de l'abstracteur cancel_send_for_signature()
9503     // Cette méthode doit retourner un tableau de valeur
9504     try {
9505     $result = $inst_es->cancel_send_for_signature($data);
9506     } catch (electronicsignature_exception $e) {
9507     $this->handle_electronicsignature_exception($e);
9508     return $this->end_treatment(__METHOD__, false);
9509     }
9510    
9511     // Après avoir reçu le résultat du parapheur, il faut mettre à jour les champs
9512     $valF = array();
9513    
9514     // Pour appeler la fonction modifier il faut traiter tous les champs de l'objet
9515     foreach($this->champs as $identifiant => $champ) {
9516     $valF[$champ] = $this->val[$identifiant];
9517     }
9518     // On fait ensuite nos modifications spécifiques
9519     $valF['id_parapheur_signature'] = null;
9520     $valF['statut_signature'] = $result['statut'];
9521     $valF['commentaire_signature'] = isset($result['commentaire_signature']) == true ? $result['commentaire_signature'] : null;
9522     $valF['date_envoi_signature'] = null;
9523     $valF['historique_signature'] = $this->get_updated_historique_signature($result);
9524    
9525     $ret = $this->modifier($valF);
9526    
9527     if ($ret === false) {
9528     $this->correct = false;
9529     $this->addToMessage(__("Une erreur est survenue lors de la mise à jour des champs."));
9530     // Termine le traitement
9531     return $this->end_treatment(__METHOD__, false);
9532     }
9533    
9534     // Message
9535     $this->addToMessage(__("L'annulation a été effectuée avec succès."));
9536    
9537     // Tout s'est bien passé, on termine le traitement
9538     return $this->end_treatment(__METHOD__, true);
9539     }
9540    
9541    
9542 softime 10573 /**
9543     * Récupère le contenu du champ historique_signature et le converti en tableau
9544     *
9545     * @return array sinon false en cas d'erreur
9546     */
9547     protected function get_historique_signature_decoded() {
9548 softime 11876 $val = str_replace("'", '"', $this->getVal('historique_signature'));
9549     if ($val === '' || $val == 'false') {
9550 softime 10573 $val = json_encode(array());
9551     }
9552     if($this->isJson($val) === false) {
9553     return false;
9554     }
9555     return json_decode($val, true);
9556     }
9557    
9558 softime 10808 /**
9559     * Récupère les informations à afficher dans le tableau de suivi à l'aide
9560     * d'une requête sql. Stocke ces informations dans un tableau.
9561 softime 12433 * Converti le tableau au format json et renvoi le json obtenu.
9562 softime 10808 *
9563 softime 12433 * Pour identifier quel suivi est affiché (notification des demandeurs, des services ou
9564     * de tiers) ce sont les tâches liées aux notifications qui sont utilisés.
9565     * La clause where de la requête est construite à partir du tableau contenant les types
9566     * de tâches fourni en paramètre.
9567     * Il est également possible d'afficher les notifications n'étant pas lié à des tâches.
9568     *
9569     * Si le suivi concerne la notification des demandeurs via le portail citoyen,
9570     * la date de premier accès ne sera pas affichée.
9571     *
9572     * @param array liste des tâches permettant d'identifier quelles notification afficher
9573     * @param boolean permet d'afficher les notifications non liées à des tâches
9574 softime 10808 * @return json
9575     */
9576 softime 12124 protected function get_json_suivi_notification($typeTache, $nonLieTache = false) {
9577 softime 11585 $whereTypeTache = '';
9578 softime 12124 $sqlTaskNull = '';
9579 softime 12654
9580     // Liste des champs à afficher. Permet également la traduction des noms de colonnes.
9581     $listeChampsTrad = array(
9582     __('emetteur'),
9583     __('date_envoi'),
9584     __('destinataire'),
9585     __('date_premier_acces'),
9586     __('instruction'),
9587     __('annexes'),
9588     __('statut'),
9589     __('commentaire')
9590     );
9591     $listeChamps = array(
9592     'emetteur',
9593     'date_envoi',
9594     'destinataire',
9595     'date_premier_acces',
9596     'instruction',
9597     'annexes',
9598     'statut',
9599     'commentaire'
9600     );
9601    
9602 softime 12124 // Défini si on veux que la requête récupère également les notifications qui n'ont pas
9603     // de tâches associées. C'est le cas pour les notifications de demandeurs lorsque la
9604     // notification du demandeur principal n'a pas pu être envoyée à cause d'un mauvais
9605     // paramétrage
9606     if(is_bool($nonLieTache) && $nonLieTache === true) {
9607     $sqlTaskNull = 'OR task.type is null';
9608     }
9609     // Prépare la clause where pour ne récupérer que les notifications liées à certain type de tâches
9610     // Permet de différencier les notifications des demandeurs de celle des services et de celles des
9611     // tiers consulté
9612 softime 12433 if (is_array($typeTache) && $typeTache != array()) {
9613 softime 11585 if (is_array($typeTache)) {
9614     $whereTypeTache = sprintf(
9615 softime 12124 'AND (task.type IN (%1$s) %2$s)',
9616     "'".implode("', '", $typeTache)."'",
9617     $sqlTaskNull
9618 softime 11585 );
9619     }
9620 softime 12433 // La date de premier accès n'a pas besoin d'être renseigné pour
9621     // les notifications des demandeurs via le portail citoyen.
9622     // Les notifications des demandeurs sont liés à 3 types de tâches
9623     // notification_recepisse, notification_instruction, notification_decision
9624     // Si le suivi de la notification concerne un de ces types de tâches on
9625     // considère que c'est une notification de demandeurs.
9626     // Dans ce cas on vérifie si cette notification est paramétrée pour passer
9627     // via le portail. Par défaut si rien n'est paramétré on considère que la
9628     // notification est faite via le portail
9629     if ((in_array('notification_recepisse', $typeTache) ||
9630     in_array('notification_instruction', $typeTache) ||
9631     in_array('notification_decision', $typeTache))) {
9632     $dossier = $this->getVal('dossier');
9633     $collectivite_di = $this->get_dossier_instruction_om_collectivite($dossier);
9634     $modeNotification = $this->f->get_param_option_notification($collectivite_di);
9635 softime 14064 if ($modeNotification === PORTAL) {
9636 softime 12654 $listeChamps = array(
9637     'emetteur',
9638     'date_envoi',
9639     'destinataire',
9640     'instruction',
9641     'annexes',
9642     'statut',
9643     'commentaire'
9644     );
9645 softime 12433 }
9646     }
9647 softime 12654 // Il n'y a pas d'annexe pour la notification des communes donc pas besoin
9648     // de les afficher dans le suivi
9649     if (in_array('notification_depot_demat', $typeTache)) {
9650     $listeChamps = array(
9651     'emetteur',
9652     'date_envoi',
9653     'destinataire',
9654     'instruction',
9655     'statut',
9656     'commentaire'
9657     );
9658     }
9659 softime 11585 }
9660 softime 12433
9661 softime 10808 $valSuivi = array();
9662     // Récupération des infos nécessaires à l'affichage du tableau
9663     $sql = sprintf(
9664 softime 11585 'SELECT DISTINCT
9665 softime 10869 instruction_notification.instruction_notification,
9666 softime 12124 -- Affiche la mention automatique avec le nom de l emetteur si la notification a été envoyé automatiquement
9667 softime 10869 CASE WHEN instruction_notification.automatique = TRUE
9668     THEN TRIM(CONCAT(instruction_notification.emetteur, \' \', \'(automatique)\'))
9669     ELSE instruction_notification.emetteur
9670     END as emetteur,
9671 softime 10808 date_envoi,
9672     instruction_notification.destinataire,
9673 softime 10869 instruction_notification.date_premier_acces,
9674 softime 10808 evenement.libelle as instruction,
9675 softime 10869 instruction_notification.statut,
9676     instruction_notification.commentaire,
9677 softime 12433 annexes.instruction_annexe as annexes
9678 softime 10808 FROM
9679     %1$sinstruction_notification
9680     LEFT JOIN %1$sinstruction
9681     ON instruction.instruction = instruction_notification.instruction
9682     LEFT JOIN %1$sevenement
9683     ON instruction.evenement = evenement.evenement
9684 softime 10869 LEFT JOIN %1$sinstruction_notification_document
9685     ON instruction_notification.instruction_notification = instruction_notification_document.instruction_notification
9686     AND instruction_notification_document.annexe = true
9687 softime 12124 -- Récupère les tâches liées au notification pour pouvoir par la suite identifier le type de notification
9688 softime 11585 LEFT JOIN %1$stask
9689     ON instruction_notification.instruction_notification::CHARACTER VARYING = task.object_id
9690 softime 12124 -- Récupération de la liste des annexes sous la forme d une liste
9691 softime 11585 LEFT JOIN (
9692     SELECT
9693     instruction_notification,
9694 softime 12124 -- Récupère la liste des annexes de la notification
9695 softime 12433 -- sous la forme d un json pour récupérer toutes les informatiosn nécessaire
9696     -- à l affichage du lien vers les annexes
9697     CONCAT(
9698     \'[\',
9699     STRING_AGG(
9700     -- Affiche le nom du fichier selon le type de document/pièce
9701     CASE
9702     WHEN instruction_notification_document.document_type = \'instruction\'
9703     THEN CONCAT(
9704     \'{
9705     "obj" : "instruction",
9706     "champs" : "om_fichier_instruction",
9707     "label" : "\', evenement.libelle, \'",
9708     "id" : "\', instruction.instruction,\'"
9709     }\'
9710     )
9711     WHEN instruction_notification_document.document_type = \'consultation\'
9712     THEN CONCAT(
9713     \'{
9714     "obj" : "consultation",
9715     "champs" : "fichier",
9716     "label" : "Avis - \', service.libelle, \'",
9717     "id" : "\', consultation.consultation,\'"
9718     }\'
9719     )
9720     ELSE
9721     CONCAT(
9722     \'{
9723     "obj" : "document_numerise",
9724     "champs" : "uid",
9725     "label" : "\', document_numerise.nom_fichier, \' - \', document_numerise_type.libelle, \'",
9726     "id" : "\', document_numerise.document_numerise,\'"
9727     }\'
9728     )
9729     END,
9730     \', \'),
9731     \']\'
9732 softime 11585 ) AS instruction_annexe
9733     FROM
9734     %1$sinstruction_notification_document
9735     LEFT JOIN %1$sinstruction
9736     ON instruction_notification_document.instruction = instruction.instruction
9737     LEFT JOIN %1$sevenement
9738     ON instruction.evenement = evenement.evenement
9739     LEFT JOIN %1$sconsultation
9740     ON instruction_notification_document.document_id = consultation.consultation
9741     LEFT JOIN %1$sservice
9742     ON consultation.service = service.service
9743 softime 12433 LEFT JOIN %1$sdocument_numerise
9744     ON instruction_notification_document.document_id = document_numerise.document_numerise
9745     LEFT JOIN %1$sdocument_numerise_type
9746     ON document_numerise.document_numerise_type = document_numerise_type.document_numerise_type
9747 softime 11585 WHERE
9748     instruction_notification_document.annexe = \'t\'
9749     GROUP BY
9750     instruction_notification
9751     ) AS annexes
9752     ON
9753     annexes.instruction_notification = instruction_notification.instruction_notification
9754 softime 10808 WHERE
9755 softime 10869 instruction.instruction = %2$s
9756 softime 11585 %3$s
9757 softime 10869 ORDER BY
9758     date_envoi ASC, instruction_notification.destinataire ASC',
9759 softime 10808 DB_PREFIXE,
9760 softime 14542 intval($this->getVal('instruction')),
9761 softime 11585 $whereTypeTache
9762 softime 10808 );
9763 softime 14542 $qres = $this->f->get_all_results_from_db_query($sql, array(
9764     "origin" => __METHOD__
9765     )
9766     );
9767 softime 12433 // Préparation du lien de téléchargement des annexes
9768     $htmlList =
9769     '<style>
9770     #content .gridjs-td a.lien_annexe {
9771     text-decoration : underline dotted 1px;
9772     }
9773     #content a.lien_annexe:hover {
9774     text-decoration : underline solid 1px;
9775     color : #46aede;
9776     }
9777     ol {padding-left : 10px;}
9778     </style>
9779     <ol>%1$s</ol>';
9780     $lienTelechargement =
9781     '<a class="lien_annexe" href="../app/index.php?module=form&amp;snippet=file&amp;obj=%1$s&amp;champ=%2$s&amp;id=%3$s" target="blank" title="%4$s">
9782     Annexe
9783     </a>';
9784 softime 10808 // Stockage des infos de chaque notification dans un tableau
9785 softime 14542 foreach ($qres['result'] as $row) {
9786 softime 10808 $valNotif = array();
9787     foreach($listeChamps as $champ) {
9788     $valNotif[$champ] = $row[$champ];
9789 softime 10815 if (($champ === 'date_envoi'
9790     || $champ === 'date_premier_acces')
9791     && $row[$champ] !== null
9792     && $row[$champ] !== '') {
9793 softime 10814 //
9794     $valNotif[$champ] = date('d/m/Y H:i:s', strtotime($row[$champ]));
9795 softime 12433 } else if ($champ === 'annexes') {
9796     $listeAnnexe = '';
9797     $infoAnnexes = json_decode($row[$champ], true);
9798     if (! empty($infoAnnexes) && json_last_error() === JSON_ERROR_NONE) {
9799     // A partir des infos récupérées prépare le code html du lien vers chacune
9800     // des annexes et ajoute un élément de liste par annexe
9801     foreach($infoAnnexes as $annexe) {
9802     $listeAnnexe .= sprintf(
9803     '<li>%s</li>',
9804     sprintf($lienTelechargement,
9805     $annexe['obj'],
9806     $annexe['champs'],
9807     $annexe['id'],
9808     $annexe['label']
9809     )
9810     );
9811     }
9812     // Construction de la liste des annexes
9813     $valNotif[$champ] = sprintf(
9814     $htmlList,
9815     $listeAnnexe
9816     );
9817     }
9818 softime 10814 }
9819 softime 10808 }
9820     array_push($valSuivi, $valNotif);
9821     }
9822    
9823     // Passage du tableau au format json
9824     return json_encode($valSuivi, JSON_HEX_APOS);
9825     }
9826    
9827 softime 10573 /**
9828     * Traitement des erreurs retournées par l'abstracteur electronicsignature.
9829     *
9830     * @param electronicsignature_exception $exception Exception retournée par l'abstracteur.
9831     *
9832     * @return void
9833     */
9834     public function handle_electronicsignature_exception(electronicsignature_exception $exception) {
9835     $this->f->displayMessage('error', $exception->getMessage());
9836     }
9837    
9838    
9839     /**
9840     * Retourne une instance du connecteur electronicsignature, et la créer si elle n'existe pas.
9841     *
9842     * @param boolean $with_handle_error Flag pour afficher ou non le message d'erreur à l'utilisateur.
9843     * @return electronicsignature Instance de l'abstracteur.
9844     */
9845     public function get_electronicsignature_instance($with_handle_error = true) {
9846     if(isset($this->electronicsignature_instance)) {
9847     return $this->electronicsignature_instance;
9848     }
9849     // Instanciation du connecteur electronicsignature
9850     try {
9851     require_once "electronicsignature.class.php";
9852     $collectivites = array("collectivite_idx" => $this->get_dossier_instruction_om_collectivite(), "collectivite_multi_idx" => $this->f->get_idx_collectivite_multi());
9853     $this->electronicsignature_instance = new electronicsignature($collectivites);
9854     } catch (electronicsignature_exception $e) {
9855     if ($with_handle_error === true) {
9856     $this->handle_electronicsignature_exception($e);
9857     }
9858     return false;
9859     }
9860     return $this->electronicsignature_instance;
9861     }
9862    
9863     /**
9864 softime 11418 * TREATMENT - envoyer_au_controle_de_legalite
9865     *
9866     * Ajoute la tâche envoi_CL.
9867     * C'est le traitement de la tâche qui mettra à jour la date d'envoi au contrôle de légalité.
9868     *
9869     * @return [type] [description]
9870     */
9871     function envoyer_au_controle_de_legalite() {
9872     $this->begin_treatment(__METHOD__);
9873     $this->correct = true;
9874    
9875     //
9876     if ($this->can_be_sended_to_cl() === true) {
9877     // Création de la task 'envoi_CL'
9878     $inst_task = $this->f->get_inst__om_dbform(array(
9879     "obj" => "task",
9880     "idx" => 0,
9881     ));
9882     $task_val = array(
9883     'type' => 'envoi_CL',
9884     'object_id' => $this->getVal('instruction'),
9885     'dossier' => $this->getVal('dossier'),
9886     );
9887     // Change l'état de la tâche de notification en fonction de l'état de
9888     // transmission du dossier d'instruction
9889     $inst_di = $this->get_inst_dossier($this->getVal('dossier'));
9890     if ($this->f->is_option_mode_service_consulte_enabled() === false
9891     && ($inst_di->getVal('etat_transmission_platau') == 'non_transmissible'
9892     || $inst_di->getVal('etat_transmission_platau') == 'transmis_mais_non_transmissible')) {
9893     //
9894     $task_val['state'] = $inst_task::STATUS_DRAFT;
9895     }
9896     $add_task = $inst_task->add_task(array('val' => $task_val));
9897     if ($add_task === false) {
9898     $this->addToMessage(sprintf('%s %s',
9899     __("Une erreur s'est produite lors de la création tâche."),
9900     __("Veuillez contacter votre administrateur.")
9901     ));
9902     $this->correct = false;
9903     return $this->end_treatment(__METHOD__, false);
9904     }
9905     // Mise à jour du champs 'envoye_cl_platau'
9906     $instr_val = array(
9907     'envoye_cl_platau' => 't',
9908     );
9909     $res = $this->f->db->autoExecute(
9910     DB_PREFIXE.$this->table,
9911     $instr_val,
9912     DB_AUTOQUERY_UPDATE,
9913     $this->getCle($this->getVal($this->clePrimaire))
9914     );
9915 softime 12124 $this->addToLog(__METHOD__."(): db->autoexecute(\"".DB_PREFIXE.'.'.$this->table."\", ".print_r($instr_val, true).", DB_AUTOQUERY_UPDATE, \"".$this->getCle($this->clePrimaire)."\");", VERBOSE_MODE);
9916 softime 11418 if ($this->f->isDatabaseError($res, true) === true) {
9917     $this->addToMessage(sprintf('%s %s',
9918     __("Une erreur s'est produite lors de la mise à jour de l'instruction."),
9919     __("Veuillez contacter votre administrateur.")
9920     ));
9921     $this->correct = false;
9922     return $this->end_treatment(__METHOD__, false);
9923     }
9924     // Message de validation à l'utilisateur
9925     $this->addToMessage(__('Votre demande de transfert au contrôle de légalité à bien été prise en compte.'));
9926     $this->addToMessage(__("La date d'envoi au contrôle de légalité sera mise à jour ultérieurement."));
9927     }
9928     //
9929     return $this->end_treatment(__METHOD__, true);
9930     }
9931    
9932    
9933     /**
9934 softime 8593 * Retourne le lien de retour (VIEW formulaire et VIEW sousformulaire).
9935     *
9936     * @param string $view Appel dans le contexte de la vue 'formulaire' ou de
9937     * la vue 'sousformulaire'.
9938     *
9939     * @return string
9940     */
9941     function get_back_link($view = "formulaire") {
9942     //
9943     $href = parent::get_back_link($view);
9944     //
9945     $crud = $this->get_action_crud();
9946 mbroquet 3730
9947 softime 8593 // Redirection vers le formulaire de modification à la validation du
9948     // formulaire d'ajout si l'événement associé possède une lettre type
9949     if (($crud === 'create'
9950     || ($crud === null
9951     && $this->getParameter('maj') == 0))
9952     && $this->correct == true
9953     && $this->evenement_has_an_edition($this->valF['evenement']) === true) {
9954 softime 7996
9955 softime 8593 // On instancie l'instruction
9956     $inst_instruction = $this->f->get_inst__om_dbform(array(
9957     "obj" => "instruction",
9958     "idx" => $this->valF[$this->clePrimaire],
9959     ));
9960    
9961     // Si l'instruction n'est pas finalisée automatiquement
9962     if ($inst_instruction->getVal('om_final_instruction') !== 't') {
9963     $href = str_replace("&action=3", "&action=1", $href);
9964     //
9965     if (strpos($href, "&retour=tab") !== false) {
9966     $href = str_replace("&retour=tab", "&retour= form", $href);
9967     } else {
9968     $href .= "&retour=form";
9969     }
9970     }
9971     }
9972    
9973     //
9974     return $href;
9975     }
9976    
9977 softime 10573 public function view_json_data() {
9978     $this->checkAccessibility();
9979     $this->f->disableLog();
9980     $view = $this->get_json_data();
9981     printf(json_encode($view));
9982     }
9983    
9984     public function get_json_data() {
9985     $val = array_combine($this->champs, $this->val);
9986     foreach ($val as $key => $value) {
9987     $val[$key] = strip_tags($value);
9988     }
9989     $val['tacite'] = 'f';
9990     $inst_ad = $this->f->get_inst__om_dbform(array(
9991     "obj" => "avis_decision",
9992     "idx" => $val['avis_decision'],
9993     ));
9994     if (preg_match('/[tT]acite/', $inst_ad->getVal('libelle')) === 1) {
9995     $val['tacite'] = 't';
9996     }
9997     return $val;
9998     }
9999    
10000 softime 13528 /**
10001     * Permet de récupérer l'identifiant de l'instruction sur le dossier, ayant
10002     * comme événement lié le suivant définit dans l'événement de l'instruction
10003     * instanciée.
10004     *
10005     * @param string $next_type Correspond aux trois déclenchement automatique
10006     * de création d'instruction paramétré sur un événement.
10007     * @param integer $instruction Identifiant de l'instruction à instancier.
10008     * @return mixed Identifiant de l'instruction recherchée ou false.
10009     */
10010 softime 11418 public function get_related_instructions_next($next_type = 'retour_signature', $instruction = null) {
10011     if (in_array($next_type, array('retour_signature', 'retour_ar', 'suivant_tacite', )) === false) {
10012     return false;
10013     }
10014     $result = array();
10015     $evenements = array();
10016     if ($instruction === null) {
10017     $instruction = $this->getVal($this->clePrimaire);
10018     $evenement = $this->getVal('evenement');
10019     $dossier = $this->getVal('dossier');
10020     } else {
10021     $inst = $this->f->get_inst__om_dbform(array(
10022     "obj" => "instruction",
10023     "idx" => $instruction,
10024     ));
10025     $evenement = $inst->getVal('evenement');
10026     $dossier = $inst->getVal('dossier');
10027     }
10028 softime 13528 // Récupération de l'identifiant de l'événement paramétré comme suivant
10029     // sur l'instruction instanciée
10030 softime 13137 $qres = $this->f->get_one_result_from_db_query(
10031     sprintf(
10032     'SELECT
10033     evenement_%3$s
10034     FROM
10035     %1$sevenement
10036     WHERE
10037     evenement = %2$s',
10038     DB_PREFIXE,
10039     intval($evenement),
10040     $next_type
10041     ),
10042     array(
10043     "origin" => __METHOD__,
10044     "force_return" => true,
10045     )
10046 softime 11418 );
10047 softime 13137 if ($qres["code"] !== "OK") {
10048 softime 11418 return false;
10049     }
10050 softime 13137 $ev_next = $qres["result"];
10051 softime 13528 // Récupération de l'instruction dans le dossier utilisant l'événement
10052     // suivant identifié dans la requête précédente
10053     $qres = $this->f->get_one_result_from_db_query(
10054 softime 13137 sprintf(
10055     'SELECT
10056     MAX(instruction.instruction) as instruction
10057     FROM
10058     %1$sinstruction
10059     WHERE
10060     dossier = \'%3$s\'
10061     AND evenement = %2$s',
10062     DB_PREFIXE,
10063     intval($ev_next),
10064 softime 14064 $this->f->db->escapeSimple($dossier)
10065 softime 13137 ),
10066     array(
10067     "origin" => __METHOD__,
10068     "force_return" => true,
10069     )
10070 softime 11418 );
10071 softime 13137 if ($qres["code"] !== "OK") {
10072 softime 11418 return false;
10073     }
10074 softime 13137 return $qres["result"];
10075 softime 11418 }
10076    
10077 softime 10573 public function get_related_instructions($instruction = null) {
10078     $result = array();
10079     $evenements = array();
10080     if ($instruction === null) {
10081     $instruction = $this->getVal($this->clePrimaire);
10082     $evenement = $this->getVal('evenement');
10083     $dossier = $this->getVal('dossier');
10084     } else {
10085     $inst = $this->f->get_inst__om_dbform(array(
10086     "obj" => "instruction",
10087     "idx" => $instruction,
10088     ));
10089     $evenement = $inst->getVal('evenement');
10090     $dossier = $inst->getVal('dossier');
10091     }
10092     //
10093 softime 13137 $qres = $this->f->get_one_result_from_db_query(
10094     sprintf(
10095     'SELECT
10096     evenement
10097     FROM
10098     %1$sevenement
10099     WHERE
10100     evenement_retour_ar = %2$s
10101     OR evenement_retour_signature = %2$s',
10102     DB_PREFIXE,
10103     intval($evenement)
10104     ),
10105     array(
10106     "origin" => __METHOD__,
10107     "force_return" => true,
10108     )
10109 softime 10573 );
10110 softime 13137 if ($qres["code"] !== "OK") {
10111 softime 10573 return false;
10112     }
10113 softime 13137 $ev_parent = $qres["result"];
10114 softime 10573 //
10115 softime 13137 $qres = $this->f->get_one_result_from_db_query(
10116     sprintf(
10117     'SELECT
10118     MAX(instruction.instruction) as instruction
10119     FROM
10120     %1$sinstruction
10121     WHERE
10122     dossier = \'%3$s\'
10123     AND evenement = %2$s',
10124     DB_PREFIXE,
10125     intval($ev_parent),
10126     $this->f->db->escapeSimple($dossier)
10127     ),
10128     array(
10129     "origin" => __METHOD__,
10130     "force_return" => true,
10131     )
10132 softime 10573 );
10133 softime 13137 if ($qres["code"] !== "OK") {
10134 softime 10573 return false;
10135     }
10136 softime 13137 $result[] = $qres["result"];
10137 softime 10573 //
10138 softime 13137 $qres = $this->f->get_one_result_from_db_query(
10139     sprintf(
10140     'SELECT
10141     evenement_retour_ar
10142     FROM
10143     %1$sevenement
10144     WHERE
10145 softime 14542 evenement = %2$d
10146     AND evenement_retour_ar != %3$d',
10147 softime 13137 DB_PREFIXE,
10148     intval($ev_parent),
10149     intval($evenement)
10150     ),
10151     array(
10152     "origin" => __METHOD__,
10153     "force_return" => true,
10154     )
10155 softime 10573 );
10156 softime 13137 if ($qres["code"] !== "OK") {
10157 softime 10573 return false;
10158     }
10159 softime 13137 $evenements[] = $qres["result"];
10160 softime 10573 //
10161 softime 13137 $qres = $this->f->get_one_result_from_db_query(
10162     sprintf(
10163     'SELECT
10164     evenement_retour_signature
10165     FROM
10166     %1$sevenement
10167     WHERE
10168     evenement = %2$s
10169     AND evenement_retour_signature != %3$s
10170     ',
10171     DB_PREFIXE,
10172     intval($ev_parent),
10173     intval($evenement)
10174     ),
10175     array(
10176     "origin" => __METHOD__,
10177     "force_return" => true,
10178     )
10179 softime 10573 );
10180 softime 13137 if ($qres["code"] !== "OK") {
10181 softime 10573 return false;
10182     }
10183 softime 13137 $evenements[] = $qres["result"];
10184 softime 10573 foreach ($evenements as $value) {
10185     if ($value !== null) {
10186 softime 13137 $qres = $this->f->get_one_result_from_db_query(
10187     sprintf(
10188     'SELECT
10189     MAX(instruction.instruction) as instruction
10190     FROM
10191     %1$sinstruction
10192     WHERE
10193     dossier = \'%3$s\'
10194     AND evenement = %2$s',
10195     DB_PREFIXE,
10196     intval($value),
10197     $this->f->db->escapeSimple($dossier)
10198     ),
10199     array(
10200     "origin" => __METHOD__,
10201     "force_return" => true,
10202     )
10203 softime 10573 );
10204 softime 13137 if ($qres["code"] !== "OK") {
10205 softime 10573 return false;
10206     }
10207 softime 13137 $result[] = $qres["result"];
10208 softime 10573 }
10209     }
10210     return $result;
10211     }
10212    
10213     protected function getDocumentType($champ = null) {
10214     $evenementId = $this->getVal('evenement');
10215     if (! empty($evenementId)) {
10216     $evenement = $this->f->findObjectById('evenement', $evenementId);
10217     if (! empty($evenement)) {
10218     return __("Instruction").':'.$evenement->getVal('libelle');
10219     }
10220     }
10221     return parent::getDocumentType();
10222     }
10223    
10224 softime 10808 /**
10225     * Récupère à l'aide d'une requête sql la liste des demandeurs
10226     * pouvant être notifié. C'est à dire les demandeurs acceptant
10227     * les notifications et pour lesquels une adresse mail existe.
10228     *
10229     * Dans le cas, d'une notification pour le portail citoyen, seul
10230     * le pétitionnaire principal doit être notifier et uniquement si
10231     * il a une adress mail et qu'il accepte les notifications.
10232     *
10233     * @param string identifiant du dossier
10234     * @param boolean true si il faut récupérer la liste des demandeurs notifiable
10235     * pour une notification de categorie portail
10236     * @return array liste des demandeurs pouvant être notifié
10237     */
10238     protected function get_demandeurs_notifiable($idDossier = null, $portail = false) {
10239     if ($idDossier === null) {
10240     $idDossier = $this->getVal('dossier');
10241     }
10242     // Ajoute une condition sur le where pour ne récupérer que le pétitionnaire principal
10243     // pour une notification depuis le portail citoyen
10244     $sqlPetitionnairePrincipal = '';
10245 softime 12124 // Gestion des champs nécessaires pour la notification d'un demandeur
10246     $condition_demandeur = "AND demandeur.notification = 't'
10247     AND demandeur.courriel IS NOT NULL";
10248 softime 10808 if ($portail === true) {
10249     $sqlPetitionnairePrincipal = 'AND lien_dossier_demandeur.petitionnaire_principal = true';
10250 softime 12124 $condition_demandeur = "AND (
10251     (notification = 't' AND courriel IS NOT NULL)
10252     OR demande.source_depot = 'portal'
10253     )";
10254 softime 10808 }
10255    
10256     $listeDemandeursNotifiable = array();
10257    
10258     // Requête de récupération des demandeurs
10259 softime 14542 $qres = $this->f->get_all_results_from_db_query(
10260     sprintf(
10261     'SELECT
10262     demandeur.demandeur,
10263     CASE
10264     WHEN demandeur.qualite=\'particulier\'
10265     THEN TRIM(CONCAT(demandeur.particulier_nom, \' \', demandeur.particulier_prenom, \' \', demandeur.courriel))
10266     ELSE
10267     TRIM(CONCAT(demandeur.personne_morale_raison_sociale, \' \', demandeur.personne_morale_denomination, \' \', demandeur.courriel))
10268     END AS destinataire,
10269     demandeur.courriel,
10270     petitionnaire_principal
10271     FROM
10272     %1$sdossier
10273     INNER JOIN %1$slien_dossier_demandeur
10274     ON dossier.dossier = lien_dossier_demandeur.dossier
10275     INNER JOIN %1$sdemandeur
10276     ON lien_dossier_demandeur.demandeur = demandeur.demandeur
10277     -- Récupération de la plus ancienne demande associée au dossier (la demande
10278     -- de création du dossier)
10279     INNER JOIN (
10280     SELECT
10281     demande,
10282     dossier_instruction,
10283     source_depot
10284     FROM
10285     %1$sdemande
10286     WHERE
10287     dossier_instruction = \'%2$s\'
10288     ORDER BY
10289     demande ASC
10290     LIMIT 1
10291     ) as demande
10292     ON dossier.dossier = demande.dossier_instruction
10293     WHERE
10294     dossier.dossier = \'%2$s\'
10295     %3$s
10296     %4$s',
10297     DB_PREFIXE,
10298     $this->f->db->escapeSimple($idDossier),
10299     $condition_demandeur,
10300     $sqlPetitionnairePrincipal
10301     ),
10302     array(
10303     "origin" => __METHOD__
10304     )
10305 softime 10808 );
10306     // Récupération des infos des demandeurs et stockage dans un tableau
10307     // ayant pour clé les id des demandeurs
10308 softime 14542 foreach ($qres['result'] as $row) {
10309 softime 10869 $listeDemandeursNotifiable[$row['demandeur']] = $row;
10310 softime 10808 }
10311    
10312     return $listeDemandeursNotifiable;
10313     }
10314    
10315     /**
10316     * Renvoie la liste des notifications liées à l'instruction
10317     *
10318     * @param integer id de l'instruction dont on cherche les notifications
10319     * @return array liste des instruction_notification liés à l'instruction
10320     */
10321 softime 12124 public function get_instruction_notification($id_instruction, $typeNotification = null, $nonLieTache = false) {
10322 softime 11585 $whereTypeTache = '';
10323 softime 12124 $sqlTaskNull = '';
10324     // Défini si on veux que la requête récupère également les notifications qui n'ont pas
10325     // de tâches associées. C'est le cas pour les notifications de demandeurs lorsque la
10326     // notification du demandeur principal n'a pas pu être envoyée à cause d'un mauvais
10327     // paramétrage
10328     if(is_bool($nonLieTache) && $nonLieTache === true) {
10329     $sqlTaskNull = 'OR task.type is null';
10330     }
10331 softime 11585 if ($typeNotification != null) {
10332     if (is_array($typeNotification)) {
10333     $whereTypeTache = sprintf(
10334 softime 12124 'AND (task.type IN (%1$s) %2$s)',
10335     "'".implode("', '", $typeNotification)."'",
10336     $sqlTaskNull
10337 softime 11585 );
10338     } else {
10339     $whereTypeTache = sprintf(
10340 softime 12124 'AND (task.type = \'%1$s\' %2$s)',
10341     $typeNotification,
10342     $sqlTaskNull
10343 softime 11585 );
10344     }
10345     }
10346 softime 10808 $listeInstrNotif = array();
10347 softime 14542 $qres = $this->f->get_all_results_from_db_query(
10348     sprintf('
10349     SELECT
10350     instruction_notification.instruction_notification
10351     FROM
10352     %1$sinstruction_notification
10353     LEFT JOIN %1$stask
10354     ON instruction_notification.instruction_notification::CHARACTER VARYING = task.object_id
10355     WHERE
10356     instruction = %2$s
10357     %3$s',
10358     DB_PREFIXE,
10359     intval($id_instruction),
10360     $whereTypeTache
10361     ),
10362     array(
10363     "origin" => __METHOD__
10364     )
10365 softime 10808 );
10366 softime 14542 foreach ($qres['result'] as $row) {
10367 softime 10808 $listeInstrNotif[] = $row['instruction_notification'];
10368     }
10369     return $listeInstrNotif;
10370     }
10371    
10372     /**
10373     * Crée une clé d'accès unique permettant à un utilisateur
10374     * anonyme de récupérer le document.
10375     *
10376     * @return string clé d'accès du document
10377     */
10378     protected function getCleAccesDocument() {
10379 softime 10869 // Initialisation d'un tableau
10380     $number_list = array();
10381    
10382     // Génération aléatoire d'un nombre sur 4 caractères, 4 fois
10383     for ($i = 0; $i < 4; $i++) {
10384     $number_list[] = str_pad(mt_rand(0, 9999), 4, 0, STR_PAD_LEFT);
10385     }
10386    
10387     // Transformation en chaîne tout en séparant les nombres par un "-"
10388     $result = implode('-', $number_list);
10389    
10390     // Vérifie si la clé existe déjà et si c'est le cas génére une nouvelle clé
10391     if ($this->getUidDocumentInstructionWithKey($result) != null) {
10392     return $this->getCleAccesDocument();
10393     }
10394    
10395     //
10396     return $result;
10397 softime 10808 }
10398    
10399     /**
10400 softime 10869 * Récupère une clé et renvoie l'uid du document liée à cette
10401     * clé. Si la clé n'existe pas renvoie null.
10402     *
10403     * @param string $cleGen clé dont on cherche l'instruction
10404     * @return integer|null
10405     */
10406     protected function getUidDocumentInstructionWithKey($cleGen) {
10407 softime 14064 $qres = $this->f->get_one_result_from_db_query(
10408     sprintf(
10409     'SELECT
10410     instruction.om_fichier_instruction
10411     FROM
10412     %1$sinstruction_notification_document
10413     LEFT JOIN %1$sinstruction
10414     ON instruction_notification_document.instruction = instruction.instruction
10415     WHERE
10416     instruction_notification_document.cle = \'%2$s\'',
10417     DB_PREFIXE,
10418     $this->f->db->escapeSimple($cleGen)
10419     ),
10420     array(
10421     "origin" => __METHOD__,
10422     )
10423 softime 10869 );
10424 softime 14064
10425     return $qres['result'];
10426 softime 10869 }
10427    
10428     /**
10429     * Récupère une clé, fait une requête pour récupérer l'id de la notification liée a cette clé.
10430     * Récupère l'instance de instruction_notification dont l'id a été récupéré et la renvoie.
10431     *
10432     * @param string $cleGen
10433     * @return instruction_notification
10434     */
10435     protected function getInstanceNotificationWithKey($key) {
10436 softime 14064 $qres = $this->f->get_one_result_from_db_query(
10437     sprintf(
10438     'SELECT
10439     instruction_notification
10440     FROM
10441     %1$sinstruction_notification_document
10442     WHERE
10443     cle = \'%2$s\'',
10444     DB_PREFIXE,
10445     $this->f->db->escapeSimple($key)
10446     ),
10447     array(
10448     "origin" => __METHOD__,
10449     )
10450 softime 10869 );
10451    
10452     // Récupération de l'instance de notification
10453     $instNotif = $this->f->get_inst__om_dbform(array(
10454     "obj" => "instruction_notification",
10455 softime 14064 "idx" => $qres['result'],
10456 softime 10869 ));
10457     return $instNotif;
10458     }
10459    
10460    
10461     /**
10462 softime 10808 * Affiche la page de téléchargement du document de la notification.
10463     *
10464     * @param boolean $content_only Affiche le contenu seulement.
10465     *
10466     * @return void
10467     */
10468 softime 10869 public function view_telecharger_document_anonym() {
10469 softime 10808 // Par défaut on considère qu'on va afficher le formulaire
10470     $idx = 0;
10471     // Flag d'erreur
10472     $error = false;
10473     // Message d'erreur
10474     $message = '';
10475    
10476 softime 10869 // Paramètres GET : récupération de la clé d'accès
10477     $cle_acces_document = $this->f->get_submitted_get_value('key');
10478 softime 10808 $cle_acces_document = $this->f->db->escapeSimple($cle_acces_document);
10479 softime 10869 // Vérification de l'existence de la clé et récupération de l'uid du fichier
10480     $uidFichier = $this->getUidDocumentInstructionWithKey($cle_acces_document);
10481     if ($uidFichier != null) {
10482     // Récupération du document
10483     $file = $this->f->storage->get($uidFichier);
10484 softime 10808
10485 softime 10869 // Headers
10486     header("Cache-Control: no-cache, must-revalidate"); // HTTP/1.1
10487     header("Expires: Sat, 26 Jul 1997 05:00:00 GMT"); // Date dans le passé
10488     header("Content-Type: ".$file['metadata']['mimetype']);
10489     header("Accept-Ranges: bytes");
10490     header("Content-Disposition: inline; filename=\"".$file['metadata']['filename']."\";" );
10491     // Affichage du document
10492     echo $file['file_content'];
10493 softime 10808
10494 softime 10869 // Récupération de la date de premier accès et maj du suivi uniquement
10495     // si la date de 1er accès n'a pas encore été remplis
10496     $inst_notif = $this->getInstanceNotificationWithKey($cle_acces_document);
10497     if ($inst_notif->getVal('date_premier_acces') == null ||
10498     $inst_notif->getVal('date_premier_acces') == '') {
10499     $notif_val = array();
10500     foreach ($inst_notif->champs as $champ) {
10501     $notif_val[$champ] = $inst_notif->getVal($champ);
10502     }
10503     $notif_val['date_premier_acces'] = date("d/m/Y H:i:s");
10504     $notif_val['statut'] = 'vu';
10505     $notif_val['commentaire'] = 'Le document a été vu';
10506     $suivi_notif = $inst_notif->modifier($notif_val);
10507 softime 10808 }
10508    
10509     } else {
10510 softime 10869 // Page vide 404
10511     printf('Ressource inexistante');
10512     header('HTTP/1.0 404 Not Found');
10513 softime 10808 }
10514     }
10515    
10516 softime 11228 /**
10517     * Récupère le titre du document envoyé au parapheur
10518     */
10519 softime 10808 protected function getDocumentTitre($champ = null) {
10520     $title = $this->getTitle();
10521     $dossier = $this->getDossier();
10522     return $dossier.' '.$title;
10523     }
10524    
10525 softime 10869 /**
10526 softime 11228 * Compose le nom du document à transmettre au parapheur.
10527     * Le nom ets composé de cette manière :
10528     * instruction_xxx_libelle_de_la_lettre_type_associee
10529     * ou xxx correspond au numéro de l'instruction
10530     */
10531     protected function getDocumentLibelle() {
10532     // Récupère le champ instruction
10533     $instruction = $this->getVal("instruction");
10534    
10535     // Requête sql servant à récupérer le titre du document
10536     // TO_CHAR() introduit un espace avant l'affichage du nombre
10537     // comme les espaces sont remplacé par des '_' dans le retour de la fonction
10538     // il n'est pas nécessaire de mettre un '_' après le mot instruction.
10539 softime 14064 $documentLibelle = $this->f->get_one_result_from_db_query(
10540     sprintf(
10541     'SELECT
10542     CONCAT(
10543     \'instruction\',
10544     TO_CHAR(instruction.instruction, \'000\'),
10545     \'_\',
10546     LOWER(om_lettretype.libelle)
10547     ) AS nom_fichier
10548     FROM
10549     %1$sinstruction
10550     LEFT JOIN %1$som_lettretype
10551     ON om_lettretype.id = instruction.lettretype
10552     WHERE
10553     instruction = %2$d',
10554     DB_PREFIXE,
10555     intval($instruction)
10556     ),
10557     array(
10558     "origin" => __METHOD__,
10559     )
10560 softime 11228 );
10561    
10562 softime 14064 $documentLibelle = $documentLibelle['result'];
10563    
10564 softime 11228 // Transforamtion des ' ' en '_', des accents en lettres sans accents et des
10565     // caractères spéciaux en '_'
10566     // La méthode normalize_string est utilisé pour gérer les accents
10567     $documentLibelle = $this->f->normalize_string($documentLibelle);
10568     // TODO : comparer cette liste et celle de la méthode normalize_string
10569     // pour éviter les doublons + vérifier qu'il n'y a pas de doublons dans cette
10570     // liste
10571     $invalid = array('Œ'=>'oe', 'œ'=>'oe', 'Ÿ'=>'y', 'ü'=>'u',
10572     '¢' => '_', 'ß' => '_', '¥' => '_', '£' => '_', '™' => '_', '©' => '_',
10573     '®' => '_', 'ª' => '_', '×' => '_', '÷' => '_', '±' => '_', '²' => '_',
10574     '³' => '_', '¼' => '_', '½' => '_', '¾' => '_', 'µ' => '_', '¿' => '_',
10575     '¶' => '_', '·' => '_', '¸' => '_', 'º' => '_', '°' => '_', '¯' => '_',
10576     '§' => '_', '…' => '_', '¤' => '_', '¦' => '_', '≠' => '_', '¬' => '_',
10577     'ˆ' => '_', '¨' => '_', '‰' => '_', '¤' => '_', '€' => '_', '$' => '_',
10578     '«' => '_', '»' => '_', '‹' => '_', '›' => '_', 'ƒ' => '_', '¥' => '_',
10579     '‘‘' => '_', '‚' => '_', '!' => '_', '¡' => '_', '¢' => '_', '£' => '_',
10580     '?' => '_', '[' => '_', ']' => '_', '´' => '_', '`' => '_', '^' => '_',
10581     '~' => '_', '˜' => '_', '#' => '_', '*' => '_', '.' => '_', ':' => '_',
10582     ';' => '_', '•' => '_', '¯' => '_', '‾' => '_', '–' => '_', '–' => '_',
10583     '—' => '_', '_' => '_', '|' => '_', '¦‌' => '_', '‡' => '_', '§' => '_',
10584     '¶' => '_', '©' => '_', '®' => '_', '™' => '_', '&' => '_', '@' => '_',
10585     '/' => '_', '\\' => '_', '◊' => '_', '♠' => '_', '♣' => '_', '♥' => '_',
10586     '♦' => '_', '←' => '_', '↑' => '_', '→' => '_', '↓' => '_', '↔' => '_',
10587     '°' => '_', 'µ' => '_', '<' => '_', '>' => '_', '≤' => '_', '≥' => '_',
10588     '=' => '_', '≈' => '_', '≠' => '_', '≡' => '_', '±' => '_', '−' => '_',
10589     '+' => '_', '×' => '_', '÷' => '_', '⁄' => '_', '%' => '_', '‰' => '_',
10590     '¼' => '_', '½' => '_', '¾' => '_', '¹' => '_', '²' => '_', '³' => '_',
10591     '' => '_', 'º' => '_', 'ª' => '_', 'ƒ' => '_', '′' => '_', '″' => '_',
10592     '∂' => '_', '∏' => '_', '∑' => '_', '√' => '_', '∞' => '_', '¬' => '_',
10593     '∩' => '_', '∫' => '_', 'α' => '_', 'Α' => '_', 'β' => '_', 'Β' => '_',
10594     'γ' => '_', 'Γ' => '_', 'δ' => '_', 'Δ' => '_', 'ε' => '_', 'Ε' => '_',
10595     'ζ' => '_', 'Ζ' => '_', 'η' => '_', 'Η' => '_', 'θ' => '_', 'Θ' => '_',
10596     'ι' => '_', 'Ι' => '_', 'κ' => '_', 'Κ' => '_', 'λ' => '_', 'Λ' => '_',
10597     'μ' => '_', 'Μ' => '_', 'ν' => '_', 'Ν' => '_', 'ξ' => '_', 'Ξ' => '_',
10598     'ο' => '_', 'Ο' => '_', 'π' => '_', 'Π' => '_', 'ρ' => '_', 'Ρ' => '_',
10599     'σ' => '_', 'ς' => '_', 'Σ' => '_', 'τ' => '_', 'Τ' => '_', 'υ' => '_',
10600     'Υ' => '_', 'φ' => '_', 'Φ' => '_', 'χ' => '_', 'Χ' => '_', 'ψ' => '_',
10601     'Ψ' => '_', 'ω' => '_', 'Ω' => '_', ',' => '_', ' ' => '_'
10602     );
10603    
10604     return str_replace(array_keys($invalid), array_values($invalid), $documentLibelle);
10605     }
10606    
10607     /**
10608 softime 10869 * Surcharge permettant de ne pas afficher le fil d'Ariane dans
10609     * l'overlay de notification des demandeurs.
10610     */
10611     function getSubFormTitle($ent) {
10612 softime 11876 $actionSansPath = array('411', '420', '430');
10613     if (in_array($this->getParameter('maj'), $actionSansPath)) {
10614 softime 10869 return '';
10615     }
10616     return parent::getSubFormTitle($ent);
10617     }
10618 softime 13137
10619     /**
10620     * Traitement de la notification automatique des tiers consulté.
10621     *
10622     * Récupère la liste des adresses mails des tiers notifiables. Pour chaque adresses
10623     * récupérées ajoute une notification et une tâche de notification par mail.
10624     * La création de la tâche de notification par mail déclenchera l'envoi du mail
10625     * et la mise à jour du suivi.
10626     *
10627     * Les tiers notifiables sont ceux :
10628     * - n’ayant pas un ID PLAT’AU correspondant à l’ID PLAT’AU du service consultant
10629     * - ayant une habilitation dont le type est listé dans les paramètres de
10630     * notification de l’événement,
10631     * - intervenant sur la commune ou le département du dossier
10632     * - ayant au moins une adresse mail valide
10633     *
10634     * @param evenement instance de l'événement associée à l'instruction
10635     * @param dossier instance du dossier de l'instruction
10636     * @return boolean indique si le traitement à réussi
10637     */
10638     protected function traitement_notification_automatique_tiers_consulte($evenement, $dossier) {
10639     // Récupération de l'identifiant plat'au du service consultant
10640     $consultationEntrante = $dossier->get_inst_consultation_entrante();
10641     // Récupération de la liste des types d'habilitations autorisées pour
10642     // cette notification
10643     $typesHabilitationsNotifiable = $evenement->get_types_habilitation_notifiable();
10644     // Récupération du département et de la commune du dossier
10645     $commune = $dossier->getVal('commune');
10646     // Le département est récupéré à partir de la commune du dossier donc si la
10647     // commune n'a pas pu être récupéré on ne récupère pas non plus le département.
10648     $idDepartement = null;
10649     if (! empty($commune)) {
10650     $departement = $dossier->get_inst_departement_dossier();
10651     $idDepartement = $departement->getVal($departement->clePrimaire);
10652     }
10653     // Récupération des courriels des tiers notifiables
10654     $tiersANotifier = $this->get_courriels_tiers_notifiable(
10655     $typesHabilitationsNotifiable,
10656     $consultationEntrante->getVal('service_consultant_id'),
10657     $commune,
10658     $idDepartement
10659     );
10660     // Traitement de chacune des listes de diffusion pour extraire les
10661     // courriels, vérifier la validité des courriels et envoyer la
10662     // notification
10663     $notificationSend = false;
10664     if (empty($tiersANotifier)) {
10665     $this->addToLog(
10666     sprintf(
10667 softime 14542 '%s() : %s %s : %s',
10668 softime 13137 __METHOD__,
10669     __("La récupération des tiers à échoué."),
10670     __('Paramétrage'),
10671     var_export(
10672     array(
10673     'types_habilitations_notifiable' => $typesHabilitationsNotifiable,
10674     'service_consultant' => $consultationEntrante->getVal('service_consultant_id'),
10675     'id_commune' => $commune,
10676     'id_departement' => $idDepartement
10677     ),
10678     true
10679     )
10680     ),
10681     DEBUG_MODE
10682     );
10683     return false;
10684     }
10685     foreach($tiersANotifier as $tierANotifier) {
10686     // Découpe la liste de diffusion pour stocker les adresses mails
10687     // des tiers dans un tableau
10688     $courriels =
10689     array_filter(
10690     array_map(
10691     'trim',
10692     preg_split("/\r\n|\n|\r/", $tierANotifier['liste_diffusion'])));
10693    
10694     foreach ($courriels as $courriel) {
10695     // Pour chaque adresse mail vérifie si l'adresse est valide
10696     if (! $this->f->checkValidEmailAddress($courriel)) {
10697     continue;
10698     }
10699     $destinataire = array(
10700     'destinataire' => $tierANotifier['libelle'].' : '.$courriel,
10701     'courriel' => $courriel
10702     );
10703     // Si l'adresse est valide ajoute une nouvelle notification
10704     // et une tâche d'envoi de mails
10705     $idNotif = $this->ajouter_notification(
10706     $this->getVal($this->clePrimaire),
10707     $this->f->get_connected_user_login_name(),
10708     $destinataire,
10709     $this->get_dossier_instruction_om_collectivite(),
10710     array(),
10711     true
10712     );
10713     if ($idNotif === false) {
10714     $this->addToLog(
10715     __METHOD__.
10716     __("L'ajout de la notification a échoué."),
10717     DEBUG_MODE
10718     );
10719     return false;
10720     }
10721     // Création de la tache en lui donnant l'id de la notification
10722     $notification_by_task = $this->notification_by_task(
10723     $idNotif,
10724     $dossier->getVal('dossier'),
10725     'mail',
10726     'notification_tiers_consulte'
10727     );
10728     if ($notification_by_task === false) {
10729     $this->addToLog(
10730     __METHOD__.
10731     __("L'ajout de la tâche de notification a échoué."),
10732     DEBUG_MODE
10733     );
10734     $this->addToMessage(
10735     __("Erreur lors de la génération de la notification au(x) pétitionnaire(s).")
10736     );
10737     return false;
10738     }
10739     $notificationSend = true;
10740     }
10741     }
10742     // Si aucune notification n'a été envoyé car il n'y a pas de courriels
10743     // valide, affiche un message dans les logs pour avoir un suivi.
10744     if (! $notificationSend) {
10745     $this->addToLog(
10746     sprintf(
10747     '%s %s : %s %s : %s',
10748     __METHOD__,
10749     __("Il n'y a pas de tiers notifiable pour l'instruction"),
10750     $evenement->getVal('libelle'),
10751     __("du dossier"),
10752     $this->getVal('dossier')
10753     ),
10754     DEBUG_MODE
10755     );
10756     }
10757     return true;
10758     }
10759    
10760     /**
10761     * Récupère, à l'aide d'une requête, la liste de diffusion des tiers
10762     * respectant les conditions suvantes :
10763     * - le tiers consulté dois accepté les notifications
10764     * - la liste de diffusion ne dois pas être vide
10765     * - l'uid du tiers consulté ne dois pas être celui passé en paramètre
10766     * si pas d'uid passé en paramètre alors on ne filtre pas selon l'uid
10767     * du tiers
10768     * - le type d'habilitation des tiers dois appartenir à la liste
10769     * fournie en paramètre
10770     * - le tiers dois être associé à la commune ou au département passé
10771     * en paramètre
10772     *
10773     * @param array $typesHabilitations tableau contenant la liste des types d'habilitation
10774     * pouvant être notifiée
10775     * @param integer $idPlautau uid de l'acteur plat'au du dossier qui ne dois pas être notifié
10776     * @param integer $commune identifiant de la commune du dossier
10777     * @param integer $departement identifiant du département du dossier
10778     *
10779     * @return array listes de diffusion des tiers notifiable
10780     */
10781     protected function get_courriels_tiers_notifiable(array $typesHabilitations, $idPlatau, $commune, $departement) {
10782     // Si paramètre non renseigné alors ne renvoie rien
10783     if (empty($typesHabilitations) || empty($commune) || empty($departement)) {
10784     return false;
10785     }
10786     // Si il n'y a pas d'acteur associé au dossier alors on ne filtre pas sur l'uid de l'acteur
10787     $filtreServiceConsulteDI = '';
10788     if (! empty($idPlatau)) {
10789     $filtreServiceConsulteDI = sprintf(
10790 softime 14064 "-- Filtre les tiers ayant une ligne correspondante a l uid platau du service
10791     -- en charge du dossier
10792     AND (tiers_consulte.uid_platau_acteur !~ ('\y' || '%s' || '\y')
10793     OR tiers_consulte.uid_platau_acteur IS NULL)",
10794 softime 13137 $this->f->db->escapeSimple($idPlatau)
10795     );
10796     }
10797     $rst = $this->f->get_all_results_from_db_query(
10798     sprintf(
10799     'SELECT
10800 softime 14064 -- Tiers notifiables lié à la commune du dossier
10801 softime 13137 tiers_consulte.liste_diffusion,
10802     tiers_consulte.libelle
10803     FROM
10804     %1$shabilitation_tiers_consulte
10805     LEFT JOIN %1$stiers_consulte
10806     ON habilitation_tiers_consulte.tiers_consulte = tiers_consulte.tiers_consulte
10807     LEFT JOIN %1$slien_habilitation_tiers_consulte_commune
10808     ON habilitation_tiers_consulte.habilitation_tiers_consulte = lien_habilitation_tiers_consulte_commune.habilitation_tiers_consulte
10809 softime 14064 -- Conservation uniquement des tiers acteur de dossiers
10810     JOIN %1$slien_dossier_tiers
10811     ON tiers_consulte.tiers_consulte = lien_dossier_tiers.tiers
10812     WHERE
10813     tiers_consulte.accepte_notification_email IS TRUE
10814     AND tiers_consulte.liste_diffusion IS NOT NULL
10815     %3$s
10816     AND habilitation_tiers_consulte.type_habilitation_tiers_consulte IN (%2$s)
10817     AND lien_habilitation_tiers_consulte_commune.commune = %4$d
10818     -- Filtre sur les tiers acteur du dossier
10819     AND lien_dossier_tiers.dossier = \'%6$s\'
10820     UNION
10821     SELECT
10822     -- Tiers notifiables lié au département du dossier
10823     tiers_consulte.liste_diffusion,
10824     tiers_consulte.libelle
10825     FROM
10826     %1$shabilitation_tiers_consulte
10827     LEFT JOIN %1$stiers_consulte
10828     ON habilitation_tiers_consulte.tiers_consulte = tiers_consulte.tiers_consulte
10829 softime 13137 LEFT JOIN %1$slien_habilitation_tiers_consulte_departement
10830     ON habilitation_tiers_consulte.habilitation_tiers_consulte = lien_habilitation_tiers_consulte_departement.habilitation_tiers_consulte
10831 softime 14064 -- Conservation uniquement des tiers acteur de dossiers
10832     JOIN %1$slien_dossier_tiers
10833     ON tiers_consulte.tiers_consulte = lien_dossier_tiers.tiers
10834 softime 13137 WHERE
10835     tiers_consulte.accepte_notification_email IS TRUE
10836     AND tiers_consulte.liste_diffusion IS NOT NULL
10837     %3$s
10838     AND habilitation_tiers_consulte.type_habilitation_tiers_consulte IN (%2$s)
10839 softime 14064 AND lien_habilitation_tiers_consulte_departement.departement = %5$d
10840     -- Filtre sur les tiers acteur du dossier
10841     AND lien_dossier_tiers.dossier = \'%6$s\'',
10842 softime 13137 DB_PREFIXE,
10843     implode(', ', $typesHabilitations),
10844     $filtreServiceConsulteDI,
10845     intval($commune),
10846 softime 14064 intval($departement),
10847     $this->f->db->escapeSimple($this->getVal('dossier'))
10848 softime 13137 ),
10849     array(
10850     "origin" => __METHOD__
10851     )
10852     );
10853 softime 14064 // Faire un order by sur un union ne fonctionne pas. A la place
10854     // c'est le tableau des résultats qui est ordonné.
10855     usort($rst['result'], function($a, $b) {
10856     return strcmp($a['libelle'], $b['libelle']);
10857     });
10858 softime 13137 return $rst['result'];
10859     }
10860     }

Properties

Name Value
svn:keywords "Id"

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26