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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 15650 - (hide annotations)
Thu Aug 31 17:29:39 2023 UTC (16 months, 4 weeks ago) by softime
File size: 485985 byte(s)
chore(branch): fusion de la branche d'intégration 6.0.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 15037 "'' as log_instruction",
690     "parapheur_lien_page_signature"
691 softime 8989 );
692     }
693    
694     /**
695 softime 8593 * CONDITION - is_edition_integrale_enabled
696     *
697     * Vérifie que la rédaction libre est activée sur l'instruction en cours.
698     *
699     * @return boolean
700     */
701     function is_edition_integrale_enabled() {
702     if ($this->getVal("flag_edition_integrale") == 't') {
703     return true;
704     }
705     return false;
706     }
707 mbroquet 3730
708     /**
709 softime 8593 * CONDITION - is_edition_integrale_not_enabled
710     *
711     * Vérifie que la rédaction libre est désactivée sur l'instruction en cours.
712     *
713     * @return boolean
714     */
715     function is_edition_integrale_not_enabled() {
716     return !$this->is_edition_integrale_enabled();
717     }
718    
719     /**
720     * CONDITION - is_option_redaction_libre_enabled
721     *
722     * Vérifie que l'option de rédaction libre est activée.
723     *
724     * @return boolean
725     */
726     function is_option_redaction_libre_enabled() {
727     $collectivite_di = $this->get_dossier_instruction_om_collectivite();
728     return $this->f->is_option_redaction_libre_enabled($collectivite_di);
729     }
730    
731     /**
732 softime 10713 * CONDITION - is_option_parapheur_relecture_enabled
733     *
734     * Vérifie que l'option de relecture lors de l'envoi en signature est activée.
735     *
736     * @return boolean
737     */
738 softime 10808 function is_parapheur_relecture_parameter_enabled() {
739     //Instanciation de la classe electronicsignature
740     $inst_es = $this->get_electronicsignature_instance();
741     if ($inst_es === false) {
742     return false;
743     }
744    
745     if ($inst_es->get_conf('is_forced_view_files') !== 'true' && $inst_es->get_conf('is_forced_view_files') !== true) {
746     return false;
747     }
748    
749     return true;
750 softime 10713 }
751    
752 softime 11876 /**
753     * CONDITION - is_parapheur_annulation_parameter_enabled
754     *
755     * Vérifie que l'option d'annulation de l'envoi en signature est activée.
756     *
757     * @return boolean
758     */
759     function is_parapheur_annulation_parameter_enabled() {
760     //Instanciation de la classe electronicsignature
761     $inst_es = $this->get_electronicsignature_instance();
762     if ($inst_es === false) {
763     return false;
764     }
765 softime 10713
766 softime 11876 if ($inst_es->get_conf('cancel_send') !== 'true' && $inst_es->get_conf('cancel_send') !== true) {
767     return false;
768     }
769    
770     return true;
771     }
772    
773    
774 softime 10713 /**
775 softime 10573 * CONDITION - is_sent_for_signature
776     *
777     * Vérifie que l'instruction a été envoyé à signature
778     *
779     * @return boolean
780     */
781     function is_sent_for_signature() {
782     // Si un parapheur a été configuré
783     // et que le champ id_parapheur_signature n'est pas vide
784     // que le status est différent de "canceled" ou "expired"
785     // alors l'évènement a été envoyé en signature
786     if ($this->has_connector_electronicsignature() === true
787     && empty($this->getVal("id_parapheur_signature")) === false
788     && ($this->getVal("statut_signature") != "canceled"
789 softime 12124 && $this->getVal("statut_signature") != "expired"
790     && $this->getVal("statut_signature") != "finished")) {
791 softime 10573 //
792     return true;
793     }
794    
795     return false;
796     }
797    
798     /**
799     * CONDITION - is_not_sent_for_signature
800     *
801     * Vérifie que l'instruction n'a pas été envoyé à signature
802     *
803     * @return boolean
804     */
805     function is_not_sent_for_signature() {
806 softime 10968 // Contrôle si l'utilisateur possède un bypass
807     $bypass = $this->f->isAccredited($this->get_absolute_class_name()."_definaliser_bypass");
808     if ($bypass == true) {
809     return true;
810     }
811    
812 softime 10573 return !$this->is_sent_for_signature();
813     }
814    
815    
816     /**
817     * CONDITION - is_signed
818     *
819     * Vérifie que l'instruction a été signé
820     *
821     * @return boolean
822     */
823     function is_signed() {
824     // Si un parapheur a été configuré
825     // et que le champ id_parapheur_signature n'est pas vide
826     // et que le statut est égal à "finished"
827     // alors le document de l'instruciton à été signé
828     if ($this->has_connector_electronicsignature() === true
829     && empty($this->getVal("id_parapheur_signature")) === false
830     && $this->getVal("statut_signature") == "finished") {
831     //
832     return true;
833     }
834    
835     return false;
836     }
837    
838 softime 11876
839 softime 12433 /**
840     * is_sent_to_cl
841     *
842     * Vérifie que l'instruction a été envoyé au contrôle de légalité
843     *
844     * @return boolean
845     */
846 softime 11418 function is_sent_to_cl() {
847 softime 12433 // Si la case à cocher de l'instruction envoye_cl_platau est à "t"
848     if ($this->getVal('envoye_cl_platau') === 't') {
849     //
850     return true;
851 softime 11418 }
852     //
853     return false;
854     }
855    
856 softime 10808 /**
857     * CONDITION - is_portail_notification
858     *
859     * Vérifie si la notification est une notification de catégorie portail
860     *
861     * @return boolean
862     */
863 softime 10869 function is_portail_notification_sans_annexe() {
864 softime 10808 $collectiviteDi = $this->get_dossier_instruction_om_collectivite();
865 softime 10869 $ev = $this->get_inst_evenement($this->getVal('evenement'));
866 softime 14064 if ($this->f->get_param_option_notification($collectiviteDi) === PORTAL
867 softime 10869 && $ev->getVal('notification') != 'notification_manuelle_annexe'
868     && $ev->getVal('notification') != 'notification_manuelle_annexe_signature_requise'
869     ) {
870 softime 10808 return true;
871     }
872     return false;
873     }
874 softime 10573
875     /**
876 softime 10808 * CONDITION - is_not_portail_notification
877     *
878     * Vérifie si la notification n'est pas une notification de catégorie portail
879     *
880     * @return boolean
881     */
882 softime 10869 function is_not_portail_notification_sans_annexe() {
883     return (! $this->is_portail_notification_sans_annexe());
884 softime 10808 }
885    
886     /**
887 softime 10573 * CONDITION - can_be_signed
888     *
889     * Vérifie que le document de l'instruction peut être envoyé au parapheur pour signature
890     *
891     * @return boolean
892     */
893     function can_be_signed() {
894     // Instanciation de l'objet signataire_arrete
895     $inst_signataire_arrete = $this->f->get_inst__om_dbform(array(
896     "obj" => "signataire_arrete",
897     "idx" => $this->getVal("signataire_arrete"),
898     ));
899     // Si un parapheur a été configuré, que le document est finalisé, que le signataire
900     // possède une adresse email, on vérifie le champ id_parapheur_signature
901     // S'il est vide l'évènement peut être envoyé en signature
902     // S'il ne l'est pas, alors on vérifie le champ statut_signature
903     // Si la valeur de ce champ est égal à "canceled" ou "expired"
904     // alors l'évènement peut être envoyé en signature
905     if ($this->has_connector_electronicsignature() === true
906     && $this->getVal("om_final_instruction") == 't'
907     && empty($inst_signataire_arrete->getVal('email')) === false) {
908     //
909     if (empty($this->getVal("id_parapheur_signature")) === true
910     || $this->getVal("statut_signature") == "canceled"
911     || $this->getVal("statut_signature") == "expired") {
912     //
913     return true;
914     }
915     }
916    
917     $this->addToLog(__METHOD__."() has_connector_electronicsignature: ".var_export($this->has_connector_electronicsignature(), true), EXTRA_VERBOSE_MODE);
918     $this->addToLog(__METHOD__."() om_final_instruction: ".var_export($this->getVal("om_final_instruction"), true), EXTRA_VERBOSE_MODE);
919     $this->addToLog(__METHOD__."() email: ".var_export($inst_signataire_arrete->getVal('email'), true), EXTRA_VERBOSE_MODE);
920     $this->addToLog(__METHOD__."() id_parapheur_signature: ".var_export($this->getVal("id_parapheur_signature"), true), EXTRA_VERBOSE_MODE);
921     $this->addToLog(__METHOD__."() statut_signature: ".var_export($this->getVal("statut_signature"), true), EXTRA_VERBOSE_MODE);
922    
923     return false;
924     }
925    
926     /**
927     * CONDITION - has_connector_electronicsignature
928     *
929     * Vérifie qu'un parapheur est paramétré
930     *
931     * @return boolean
932     */
933     function has_connector_electronicsignature() {
934     $inst_es = $this->get_electronicsignature_instance(false);
935     if ($inst_es === false) {
936     return false;
937     }
938     return true;
939     }
940    
941     /**
942     * CONDITION - can_display_parapheur
943     *
944     * Vérifie que le fieldset "Suivi Parapheur" soit affichable
945     *
946     * @return boolean
947     */
948     function can_display_parapheur() {
949     $evenement_id = $this->getVal("evenement");
950     $inst_evenement = $this->get_inst_evenement($evenement_id);
951     if ($this->has_connector_electronicsignature() === true
952     && $inst_evenement->getVal('lettretype') !== ''
953     && $inst_evenement->getVal('lettretype') !== null
954     && (empty($this->getVal("id_parapheur_signature")) === false
955     || empty($this->getVal("historique_signature")) === false)) {
956     //
957     return true;
958     }
959    
960     return false;
961     }
962    
963     /**
964 softime 10808 * CONDITION - can_display_notification
965     *
966 softime 11585 * Vérifie que le champs "Suivi notification" est affichable
967 softime 10808 *
968     * @return boolean
969     */
970 softime 11585 function can_display_notification_demandeur() {
971 softime 10808 // Le suivi des notification est affiché si l'événement est notifiable
972     // et si des notifications ont été envoyées
973     $evenement_id = $this->getVal("evenement");
974     $inst_evenement = $this->get_inst_evenement($evenement_id);
975     if ($inst_evenement->getVal('notification') != null &&
976     $inst_evenement->getVal('notification') != '') {
977     // Des notifications ont été envoyé si il existe au moins une notification
978     // liées à l'instruction
979 softime 11585 $idsNotifs = $this->get_instruction_notification(
980     $this->getVal($this->clePrimaire),
981     array(
982     'notification_recepisse',
983     'notification_instruction',
984     'notification_decision',
985 softime 12124 ),
986     true
987 softime 11585 );
988 softime 10808 if (isset($idsNotifs) && $idsNotifs !== array()) {
989     return true;
990     }
991     }
992     return false;
993     }
994    
995     /**
996 softime 11585 * CONDITION - can_display_notification
997     *
998     * Vérifie que le champs "suivi_notification_service" est affichable
999     *
1000     * @return boolean
1001     */
1002     function can_display_notification_service() {
1003     // Le suivi des notification est affiché si l'événement est notifiable
1004     // et si des notifications ont été envoyées
1005     $evenement_id = $this->getVal("evenement");
1006     $inst_evenement = $this->get_inst_evenement($evenement_id);
1007     if ($this->get_boolean_from_pgsql_value($inst_evenement->getVal('notification_service')) == true) {
1008     // Des notifications ont été envoyé si il existe au moins une notification
1009     // de type notification_service_consulte liées à l'instruction
1010     $idsNotifs = $this->get_instruction_notification(
1011     $this->getVal($this->clePrimaire),
1012     'notification_service_consulte'
1013     );
1014     if (isset($idsNotifs) && $idsNotifs !== array()) {
1015     return true;
1016     }
1017     }
1018     return false;
1019     }
1020    
1021    
1022     /**
1023     * CONDITION - can_display_notification_tiers
1024     *
1025     * Vérifie que le champs "suivi_notification_tiers" est affichable
1026     *
1027     * @return boolean
1028     */
1029     function can_display_notification_tiers() {
1030     // Le suivi des notification est affiché si l'événement est notifiable
1031     // et si des notifications ont été envoyées
1032     $evenement_id = $this->getVal("evenement");
1033     $inst_evenement = $this->get_inst_evenement($evenement_id);
1034 softime 13137 if (! empty($inst_evenement->getVal('notification_tiers'))) {
1035 softime 11585 // Des notifications ont été envoyé si il existe au moins une notification
1036     // de type notification_tiers_consulte liées à l'instruction
1037     $idsNotifs = $this->get_instruction_notification(
1038     $this->getVal($this->clePrimaire),
1039     'notification_tiers_consulte'
1040     );
1041     if (isset($idsNotifs) && $idsNotifs !== array()) {
1042     return true;
1043     }
1044     }
1045     return false;
1046     }
1047    
1048     /**
1049 softime 12654 * CONDITION - can_display_notification_commune
1050     *
1051     * Vérifie que le champs "suivi_notification_commune" est affichable
1052     *
1053     * @return boolean
1054     */
1055     function can_display_notification_commune() {
1056     // Le suivi des notification si il existe au moins une notification
1057     // de type notification_depot_demat liées à l'instruction
1058     $idsNotifs = $this->get_instruction_notification(
1059     $this->getVal($this->clePrimaire),
1060     array('notification_depot_demat', 'notification_commune')
1061     );
1062     if (isset($idsNotifs) && $idsNotifs !== array()) {
1063     return true;
1064     }
1065     return false;
1066     }
1067    
1068     /**
1069 softime 8593 * TREATMENT - disable_edition_integrale.
1070     *
1071     * Cette methode permet de passer la consultation en "lu"
1072     *
1073     * @return boolean true si maj effectué false sinon
1074     */
1075     function disable_edition_integrale() {
1076     // Cette méthode permet d'exécuter une routine en début des méthodes
1077     // dites de TREATMENT.
1078     $this->begin_treatment(__METHOD__);
1079     $this->correct = true;
1080     $valF = array(
1081     "flag_edition_integrale" => false,
1082     "titre_om_htmletat" => null,
1083     "corps_om_htmletatex" => null,
1084     );
1085     $res = $this->f->db->autoExecute(
1086     DB_PREFIXE.$this->table,
1087     $valF,
1088     DB_AUTOQUERY_UPDATE,
1089     $this->clePrimaire."=".$this->getVal($this->clePrimaire)
1090     );
1091     if ($this->f->isDatabaseError($res, true)) {
1092     // Appel de la methode de recuperation des erreurs
1093     $this->erreur_db($res->getDebugInfo(), $res->getMessage(), '');
1094     $this->correct = false;
1095     // Termine le traitement
1096     return $this->end_treatment(__METHOD__, false);
1097     } else {
1098     $this->addToMessage(_("Rédaction par compléments activé."));
1099     return $this->end_treatment(__METHOD__, true);
1100     }
1101    
1102     // Termine le traitement
1103     return $this->end_treatment(__METHOD__, false);
1104     }
1105    
1106     /**
1107     * TREATMENT - enable_edition_integrale.
1108     *
1109     * Cette methode permet de passer la consultation en "lu"
1110     *
1111     * @return boolean true si maj effectué false sinon
1112     */
1113     function enable_edition_integrale() {
1114     // Cette méthode permet d'exécuter une routine en début des méthodes
1115     // dites de TREATMENT.
1116     $this->begin_treatment(__METHOD__);
1117     $this->correct = true;
1118    
1119     // Récupère la collectivite du dossier d'instruction
1120     $dossier_instruction_om_collectivite = $this->get_dossier_instruction_om_collectivite();
1121     $collectivite = $this->f->getCollectivite($dossier_instruction_om_collectivite);
1122     //
1123     $params = array(
1124     "specific" => array(
1125     "corps" => array(
1126     "mode" => "get",
1127     )
1128     ),
1129     );
1130     $result = $this->compute_pdf_output('lettretype', $this->getVal('lettretype'), $collectivite, null, $params);
1131     $corps = $result['pdf_output'];
1132     //
1133     $params = array(
1134     "specific" => array(
1135     "titre" => array(
1136     "mode" => "get",
1137     )
1138     ),
1139     );
1140     $result = $this->compute_pdf_output('lettretype', $this->getVal('lettretype'), $collectivite, null, $params);
1141     $titre = $result['pdf_output'];
1142     //
1143     $valF = array(
1144     "flag_edition_integrale" => true,
1145     "titre_om_htmletat" => $titre,
1146     "corps_om_htmletatex" => $corps,
1147     );
1148     $res = $this->f->db->autoExecute(
1149     DB_PREFIXE.$this->table,
1150     $valF,
1151     DB_AUTOQUERY_UPDATE,
1152     $this->clePrimaire."=".$this->getVal($this->clePrimaire)
1153     );
1154     if ($this->f->isDatabaseError($res, true)) {
1155     // Appel de la methode de recuperation des erreurs
1156     $this->erreur_db($res->getDebugInfo(), $res->getMessage(), '');
1157     $this->correct = false;
1158     // Termine le traitement
1159     return $this->end_treatment(__METHOD__, false);
1160     } else {
1161     $this->addToMessage(_("Rédaction libre activé."));
1162     return $this->end_treatment(__METHOD__, true);
1163     }
1164    
1165     // Termine le traitement
1166     return $this->end_treatment(__METHOD__, false);
1167     }
1168    
1169     /**
1170 softime 14064 * Cette méthode instancie le dossier à partir de l'identifiant passé
1171     * en paramètre et renvoie l'identifiant du dossier d'autorisation (DA)
1172     * associé au dossier.
1173     * Si l'identifiant du dossier n'est pas fourni alors cette méthode
1174     * renverra NULL
1175     *
1176     * @param string identifiant du dossier
1177     * @return null|string null ou identifiant du DA
1178 mbroquet 3730 */
1179     function getNumDemandeAutorFromDossier($id) {
1180     if (!isset($id)) {
1181     return NULL;
1182     }
1183 softime 14064
1184     $dossier = $this->f->get_inst__om_dbform(array(
1185     'obj' => 'dossier',
1186     'idx' => $id,
1187     ));
1188    
1189     return $dossier->getVal('dossier_autorisation');
1190 mbroquet 3730 }
1191    
1192 softime 14064
1193 mbroquet 3730 function setType(&$form, $maj) {
1194 softime 8593 // Récupération du mode de l'action
1195     $crud = $this->get_action_crud($maj);
1196     // Récupère la collectivité du dossier d'instruction
1197     $collectivite_di = $this->get_dossier_instruction_om_collectivite();
1198 mbroquet 3730
1199 softime 8593 // Cache tous les champs
1200     foreach ($this->champs as $value) {
1201     $form->setType($value, 'hidden');
1202     }
1203 softime 6565
1204 softime 10573 // Les champs historique_signature et statut_signature ne sont pas saisissable dans tous les cas
1205 softime 11228 if ($this->can_display_parapheur() === true && $maj == 3) {
1206 softime 10573 $form->setType('statut_signature', 'selectstatic');
1207     $form->setType('historique_signature', 'jsontotab');
1208     if ($this->getVal('commentaire_signature') == null) {
1209     $form->setType('commentaire_signature', 'hidden');
1210     } else {
1211     $form->setType('commentaire_signature', 'hiddenstatic');
1212     }
1213     }
1214    
1215 softime 11585 // Le champ de suivi des notifications des demandeurs n'est pas affichable dans tous les cas
1216 softime 12654 if ($maj == 3 && $this->can_display_notification_demandeur() === true) {
1217 softime 10808 $form->setType('suivi_notification', 'jsontotab');
1218     }
1219 softime 11585 // Le champ de suivi des notifications des services n'est pas affichable dans tous les cas
1220 softime 12654 if ($maj == 3 && $this->can_display_notification_service() === true) {
1221 softime 11585 $form->setType('suivi_notification_service', 'jsontotab');
1222     }
1223     // Le champ de suivi des notifications des tiers n'est pas affichable dans tous les cas
1224 softime 12654 if ($maj == 3 && $this->can_display_notification_tiers() === true) {
1225 softime 11585 $form->setType('suivi_notification_tiers', 'jsontotab');
1226     }
1227 softime 12654 // Le champ de suivi des notifications des communes n'est pas affichable dans tous les cas
1228     if ($maj == 3 && $this->can_display_notification_commune() === true) {
1229     $form->setType('suivi_notification_commune', 'jsontotab');
1230     }
1231 softime 10808
1232 softime 8593 // MODE AJOUTER
1233     if ($this->getParameter('maj') == 0) {
1234 softime 10573 $form->setType('commentaire', 'textareahidden');
1235     // Si l'option est active passage du champ date en lecture seule
1236     if ($this->f->is_option_date_evenement_instruction_lecture_seule($collectivite_di) === true) {
1237     $form->setType("date_evenement", "hiddenstaticdate");
1238     } else {
1239     $form->setType("date_evenement", "date");
1240     }
1241 softime 8989 if ($this->is_in_context_of_foreign_key("evenement", $this->getParameter("retourformulaire"))) {
1242 softime 8593 $form->setType("evenement", "selecthiddenstatic");
1243     } else {
1244     $form->setType("evenement", "select");
1245     }
1246 softime 8989 if ($this->is_in_context_of_foreign_key("signataire_arrete", $this->getParameter("retourformulaire"))) {
1247 softime 8593 $form->setType("signataire_arrete", "selecthiddenstatic");
1248     } else {
1249     $form->setType("signataire_arrete", "select");
1250     }
1251     if ($this->is_option_redaction_libre_enabled() === true) {
1252     $form->setType("flag_edition_integrale", "select");
1253     }
1254 mbroquet 3730 }
1255    
1256 softime 8593 // MODE MODIFIER
1257     if ($this->getParameter('maj') == 1) {
1258 softime 10573 // Si l'option est active passage du champ date en lecture seule
1259     if ($this->f->is_option_date_evenement_instruction_lecture_seule($collectivite_di) === true) {
1260     $form->setType("date_evenement", "hiddenstaticdate");
1261     } else {
1262     $form->setType("date_evenement", "date");
1263     }
1264 softime 8593 $form->setType("evenement", "selecthiddenstatic");
1265     if ($this->has_an_edition() === true) {
1266     $form->setType('lettretype', 'hiddenstatic');
1267 softime 8989 if ($this->is_in_context_of_foreign_key("signataire_arrete", $this->getParameter("retourformulaire"))) {
1268 softime 8593 $form->setType("signataire_arrete", "selecthiddenstatic");
1269     } else {
1270     $form->setType("signataire_arrete", "select");
1271     }
1272     if ($this->getVal("flag_edition_integrale") == "t") {
1273     $form->setType("titre_om_htmletat", "htmlEtat");
1274     $form->setType("corps_om_htmletatex", "htmlEtatEx");
1275     } else {
1276     $form->setType("complement_om_html", "html");
1277     $form->setType("complement2_om_html", "html");
1278     $form->setType("complement3_om_html", "html");
1279     $form->setType("complement4_om_html", "html");
1280     $form->setType('bible_auto', 'httpclick');
1281     $form->setType('bible', 'httpclick');
1282     $form->setType('bible2', 'httpclick');
1283     $form->setType('bible3', 'httpclick');
1284     $form->setType('bible4', 'httpclick');
1285     }
1286     if ($this->f->is_option_preview_pdf_enabled($collectivite_di) === true) {
1287     //
1288     $form->setType('btn_refresh', 'httpclickbutton');
1289     $form->setType('btn_preview', 'httpclickbutton');
1290     $form->setType('btn_redaction', 'httpclickbutton');
1291 softime 11876 // /!\ le type du champs est utilisé dans un selecteur dans le jscript.js
1292     // pour identifiant le champ de prévisualisation et régler sa taille à
1293     // l'affichage du champ. En cas de modification, le selecteur doit également
1294     // être mis à jour
1295 softime 11418 $form->setType('live_preview', 'previsualiser_pdf');
1296 softime 7521 }
1297 softime 8593
1298 mbroquet 3730 // necessaire pour calcul de date en modification
1299     //$form->setType('delai', 'hiddenstatic');
1300     // les administrateurs technique et fonctionnel peuvent
1301     // modifier tous les champs de date
1302     // si l'instruction a déjà été finalisée au moins une fois
1303 softime 7996 if (($this->f->isAccredited(array($this->get_absolute_class_name(), $this->get_absolute_class_name()."modification_dates"), "OR")
1304 softime 6565 || $this->f->isAccredited(array('instruction', 'instruction_modification_dates'), "OR"))
1305 mbroquet 3730 && $this->getVal("date_finalisation_courrier") != '') {
1306 softime 8593 //
1307 mbroquet 3730 $form->setType('date_envoi_signature', 'date');
1308     $form->setType('date_retour_signature', 'date');
1309 softime 10573 if ($this->is_sent_for_signature() === true
1310     && $this->is_signed() === true) {
1311     //
1312     $form->setType("date_envoi_signature", "datereadonly");
1313     $form->setType("date_retour_signature", "datereadonly");
1314     }
1315 mbroquet 3730 $form->setType('date_envoi_rar', 'date');
1316     $form->setType('date_retour_rar', 'date');
1317     $form->setType('date_envoi_controle_legalite', 'date');
1318 softime 11418 if ($this->is_sent_to_cl() === true) {
1319 softime 12124 $form->setType("date_envoi_controle_legalite", "datedisabled");
1320 softime 11418 }
1321 mbroquet 3730 $form->setType('date_retour_controle_legalite', 'date');
1322     $form->setType('date_finalisation_courrier', 'date');
1323     }
1324     }
1325     }
1326    
1327 softime 10808 // MODE CONSULTER + SUPPRIMER + SUIVI DES DATES 125 + NOTIFICATION MANUELLE
1328 softime 8593 if ($this->getParameter('maj') == 3
1329     || $this->getParameter('maj') == 2
1330 softime 10808 || $this->getParameter('maj') == 125
1331     || $this->getParameter('maj') == 410) {
1332 softime 8593 //
1333     $form->setType("date_evenement", "datestatic");
1334     $form->setType("evenement", "selecthiddenstatic");
1335     if ($this->has_an_edition() === true) {
1336     $form->setType('lettretype', 'hiddenstatic');
1337     $form->setType("signataire_arrete", "selecthiddenstatic");
1338     if ($this->getVal("om_final_instruction") == 't') {
1339     $form->setType('om_final_instruction_utilisateur', 'textareastatic');
1340     } else {
1341     $form->setType('om_final_instruction_utilisateur', 'hidden');
1342     }
1343     }
1344 softime 10573 if ($this->evenement_has_a_commentaire($this->getVal('evenement')) === true ) {
1345     $form->setType('commentaire', 'textareastatic');
1346     }
1347 mbroquet 3730 }
1348    
1349 softime 10808 // MODE CONSULTER + SUPPRIMER + NOTIFICATION MANUELLE
1350     if ($this->getParameter('maj') == 3
1351     || $this->getParameter('maj') == 2
1352     || $this->getParameter('maj') == 410) {
1353 softime 10573 // Si il n'y a pas de lettre type (edition) associé à l'événement
1354     // les dates de suivi ne sont pas affichée
1355 softime 8593 if ($this->has_an_edition() === true) {
1356 softime 10573 $form->setType('date_envoi_signature', 'datestatic');
1357     $form->setType('date_retour_signature', 'datestatic');
1358     $form->setType('date_envoi_rar', 'datestatic');
1359     $form->setType('date_retour_rar', 'datestatic');
1360     $form->setType('date_envoi_controle_legalite', 'datestatic');
1361     $form->setType('date_retour_controle_legalite', 'datestatic');
1362     $form->setType('date_finalisation_courrier', 'datestatic');
1363 softime 8593 if ($this->getVal("flag_edition_integrale") == "t") {
1364     $form->setType("titre_om_htmletat", "htmlstatic");
1365     $form->setType("corps_om_htmletatex", "htmlstatic");
1366     } else {
1367     $form->setType("complement_om_html", "htmlstatic");
1368     $form->setType("complement2_om_html", "htmlstatic");
1369     $form->setType("complement3_om_html", "htmlstatic");
1370     $form->setType("complement4_om_html", "htmlstatic");
1371     }
1372 mbroquet 3730 }
1373     }
1374 softime 8593
1375     // MODE SUIVI DES DATES 125
1376     if ($this->getParameter('maj') == 125) {
1377     $form->setType("date_evenement", "hiddenstaticdate");
1378     $form->setType('om_final_instruction_utilisateur', 'hiddenstatic');
1379     $form->setType('date_envoi_signature', 'date');
1380     $form->setType('date_retour_signature', 'date');
1381 softime 10573 if ($this->is_sent_for_signature() === true
1382     || $this->is_signed() === true) {
1383     //
1384     $form->setType("date_envoi_signature", "datereadonly");
1385     $form->setType("date_retour_signature", "datereadonly");
1386     }
1387 softime 8593 $form->setType('date_envoi_rar', 'date');
1388     $form->setType('date_retour_rar', 'date');
1389     $form->setType('date_envoi_controle_legalite', 'date');
1390 softime 11418 if ($this->is_sent_to_cl() === true) {
1391 softime 12124 $form->setType("date_envoi_controle_legalite", "datedisabled");
1392 softime 11418 }
1393 softime 8593 $form->setType('date_retour_controle_legalite', 'date');
1394     $form->setType('date_finalisation_courrier', 'date');
1395     }
1396 softime 10573
1397     if ($maj == 401) {
1398     foreach ($this->champs as $champ) {
1399     $form->setType($champ, 'hidden');
1400     }
1401 softime 11418 $form->setType('preview_edition', 'previsualiser');
1402 softime 10573 }
1403 softime 12124
1404     // Si l'instruction a été envoyé au contrôle de légalité et que la
1405     // tâche envoi_cl lié n'a pas encore été traité il faut indiquer à
1406     // l'utilisateur que l'envoi au cl est en cours de traitement.
1407     if ($this->is_sent_to_cl() === true
1408     && empty($this->getVal('date_envoi_controle_legalite'))
1409     && $maj == 3) {
1410     $form->setType("date_envoi_controle_legalite", "hiddenstatic");
1411     }
1412 mbroquet 3730 }
1413    
1414 softime 8593 function setOnchange(&$form,$maj){
1415     parent::setOnchange($form,$maj);
1416    
1417     // MODE AJOUTER
1418     if ($this->getParameter('maj') == 0) {
1419 softime 10573 $form->setOnchange(
1420     "evenement",
1421     "manage_instruction_evenement_lettretype(this.value, '".addslashes($this->getParameter('idxformulaire'))."');
1422     manage_instruction_evenement_commentaire(this.value, '".addslashes($this->getParameter('idxformulaire'))."');"
1423     );
1424 softime 8593 }
1425     }
1426    
1427     function evenement_has_an_edition($evenement_id) {
1428     $evenement = $this->get_inst_evenement($evenement_id);
1429     $lettretype = $evenement->getVal('lettretype');
1430     if ($lettretype !== '' && $lettretype !== null) {
1431     return true;
1432     }
1433     return false;
1434     }
1435    
1436     function view_evenement_has_an_edition_json() {
1437     $json_return = array(
1438     "lettretype" => $this->evenement_has_an_edition($this->f->get_submitted_get_value('evenement_id')),
1439     "option_redaction_libre_enabled" => $this->is_option_redaction_libre_enabled(),
1440     );
1441     echo json_encode($json_return);
1442     }
1443    
1444 softime 10573 function evenement_has_a_commentaire($evenement_id) {
1445     $evenement = $this->get_inst_evenement($evenement_id);
1446     return $this->get_boolean_from_pgsql_value($evenement->getVal('commentaire'));
1447     }
1448    
1449     function view_evenement_has_a_commentaire_json() {
1450     $json_return = array(
1451     "commentaire" => $this->evenement_has_a_commentaire($this->f->get_submitted_get_value('evenement_id'))
1452     );
1453     echo json_encode($json_return);
1454     }
1455    
1456 softime 11418
1457 softime 8989 /**
1458 softime 11418 * CONDITION - can_be_sended_to_cl
1459 softime 8989 *
1460 softime 11418 * Vérifie que le contrôle de légalité est disponible
1461     *
1462     * @return boolean
1463     */
1464     function can_be_sended_to_cl() {
1465     // Si l'instruction a une édition
1466     // et que l'événement est paramétré pour envoyer le contrôle de légalité
1467     // par Plat'AU
1468     // et que la date de retour signature est renseignée
1469     // et que la date d'envoi au contrôle légalité n'est pas renseignée
1470     // et qu'il n'existe pas de task envoi_CL en cours (!= done ou canceled)
1471     if ($this->has_an_edition() === true) {
1472     $inst_di = $this->get_inst_dossier($this->getVal('dossier'));
1473     $inst_evenement = $this->get_inst_evenement($this->getVal('evenement'));
1474     if ($inst_evenement->getVal('envoi_cl_platau') === 't'
1475     && empty($this->getVal('date_retour_signature')) === false
1476     && empty($this->getVal('date_envoi_controle_legalite')) === true
1477     && $this->getVal('envoye_cl_platau') === 'f'
1478     && $this->f->is_type_dossier_platau($inst_di->getVal('dossier_autorisation')) === true
1479     && $inst_di->getVal('etat_transmission_platau') !== 'jamais_transmissible') {
1480     //
1481     return true;
1482     }
1483     }
1484     //
1485     return false;
1486     }
1487    
1488     /**
1489     *
1490 softime 8989 * @return string
1491     */
1492     function get_var_sql_forminc__sql_signataire_arrete() {
1493 softime 11585 return sprintf(
1494     "SELECT
1495     signataire_arrete.signataire_arrete,
1496     CONCAT_WS(
1497     ' - ',
1498     CONCAT_WS(' ', signataire_arrete.prenom, signataire_arrete.nom),
1499     signataire_habilitation.libelle,
1500     signataire_arrete.description
1501     )
1502     FROM
1503     %1\$ssignataire_arrete
1504     LEFT JOIN %1\$ssignataire_habilitation
1505     ON signataire_arrete.signataire_habilitation = signataire_habilitation.signataire_habilitation
1506     WHERE
1507     ((signataire_arrete.om_validite_debut IS NULL
1508     AND (signataire_arrete.om_validite_fin IS NULL
1509     OR signataire_arrete.om_validite_fin > CURRENT_DATE))
1510     OR (signataire_arrete.om_validite_debut <= CURRENT_DATE
1511     AND (signataire_arrete.om_validite_fin IS NULL
1512     OR signataire_arrete.om_validite_fin > CURRENT_DATE)))
1513     ORDER BY
1514     signataire_arrete.prenom,
1515     signataire_arrete.nom",
1516     DB_PREFIXE
1517     );
1518 softime 8989 }
1519    
1520     /**
1521     *
1522     * @return string
1523     */
1524     function get_var_sql_forminc__sql_signataire_arrete_by_id() {
1525 softime 11585 return sprintf(
1526     "SELECT
1527     signataire_arrete.signataire_arrete,
1528     CONCAT_WS(
1529     ' - ',
1530     CONCAT_WS(' ', signataire_arrete.prenom, signataire_arrete.nom),
1531     signataire_habilitation.libelle,
1532     signataire_arrete.description
1533     )
1534     FROM
1535     %1\$ssignataire_arrete
1536     LEFT JOIN %1\$ssignataire_habilitation
1537     ON signataire_arrete.signataire_habilitation = signataire_habilitation.signataire_habilitation
1538     WHERE
1539     signataire_arrete.signataire_arrete = <idx>",
1540     DB_PREFIXE
1541     );
1542 softime 8989 }
1543    
1544     /**
1545     *
1546     * @return string
1547     */
1548     function get_var_sql_forminc__sql_signataire_arrete_by_di() {
1549 softime 11585 return sprintf(
1550     "SELECT
1551     signataire_arrete.signataire_arrete,
1552     CONCAT_WS(
1553     ' - ',
1554     CONCAT_WS(' ', signataire_arrete.prenom, signataire_arrete.nom),
1555     signataire_habilitation.libelle,
1556     signataire_arrete.description
1557     )
1558     FROM
1559     %1\$ssignataire_arrete
1560     LEFT JOIN %1\$som_collectivite
1561     ON signataire_arrete.om_collectivite = om_collectivite.om_collectivite
1562     LEFT JOIN %1\$ssignataire_habilitation
1563     ON signataire_arrete.signataire_habilitation = signataire_habilitation.signataire_habilitation
1564     WHERE
1565     ((signataire_arrete.om_validite_debut IS NULL
1566     AND (signataire_arrete.om_validite_fin IS NULL
1567     OR signataire_arrete.om_validite_fin > CURRENT_DATE))
1568     OR (signataire_arrete.om_validite_debut <= CURRENT_DATE
1569     AND (signataire_arrete.om_validite_fin IS NULL
1570     OR signataire_arrete.om_validite_fin > CURRENT_DATE)))
1571     AND (om_collectivite.niveau = '2'
1572     OR signataire_arrete.om_collectivite = <collectivite_di>)
1573     ORDER BY
1574     signataire_arrete.prenom, signataire_arrete.nom",
1575     DB_PREFIXE
1576     );
1577 softime 8989 }
1578    
1579     /**
1580     *
1581     * @return string
1582     */
1583     function get_var_sql_forminc__sql_signataire_arrete_defaut() {
1584 softime 11585 return sprintf(
1585     "SELECT
1586     signataire_arrete.signataire_arrete,
1587     CONCAT_WS(
1588     ' - ',
1589     CONCAT_WS(' ', signataire_arrete.prenom, signataire_arrete.nom),
1590     signataire_habilitation.libelle,
1591     signataire_arrete.description
1592     )
1593     FROM
1594     %1\$ssignataire_arrete
1595     LEFT JOIN %1\$ssignataire_habilitation
1596     ON signataire_arrete.signataire_habilitation = signataire_habilitation.signataire_habilitation
1597     WHERE
1598     ((signataire_arrete.om_validite_debut IS NULL
1599     AND (signataire_arrete.om_validite_fin IS NULL
1600     OR signataire_arrete.om_validite_fin > CURRENT_DATE))
1601     OR (signataire_arrete.om_validite_debut <= CURRENT_DATE
1602     AND (signataire_arrete.om_validite_fin IS NULL
1603     OR signataire_arrete.om_validite_fin > CURRENT_DATE)))
1604     AND signataire_arrete.defaut IS TRUE
1605     ORDER BY
1606     signataire_arrete.prenom, signataire_arrete.nom",
1607     DB_PREFIXE
1608     );
1609 softime 8989 }
1610    
1611     /**
1612     *
1613     * @return string
1614     */
1615     function get_var_sql_forminc__sql_signataire_arrete_defaut_by_di() {
1616 softime 11585 return sprintf(
1617     "SELECT
1618     signataire_arrete.signataire_arrete,
1619     CONCAT_WS(
1620     ' - ',
1621     CONCAT_WS(' ', signataire_arrete.prenom, signataire_arrete.nom),
1622     signataire_habilitation.libelle,
1623     signataire_arrete.description
1624     )
1625     FROM
1626     %1\$ssignataire_arrete
1627     LEFT JOIN %1\$ssignataire_habilitation
1628     ON signataire_arrete.signataire_habilitation = signataire_habilitation.signataire_habilitation
1629     LEFT JOIN %1\$som_collectivite
1630     ON signataire_arrete.om_collectivite = om_collectivite.om_collectivite
1631     WHERE
1632     ((signataire_arrete.om_validite_debut IS NULL
1633     AND (signataire_arrete.om_validite_fin IS NULL
1634     OR signataire_arrete.om_validite_fin > CURRENT_DATE))
1635     OR (signataire_arrete.om_validite_debut <= CURRENT_DATE
1636     AND (signataire_arrete.om_validite_fin IS NULL
1637     OR signataire_arrete.om_validite_fin > CURRENT_DATE)))
1638     AND signataire_arrete.defaut IS TRUE
1639     AND (om_collectivite.niveau = '2'
1640     OR signataire_arrete.om_collectivite = <collectivite_di>)
1641     ORDER BY
1642     signataire_arrete.prenom,
1643     signataire_arrete.nom",
1644     DB_PREFIXE
1645     );
1646 softime 8989 }
1647    
1648     /**
1649 softime 14542 * Renvoie sous la forme d'un tableau la liste des événements pouvant être ajoutés au dossier
1650     * dont l'identifiant a été passé en paramètre dans l'url.
1651     *
1652     * @return array
1653     */
1654     function get_var_sql_forminc__sql_evenement() {
1655     // Récupération du numéro de dossier
1656     $dossier = $this->getParameter("idxformulaire");
1657     // Si changement de décision par instructeur commune
1658     $filter = '';
1659     if ($this->f->isUserInstructeur() === true
1660     && $this->getDivisionFromDossier($dossier) != $_SESSION["division"]
1661     && $this->isInstrCanChangeDecision($dossier) === true) {
1662     $filter = "AND evenement.type IN ('arrete', 'changement_decision')";
1663     }
1664     // Récupération du libellé, de l'identifiant des évènement et d'un booléen permettant
1665     // de déterminer si il s'agit d'évènements suggérés.
1666     $qres = $this->f->get_all_results_from_db_query(
1667     sprintf(
1668     'SELECT
1669     DISTINCT(evenement.evenement),
1670     evenement.libelle,
1671     -- Si l evenement est suggérés alors il sera lié à la table des événements suggérés du dossier
1672     CASE WHEN evenement_suggere_dossier.evenement IS NULL
1673     THEN FALSE
1674     ELSE TRUE
1675     END AS is_suggested
1676     FROM
1677     -- Jointures permettant de récupérer la liste des évènements compatibles avec le dossier
1678     -- selon le type de dossier et l état du dossier.
1679     %1$sevenement
1680     JOIN %1$slien_dossier_instruction_type_evenement
1681     ON evenement.evenement = lien_dossier_instruction_type_evenement.evenement
1682     JOIN %1$stransition
1683     ON evenement.evenement = transition.evenement
1684     JOIN %1$sdossier
1685     ON lien_dossier_instruction_type_evenement.dossier_instruction_type = dossier.dossier_instruction_type
1686     AND transition.etat = dossier.etat
1687     -- Jointures avec une sous requêtes servant à récupérer la liste des évènements suggérés du dossier.
1688     LEFT JOIN (
1689     SELECT
1690     lien_sig_contrainte_evenement.evenement,
1691     dossier.dossier
1692     FROM
1693     %1$slien_sig_contrainte_evenement
1694     JOIN %1$ssig_contrainte
1695     ON lien_sig_contrainte_evenement.sig_contrainte = sig_contrainte.sig_contrainte
1696     JOIN %1$slien_sig_contrainte_dossier_instruction_type
1697     ON sig_contrainte.sig_contrainte = lien_sig_contrainte_dossier_instruction_type.sig_contrainte
1698     JOIN %1$slien_sig_contrainte_om_collectivite
1699     ON sig_contrainte.sig_contrainte = lien_sig_contrainte_om_collectivite.sig_contrainte
1700     JOIN %1$scontrainte
1701     ON sig_contrainte.libelle = contrainte.libelle
1702     JOIN %1$sdossier_contrainte
1703     ON contrainte.contrainte = dossier_contrainte.contrainte
1704     JOIN %1$sdossier
1705     ON dossier_contrainte.dossier = dossier.dossier
1706     AND lien_sig_contrainte_dossier_instruction_type.dossier_instruction_type = dossier.dossier_instruction_type
1707     JOIN %1$som_collectivite
1708     ON lien_sig_contrainte_om_collectivite.om_collectivite = om_collectivite.om_collectivite
1709     AND (dossier.om_collectivite = om_collectivite.om_collectivite
1710     OR om_collectivite.niveau = \'2\')
1711     ) AS evenement_suggere_dossier
1712     ON evenement.evenement = evenement_suggere_dossier.evenement
1713     AND dossier.dossier = evenement_suggere_dossier.dossier
1714     WHERE
1715     dossier.dossier = \'%2$s\'
1716     %3$s
1717     ORDER BY
1718     is_suggested DESC,
1719     evenement.libelle',
1720     DB_PREFIXE,
1721     $this->f->db->escapeSimple($dossier),
1722     $filter
1723     ),
1724     array(
1725     "origin" => __METHOD__
1726     )
1727     );
1728     return $qres['result'];
1729     }
1730    
1731     /**
1732     * Récupère un tableau contenant des évènements de la forme :
1733     * $events = array(
1734     * 1 => array(
1735     * 'libelle' => 'evenement_libelle',
1736     * 'evenement' => 'identifiant_evenement',
1737     * 'is_suggested' => true/false -> booleen indiquant si c'est un événement suggéré
1738     * ))
1739     * Et le transforme pour pouvoir l'utiliser pour le remplissage d'un select de formulaire.
1740     *
1741     * Le format de sorti est le suivant :
1742     * $select = array(
1743     * 0 => array( -> liste des id des événements
1744     * '0' => '',
1745     * '1' => array(
1746     * '0' => array(), -> liste des id des événements suggérés
1747     * '1' => array(), -> liste des libelles des événements suggérés
1748     * ),
1749     * ...,
1750     * n => 'id_evenement_n'
1751     * ),
1752     * 1 => array(
1753     * '0' => '__('choisir')." ".__('evenement')',
1754     * '1' => '💡 Suggestions',
1755     * ...,
1756     * 'n' => 'libelle_evenement_n',
1757     * )
1758     * )
1759     *
1760     * @param array tableau des événements
1761     * @return array
1762     */
1763     protected function convert_events_array_to_select_format($events) {
1764     // Remplissage du tableau du select en incluant le groupe des instructions suggérées.
1765     $contenu = array(
1766     0 => array("",),
1767     1 => array(__('choisir')." ".__('evenement'),)
1768     );
1769    
1770     if (! empty($events)) {
1771     // S'il y a des évènements suggérés extraction de ces événements et mise en place du groupe
1772     $suggested_event_group = array_filter($events, function($a) {
1773     return $a['is_suggested'] === 't';
1774     });
1775     if (! empty($suggested_event_group)) {
1776     // Prépare les données qui permettront d'afficher le groupe des événements
1777     // suggérés.
1778     $values = array();
1779     $labels = array();
1780     foreach ($suggested_event_group as $index => $suggested_event) {
1781     $values[] = $suggested_event['evenement'];
1782     $labels[] = $suggested_event['libelle'];
1783     // Supprime les évènements suggérés de la liste des évènements
1784     unset($events[$index]);
1785     }
1786     // Remplissage du select pour le groupe
1787     $contenu[0][] = array($values, $labels);
1788     $contenu[1][] = __('💡 Suggestions');
1789     }
1790    
1791     // Remplissage du select
1792     foreach ($events as $event) {
1793     $contenu[0][] = $event['evenement'];
1794     $contenu[1][] = $event['libelle'];
1795     }
1796     }
1797     return $contenu;
1798     }
1799    
1800     /**
1801 softime 8989 * SETTER_FORM - setSelect.
1802     *
1803     * @return void
1804     */
1805     function setSelect(&$form, $maj, &$dnu1 = null, $dnu2 = null) {
1806     //parent::setSelect($form, $maj);
1807 mbroquet 3730 /**
1808     * On ne surcharge pas la méthode parent car une requête sur la table
1809     * dossier est mauvaise pour les performances, car la requête qui
1810     * concerne evenement est plus complexe que celle générée et car les
1811     * champs action, avis_decision et etat ne sont pas utilisés comme des
1812     * select
1813     */
1814     //// action
1815 softime 8989 //$this->init_select($form, $this->f->db, $maj, null, "action",
1816 mbroquet 3730 // $sql_action, $sql_action_by_id, false);
1817    
1818     //// avis_decision
1819 softime 8989 //$this->init_select($form, $this->f->db, $maj, null, "avis_decision",
1820 mbroquet 3730 // $sql_avis_decision, $sql_avis_decision_by_id, false);
1821    
1822     //// dossier
1823 softime 8989 //$this->init_select($form, $this->f->db, $maj, null, "dossier",
1824 mbroquet 3730 // $sql_dossier, $sql_dossier_by_id, false);
1825    
1826     //// etat
1827 softime 8989 //$this->init_select($form, $this->f->db, $maj, null, "etat",
1828 mbroquet 3730 // $sql_etat, $sql_etat_by_id, false);
1829    
1830     //// evenement
1831 softime 8989 //$this->init_select($form, $this->f->db, $maj, null, "evenement",
1832 mbroquet 3730 // $sql_evenement, $sql_evenement_by_id, false);
1833    
1834     // signataire_arrete
1835     // si contexte DI
1836     if ($this->getParameter("retourformulaire") == "dossier"
1837 softime 12847 || $this->f->contexte_dossier_instruction()) {
1838 mbroquet 3730 // on recupère les signataires de la multicollectivité et de celle du DI
1839 softime 7996 $di = $this->f->get_inst__om_dbform(array(
1840     "obj" => "dossier_instruction",
1841     "idx" => $this->getParameter('idxformulaire'),
1842     ));
1843 softime 8989 $sql_signataire_arrete_by_di = str_replace(
1844     '<collectivite_di>',
1845     $di->getVal("om_collectivite"),
1846     $this->get_var_sql_forminc__sql("signataire_arrete_by_di")
1847     );
1848     $this->init_select(
1849     $form,
1850     $this->f->db,
1851     $maj,
1852     null,
1853     "signataire_arrete",
1854     $sql_signataire_arrete_by_di,
1855     $this->get_var_sql_forminc__sql("signataire_arrete_by_id"),
1856     true
1857     );
1858 mbroquet 3730 } else {
1859 softime 8989 $this->init_select(
1860     $form,
1861     $this->f->db,
1862     $maj,
1863     null,
1864     "signataire_arrete",
1865     $this->get_var_sql_forminc__sql("signataire_arrete"),
1866     $this->get_var_sql_forminc__sql("signataire_arrete_by_id"),
1867     true
1868     );
1869 mbroquet 3730 }
1870    
1871     /**
1872     * Gestion du filtre sur les événements de workflow disponibles
1873     * On récupère ici en fonction de l'état du dossier d'instruction en
1874     * cours et du type du dossier d'instruction en cours la liste
1875     * événements disponibles.
1876     */
1877     if ($maj == 0) {
1878 softime 14542 $evenements = $this->get_var_sql_forminc__sql_evenement();
1879     $form->setSelect("evenement", $this->convert_events_array_to_select_format($evenements));
1880 mbroquet 3730 } else {
1881 softime 14064 // Instanciation de l'événement pour récupérer son libellé
1882     $evenement = $this->f->get_inst__om_dbform(array(
1883     "obj" => "evenement",
1884     "idx" => $this->getVal("evenement"),
1885     ));
1886    
1887 mbroquet 3730 $contenu = array(
1888     0 => array($this->getVal("evenement"),),
1889 softime 14064 1 => array($evenement->getVal('libelle'),)
1890 mbroquet 3730 );
1891     $form->setSelect("evenement", $contenu);
1892     }
1893    
1894     /**
1895     * Gesion des liens vers la bible
1896     */
1897     // lien bible_auto
1898     $contenu = array(_("automatique"));
1899     $form->setSelect("bible_auto",$contenu);
1900     // lien bible1
1901     $contenu = array(_("bible"));
1902     $form->setSelect("bible",$contenu);
1903     // lien bible2
1904     $contenu = array(_("bible"));
1905     $form->setSelect("bible2",$contenu);
1906     // lien bible3
1907     $contenu = array(_("bible"));
1908     $form->setSelect("bible3",$contenu);
1909     // lien bible4
1910     $contenu = array(_("bible"));
1911     $form->setSelect("bible4",$contenu);
1912 softime 7521
1913     if ($maj == 1) {
1914     $base64 = $this->init_pdf_temp();
1915     $form->setSelect('live_preview', array('base64'=>$base64));
1916 softime 8593 $form->setSelect("btn_refresh", array(_('Prévisualiser')));
1917     $form->setSelect("btn_preview", array(_('Prévisualiser >>')));
1918     $form->setSelect("btn_redaction", array(_('<< Rédiger')));
1919 softime 7521 }
1920 softime 8593
1921     // Selection du type de rédaction à l'ajout
1922     $content = array(
1923     0 => array('f', 't', ),
1924     1 => array(_('Rédaction par compléments'), _('Rédaction libre'), ),
1925     );
1926     $form->setSelect('flag_edition_integrale', $content);
1927 softime 10573
1928     $contenu = array();
1929     foreach(array('waiting', 'in_progress', 'canceled', 'expired', 'finished') as $value) {
1930     $contenu[0][] = $value;
1931     $contenu[1][] = $this->get_trad_for_statut($value);
1932     }
1933     $form->setSelect('statut_signature', $contenu);
1934    
1935    
1936     if ($maj == 401) {
1937     $file = $this->f->storage->get($this->getVal('om_fichier_instruction'));
1938 softime 11418 $form->setSelect('preview_edition', array(
1939     'base64' => base64_encode($file['file_content']),
1940     'mimetype' => $file['metadata']['mimetype'],
1941     'label' => 'instruction_'.$this->getVal($this->clePrimaire),
1942     'href' => sprintf(
1943     '../app/index.php?module=form&snippet=file&obj=instruction&champ=om_fichier_instruction&id=%1$s',
1944     $this->getVal($this->clePrimaire)
1945     )
1946     ));
1947 softime 10573 }
1948 mbroquet 3730 }
1949    
1950 softime 8989 function cleSecondaire($id, &$dnu1 = null, $val = array(), $dnu2 = null) {
1951 mbroquet 3730 //
1952 softime 11228 // Vérifie uniquementla cle secondaire : demande
1953     $this->rechercheTable($this->f->db, "demande", "instruction_recepisse", $id);
1954 mbroquet 3730
1955     $id = $this->getVal($this->clePrimaire);
1956    
1957     //Requête de vérification que cet événement d'instruction n'est pas lié
1958     //à la création d'un dossier d'instruction
1959 softime 14064 $qres = $this->f->get_one_result_from_db_query(
1960     sprintf(
1961     'SELECT
1962     demande_type.dossier_instruction_type
1963     FROM
1964     %1$sdemande_type
1965     LEFT JOIN %1$sdemande
1966     ON demande.demande_type = demande_type.demande_type
1967     WHERE
1968     demande.instruction_recepisse = \'%2$d\'',
1969     DB_PREFIXE,
1970     intval($id)
1971     ),
1972     array(
1973     "origin" => __METHOD__,
1974     )
1975     );
1976 mbroquet 3730
1977     // Aucune clé secondaire n'a été trouvée ou c'est un événement sans
1978     //création de dossier d'instruction, l'événement d'instruction peut être
1979     //supprimé
1980 softime 14064 if ( $this->correct !== false || $qres['result'] == null || $qres['result'] == ""){
1981 mbroquet 3730 // Requête de vérification que cet événement d'instruction est lié
1982     // à une demande
1983 softime 14064 $qres = $this->f->get_one_result_from_db_query(
1984     sprintf(
1985     'SELECT
1986     demande
1987     FROM
1988     %1$sdemande
1989     WHERE
1990     instruction_recepisse = \'%2$d\'',
1991     DB_PREFIXE,
1992     intval($id)
1993     ),
1994     array(
1995     "origin" => __METHOD__,
1996     )
1997     );
1998 mbroquet 3730
1999     //Si c'est un événement d'instruction lié à une demande
2000 softime 14064 if ($qres['result'] != null || $qres['result'] != ""){
2001 softime 7996 $demande = $this->f->get_inst__om_dbform(array(
2002     "obj" => "demande",
2003 softime 14064 "idx" => $qres['result'],
2004 softime 7996 ));
2005 mbroquet 3730
2006 softime 14064 //On met à jour la demande en supprimant la liaison vers
2007 mbroquet 3730 //l'événement d'instruction
2008     $demande->setParameter("maj", 1);
2009     $valF = array();
2010     foreach($demande->champs as $identifiant => $champ) {
2011     $valF[$champ] = $demande->val[$identifiant];
2012     }
2013     $valF['date_demande']=$demande->dateDBToForm($valF['date_demande']);
2014     $valF['instruction_recepisse']=NULL;
2015 softime 8989 $ret = $demande->modifier($valF);
2016 mbroquet 3730 }
2017    
2018     /**
2019     * Vérification que l'élément supprimé est le dernier pour pouvoir
2020     * remodifier les données de manière itérative.
2021     */
2022 softime 14064 $qres = $this->f->get_one_result_from_db_query(
2023     sprintf(
2024     'SELECT
2025     max(instruction)
2026     FROM
2027     %1$sinstruction
2028     WHERE
2029     dossier = \'%2$s\'',
2030     DB_PREFIXE,
2031     $this->f->db->escapeSimple($this->getParameter("idxformulaire"))
2032     ),
2033     array(
2034     "origin" => __METHOD__,
2035     )
2036     );
2037    
2038 mbroquet 3730 // Si on se trouve effectivement sur le dernier evenement d'instruction
2039 softime 14064 // alors on valide la suppression sinon on l'annule
2040     $this->correct = false;
2041     $message = __("Seul le dernier evenement d'instruction peut etre supprime.");
2042     if ($qres['result'] == $id) {
2043 mbroquet 3730 // Alors on valide la suppression
2044     $this->correct = true;
2045 softime 14064 $message = __('Destruction_chronologique');
2046 mbroquet 3730 }
2047 softime 14064 $this->addToMessage($message);
2048 mbroquet 3730 }
2049     }
2050    
2051     /**
2052     * Vérification de la possibilité ou non de modifier des dates de suivi
2053     * @param string $champ champ date à vérifier
2054     */
2055     function updateDate($champ) {
2056    
2057     //Si le retourformulaire est "dossier_instruction"
2058     if ($this->getParameter("retourformulaire") == "dossier"
2059 softime 12847 || $this->f->contexte_dossier_instruction()) {
2060 mbroquet 3730
2061     // Vérification de la possibilité de modifier les dates si déjà éditées
2062     if($this->valF[$champ] != "" AND !$this->f->user_is_admin) {
2063     // si l'utilisateur n'est pas un admin
2064     if($this->getVal($champ) != "" AND $this->getVal($champ) != $this->valF[$champ]) {
2065 softime 15650
2066     // si le champ concerné est 'date_envoi_signature'
2067     // et que le statut du parapheur est 'expired'
2068     // alors on autorise le changement de la date
2069     // pour tous les autres cas, on ne peut modifier la date
2070     if ($champ !== 'date_envoi_signature' || $this->getVal('statut_signature') !== 'expired') {
2071     $this->correct = false;
2072     $this->addToMessage(_("Les dates de suivis ne peuvent etre modifiees"));
2073     }
2074 mbroquet 3730 }
2075     }
2076     }
2077    
2078     //
2079     return true;
2080     }
2081    
2082 softime 8989 /**
2083     * SETTER_FORM - setValsousformulaire (setVal).
2084     *
2085     * @return void
2086     */
2087     function setValsousformulaire(&$form, $maj, $validation, $idxformulaire, $retourformulaire, $typeformulaire, &$dnu1 = null, $dnu2 = null) {
2088     // parent::setValsousformulaire($form, $maj, $validation, $idxformulaire, $retourformulaire, $typeformulaire);
2089 mbroquet 3730 //
2090 softime 8989 $this->retourformulaire = $retourformulaire;
2091     //
2092 mbroquet 3730 if ($maj == 0) {
2093 softime 8989 $form->setVal("destinataire", $this->getParameter("idxformulaire"));
2094     $form->setVal("dossier", $this->getParameter("idxformulaire"));
2095 mbroquet 3730 }
2096 softime 12124
2097     // Si l'instruction a été envoyé au contrôle de légalité et que la
2098     // tâche envoi_cl lié n'a pas encore été traité il faut indiquer à
2099     // l'utilisateur que l'envoi au cl est en cours de traitement.
2100     if ($this->is_sent_to_cl() === true
2101     && empty($this->getVal('date_envoi_controle_legalite'))
2102     && $maj == 3) {
2103     $form->setVal("date_envoi_controle_legalite", __("En cours de traitement."));
2104     }
2105 mbroquet 3730 //
2106     $this->set_form_default_values($form, $maj, $validation);
2107     }
2108    
2109     /**
2110 softime 8989 * SETTER_FORM - set_form_default_values (setVal).
2111     *
2112     * @return void
2113 mbroquet 3730 */
2114     function set_form_default_values(&$form, $maj, $validation) {
2115 softime 8989 //
2116 mbroquet 3730 if ($maj == 0) {
2117     // si contexte DI
2118     if ($this->getParameter("retourformulaire") == "dossier"
2119 softime 12847 || $this->f->contexte_dossier_instruction()) {
2120 mbroquet 3730 // on recupère les signataires de la multicollectivité et de celle du DI
2121 softime 7996 $di = $this->f->get_inst__om_dbform(array(
2122     "obj" => "dossier_instruction",
2123 softime 8989 "idx" => $this->getParameter("idxformulaire"),
2124 softime 7996 ));
2125 softime 8989 $sql = str_replace(
2126     "<collectivite_di>",
2127     $di->getVal("om_collectivite"),
2128     $this->get_var_sql_forminc__sql("signataire_arrete_defaut_by_di")
2129     );
2130 mbroquet 3730 } else {
2131 softime 8989 $sql = $this->get_var_sql_forminc__sql("signataire_arrete_defaut");
2132 mbroquet 3730 }
2133 softime 14542
2134     $qres = $this->f->get_all_results_from_db_query($sql, array(
2135     "origin" => __METHOD__));
2136     $row = array_shift($qres['result']);
2137 softime 8989 if (isset($row["signataire_arrete"])
2138     && is_numeric($row["signataire_arrete"])) {
2139     //
2140     $form->setVal("signataire_arrete", $row["signataire_arrete"]);
2141 mbroquet 3730 }
2142 softime 8989 // Date du jour
2143     $form->setVal("date_evenement", date("Y-m-d"));
2144 mbroquet 3730 }
2145 softime 8989 //
2146 mbroquet 3730 if ($maj == 0 || $maj == 1 || $maj == 125) {
2147 softime 8989 $form->setVal("bible_auto", "bible_auto()");
2148     $form->setVal("bible", "bible(1)");
2149     $form->setVal("bible2", "bible(2)");
2150     $form->setVal("bible3", "bible(3)");
2151     $form->setVal("bible4", "bible(4)");
2152 mbroquet 3730 }
2153 softime 8989 //
2154 softime 7521 $collectivite_di = $this->get_dossier_instruction_om_collectivite();
2155 softime 8989 if ($maj == 1
2156     && $this->f->is_option_preview_pdf_enabled($collectivite_di) === true
2157 softime 7521 && $this->has_an_edition() === true) {
2158 softime 8989 //
2159     $form->setVal("live_preview", $this->getVal($this->clePrimaire));
2160     $form->setVal("btn_refresh", "reload_pdf_viewer()");
2161     $form->setVal("btn_preview", "show_instr_preview()");
2162     $form->setVal("btn_redaction", "show_instr_redaction()");
2163 softime 7521 }
2164 softime 10808
2165 softime 12654 // Gestion de l'affichage des suivis de notification des demandeurs, des services, des tiers et
2166     // des communes
2167     if ($maj == 3) {
2168     if ($this->can_display_notification_demandeur()) {
2169     $typeNotification = array(
2170     'notification_recepisse',
2171     'notification_instruction',
2172     'notification_decision',
2173     );
2174     $form->setVal("suivi_notification", $this->get_json_suivi_notification($typeNotification, true));
2175     }
2176     if ($this->can_display_notification_service()) {
2177     $form->setVal("suivi_notification_service", $this->get_json_suivi_notification(array('notification_service_consulte')));
2178     }
2179     if ($this->can_display_notification_tiers()) {
2180     $form->setVal("suivi_notification_tiers", $this->get_json_suivi_notification(array('notification_tiers_consulte')));
2181     }
2182     if ($this->can_display_notification_commune()) {
2183     $form->setVal("suivi_notification_commune", $this->get_json_suivi_notification(array('notification_depot_demat', 'notification_commune')));
2184     }
2185 softime 10808 }
2186 mbroquet 3730 }
2187    
2188     function setLayout(&$form, $maj){
2189 softime 12124 // En consultation, pour les dossiers qui n'ont pas été transmis par le portail
2190     // citoyen, si la notification des demandeurs est activée sur l'évenement
2191     // d'instruction et que le paramétrage du demandeur principal n'est pas
2192     // correct alors un message a destination de l'instructeur est affiché.
2193     if ($maj == 3) {
2194 softime 12847 // Si le dossier n'a pas été déposé sur le portail citoyen (ou si
2195     // la requête permettant de savoir le type de demande à échouée) et si
2196     // la notification se fait par mail vérifie si il y a des erreurs de
2197     // paramétrage et si c'est le cas on affiche un message d'information
2198     $collectivite = $this->get_dossier_instruction_om_collectivite($this->getVal('dossier'));
2199     $categorieNotif = $this->f->get_param_option_notification($collectivite);
2200 softime 15037 if ($this->dossier_depose_sur_portail() == null || ! $this->dossier_depose_sur_portail()) {
2201 softime 12124 $erreurParam = $this->get_info_notification_fail();
2202     // Récupération de l'évenement d'instruction
2203     $instEV = $this->get_inst_evenement();
2204     if (! empty($instEV->getVal('notification')) && $erreurParam != array()) {
2205     $class = 'text-info ui-state-highlight ui-state-info';
2206     $message = __("Attention l'envoi de notification automatique n'est pas possible.");
2207     $this->f->display_panel_information(
2208     $class,
2209     $message,
2210     $erreurParam,
2211     __('Veuillez corriger les informations suivantes.'),
2212     'erreur_param_notif'
2213     );
2214     }
2215     }
2216     }
2217 softime 8593 $form->setBloc('evenement','D',"","sousform-instruction-action-".$maj);
2218 mbroquet 3730
2219 softime 8593 $form->setFieldset('evenement','D',_('Evenement'));
2220     $form->setFieldset('om_final_instruction_utilisateur','F','');
2221    
2222     $form->setBloc('om_final_instruction_utilisateur','F');
2223 mbroquet 3730
2224 softime 8593 $form->setBloc('date_finalisation_courrier','D',"","");
2225 mbroquet 3730
2226 softime 8593 $form->setFieldset('date_finalisation_courrier','D',_('Dates'));
2227     $form->setBloc('date_finalisation_courrier','D',"","col_6");
2228     $form->setBloc('date_envoi_controle_legalite','F');
2229 mbroquet 3730
2230 softime 8593 $form->setBloc('date_retour_signature','D',"","col_6");
2231     $form->setBloc('date_retour_controle_legalite','F');
2232     $form->setFieldset('date_retour_controle_legalite','F','');
2233    
2234     $form->setBloc('date_retour_controle_legalite','F');
2235 mbroquet 3730
2236 softime 10573 $form->setBloc('statut_signature','D');
2237     $form->setFieldset('statut_signature','D','Suivi Parapheur');
2238     $form->setBloc('commentaire_signature','F');
2239     $form->setBloc('historique_signature','D');
2240     $form->setFieldset('historique_signature', 'DF', __("Historique"), "collapsible, startClosed");
2241     $form->setBloc('historique_signature','F');
2242     $form->setFieldset('historique_signature','F');
2243    
2244 softime 10808 $form->setFieldset('suivi_notification', 'D', __("Suivi notification"), "collapsible");
2245     $form->setFieldset('suivi_notification','F');
2246 softime 11585 $form->setFieldset('suivi_notification_service', 'D', __("Suivi notification service"), "collapsible");
2247     $form->setFieldset('suivi_notification_service','F');
2248     $form->setFieldset('suivi_notification_tiers', 'D', __("Suivi notification tiers"), "collapsible");
2249     $form->setFieldset('suivi_notification_tiers','F');
2250 softime 12654 $form->setFieldset('suivi_notification_commune', 'D', __("Suivi notification commune"), "collapsible");
2251     $form->setFieldset('suivi_notification_commune','F');
2252 softime 10808
2253 softime 8593 if ($maj == 1) {
2254     // Récupère la collectivité du dossier d'instruction
2255     $collectivite_di = $this->get_dossier_instruction_om_collectivite();
2256 mbroquet 3730
2257 softime 8593 //
2258     if ($this->f->is_option_preview_pdf_enabled($collectivite_di) === true
2259     && $this->has_an_edition() === true) {
2260 softime 7521 //
2261 softime 8593 $form->setBloc('complement_om_html','D',"","container_instr_edition");
2262     $form->setBloc('complement_om_html','D',"","hidelabel box_instr_edition redaction_instr_edition");
2263     $form->setBloc('complement_om_html','D',"","box_instr_edition_main");
2264     $form->setFieldset('complement_om_html','D',_('Complement'));
2265     $form->setFieldset('bible','F','');
2266     $form->setFieldset('complement2_om_html','D',_('Complement 2'));
2267     $form->setFieldset('bible2','F','');
2268     $form->setFieldset('complement3_om_html','D',_('Complement 3'));
2269     $form->setFieldset('bible3','F','');
2270     $form->setFieldset('complement4_om_html','D',_('Complement 4'));
2271     $form->setFieldset('bible4','F','');
2272     $form->setFieldset('titre_om_htmletat','DF',_('Titre'), 'startClosed');
2273     $form->setFieldset('corps_om_htmletatex','DF',_('Corps'));
2274     $form->setBloc('corps_om_htmletatex','F');
2275     $form->setBloc('btn_preview','DF',"","box_instr_edition_btn");
2276     $form->setBloc('btn_preview','F');
2277     $form->setBloc('btn_redaction','D', '',"hidelabel box_instr_edition preview_instr_edition");
2278     $form->setBloc('btn_redaction','DF',"","box_instr_edition_btn");
2279     $form->setFieldset('btn_refresh','D',_('Prévisualisation'), "box_instr_edition_main");
2280     $form->setFieldset('live_preview','F');
2281     $form->setBloc('live_preview','F');
2282     $form->setBloc('live_preview','F');
2283 softime 7521 } else {
2284 softime 8593 $form->setBloc('complement_om_html','D',"","hidelabel");
2285 softime 7521 $form->setFieldset('complement_om_html','D',_('Complement'));
2286     $form->setFieldset('bible','F','');
2287     $form->setFieldset('complement2_om_html','D',_('Complement 2'));
2288     $form->setFieldset('bible2','F','');
2289     $form->setFieldset('complement3_om_html','D',_('Complement 3'));
2290     $form->setFieldset('bible3','F','');
2291     $form->setFieldset('complement4_om_html','D',_('Complement 4'));
2292     $form->setFieldset('bible4','F','');
2293 softime 8593 $form->setFieldset('titre_om_htmletat','DF',_('Titre'), 'startClosed');
2294     $form->setFieldset('corps_om_htmletatex','DF',_('Corps'));
2295     $form->setBloc('corps_om_htmletatex','F');
2296 softime 7521 }
2297 softime 8593 } else {
2298     $form->setBloc('complement_om_html','D',"","hidelabel");
2299     $form->setFieldset('complement_om_html','D',_('Complement'));
2300     $form->setFieldset('bible','F','');
2301     $form->setFieldset('complement2_om_html','D',_('Complement 2'));
2302     $form->setFieldset('bible2','F','');
2303     $form->setFieldset('complement3_om_html','D',_('Complement 3'));
2304     $form->setFieldset('bible3','F','');
2305     $form->setFieldset('complement4_om_html','D',_('Complement 4'));
2306     $form->setFieldset('bible4','F','');
2307     $form->setFieldset('titre_om_htmletat','DF',_('Titre'), 'startClosed');
2308     $form->setFieldset('corps_om_htmletatex','DF',_('Corps'));
2309     $form->setBloc('corps_om_htmletatex','F');
2310 mbroquet 3730 }
2311     }
2312    
2313     function setLib(&$form, $maj) {
2314     //
2315     parent::setLib($form, $maj);
2316     //
2317     $form->setLib('bible_auto', "");
2318     $form->setLib('bible', "");
2319     $form->setLib('bible2', "");
2320     $form->setLib('bible3', "");
2321     $form->setLib('bible4', "");
2322 softime 7521 $form->setLib('btn_refresh', "");
2323 softime 8593 $form->setLib('btn_preview', "");
2324     $form->setLib('btn_redaction', "");
2325 softime 7521 $form->setLib('live_preview', "");
2326 mbroquet 3730 $form->setLib('om_final_instruction_utilisateur', _("finalise par"));
2327 softime 8989 $form->setLib('date_envoi_rar', __("date_envoi_ar"));
2328     $form->setLib('date_retour_rar', __("date_notification"));
2329 softime 10573 $form->setLib('statut_signature', __("statut"));
2330     $form->setLib('commentaire_signature', __("commentaire"));
2331     $form->setLib('historique_signature', '');
2332 softime 10808 $form->setLib('suivi_notification', '');
2333 softime 11585 $form->setLib('suivi_notification_service', '');
2334     $form->setLib('suivi_notification_tiers', '');
2335 softime 12654 $form->setLib('suivi_notification_commune', '');
2336 softime 10573 $form->setLib('preview_edition', "");
2337 softime 8593
2338     // Ajout d'une infobulle d'aide lorsque le formulaire est en mode
2339     // ajout et que l'option de rédaction libre est activée sur la
2340     // collectivité du dossier
2341     if ($maj === '0' && $this->is_option_redaction_libre_enabled() === true) {
2342     //
2343     $help_text_template = '%s <span class="info-16" title="%s"></span>';
2344     $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.");
2345     $form->setLib('flag_edition_integrale', sprintf($help_text_template, _("Type de rédaction"), $help_text));
2346     }
2347     else {
2348     $form->setLib('flag_edition_integrale', _("Type de rédaction"));
2349     }
2350    
2351     // Ajout d'une infobulle d'aide lorsque le formulaire est en mode
2352     // modification et que l'option de prévisualisation de l'édition est
2353     // activée sur la collectivité du dossier
2354     if ($maj === '1'
2355     && $this->f->is_option_preview_pdf_enabled($this->get_dossier_instruction_om_collectivite()) === true) {
2356     //
2357     $help_text_template = '%s <span class="info-16" title="%s"></span>';
2358     $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.");
2359     $form->setLib('date_evenement', sprintf($help_text_template, _('date_evenement'), $help_text));
2360     $form->setLib('signataire_arrete', sprintf($help_text_template, _('signataire_arrete'), $help_text));
2361     }
2362 mbroquet 3730 }
2363    
2364 softime 8989 /**
2365     * TRIGGER - triggerajouter.
2366     *
2367     * @return boolean
2368     */
2369     function triggerajouter($id, &$dnu1 = null, $val = array(), $dnu2 = null) {
2370     $this->addToLog(__METHOD__."(): start", EXTRA_VERBOSE_MODE);
2371 mbroquet 3730 /**
2372     * Le code suivant permet de récupérer des valeurs des tables evenement
2373     * et dossier pour les stocker dans l'instruction :
2374     * DEPUIS L'EVENEMENT
2375     * - action
2376     * - delai
2377     * - accord_tacite
2378     * - etat
2379     * - avis_decision
2380     * - delai_notification
2381     * - lettretype
2382     * - autorite_competente
2383 softime 10573 * - pec_metier
2384 softime 6565 * - complement_om_html
2385     * - complement2_om_html
2386     * - complement3_om_html
2387     * - complement4_om_html
2388     * - complement5_om_html
2389 mbroquet 3730 * DEPUIS LE DOSSIER D'INSTRUCTION
2390     * - archive_delai
2391     * - archive_accord_tacite
2392     * - archive_etat
2393     * - archive_avis
2394     * - date_complet
2395     * - date_rejet
2396     * - date_limite
2397     * - date_notification_delai
2398     * - date_decision
2399     * - date_validite
2400     * - date_achevement
2401     * - date_chantier
2402     * - date_conformite
2403     * - avis_decision
2404     */
2405     // Récupération de tous les paramètres de l'événement sélectionné
2406 softime 14542 // TODO : remplacer cette requête par l'instanciation de l'événement
2407     $qres = $this->f->get_all_results_from_db_query(
2408     sprintf(
2409     'SELECT
2410     *
2411     FROM
2412     %1$sevenement
2413     WHERE
2414     evenement = %2$d',
2415     DB_PREFIXE,
2416     intval($this->valF['evenement'])
2417     ),
2418     array(
2419     "origin" => __METHOD__,
2420     )
2421     );
2422     foreach ($qres['result'] as $row) {
2423 mbroquet 3730 // Récupération de l'identifiant de l'action
2424     // si une action est paramétrée dans l'événement
2425     $this->valF['action'] = NULL;
2426     if (isset($row['action']) and !empty($row['action'])) {
2427     $this->valF['action']=$row['action'];
2428     }
2429     // Récupération de la valeur du délai
2430     $this->valF['delai'] = $row['delai'];
2431     // Récupération de l'identifiant de l'état
2432     // si un état est paramétré dans l'événement
2433     $this->valF['etat']=NULL;
2434     if (isset($row['etat']) and !empty($row['etat'])) {
2435     $this->valF['etat']=$row['etat'];
2436     }
2437     // Récupération de la valeur d'accord tacite
2438     $this->valF['accord_tacite']=$row['accord_tacite'];
2439     // Récupération de la valeur du délai de notification
2440     $this->valF['delai_notification']=$row['delai_notification'];
2441     // Récupération de l'identifiant de l'avis
2442     // si un avis est paramétré dans l'événement
2443     $this->valF['avis_decision'] = NULL;
2444     if(isset($row['avis_decision']) and !empty($row['avis_decision'])) {
2445     $this->valF['avis_decision']=$row['avis_decision'];
2446     }
2447     // Récupération de la valeur de l'autorité compétente
2448     // si l'autorité compétente est paramétré dans l'événement
2449     $this->valF['autorite_competente'] = NULL;
2450     if(isset($row['autorite_competente']) and !empty($row['autorite_competente'])) {
2451     $this->valF['autorite_competente']=$row['autorite_competente'];
2452     }
2453     // Récupération de la valeur de la lettre type
2454     $this->valF['lettretype']=$row['lettretype'];
2455 softime 10573 // Récupération de la valeur de la prise en compte métier
2456     // si la prise en compte métier est paramétrée dans l'événement
2457     $this->valF['pec_metier'] = NULL;
2458     if(isset($row['pec_metier']) === true and empty($row['pec_metier']) === false) {
2459     $this->valF['pec_metier'] = $row['pec_metier'];
2460     }
2461 mbroquet 3730 }
2462     // Récupération de toutes les valeurs du dossier d'instruction en cours
2463 softime 14542 // TODO : remplacer cette requête par l'instanciation de l'objet
2464     $qres = $this->f->get_all_results_from_db_query(
2465     sprintf(
2466     'SELECT
2467     *
2468     FROM
2469     %1$sdossier
2470     WHERE
2471     dossier = \'%2$s\'',
2472     DB_PREFIXE,
2473     $this->f->db->escapeSimple($this->valF['dossier'])
2474     ),
2475     array(
2476     "origin" => __METHOD__,
2477     )
2478     );
2479     $row = array_shift($qres['result']);
2480 mbroquet 3730 $this->updateArchiveData($row);
2481    
2482     // Récupération de la duree de validite du dossier d'autorisation
2483 softime 14064 $qres = $this->f->get_one_result_from_db_query(
2484     sprintf(
2485     'SELECT
2486     duree_validite_parametrage
2487     FROM
2488     %1$sdossier_autorisation_type_detaille
2489     LEFT JOIN %1$sdossier_autorisation
2490     ON dossier_autorisation.dossier_autorisation_type_detaille = dossier_autorisation_type_detaille.dossier_autorisation_type_detaille
2491     LEFT JOIN %1$sdossier
2492     ON dossier.dossier_autorisation = dossier_autorisation.dossier_autorisation
2493     WHERE
2494     dossier.dossier = \'%2$s\'',
2495     DB_PREFIXE,
2496     $this->f->db->escapeSimple($this->valF['dossier'])
2497     ),
2498     array(
2499     "origin" => __METHOD__,
2500     )
2501     );
2502    
2503     if ($qres['result'] != '') {
2504     $this->valF['duree_validite_parametrage'] = $qres['result'];
2505 mbroquet 3730 }
2506    
2507     // Identifiant du type de courrier
2508     $idTypeCourrier = '11';
2509     $idCourrier = str_pad($this->valF["instruction"], 10, "0", STR_PAD_LEFT);
2510     // Code barres
2511     $this->valF["code_barres"] = $idTypeCourrier . $idCourrier;
2512     }
2513    
2514 softime 12124 /**
2515     * Test si une restriction est valide.
2516     *
2517     * @return boolean
2518     */
2519 mbroquet 3730 function restrictionIsValid($restriction){
2520     if($this->restriction_valid != null) {
2521     return $this->restriction_valid;
2522     }
2523     if(empty($restriction)) {
2524     $this->restriction_valid = true;
2525     return $this->restriction_valid;
2526     }
2527 nmeucci 3873 // Liste des opérateurs possibles sans espace
2528     $operateurs = array(">=", "<=", "+", "-", "&&", "||", "==", "!=");
2529     // Liste identique mais avec le marqueur §
2530     $mark = "§";
2531     $operateurs_marked = array();
2532     foreach ($operateurs as $operateur) {
2533     $operateurs_marked[] = $mark.$operateur.$mark;
2534     }
2535 mbroquet 3730
2536     // Supprime tous les espaces de la chaîne de caractère
2537 nmeucci 3873 $restriction = preg_replace('/\s+/', '', $restriction);
2538 mbroquet 3730
2539 nmeucci 3873 // Met un marqueur avant et après les opérateurs
2540     // puis transforme la chaine en un tableau
2541     $restriction = str_replace($operateurs, $operateurs_marked,
2542 mbroquet 3730 $restriction);
2543    
2544 nmeucci 3873 // Pour chaque opérateur logique
2545     foreach (array('&&', '||') as $operator) {
2546    
2547     // S'il est absent on ne fait aucun traitement
2548     if (strpos($restriction, $mark.$operator.$mark) === false) {
2549     continue;
2550     }
2551     // Sinon on vérifie les deux conditions avec le OU/ET logique
2552     $restrictions = explode($mark.$operator.$mark, $restriction);
2553     $restrictions[0] = explode($mark, $restrictions[0]);
2554     $restrictions[1] = explode($mark, $restrictions[1]);
2555     $res_bool = false;
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     if ($operator == '||') {
2563     if ($this->is_restriction_satisfied($restrictions[0], $operateurs)
2564     || $this->is_restriction_satisfied($restrictions[1], $operateurs)) {
2565     $res_bool = true;
2566     }
2567     }
2568     return $res_bool;
2569     }
2570     $tabRestriction = explode($mark, $restriction);
2571     return $this->is_restriction_satisfied($tabRestriction, $operateurs);
2572    
2573     }
2574    
2575     function is_restriction_satisfied($restriction, $operateurs) {
2576 mbroquet 3730 // Tableau comprenant les résultat
2577     $res = array();
2578     // Compteur pour les résultat
2579     // commence à 1 car le 0 doit rester inchangé tout au long du traitement
2580     $j = 1;
2581     // Comparateur du calcul
2582     $comparateur = '';
2583     // Booléen retourné
2584     $res_bool = true;
2585    
2586     // S'il y a un comparateur
2587 nmeucci 3873 if (in_array(">=", $restriction)
2588     || in_array("<=", $restriction)
2589     || in_array("==", $restriction)
2590     || in_array("!=", $restriction)) {
2591 mbroquet 3730
2592     // Si le tableau n'est pas vide
2593 nmeucci 3873 if (count($restriction) > 0) {
2594 mbroquet 3730
2595     // Boucle dans le tableau pour récupérer seulement les valeurs
2596 nmeucci 3873 foreach ($restriction as $key => $value) {
2597 mbroquet 3730 //
2598     if (!in_array($value, $operateurs)) {
2599     if ($this->getRestrictionValue($value) != false) {
2600     $res[] = $this->getRestrictionValue($value);
2601     } else {
2602     // Message d'erreur
2603     $error_message = sprintf(_("Le champ %s de l'instruction %s est vide"), "<span class='bold'>".$value."</span>", "<span class='bold'>".$this->valF["instruction"]."</span>");
2604     $this->addToMessage($error_message);
2605     // Arrête le traitement
2606     return false;
2607     }
2608     }
2609     }
2610    
2611     // Boucle dans le tableau
2612     // commence à 1 car le 0 doit rester inchangé tout au long du
2613     // traitement
2614 nmeucci 3873 for ($i = 1; $i<count($restriction); $i++) {
2615 mbroquet 3730
2616     // Récupère le comparateur
2617 nmeucci 3873 if ($restriction[$i] === ">="
2618     || $restriction[$i] === "<="
2619     || $restriction[$i] === "=="
2620     || $restriction[$i] === "!=") {
2621     $comparateur = $restriction[$i];
2622 mbroquet 3730 }
2623    
2624     // Si l'opérateur qui suit est un "+"
2625 nmeucci 3873 if ($restriction[$i] === "+") {
2626 mbroquet 3730 $dateDep = $res[$j];
2627     unset($res[$j]);$j++;
2628     $duree = $res[$j];
2629     unset($res[$j]);
2630     $res[$j] = $this->f->mois_date($dateDep, $duree, "+");
2631     }
2632    
2633     // Si l'opérateur qui suit est un "-"
2634 nmeucci 3873 if ($restriction[$i] === "-") {
2635 mbroquet 3730 $dateDep = $res[$j];
2636     unset($res[$j]);$j++;
2637     $duree = $res[$j];
2638     unset($res[$j]);
2639     $res[$j] = $this->f->mois_date($dateDep, $duree, "-");
2640     }
2641     }
2642    
2643     }
2644    
2645     // Si les tableau des résultats n'est pas vide
2646     if (count($res) > 0) {
2647     //
2648     $res_bool = false;
2649     // Effectue le test
2650     if ($comparateur === ">=") {
2651     //
2652     if (strtotime($res[0]) >= strtotime($res[$j])) {
2653     $res_bool = true;
2654     }
2655     }
2656     if ($comparateur === "<=") {
2657 nmeucci 3873 //
2658 mbroquet 3730 if (strtotime($res[0]) <= strtotime($res[$j])) {
2659     $res_bool = true;
2660     }
2661     }
2662 nmeucci 3873 if ($comparateur === "==") {
2663     //
2664     if (strtotime($res[0]) == strtotime($res[$j])) {
2665     $res_bool = true;
2666     }
2667     }
2668     if ($comparateur === "!=") {
2669     //
2670     if (strtotime($res[0]) != strtotime($res[$j])) {
2671     $res_bool = true;
2672     }
2673     }
2674 mbroquet 3730 }
2675     // Sinon une erreur s'affiche
2676     } else {
2677    
2678     // Message d'erreur
2679     $error_message = _("Mauvais parametrage de la restriction.")." ".
2680     _("Contactez votre administrateur");
2681     $this->addToMessage($error_message);
2682     // Arrête le traitement
2683     return false;
2684     }
2685    
2686     return $res_bool;
2687    
2688     }
2689    
2690     /**
2691     * Permet de définir si l'événement passé en paramètre est un événement retour.
2692     * @param integer $evenement événement à tester
2693     *
2694     * @return boolean retourne true si événement retour sinon false
2695     */
2696     function is_evenement_retour($evenement) {
2697     if(empty($evenement) || !is_numeric($evenement)) {
2698     return "";
2699     }
2700 softime 14064
2701     $evenement = $this->f->get_inst__om_dbform(array(
2702     "obj" => "evenement",
2703     "idx" => $evenement,
2704     ));
2705    
2706     return $evenement->getVal('retour') == 't';
2707 mbroquet 3730 }
2708    
2709     /**
2710     * Retourne le champ restriction de l'événement passé en paramètre.
2711     *
2712     * @param integer $evenement id de l'événement sur lequel récupérer la restriction
2713     *
2714     * @return string contenu du champ restriction
2715     */
2716     function get_restriction($evenement) {
2717     if(empty($evenement) || !is_numeric($evenement)) {
2718     return "";
2719     }
2720     //Récupère la restriction
2721 softime 14064 $evenement = $this->f->get_inst__om_dbform(array(
2722     "obj" => "evenement",
2723     "idx" => $evenement,
2724     ));
2725    
2726     return $evenement->getVal('restriction');
2727 mbroquet 3730 }
2728    
2729     /**
2730     * Récupère la valeur du champ dans la restriction
2731     * @param string $restrictionValue Nom du champ
2732     * @return mixed Valeur du champ
2733     */
2734     function getRestrictionValue($restrictionValue){
2735    
2736     // Initialisation de la valeur de retour
2737     $return = false;
2738    
2739     // Récupére les valeurs du dossier
2740     $value_dossier = $this->get_dossier_actual();
2741    
2742     //
2743     if (is_numeric($restrictionValue)) {
2744     $return = $restrictionValue;
2745     }elseif (isset($value_dossier[$restrictionValue])) {
2746     $return = $value_dossier[$restrictionValue];
2747     }elseif (isset($this->valF[$restrictionValue])) {
2748     $return = $this->valF[$restrictionValue];
2749     }
2750    
2751     // Retourne la valeur du champ
2752     return $return;
2753     }
2754    
2755 softime 6565
2756 mbroquet 3730 /**
2757 softime 6565 * Calcul des règle d'action selon leur type.
2758     *
2759     * Types de règle :
2760     * - date
2761     * - numeric
2762     * - text
2763     * - bool
2764     * - specific
2765     * - technical_data
2766 mbroquet 3730 *
2767 softime 6565 * @param string $rule Règle d'action.
2768     * @param string $rule_name Nom de la règle.
2769     * @param string $type Type de la règle.
2770     *
2771 mbroquet 3730 * @return mixed Résultat de la règle
2772     */
2773 softime 6565 public function regle($rule, $rule_name, $type = null) {
2774 mbroquet 3730
2775     // Supprime tous les espaces de la chaîne de caractère
2776     $rule = str_replace(' ', '', $rule);
2777     // Coupe la chaîne au niveau de l'opérateur
2778     $operands = explode ("+", $rule);
2779     // Nombre d'opérande
2780     $nb_operands = count($operands);
2781    
2782     // Règle à null
2783     if ($rule == "null") {
2784     return null;
2785     }
2786    
2787     // Tableau des champs de type date
2788     $rule_type_date = array(
2789     "regle_date_limite",
2790     "regle_date_notification_delai",
2791     "regle_date_complet",
2792     "regle_date_validite",
2793     "regle_date_decision",
2794     "regle_date_chantier",
2795     "regle_date_achevement",
2796     "regle_date_conformite",
2797     "regle_date_rejet",
2798     "regle_date_dernier_depot",
2799     "regle_date_limite_incompletude",
2800 softime 6565 "regle_date_cloture_instruction",
2801     "regle_date_premiere_visite",
2802     "regle_date_derniere_visite",
2803     "regle_date_contradictoire",
2804     "regle_date_retour_contradictoire",
2805     "regle_date_ait",
2806     "regle_date_transmission_parquet",
2807 softime 8989 "regle_date_affichage",
2808 mbroquet 3730 );
2809     // Tableau des champs de type numérique
2810     $rule_type_numeric = array(
2811     "regle_delai",
2812     "regle_delai_incompletude",
2813     );
2814 softime 6565 // Tableau des champs de type text
2815     $rule_type_text = array(
2816     );
2817     // Tableau des champs de type booléen
2818     $rule_type_bool = array(
2819 softime 10573 "regle_a_qualifier",
2820     "regle_incompletude",
2821     "regle_incomplet_notifie",
2822     "regle_evenement_suivant_tacite_incompletude",
2823 softime 6565 );
2824     // Tableau des champs spécifiques
2825     $rule_type_specific = array(
2826     "regle_autorite_competente",
2827     "regle_etat",
2828     "regle_accord_tacite",
2829     "regle_avis",
2830 softime 10573 "regle_pec_metier",
2831     "regle_etat_pendant_incompletude",
2832 softime 6565 );
2833     // Tableau des champs de données techniques
2834     $rule_type_technical_data = array(
2835     'regle_donnees_techniques1',
2836     'regle_donnees_techniques2',
2837     'regle_donnees_techniques3',
2838     'regle_donnees_techniques4',
2839     'regle_donnees_techniques5',
2840     );
2841 softime 8593 // Tableau des champs simple
2842     $rule_type_simple = array(
2843     "regle_dossier_instruction_type",
2844     );
2845 mbroquet 3730
2846     // Définit le type du champ
2847     if (in_array($rule_name, $rule_type_date) == true) {
2848     $type = "date";
2849     }
2850     if (in_array($rule_name, $rule_type_numeric) == true) {
2851     $type = "numeric";
2852     }
2853 softime 6565 if (in_array($rule_name, $rule_type_text) === true) {
2854     $type = "text";
2855     }
2856     if (in_array($rule_name, $rule_type_bool) === true) {
2857     $type = "bool";
2858     }
2859     if (in_array($rule_name, $rule_type_specific) === true) {
2860     $type = "specific";
2861     }
2862     if (in_array($rule_name, $rule_type_technical_data) === true) {
2863     $type = 'text';
2864     }
2865 softime 8593 if (in_array($rule_name, $rule_type_simple) === true) {
2866     $type = 'simple';
2867     }
2868 mbroquet 3730
2869 softime 6565 // Si c'est un type spécifique ou booléen alors il n'a qu'un opérande
2870     // Récupère directement la valeur de l'opérande
2871 softime 10573 if ($type === 'specific') {
2872 softime 6565 //
2873     return $this->get_value_for_rule($rule);
2874     }
2875    
2876 mbroquet 3730 // Initialisation des variables
2877     $key_date = 0;
2878     $total_numeric = 0;
2879 softime 6565 $res_text = '';
2880 mbroquet 3730
2881     // Pour chaque opérande
2882     foreach ($operands as $key => $operand) {
2883    
2884     // Si c'est une règle de type date
2885     if ($type == 'date') {
2886     // Vérifie si au moins une des opérandes est une date
2887 softime 6565 if (is_numeric($operand) === false
2888     && $this->get_value_for_rule($operand) !== null
2889     && $this->f->check_date($this->get_value_for_rule($operand)) == true) {
2890 mbroquet 3730 // Récupère la position de la date
2891     $key_date = $key;
2892     }
2893     // Les autres opérandes doivent être que des numériques
2894     if (is_numeric($operand) == true) {
2895     // Ajoute l'opérande au total
2896     $total_numeric += $operand;
2897     }
2898 softime 6565 if (is_numeric($operand) === false
2899     && $this->get_value_for_rule($operand) !== null
2900     && is_numeric($this->get_value_for_rule($operand)) == true) {
2901 mbroquet 3730 // Ajoute l'opérande au total
2902 softime 6565 $total_numeric += $this->get_value_for_rule($operand);
2903 mbroquet 3730 }
2904     }
2905    
2906     // Si c'est une règle de type numérique
2907     if ($type == 'numeric') {
2908     // Les opérandes doivent être que des numériques
2909     if (is_numeric($operand) == true) {
2910     // Ajoute l'opérande au total
2911     $total_numeric += $operand;
2912     }
2913 softime 6565 if (is_numeric($operand) === false
2914     && $this->get_value_for_rule($operand) !== null
2915     && is_numeric($this->get_value_for_rule($operand)) == true) {
2916 mbroquet 3730 // Ajoute l'opérande au total
2917 softime 6565 $total_numeric += $this->get_value_for_rule($operand);
2918 mbroquet 3730 }
2919     }
2920 softime 6565
2921     // Si c'est une règle de type text
2922     if ($type === 'text') {
2923     // Concatène toutes les chaînes de caractère
2924     $res_text .= $this->get_value_for_rule($operand);
2925     }
2926 mbroquet 3730 }
2927    
2928     // Résultat pour une règle de type date
2929     if ($type == 'date') {
2930     // Retourne le calcul de la date
2931     return $this->f->mois_date($this->valF[$operands[$key_date]],
2932     $total_numeric, "+");
2933     }
2934    
2935     // Résultat pour une règle de type numérique
2936     if ($type == 'numeric') {
2937     // Retourne le calcul
2938     return $total_numeric;
2939     }
2940 softime 6565
2941     // Résultat pour une règle de type text
2942     if ($type === 'text') {
2943     // Retourne la chaîne de caractère
2944     return $res_text;
2945     }
2946 softime 10573 if ($type === 'simple' || $type === 'bool') {
2947 softime 8593 // Retourne la valeur du champs rule
2948     return $rule;
2949     }
2950 softime 6565 }
2951    
2952    
2953     /**
2954     * Récupère la valeur du champs dans l'instruction ou dans les données
2955     * techniques.
2956     * Spécifique au calcul des règles.
2957     *
2958     * @param string $field Champ
2959     *
2960     * @return mixed Valeur du champ
2961     */
2962     private function get_value_for_rule($field) {
2963     // Si le champ n'existe pas dans la table instruction
2964     if (array_key_exists($field, $this->valF) === false) {
2965     // Récupère l'instance de la classe donnees_techniques
2966     $inst_donnees_techniques = $this->get_inst_donnees_techniques();
2967     // Retourne la valeur de la donnée technique
2968     return $inst_donnees_techniques->getVal($field);
2969     }
2970    
2971     //
2972     return $this->valF[$field];
2973     }
2974    
2975    
2976     /**
2977     * [get_inst_donnees_techniques description]
2978     *
2979     * @param [type] $donnees_techniques [description]
2980     *
2981     * @return [type] [description]
2982     */
2983     function get_inst_donnees_techniques($donnees_techniques = null) {
2984     //
2985     if (isset($this->inst_donnees_techniques) === false or
2986     $this->inst_donnees_techniques === null) {
2987     //
2988     if (is_null($donnees_techniques)) {
2989     $donnees_techniques = $this->getDonneesTechniques();
2990     }
2991     //
2992 softime 7996 $this->inst_donnees_techniques = $this->f->get_inst__om_dbform(array(
2993     "obj" => "donnees_techniques",
2994     "idx" => $donnees_techniques,
2995     ));
2996 softime 6565 }
2997     //
2998     return $this->inst_donnees_techniques;
2999     }
3000    
3001    
3002     /**
3003     * Retourne l'identifiant des données techniques liées du dossier
3004     * @return string L'identifiant des données techniques liées du dossier
3005     */
3006     function getDonneesTechniques() {
3007 softime 14064
3008     $qres = $this->f->get_one_result_from_db_query(
3009     sprintf(
3010     'SELECT
3011     donnees_techniques
3012     FROM
3013     %1$sdonnees_techniques
3014     WHERE
3015     dossier_instruction = \'%2$s\'',
3016     DB_PREFIXE,
3017     $this->f->db->escapeSimple($this->valF["dossier"])
3018     ),
3019     array(
3020     "origin" => __METHOD__,
3021     )
3022     );
3023 mbroquet 3730
3024 softime 14064 return $qres['result'];
3025 mbroquet 3730 }
3026    
3027 fmichon 4708 /**
3028     * TRIGGER - triggerajouterapres.
3029     *
3030     * - Mise à jour des informations liées au workflow sur le dossier
3031     * - Interface avec le référentiel ERP [105][111]
3032     * - Mise à jour du DA
3033     * - Historisation de la vie du DI
3034     *
3035     * @return boolean
3036     */
3037 softime 8989 function triggerajouterapres($id, &$dnu1 = null, $val = array(), $dnu2 = null) {
3038     $this->addToLog(__METHOD__."(): start", EXTRA_VERBOSE_MODE);
3039 fmichon 4708
3040     // On a besoin de l'instance du dossier lié à l'événement d'instruction
3041     $inst_di = $this->get_inst_dossier($this->valF['dossier']);
3042     // Instance de la classe evenement
3043     $inst_evenement = $this->get_inst_evenement($this->valF['evenement']);
3044 softime 9245 // Instance de l'état courant du dossier d'instruction
3045     $inst_current_etat = $this->f->get_inst__om_dbform(array(
3046     "obj" => "etat",
3047     "idx" => $inst_di->get_id_etat(),
3048     ));
3049 fmichon 4708
3050 mbroquet 3730 /**
3051     * Mise à jour des valeurs du dossier en fonction des valeurs calculées
3052     * par l'action
3053     */
3054 fmichon 4708 // état de complétude actuel du dossier
3055     $incompletude = ($inst_di->getVal('incompletude') == 't' ? true : false);
3056 softime 10573 // L'événement suivant tacite paramétré est destiné à la gestion de l'incomplétude
3057     $ev_suiv_tacite_incompletude = false;
3058 mbroquet 3730 // Initialisation
3059 softime 9245 $valF = array();
3060     $valF_dt = array();
3061 fmichon 4708 //
3062 mbroquet 3730 // Récupération des paramètres de l'action
3063 softime 14542 // TODO : remplacer cette requête par l'instanciation de l'action
3064     $qres = $this->f->get_all_results_from_db_query(
3065     sprintf(
3066     'SELECT
3067     *
3068     FROM
3069     %1$saction
3070     WHERE
3071     action = \'%2$s\'',
3072     DB_PREFIXE,
3073     $this->f->db->escapeSimple($this->valF['action'])
3074     ),
3075     array(
3076     "origin" => __METHOD__
3077     )
3078     );
3079     foreach ($qres['result'] as $row) {
3080 mbroquet 3730
3081     // pour chacune des regles, on applique la regle
3082 softime 6565 if ($row['regle_delai'] != '') {
3083 mbroquet 3730 $valF['delai'] = $this->regle($row['regle_delai'], 'regle_delai');
3084     }
3085 softime 6565 if ($row['regle_accord_tacite'] != '') {
3086 mbroquet 3730 $valF['accord_tacite'] = $this->regle($row['regle_accord_tacite'], 'regle_accord_tacite');
3087     }
3088 softime 6565 if ($row['regle_avis'] != '') {
3089 mbroquet 3730 $valF['avis_decision'] = $this->regle($row['regle_avis'], 'regle_avis');
3090     }
3091 softime 6565 if ($row['regle_date_limite'] != '') {
3092     $valF['date_limite'] = $this->regle($row['regle_date_limite'], 'regle_date_limite');
3093 mbroquet 3730 }
3094 softime 6565 if ($row['regle_date_complet'] != '') {
3095     $valF['date_complet'] = $this->regle($row['regle_date_complet'], 'regle_date_complet');
3096 mbroquet 3730 }
3097 softime 6565 if ($row['regle_date_dernier_depot'] != '') {
3098     $valF['date_dernier_depot'] = $this->regle($row['regle_date_dernier_depot'], 'regle_date_dernier_depot');
3099 mbroquet 3730 }
3100 softime 6565 if ($row['regle_date_notification_delai'] != '') {
3101     $valF['date_notification_delai'] = $this->regle($row['regle_date_notification_delai'], 'regle_date_notification_delai');
3102 mbroquet 3730 }
3103 softime 6565 if ($row['regle_date_decision'] != '') {
3104     $valF['date_decision'] = $this->regle($row['regle_date_decision'], 'regle_date_decision');
3105 mbroquet 3730 }
3106 softime 6565 if ($row['regle_date_rejet'] != '') {
3107     $valF['date_rejet'] = $this->regle($row['regle_date_rejet'], 'regle_date_rejet');
3108 mbroquet 3730 }
3109 softime 6565 if ($row['regle_date_validite'] != '') {
3110     $valF['date_validite'] = $this->regle($row['regle_date_validite'], 'regle_date_validite');
3111 mbroquet 3730 }
3112 softime 6565 if ($row['regle_date_chantier'] != '') {
3113     $valF['date_chantier'] = $this->regle($row['regle_date_chantier'], 'regle_date_chantier');
3114 mbroquet 3730 }
3115 softime 6565 if ($row['regle_date_achevement'] != '') {
3116     $valF['date_achevement'] = $this->regle($row['regle_date_achevement'], 'regle_date_achevement');
3117 mbroquet 3730 }
3118 softime 6565 if ($row['regle_date_conformite'] != '') {
3119     $valF['date_conformite'] = $this->regle($row['regle_date_conformite'], 'regle_date_conformite');
3120 mbroquet 3730 }
3121 softime 6565 if ($row['regle_date_limite_incompletude'] != '') {
3122     $valF['date_limite_incompletude'] = $this->regle($row['regle_date_limite_incompletude'], 'regle_date_limite_incompletude');
3123 mbroquet 3730 }
3124 softime 6565 if ($row['regle_delai_incompletude'] != '') {
3125     $valF['delai_incompletude'] = $this->regle($row['regle_delai_incompletude'], 'regle_delai_incompletude');
3126 mbroquet 3730 }
3127 softime 6565 if ($row['regle_autorite_competente'] != '') {
3128     $valF['autorite_competente'] = $this->regle($row['regle_autorite_competente'], 'regle_autorite_competente');
3129 mbroquet 3730 }
3130 softime 6565 if ($row['regle_etat'] != '') {
3131 softime 10573 $valF['etat'] = $this->regle($row['regle_etat'], 'regle_etat');
3132 mbroquet 3730 }
3133 softime 6565 if ($row['regle_date_cloture_instruction'] !== '') {
3134     $valF['date_cloture_instruction'] = $this->regle($row['regle_date_cloture_instruction'], 'regle_date_cloture_instruction');
3135     }
3136     if ($row['regle_date_premiere_visite'] !== '') {
3137     $valF['date_premiere_visite'] = $this->regle($row['regle_date_premiere_visite'], 'regle_date_premiere_visite');
3138     }
3139     if ($row['regle_date_derniere_visite'] !== '') {
3140     $valF['date_derniere_visite'] = $this->regle($row['regle_date_derniere_visite'], 'regle_date_derniere_visite');
3141     }
3142     if ($row['regle_date_contradictoire'] !== '') {
3143     $valF['date_contradictoire'] = $this->regle($row['regle_date_contradictoire'], 'regle_date_contradictoire');
3144     }
3145     if ($row['regle_date_retour_contradictoire'] !== '') {
3146     $valF['date_retour_contradictoire'] = $this->regle($row['regle_date_retour_contradictoire'], 'regle_date_retour_contradictoire');
3147     }
3148     if ($row['regle_date_ait'] !== '') {
3149     $valF['date_ait'] = $this->regle($row['regle_date_ait'], 'regle_date_ait');
3150     }
3151     if ($row['regle_donnees_techniques1'] !== '') {
3152     $valF_dt[$row['cible_regle_donnees_techniques1']] = $this->regle($row['regle_donnees_techniques1'], 'regle_donnees_techniques1');
3153     }
3154     if ($row['regle_donnees_techniques2'] !== '') {
3155     $valF_dt[$row['cible_regle_donnees_techniques2']] = $this->regle($row['regle_donnees_techniques2'], 'regle_donnees_techniques2');
3156     }
3157     if ($row['regle_donnees_techniques3'] !== '') {
3158     $valF_dt[$row['cible_regle_donnees_techniques3']] = $this->regle($row['regle_donnees_techniques3'], 'regle_donnees_techniques3');
3159     }
3160     if ($row['regle_donnees_techniques4'] !== '') {
3161     $valF_dt[$row['cible_regle_donnees_techniques4']] = $this->regle($row['regle_donnees_techniques4'], 'regle_donnees_techniques4');
3162     }
3163     if ($row['regle_donnees_techniques5'] !== '') {
3164     $valF_dt[$row['cible_regle_donnees_techniques5']] = $this->regle($row['regle_donnees_techniques5'], 'regle_donnees_techniques5');
3165     }
3166     if ($row['regle_date_transmission_parquet'] !== '') {
3167     $valF['date_transmission_parquet'] = $this->regle($row['regle_date_transmission_parquet'], 'regle_date_transmission_parquet');
3168     }
3169 softime 8593 if ($row['regle_dossier_instruction_type'] !== '') {
3170     $valF['dossier_instruction_type'] = $this->regle($row['regle_dossier_instruction_type'], 'regle_dossier_instruction_type');
3171     }
3172 softime 8989 // La date d'affichage est modifiée seulement si le champ n'est pas
3173     // renseigné
3174     if ($row['regle_date_affichage'] !== ''
3175     && ($inst_di->getVal('date_affichage') === ''
3176     || $inst_di->getVal('date_affichage') === null)) {
3177     //
3178     $valF['date_affichage'] = $this->regle($row['regle_date_affichage'], 'regle_date_affichage');
3179     }
3180 softime 10573 //
3181     if ($row['regle_pec_metier'] != '') {
3182     $valF['pec_metier'] = $this->regle($row['regle_pec_metier'], 'regle_pec_metier');
3183     }
3184     if ($row['regle_a_qualifier'] != '') {
3185     $valF['a_qualifier'] = $this->regle($row['regle_a_qualifier'], 'regle_a_qualifier');
3186     }
3187     //
3188     if ($row['regle_incompletude'] != '') {
3189     $valF['incompletude'] = $this->regle($row['regle_incompletude'], 'regle_incompletude');
3190     }
3191     if ($row['regle_incomplet_notifie'] != '') {
3192     $valF['incomplet_notifie'] = $this->regle($row['regle_incomplet_notifie'], 'regle_incomplet_notifie');
3193     }
3194     if ($row['regle_etat_pendant_incompletude'] != '') {
3195     $valF['etat_pendant_incompletude'] = $this->regle($row['regle_etat_pendant_incompletude'], 'regle_etat_pendant_incompletude');
3196     }
3197     if ($row['regle_evenement_suivant_tacite_incompletude'] != '') {
3198     $resti = $this->regle($row['regle_evenement_suivant_tacite_incompletude'], 'regle_evenement_suivant_tacite_incompletude');
3199     if (strtolower($resti) === 't' || strtolower($resti) === 'true') {
3200     $ev_suiv_tacite_incompletude = true;
3201     }
3202     }
3203 mbroquet 3730 }
3204 softime 6063
3205     // Si l'événement a un événement suivant tacite
3206     if($inst_evenement->getVal('evenement_suivant_tacite') != '') {
3207 softime 10573 // En fonction de l'action de l'événement, l'événement suivant tacite ne sera
3208     // pas associé de le même façon au dossier d'instruction
3209     if ($ev_suiv_tacite_incompletude === false) {
3210 softime 6063 $valF['evenement_suivant_tacite'] = $inst_evenement->getVal('evenement_suivant_tacite');
3211 softime 10573 }
3212     if ($ev_suiv_tacite_incompletude === true) {
3213 softime 6063 $valF['evenement_suivant_tacite_incompletude'] = $inst_evenement->getVal('evenement_suivant_tacite');
3214 nhaye 5254 }
3215 mbroquet 3730 }
3216 softime 6565 // Si des valeurs de données techniques ont été calculées alors on met à jour l'enregistrement
3217 softime 9245 if (count($valF_dt) > 0) {
3218 softime 6565 $dt_id = $this->getDonneesTechniques();
3219     // On met à jour le dossier
3220     $cle = " donnees_techniques='".$dt_id."'";
3221 softime 12847 $res1 = $this->f->db->autoexecute(DB_PREFIXE.'donnees_techniques', $valF_dt, DB_AUTOQUERY_UPDATE, $cle);
3222     $this->addToLog(
3223     __METHOD__."(): db->autoexecute(\"".DB_PREFIXE."donnees_techniques\", ".print_r($valF_dt, true).", DB_AUTOQUERY_UPDATE, \"".$cle."\");",
3224     VERBOSE_MODE
3225     );
3226     $this->f->isDatabaseError($res1);
3227 softime 6565 // Affichage d'informations à l'utilisateur
3228 softime 8989 $this->addToMessage(_('enregistrement')." ".$this->valF['dossier']." "._('table')." dossier [".$this->f->db->affectedRows()." "._('enregistrement')." "._('mis_a_jour')."]");
3229 softime 6565 }
3230 mbroquet 3730 // Si des valeurs ont été calculées alors on met à jour l'enregistrement
3231 softime 9245 if (count($valF) > 0) {
3232 softime 10573 //
3233     $inst_dossier = $this->f->get_inst__om_dbform(array(
3234     "obj" => "dossier",
3235     "idx" => $this->valF['dossier'],
3236     ));
3237     $valF['instruction'] = $id;
3238 softime 10968 $valF['crud'] = 'create';
3239 softime 10573 $update_by_instruction = $inst_dossier->update_by_instruction($valF);
3240     if ($update_by_instruction === false) {
3241     $this->cleanMessage();
3242     $this->addToMessage(sprintf('%s %s', __("Une erreur s'est produite lors de la mise à jour du dossier d'instruction."), __("Veuillez contacter votre administrateur.")));
3243     return false;
3244 mbroquet 3730 }
3245     // Affichage d'informations à l'utilisateur
3246 softime 8989 $this->addToMessage(_('enregistrement')." ".$this->valF['dossier']." "._('table')." dossier [".$this->f->db->affectedRows()." "._('enregistrement')." "._('mis_a_jour')."]");
3247 mbroquet 3730 }
3248    
3249     /**
3250 fmichon 4708 * Interface avec le référentiel ERP.
3251     *
3252     * (WS->ERP)[105] Arrêté d'un dossier PC effectué -> PC qui concerne un ERP
3253     * (WS->ERP)[111] Décision de conformité effectuée -> PC qui concerne un ERP
3254     * Déclencheur :
3255     * - L'option ERP est activée
3256     * - Le dossier est marqué comme "connecté au référentiel ERP"
3257     * - Le dossier est de type PC
3258     * - Le formulaire d'ajout d'un événement d'instruction est validé
3259     * avec un événement pour lequel les services ERP doivent être
3260     * informé
3261 mbroquet 3730 */
3262 fmichon 4708 //
3263 softime 7521 if ($this->f->is_option_referentiel_erp_enabled() === true
3264 fmichon 4708 && $inst_di->is_connected_to_referentiel_erp() === true
3265     && $this->f->getDATCode($this->valF['dossier']) == $this->f->getParameter('erp__dossier__nature__pc')
3266     && in_array($inst_evenement->getVal($inst_evenement->clePrimaire), explode(";", $this->f->getParameter('erp__evenements__decision__pc')))) {
3267 mbroquet 3730 //
3268 fmichon 4708 $infos = array(
3269     "dossier_instruction" => $this->valF['dossier'],
3270     "decision" => $inst_evenement->getVal("libelle"),
3271     );
3272 mbroquet 3730 //
3273 fmichon 4708 $ret = $this->f->send_message_to_referentiel_erp(105, $infos);
3274     if ($ret !== true) {
3275     $this->cleanMessage();
3276     $this->addToMessage(_("Une erreur s'est produite lors de la notification (105) du référentiel ERP. Contactez votre administrateur."));
3277     return false;
3278 mbroquet 3730 }
3279 fmichon 4708 $this->addToMessage(_("Notification (105) du référentiel ERP OK."));
3280     }
3281 mbroquet 3730
3282 softime 8989 // Si le mode en rédaction intégrale est activé
3283     if (isset($this->valF['flag_edition_integrale']) === true
3284     && $this->valF['flag_edition_integrale'] === true) {
3285     $redactionIntegraleValF = array();
3286    
3287     // Récupère la collectivite du dossier d'instruction
3288     $dossier_instruction_om_collectivite = $this->get_dossier_instruction_om_collectivite();
3289     $collectivite = $this->f->getCollectivite($dossier_instruction_om_collectivite);
3290     // Récupère le corps de la lettre type
3291     $params = array(
3292     "specific" => array(
3293     "corps" => array(
3294     "mode" => "get",
3295     )
3296     ),
3297     );
3298     $result = $this->compute_pdf_output('lettretype', $this->valF['lettretype'], $collectivite, $id, $params);
3299     $redactionIntegraleValF['corps_om_htmletatex'] = $result['pdf_output'];
3300     // Récupère le titre de la lettre type
3301     $params = array(
3302     "specific" => array(
3303     "titre" => array(
3304     "mode" => "get",
3305     )
3306     ),
3307     );
3308     $result = $this->compute_pdf_output('lettretype', $this->valF['lettretype'], $collectivite, $id, $params);
3309     $redactionIntegraleValF['titre_om_htmletat'] = $result['pdf_output'];
3310    
3311     // mise à jour en base de données
3312     $res = $this->f->db->autoExecute(
3313     DB_PREFIXE.$this->table,
3314     $redactionIntegraleValF,
3315     DB_AUTOQUERY_UPDATE,
3316     $this->clePrimaire."=".$id
3317     );
3318     $this->addToLog(__METHOD__."(): db->autoexecute(\"".DB_PREFIXE.'.'.$this->table."\", ".print_r($redactionIntegraleValF, true).", DB_AUTOQUERY_UPDATE, \"".$this->clePrimaire."=".$id."\");", VERBOSE_MODE);
3319     if ($this->f->isDatabaseError($res, true) === true) {
3320     return false;
3321     }
3322     }
3323    
3324 fmichon 4708 /**
3325 softime 7996 * Finalisation automatique de l'instruction si le paramétrage de l'événement l'autorise
3326     */
3327     // Si la finalisation automatique de l'événement est activée
3328     // ET si l'instruction n'a pas déjà été finalisée
3329     // ET s'il existe une lettre type associée
3330     if ($inst_evenement->getVal('finaliser_automatiquement') === 't'
3331     && $inst_evenement->getVal('om_final_instruction') !== 't'
3332     && $inst_evenement->getVal('lettretype') !== ''
3333     && $inst_evenement->getVal('lettretype') !== null) {
3334    
3335     // On instancie l'instruction
3336     $inst_instruction = $this->f->get_inst__om_dbform(array(
3337     "obj" => "instruction",
3338     "idx" => $this->valF[$this->clePrimaire],
3339     ));
3340    
3341     // On finalise l'instruction dans le contexte de finalisation : action 100
3342     $inst_instruction->setParameter('maj', 100);
3343     $finalize = $inst_instruction->finalize($inst_instruction->valF);
3344    
3345     // Une erreur de finalisation renvoie 'false' : ajout dans les logs
3346     // et dans le message d'erreur
3347     if ($finalize === false) {
3348     $this->f->addToLog(__METHOD__."() : ERROR - Impossible de finaliser l'instruction.", DEBUG_MODE);
3349     $this->addToMessage(_("Erreur lors de la finalisation de l'instruction. Contactez votre administrateur."));
3350     return false;
3351     }
3352     }
3353    
3354     /**
3355 softime 7521 * Finalisation automatique des instructions tacites ou retours.
3356     */
3357 softime 7685 // Si l'option de finalisation automatique des instructions tacites ou
3358     // retours est activée et l'événement d'instruction a une lettre type
3359     // associée
3360     $collectivite_di = $this->get_dossier_instruction_om_collectivite($val['dossier']);
3361     if ($this->f->is_option_finalisation_auto_enabled($collectivite_di) === true
3362     && $inst_evenement->getVal('lettretype') !== ''
3363 softime 7521 && $inst_evenement->getVal('lettretype') !== null) {
3364    
3365     // Rècupère l'identifiant de l'événement
3366     $evenement_id = $inst_evenement->getVal($inst_evenement->clePrimaire);
3367    
3368     // Si l'événement d'instruction est identifié comme un événement
3369     // retour
3370     // OU l'événement d'instruction est l'événement suivant tacite du
3371     // dossier d'instruction (incomplétude prise en compte)
3372 softime 7996 // ET l'événement d'instruction n'a pas déjà été finalisé
3373     if (($inst_evenement->getVal("retour") === 't'
3374 softime 7521 || ($inst_di->getVal('evenement_suivant_tacite_incompletude') === $evenement_id
3375 softime 7996 || $inst_di->getVal('evenement_suivant_tacite') === $evenement_id))
3376     && ($inst_evenement->getVal('om_final_instruction') !== 't')) {
3377 softime 7521
3378     // Finalise l'instruction
3379 softime 7996 $inst_instruction = $this->f->get_inst__om_dbform(array(
3380     "obj" => "instruction",
3381     "idx" => $this->valF[$this->clePrimaire],
3382     ));
3383 softime 7521 $inst_instruction->setParameter('maj', 100);
3384     $finalize = $inst_instruction->finalize($inst_instruction->valF);
3385     if ($finalize === false) {
3386     //
3387     return false;
3388     }
3389     }
3390     }
3391    
3392     /**
3393 softime 9245 * Mise à jour de la version de clôture *version_clos* du dossier si et
3394     * seulement si l'instruction met à jour l'état du dossier.
3395     */
3396     if (isset($valF['etat']) === true
3397     && $valF['etat'] !== null
3398     && $valF['etat'] !== '') {
3399     // Instanciation de l'état appliqué sur le dossier par l'instruction
3400     $inst_etat = $this->f->get_inst__om_dbform(array(
3401     "obj" => "etat",
3402     "idx" => $valF['etat'],
3403     ));
3404     //
3405     $update_version_clos = null;
3406     // En cas d'instruction qui clôture le dossier
3407     if ($inst_etat->getVal('statut') === 'cloture') {
3408     $update_version_clos = $inst_di->update_version_clos('up');
3409     }
3410     // En cas d'instruction qui rouvre le dossier
3411     if ($inst_current_etat->getVal('statut') === 'cloture'
3412     && $inst_etat->getVal('statut') !== 'cloture') {
3413     //
3414     $update_version_clos = $inst_di->update_version_clos('down');
3415     //
3416     $params = array(
3417     'di_reopened' => true,
3418     );
3419     }
3420     //
3421     if ($update_version_clos === false) {
3422     $this->f->addToLog(sprintf(
3423     "%s() : ERREUR - %s %s",
3424     __METHOD__,
3425     sprintf(
3426     __("Impossible de mettre à jour la version de clôture du dossier d'instruction %s."),
3427     $inst_di->getVal($inst_di->clePrimaire)
3428     ),
3429     sprintf(
3430     __("L'instruction tente d'appliquer l'état %s."),
3431     $inst_etat->getVal($inst_etat->clePrimaire)
3432     )
3433     ));
3434     $this->addToMessage(sprintf(
3435     "%s %s",
3436     __("Erreur lors de la mise à jour de la version de clôture du dossier d'instruction."),
3437     __("Veuillez contacter votre administrateur.")
3438     ));
3439     return false;
3440     }
3441     }
3442    
3443     /**
3444 softime 10808 * Notification automatique
3445     */
3446     // Notification automatique à l'ajout de l'instruction si la notification
3447     // automatique est choisie et qu'il n'y a pas de lettretype associée à l'événement
3448     if ($inst_evenement->getVal('notification') === 'notification_automatique' &&
3449     ($inst_evenement->getVal('lettretype') === null ||
3450     $inst_evenement->getVal('lettretype') === '')) {
3451 softime 13137 // Message à afficher dans les logs pour indiquer quelle notification a échouée
3452 softime 13528 $msgLog = sprintf(
3453     '%s %s : %d',
3454     __('Erreur lors de la notification automatique du(des) pétitionnaire(s).'),
3455     __('Instruction notifiée'),
3456     $id
3457     );
3458 softime 13137
3459 softime 10808 // Récupération de la liste des demandeurs à notifier et de la catégorie
3460     $categorie = $this->f->get_param_option_notification($collectivite_di);
3461 softime 14064 $isPortal = $categorie === PORTAL;
3462 softime 10869 $demandeursANotifie = $this->get_demandeurs_notifiable(
3463     $this->valF['dossier'],
3464     $isPortal
3465     );
3466 softime 10808
3467     // Création d'une notification et d'une tâche pour chaque demandeur à notifier
3468 softime 12124 $demandeurPrincipalNotifie = false;
3469 softime 10808 foreach ($demandeursANotifie as $demandeur) {
3470 softime 12124 // Identifie si le demandeur principal a été notifié ou pas
3471     // et récupère ses informations
3472     if ($demandeur['petitionnaire_principal'] == 't') {
3473     $demandeurPrincipalNotifie = true;
3474     // Si le demandeur principal est notifiable mais qu'il y a des erreurs dans
3475     // son paramétrage, on effectue pas le traitement et on passe à l'itération
3476     // suivante. On le considère également comme non notifié pour gérer l'envoie
3477     // des messages d'erreurs
3478     // Si la demande a été déposée via le portail alors le paramétrage n'a pas
3479     // d'impact sur la notification
3480     $erreursParam = $this->get_info_notification_fail($val['dossier']);
3481     if (! $this->dossier_depose_sur_portail($val['dossier']) && $erreursParam != array()) {
3482     $demandeurPrincipalNotifie = false;
3483     continue;
3484     }
3485     }
3486 softime 10808 // Ajout de la notif et récupération de son id
3487     $idNotif = $this->ajouter_notification(
3488     $this->valF[$this->clePrimaire],
3489     $this->f->get_connected_user_login_name(),
3490 softime 10968 $demandeur,
3491     $collectivite_di,
3492 softime 12433 array(),
3493 softime 10968 true
3494 softime 10808 );
3495     if ($idNotif === false) {
3496 softime 13528 $this->addToLog(
3497     sprintf('%s() : %s', __METHOD__, $msgLog),
3498     DEBUG_MODE
3499     );
3500 softime 10808 return false;
3501     }
3502     // Création de la tache en lui donnant l'id de la notification
3503     $notification_by_task = $this->notification_by_task(
3504     $idNotif,
3505     $this->valF['dossier'],
3506     $categorie
3507     );
3508     if ($notification_by_task === false) {
3509 softime 13528 $this->addToLog(
3510     sprintf('%s() : %s', __METHOD__, $msgLog),
3511     DEBUG_MODE
3512     );
3513 softime 10808 $this->addToMessage(
3514     __("Erreur lors de la génération de la notification au(x) pétitionnaire(s).")
3515     );
3516     return false;
3517     }
3518     }
3519 softime 12847 // Pour la notification par mail ou la notification via portal si le dossier a
3520     // été déposés via portal, si le demandeur principal n'est pas notifiable,
3521     // on créé une nouvelle notification en erreur avec en commentaire la raison pour
3522     // laquelle le demandeur principal n'a pas pu être notifié
3523     $depotPortal = $this->dossier_depose_sur_portail();
3524     if (! $demandeurPrincipalNotifie && ($isPortal === false || $depotPortal === true)) {
3525 softime 13137 // Précision dans les logs que le pétitionnaire principal n'est pas notifiable.
3526     // ' ' permet de mettre un espace entre les 2 msg de log.
3527 softime 13528 $msgLog .= sprintf(' %s', __('Le pétitionnaire principale n\'est pas notifiable.'));
3528 softime 12124 // Analyse pour savoir pourquoi le demandeur principal n'est pas notifiable
3529     $erreursParam = $this->get_info_notification_fail($val['dossier']);
3530     $demandeurPrincipal = $this->get_info_petitionnaire_principal_dossier($val['dossier']);
3531     // Ajout de la notif et récupération de son id
3532     $idNotif = $this->ajouter_notification(
3533     $this->valF[$this->clePrimaire],
3534     $this->f->get_connected_user_login_name(),
3535     $demandeurPrincipal,
3536     $collectivite_di,
3537 softime 12433 array(),
3538 softime 12124 true,
3539     'Echec',
3540     implode(' ', $erreursParam)
3541     );
3542     if ($idNotif === false) {
3543 softime 13528 $this->addToLog(
3544     sprintf('%s() : %s', __METHOD__, $msgLog),
3545     DEBUG_MODE
3546     );
3547 softime 12124 $this->addToMessage(
3548     __('Erreur : la création de la notification a échouée.').
3549     __("Veuillez contacter votre administrateur.")
3550     );
3551     return false;
3552     }
3553     // Prépare un message d'alerte à destination de l'instructeur pour l'informer
3554     // de l'échec de la notification
3555     $dossier_message = $this->get_inst_dossier_message(0);
3556     $dossier_message_val = array(
3557     'dossier' => $val['dossier'],
3558     'type' => _('erreur expedition'),
3559     'emetteur' => $this->f->get_connected_user_login_name().' (automatique)',
3560     'login' => $_SESSION['login'],
3561     'date_emission' => date('Y-m-d H:i:s'),
3562     'contenu' => _('Échec lors de la notification de l\'instruction ').
3563     $inst_evenement->getVal('libelle').
3564     '.<br>'.
3565     implode("\n", $erreursParam).
3566     '<br>'.
3567     _('Veuillez corriger ces informations avant de renvoyer la notification.')
3568     );
3569     $add = $dossier_message->add_notification_message($dossier_message_val, true);
3570     // Si une erreur se produit pendant l'ajout
3571     if ($add !== true) {
3572     $this->addToLog(__METHOD__."(): Le message d'alerte concernant l'echec de l'envoi de la notification n'a pas pu être envoyé.", DEBUG_MODE);
3573     return false;
3574     }
3575     }
3576 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.")));
3577     }
3578    
3579 softime 12654 // Notification automatique en cas de dépôt de dossier dématérialisé
3580     // Vérifie si l'option de notification est active et si il s'agit bien d'une
3581     // instruction de récépissé
3582     if (
3583     $this->f->is_option_notification_depot_demat_enabled($collectivite_di)
3584     && $this->is_instruction_recepisse()
3585     ) {
3586 softime 13137 // Message à afficher dans les logs pour indiquer quelle notification a échouée
3587 softime 13528 $msgLog = sprintf(
3588     __('Erreur lors de la notification de dépôt du dossier dématérialisé : %s.'),
3589     $val['dossier']
3590     );
3591 softime 12654 // Récupère l'instance de la demande
3592     $demande = $inst_di->get_inst_demande();
3593 softime 13137 // Vérifie que le dossier a été déposé via platau ou portal
3594 softime 12654 if (
3595 softime 13137 ($demande->getVal('source_depot') == PLATAU ||
3596     $demande->getVal('source_depot') == PORTAL)
3597 softime 12654 ) {
3598 softime 13137 // Récupère la liste des mails fournis en paramètre. Si aucun adresse n'a été récupéré
3599     // l'envoi de la notification n'est pas effectué et un message d'erreur est affiché.
3600     $listeEmails = $this->f->get_param_courriel_de_notification_commune($collectivite_di);
3601     if (empty($listeEmails)) {
3602     $this->addToLog(
3603 softime 13528 sprintf(
3604     '%s(): %s %s',
3605     __METHOD__,
3606     $msgLog,
3607     __('Aucun courriel paramétré.')
3608     ),
3609 softime 13137 DEBUG_MODE
3610 softime 12654 );
3611 softime 13137 } else {
3612     foreach ($listeEmails as $email) {
3613     // Ajout de la notif et récupération de son id
3614     $destinataire = array(
3615     'destinataire' => $email,
3616     'courriel' => $email
3617 softime 12654 );
3618 softime 13137 $idNotif = $this->ajouter_notification(
3619     $this->valF[$this->clePrimaire],
3620     $this->f->get_connected_user_login_name(),
3621     $destinataire,
3622     $collectivite_di,
3623     array(),
3624     true
3625     );
3626     if ($idNotif === false) {
3627 softime 13528 $this->addToLog(
3628     sprintf('%s(): %s', __METHOD__, $msgLog),
3629     DEBUG_MODE
3630     );
3631 softime 13137 return false;
3632     }
3633     // Création de la tache en lui donnant l'id de la notification
3634     $notification_by_task = $this->notification_by_task(
3635     $idNotif,
3636     $this->valF['dossier'],
3637     'mail',
3638     'notification_depot_demat'
3639     );
3640     if ($notification_by_task === false) {
3641     $this->addToMessage(
3642     __("Erreur lors de la génération de la notification de dépot de dossier par voie dématérialisée.")
3643     );
3644 softime 13528 $this->addToLog(
3645     sprintf('%s(): %s', __METHOD__, $msgLog),
3646     DEBUG_MODE
3647     );
3648 softime 13137 return false;
3649     }
3650 softime 12654 }
3651     }
3652     }
3653     }
3654    
3655 softime 10808 /**
3656 softime 7996 * Mise à jour de la date de dernière modification du dossier
3657     */
3658     $inst_di->update_last_modification_date();
3659    
3660     /**
3661 softime 8640 * Mise à jour des données du DA.
3662     */
3663     $inst_da = $inst_di->get_inst_dossier_autorisation();
3664 softime 9245 $params['di_id'] = $this->valF['dossier'];
3665 softime 8640 if ($inst_da->majDossierAutorisation($params) === false) {
3666     $this->addToMessage(_("Erreur lors de la mise a jour des donnees du dossier d'autorisation. Contactez votre administrateur."));
3667     $this->correct = false;
3668     return false;
3669     }
3670    
3671     /**
3672 fmichon 4708 * Historisation de la vie du DI.
3673     */
3674     //
3675 nmeucci 3963 return $this->add_log_to_dossier($id, array_merge($val, $this->valF));
3676 nmeucci 3876 }
3677 mbroquet 3730
3678 softime 12124 /**
3679     * Cette méthode vérifie si toutes les conditions de l'envoi de la notification
3680     * sont remplies.
3681     * Les conditions vérifiées sont les suivantes :
3682 softime 14064 * - L'option de notification *option_notification* doit être définie
3683 softime 12124 * - Le petitionnaire principal doit accepter les notifications
3684     * - Le pétitionnaire principal doit avoir une adresse mail renseignée
3685     * - Le pétitionnaire principal doit avoir une adresse mail correcte
3686     * Pour chaque vérification effectué un message d'erreur est ajouté si la
3687     * condition n'est pas remplie.
3688     * Renvoie le message d'erreur en sortie.
3689     *
3690     * @param string identifiant du dossier sur lequel les notifications ont échouée
3691     * @return string
3692     */
3693     protected function get_info_notification_fail($dossier = null) {
3694     // Utilise l'identifiant du dossier passé en paramètre et si aucun dossier n'a été récupéré
3695     // utilise celui associé à l'instruction
3696     if ($dossier == null) {
3697     $dossier = $this->getVal('dossier');
3698     }
3699     // Tableau contenant la liste des messages d'erreur
3700     $errorMessage = array();
3701 softime 14064 // Récupère l'option de notification
3702     $collectivite_di = $this->get_dossier_instruction_om_collectivite($dossier);
3703     $option_notification = $this->f->get_param_option_notification($collectivite_di);
3704     if ($option_notification !== PORTAL && $option_notification !== 'mail') {
3705     $errorMessage[] = __("L'option de notification option_notification doit obligatoirement être définie.");
3706     }
3707 softime 12124 // Récupère les informations du demandeurs principal
3708     $infoPetitionnaire = $this->get_info_petitionnaire_principal_dossier($dossier);
3709     // Vérifie si le pétitionnaire principal à bien la case "accepte les notification" cochée
3710     if (isset($infoPetitionnaire['notification']) && $infoPetitionnaire['notification'] != 't') {
3711     $errorMessage[] = __('Le pétitionnaire principal n\'accepte pas les notifications.');
3712     }
3713     // Vérifie si l'adresse mail du pétitionnaire principale est renseignée
3714     if (isset($infoPetitionnaire['courriel']) && ! empty($infoPetitionnaire['courriel'])) {
3715     // Vérifie si le format de l'adresse mail est pas correct et, si ce n'est pas le cas, informe l'utilisateur
3716     // qu'il doit le corriger avant de pouvoir ajouter l'nstruction
3717     if (! $this->f->checkValidEmailAddress($infoPetitionnaire['courriel'])) {
3718     $errorMessage[] = __('Le courriel du pétitionnaire principal n\'est pas correct : ').
3719     $infoPetitionnaire['courriel'].
3720     '.';
3721     }
3722     } else {
3723     // Si le courriel du pétitionnaire principal
3724     $errorMessage[] = __('Le courriel du pétitionnaire principal n\'est pas renseigné.');
3725     }
3726 softime 11585
3727 softime 12124 return $errorMessage;
3728     }
3729    
3730     /**
3731     * Méthode servant à vérifier si un dossier a été déposé sur
3732     * le portail citoyen ou pas.
3733     * La verification se fait via une requête sql dans laquelle
3734     * on va chercher un dossier ayant pour id l'identifiant de
3735     * dossier associé à l'instruction et pour lequel la demande
3736     * associée la plus ancienne est une demande de création de
3737     * dossier via portail
3738     *
3739     * @param string identifiant du dossier. Si non renseigné c'est le dossier
3740     * associé à l'instruction qui est utilisé
3741     * @return boolean|void true : dossier déposé via portail, false : dossier
3742     * non déposé via portail et null : erreur de base de données.
3743     */
3744     protected function dossier_depose_sur_portail($dossier = null) {
3745     if (empty($dossier)) {
3746     $dossier = $this->getVal('dossier');
3747     }
3748 softime 13137 $qres = $this->f->get_one_result_from_db_query(
3749     sprintf(
3750     'SELECT
3751     dossier
3752     FROM
3753     %1$sdossier
3754     -- Récuperation de la première demande associée au dossier
3755     LEFT JOIN (
3756     SELECT
3757     demande,
3758     dossier_instruction,
3759     source_depot
3760     FROM
3761     %1$sdemande
3762     WHERE
3763     dossier_instruction = \'%2$s\'
3764     ORDER BY
3765     demande ASC
3766     LIMIT 1
3767 softime 14064 ) AS demande
3768     ON dossier.dossier = demande.dossier_instruction
3769 softime 13137 WHERE
3770     dossier.dossier = \'%2$s\'
3771     AND demande.source_depot = \'portal\'',
3772     DB_PREFIXE,
3773     $this->f->db->escapeSimple($dossier)
3774     ),
3775     array(
3776     "origin" => __METHOD__,
3777     "force_return" => true,
3778     )
3779 softime 12124 );
3780 softime 13137 if ($qres["code"] !== "OK") {
3781 softime 12124 $this->addToMessage(__('Erreur : La vérification du mode de dépôt du dossier à échoué'));
3782     return;
3783     }
3784     // Si on a un résultat c'est que le dossier a été déposé via le portail
3785 softime 13137 return ! empty($qres["result"]);
3786 softime 12124 }
3787    
3788 softime 11585 public function is_service_notifiable() {
3789     $evenement = $this->get_inst_evenement($this->getVal('evenement'));
3790    
3791     // Si l'instruction a une édition non finalisé quel que soit
3792     // le type de notification, il n'est pas notifiable
3793     if ($this->has_an_edition() === true) {
3794     if ($this->is_unfinalizable_without_bypass() === false) {
3795     return false;
3796     }
3797     }
3798     // Vérifie si la notification des tiers est active pour l'évènement
3799     return $this->get_boolean_from_pgsql_value($evenement->getVal('notification_service'));
3800     }
3801    
3802     public function is_tiers_notifiable() {
3803     $evenement = $this->get_inst_evenement($this->getVal('evenement'));
3804    
3805     // Si l'instruction a une édition non finalisé quel que soit
3806     // le type de notification, il n'est pas notifiable
3807     if ($this->has_an_edition() === true) {
3808     if ($this->is_unfinalizable_without_bypass() === false) {
3809     return false;
3810     }
3811     }
3812     // Vérifie si la notification des tiers est active pour l'évènement
3813 softime 13137 return ! empty($evenement->getVal('notification_tiers'));
3814 softime 11585 }
3815    
3816 softime 12124 /**
3817     * Méthode permettant de savoir si une instruction peut
3818     * être notifiée manuellement selon les différents types
3819     * de notification.
3820     *
3821     * Si l'instruction a une édition non finalisée alors elle n'est pas
3822     * manuellement notifiable.
3823     * Si l'instruction est associé à un événement de notification pour
3824     * lequel un retour signature est recquis, elle n'est notifiable que
3825     * si la date de retour de signature est remplie.
3826     * Par défaut si le type de notification n'est pas connu alors l'instruction
3827     * n'est pas notifiable.
3828     * Pour tous les autres cas l'instruction est manuellement notifiable.
3829     *
3830     * @return boolean true : notifiable | false : non notifiable
3831     */
3832 softime 10808 public function is_notifiable_by_task_manual() {
3833     $ev = $this->get_inst_evenement($this->getVal('evenement'));
3834    
3835     // Si l'instruction a une édition non finalisé quel que soit
3836     // le type de notification, il n'est pas notifiable
3837     if ($this->has_an_edition() === true) {
3838     if ($this->is_unfinalizable_without_bypass() === false) {
3839     return false;
3840     }
3841     }
3842    
3843     // Gestion des différents cas selon la valeur du champs notification
3844 softime 12124 if ($ev->getVal('notification') == 'notification_manuelle' ||
3845     $ev->getVal('notification') == 'notification_manuelle_annexe' ||
3846     $ev->getVal('notification') == 'notification_automatique'
3847     ) {
3848     return true;
3849     } elseif (($ev->getVal('notification') == 'notification_auto_signature_requise' ||
3850     $ev->getVal('notification') == 'notification_manuelle_signature_requise' ||
3851     $ev->getVal('notification') == 'notification_manuelle_annexe_signature_requise') &&
3852     $this->getVal('date_retour_signature') != null &&
3853     $this->getVal('date_retour_signature') != ''
3854     ) {
3855     return true ;
3856 softime 10808 }
3857 softime 12124 return false;
3858 softime 10808 }
3859    
3860 softime 8989 /**
3861 softime 14542 * Crée une instance de notification et une tache notification_instruction de catégorie portal
3862     * pour le demandeur principal.
3863 softime 10808 *
3864     * @return boolean true si le traitement à réussi
3865     */
3866 softime 14542 protected function notifier_demandeur_principal_via_portal() {
3867 softime 10808 $this->begin_treatment(__METHOD__);
3868     $message = '';
3869     // Récupération des informations concernant le demandeur
3870     $dossier = $this->getVal('dossier');
3871 softime 10968 $collectivite_di = $this->get_dossier_instruction_om_collectivite($dossier);
3872 softime 10808 $demandeur = $this->get_demandeurs_notifiable(
3873     $dossier,
3874     true
3875     );
3876     if ($demandeur !== array()) {
3877 softime 10869 $destinataire = array_values($demandeur);
3878 softime 10808 // Ajout de la notif et récupération de son id
3879     $idNotification = $this->ajouter_notification(
3880     $this->getVal($this->clePrimaire),
3881     $this->f->get_connected_user_login_name(),
3882 softime 10968 $destinataire[0],
3883     $collectivite_di,
3884 softime 12433 array(),
3885 softime 10968 true
3886 softime 10808 );
3887     if ($idNotification === false) {
3888     return $this->end_treatment(__METHOD__, false);
3889     }
3890     // Création de la tâche en lui donnant l'id de la notification
3891 softime 14542 $notification_by_task = $this->notification_by_task($idNotification, $dossier, PORTAL);
3892 softime 10808 if ($notification_by_task === false) {
3893     $this->addToMessage(
3894     __("Erreur lors de la génération de la notification au(x) pétitionnaire(s).")
3895     );
3896     return $this->end_treatment(__METHOD__, false);
3897     }
3898     $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.")));
3899     return $this->end_treatment(__METHOD__, true);
3900     }
3901     $this->addToMessage( __("Le demandeur principal n'est pas notifiable."));
3902 softime 12124 return $this->end_treatment(__METHOD__, false);
3903 softime 10808 }
3904    
3905     public function notification_by_task($object_id, $dossier, $category = null, $type = null) {
3906     // Si le type n'est pas correctement spécifié, alors il est calculé
3907 softime 11585 if ($type !== 'notification_recepisse'
3908     && $type !== 'notification_instruction'
3909     && $type !== 'notification_decision'
3910     && $type !== 'notification_service_consulte'
3911 softime 12654 && $type !== 'notification_tiers_consulte'
3912     && $type !== 'notification_depot_demat'
3913 softime 15037 && $type !== 'notification_commune'
3914     && $type !== 'notification_signataire') {
3915 softime 10808 //
3916     $type = 'notification_instruction';
3917     // Vérifie si l'instruction est un récépissé
3918 softime 12654 if ($this->is_instruction_recepisse()) {
3919     $type = 'notification_recepisse';
3920    
3921 softime 10808 }
3922     // Vérifie si l'instruction est une décision
3923     if ($type !== 'notification_recepisse') {
3924     $avis_decision = $this->getVal('avis_decision') !== null ? $this->getVal('avis_decision') : $this->valF['avis_decision'];
3925     if ($avis_decision !== null && $avis_decision !== '') {
3926     $type = 'notification_decision';
3927     }
3928     }
3929     }
3930 softime 14064 // Préparation des valeurs de la tâche
3931 softime 10808 $task_val = array(
3932     'type' => $type,
3933     'object_id' => $object_id,
3934     'dossier' => $dossier,
3935     'category' => $category,
3936     );
3937 softime 14064 // Préparation de la tache de notification
3938     $inst_task = $this->f->get_inst__om_dbform(array(
3939     "obj" => "task",
3940     "idx" => 0,
3941     ));
3942 softime 10808
3943     $add_task = $inst_task->add_task(array('val' => $task_val));
3944     if ($add_task === false) {
3945 softime 13528 $this->addToLog(
3946     sprintf(
3947     '%s(): %s %s : %s',
3948     __METHOD__,
3949     __('Echec de l\'ajout de la tâche de notification.'),
3950     __('Paramétrage de la tâche'),
3951     var_export($task_val, true)
3952     ),
3953     DEBUG_MODE
3954     );
3955 softime 10808 return false;
3956     }
3957    
3958     return true;
3959     }
3960    
3961 softime 10968 /**
3962 softime 12654 * Cette méthode permet de savoir si l'instruction est une instruction
3963     * de recepisse (instruction lié à l'ajout du dossier).
3964     *
3965     * Pour cela, on récupère la liste des actions qui ont menées à la création
3966     * de l'instruction. Si une de ces actions est lié à un objet "demande" on
3967     * en deduis que c'est l'ajout d'une demande qui a déclenché la création de
3968     * l'instruction et donc qu'il s'agit d'un recepisse.
3969     *
3970     * @return boolean
3971     */
3972     protected function is_instruction_recepisse() {
3973     // Récupère la liste des actions qui ont mené à la création de
3974     // l'instruction
3975     $trace = debug_backtrace();
3976     // Parcours la liste des actions et si une de ces actions est lié
3977     // à la classe demande on cosidère que l'instruction est un recepisse
3978     foreach ($trace as $key => $value) {
3979     if (isset($trace[$key]['class']) === true
3980     && empty($trace[$key]['class']) === false) {
3981     if (strtolower($trace[$key]['class']) === 'demande') {
3982     return true;
3983     }
3984     }
3985     }
3986     return false;
3987     }
3988    
3989     /**
3990 softime 10968 * A partir des informations passée en argument ajoute un nouvel élément
3991     * dans la table instruction_notification.
3992     * Avant l'ajout vérifie en utilisant l'id de la collectivité passée en
3993     * paramètre si le paramétrage attendus est ok.
3994     * Ajoute également un nouvel élement dans instruction_notification_document
3995     * si l'instruction possède une lettretype.
3996     * Si un identifiant d'une instruction annexe est donnée ajoute un deuxième
3997     * élement dans la table instruction_notification_document qui correspondra
3998     * à l'annexe de la notification.
3999     *
4000     * @param integer identifiant de l'instruction notifiée
4001     * @param string information concernant l'emetteur
4002     * @param array tableau contenant 2 entrées
4003     * - destinatire : nom, prenom ou raison sociale, dénomination et courriel
4004     * - courriel : adresse mail de la personne à notifier
4005     * @param integer identifiant de la collectivité permettant de récupèrer les
4006     * paramètres à valider
4007     * @param boolean indique si la notification est automatique ou manuelle
4008     * @param integer identifiant d'une instruction dont l'édition sera annexé
4009     * à la notification
4010     *
4011     * @return integer|boolean identifiant de la notification créée si le traitement
4012     * a réussie, false sinon.
4013     */
4014 softime 10869 protected function ajouter_notification(
4015     $idInstruction,
4016     $emetteur,
4017     $destinataire,
4018 softime 10968 $collectiviteId,
4019 softime 12433 $annexes = array(),
4020 softime 10968 $demandeAuto = false,
4021 softime 12124 $statut = 'en cours d\'envoi',
4022 softime 12433 $commentaire = 'Notification en cours de traitement'
4023 softime 10869 ) {
4024 softime 10968 // Vérification que les paramètres nécessaires à l'envoi de la notification existe avant
4025     // de créer la notification
4026     if (! $this->is_parametrage_notification_correct($collectiviteId)) {
4027 softime 13137 $msgErreur = __("Erreur de paramétrage. L'url d'accès au(x) document(s) notifié(s) n'est pas paramétrée.");
4028     $this->addToMessage($msgErreur);
4029 softime 13528 $this->addToLog(
4030     sprintf('%s() : %s', __METHOD__, $msgErreur),
4031     DEBUG_MODE
4032     );
4033 softime 10968 return false;
4034     }
4035 softime 10808 // Préparation de la notification
4036     $inst_notif = $this->f->get_inst__om_dbform(array(
4037     "obj" => "instruction_notification",
4038     "idx" => "]",
4039     ));
4040     $notif_val = array(
4041     'instruction_notification' => null,
4042     'instruction' => $idInstruction,
4043     'automatique' => $demandeAuto,
4044     'emetteur' => $emetteur,
4045     'date_envoi' => null,
4046 softime 10869 'destinataire' => $destinataire['destinataire'],
4047     'courriel' => $destinataire['courriel'],
4048 softime 10808 'date_premier_acces' => null,
4049 softime 12124 'statut' => $statut,
4050     'commentaire' => $commentaire
4051 softime 10808 );
4052    
4053     // Création de la notification
4054     $add_notif = $inst_notif->ajouter($notif_val);
4055     if ($add_notif === false) {
4056 softime 10968 $this->addToMessage(__("Erreur lors de la génération de la notification au(x) pétitionnaire(s)."));
4057 softime 13528 $this->addToLog(
4058     sprintf(
4059     '%s() : %s %s : %s',
4060     __METHOD__,
4061     __("Echec de l'ajout de la notification en base de données."),
4062     __('Paramétrage de la notification'),
4063     var_export($notif_val, true)
4064     ),
4065     DEBUG_MODE
4066     );
4067 softime 10808 return false;
4068     }
4069    
4070 softime 10869 // Si il y a une lettretype finalisé stockage de la clé d'accès au documents
4071     if ($this->evenement_has_an_edition($this->getVal('evenement')) === true) {
4072 softime 12433 $add_notif_doc = $this->ajouter_notification_document(
4073     $inst_notif->getVal($inst_notif->clePrimaire),
4074 softime 10869 $this->getVal($this->clePrimaire),
4075 softime 12433 'instruction'
4076 softime 10808 );
4077     if ($add_notif_doc === false) {
4078 softime 10968 $this->addToMessage(__("Erreur lors de la génération de la notification du document."));
4079 softime 10808 return false;
4080     }
4081 softime 10869 }
4082     // Si une annexe a été choisie stockage de la clé d'accès à l'annexe
4083 softime 12433 if (! empty($annexes) && is_array($annexes)) {
4084     $add_notif_annexe = $this->ajouter_notification_document_multiple(
4085 softime 10869 $inst_notif->getVal($inst_notif->clePrimaire),
4086 softime 12433 $annexes
4087 softime 10869 );
4088     if ($add_notif_annexe === false) {
4089 softime 10968 $this->addToMessage(__("Erreur lors de la génération de la notification de l'annexe."));
4090 softime 10869 return false;
4091     }
4092     }
4093 softime 10808
4094     // Renvoie l'id de la nouvelle instance de instruction_notification
4095     return $inst_notif->getVal($inst_notif->clePrimaire);
4096     }
4097    
4098     /**
4099 softime 11585 * Pour chaque élément du tableau passé en paramètre ajoute une nouvelle
4100     * instance dans la table instruction_notification_document lié a la
4101     * notification dont l'id est passé en paramètre.
4102     *
4103     * @param array tableau contenant les informations nécessaires pour créer les annexes
4104     *
4105     * @return integer|boolean identifiant de la notification créée si le traitement
4106     * a réussie, false sinon.
4107     */
4108     protected function ajouter_notification_document_multiple($idNotification, $listeDocument) {
4109 softime 12433 foreach ($listeDocument as $paramDoc) {
4110     if (! $this->ajouter_notification_document($idNotification, $paramDoc['id'], $paramDoc['tableDocument'], $paramDoc['isAnnexe'])) {
4111 softime 11585 $this->addToMessage(__("Erreur lors de la génération des documents à notifier."));
4112     return false;
4113     }
4114     }
4115     return true;
4116     }
4117    
4118     /**
4119     * Ajoute un élément dans la table instruction_notification_document en utilisant
4120     * les éléments fourni en paramètre
4121     *
4122     * @param integer $idNotification : id de la notification à laquelle on associe le document
4123     * @param integer $idDocument : id de l'objet auquel est rattaché le document
4124     * @param string $tableDocument : nom de la table a laquelle est rattaché le document
4125     * @param boolean $isAnnexe : indique si le document est une annexe ou pas
4126     *
4127     * @return boolean indique si le traitement a réussi
4128     */
4129     protected function ajouter_notification_document($idNotification, $idDocument, $tableDocument, $isAnnexe = false) {
4130     $inst_notif_doc = $this->f->get_inst__om_dbform(array(
4131     "obj" => "instruction_notification_document",
4132     "idx" => "]",
4133     ));
4134     // l'attribut instruction doit obligatoirement être renseigné
4135     // pour éviter toutes confusion avec d'autres instruction l'id
4136     // 0 est donné au document n'appartenant pas aux instructions
4137     $notif_doc_val = array(
4138     'instruction_notification_document' => null,
4139     'instruction_notification' => $idNotification,
4140     'instruction' => $tableDocument == 'instruction' ? $idDocument : 0,
4141     'document_type' => $tableDocument,
4142     'document_id' => $idDocument,
4143     'cle' => $this->getCleAccesDocument(),
4144     'annexe' => $isAnnexe
4145     );
4146    
4147     $add_notif_doc = $inst_notif_doc->ajouter($notif_doc_val);
4148     if ($add_notif_doc === false) {
4149 softime 13528 $this->addToLog(
4150     sprintf(
4151     '%s() : %s %s : %s',
4152     __METHOD__,
4153     __('Echec de l\'ajout du paramétrage du document notifié en base de données.'),
4154     __('Paramétrage du document'),
4155     var_export($notif_doc_val, true)
4156     ),
4157     DEBUG_MODE
4158     );
4159 softime 11585 return false;
4160     }
4161     return true;
4162     }
4163    
4164     /**
4165 softime 10968 * Vérifie si le paramétrage de la notification des demandeurs est correct.
4166     *
4167     * @param integer identifiant de la collectivité
4168     * @return boolean
4169     */
4170     protected function is_parametrage_notification_correct($collectiviteId) {
4171     $categorie = $this->f->get_param_option_notification($collectiviteId);
4172     $urlAccesNotif = $this->f->get_parametre_notification_url_acces($collectiviteId);
4173 softime 14064 if ($categorie === 'mail' && $urlAccesNotif === null) {
4174 softime 10968 return false;
4175     }
4176     return true;
4177     }
4178    
4179     /**
4180 softime 8989 * TRIGGER - triggermodifierapres.
4181     *
4182     * @return boolean
4183     */
4184     function triggermodifierapres($id, &$dnu1 = null, $val = array(), $dnu2 = null) {
4185     $this->addToLog(__METHOD__."(): start", EXTRA_VERBOSE_MODE);
4186 softime 10808 $collectivite_di = $this->get_dossier_instruction_om_collectivite($val['dossier']);
4187     $message = '';
4188 mbroquet 3730
4189 softime 13137 // Définit si le dossier d'instruction doit être mis à jour
4190     $update_dossier = true;
4191     // Les actions de mise à jour des dates ne doivent pas appliquer
4192     // l'action de l'événement et donc ne pas mettre à jour le dossier
4193     if ($this->getParameter("maj") == 125
4194     || $this->getParameter("maj") == 170
4195     || $this->getParameter("maj") == 175) {
4196     $update_dossier = false;
4197     }
4198    
4199     // Traitement en cas de mise à jour du dossier
4200     if ($update_dossier === true) {
4201     /**
4202     * L'objectif ici est d'effectuer les recalculs de date dans le dossier
4203     * si la date de l'evenement est modifiee
4204     */
4205     // Initialisation
4206     $valF = array();
4207     $valF_dt = array();
4208     // Initialisation du type d'événement
4209     $type_evmt = "";
4210     // Récupération de l'action correspondante à l'événement
4211 softime 14064 $evenement = $this->f->get_inst__om_dbform(array(
4212     "obj" => "evenement",
4213     "idx" => $this->valF['evenement']
4214     ));
4215 softime 13137
4216     // Récupération des paramètres de l'action
4217 softime 14542 // TODO : remplacer cette requête par l'instanciation de l'action
4218     $qres = $this->f->get_all_results_from_db_query(
4219     sprintf(
4220     'SELECT
4221     *
4222     FROM
4223     %1$saction
4224     WHERE
4225     action = \'%2$s\'',
4226     DB_PREFIXE,
4227     $this->f->db->escapeSimple($evenement->getVal('action'))
4228     ),
4229     array(
4230     "origin" => __METHOD__
4231     )
4232 softime 14064 );
4233 softime 14542 foreach ($qres['result'] as $row) {
4234 softime 13137 // application des regles sur le courrier + delai
4235     if(preg_match("/date_evenement/",$row['regle_date_limite'])){
4236     $valF['date_limite']= $this->regle($row['regle_date_limite'], 'regle_date_limite');
4237     }
4238     if(preg_match("/date_evenement/",$row['regle_date_complet'])){
4239     $valF['date_complet']= $this->regle($row['regle_date_complet'], 'regle_date_complet');
4240     }
4241     if(preg_match("/date_evenement/",$row['regle_date_dernier_depot'])){
4242     $valF['date_dernier_depot']= $this->regle($row['regle_date_dernier_depot'], 'regle_date_dernier_depot');
4243     }
4244     if(preg_match("/date_evenement/",$row['regle_date_notification_delai'])){
4245     $valF['date_notification_delai']= $this->regle($row['regle_date_notification_delai'], 'regle_date_notification_delai');
4246     }
4247     if(preg_match("/date_evenement/",$row['regle_date_decision'])){
4248     $valF['date_decision']= $this->regle($row['regle_date_decision'], 'regle_date_decision');
4249     }
4250     if(preg_match("/date_evenement/",$row['regle_date_rejet'])){
4251     $valF['date_rejet']= $this->regle($row['regle_date_rejet'], 'regle_date_rejet');
4252     }
4253     if(preg_match("/date_evenement/",$row['regle_date_validite'])){
4254     $valF['date_validite']= $this->regle($row['regle_date_validite'], 'regle_date_validite');
4255     }
4256     if(preg_match("/date_evenement/",$row['regle_date_chantier'])){
4257     $valF['date_chantier']= $this->regle($row['regle_date_chantier'], 'regle_date_chantier');
4258     }
4259     if(preg_match("/date_evenement/",$row['regle_date_achevement'])){
4260     $valF['date_achevement']= $this->regle($row['regle_date_achevement'], 'regle_date_achevement');
4261     }
4262     if(preg_match("/date_evenement/",$row['regle_date_conformite'])){
4263     $valF['date_conformite']= $this->regle($row['regle_date_conformite'], 'regle_date_conformite');
4264     }
4265     if(preg_match("/date_evenement/",$row['regle_date_cloture_instruction'])){
4266     $valF['date_cloture_instruction']= $this->regle($row['regle_date_cloture_instruction'], 'regle_date_cloture_instruction');
4267     }
4268     if(preg_match("/date_evenement/",$row['regle_date_premiere_visite'])){
4269     $valF['date_premiere_visite']= $this->regle($row['regle_date_premiere_visite'], 'regle_date_premiere_visite');
4270     }
4271     if(preg_match("/date_evenement/",$row['regle_date_derniere_visite'])){
4272     $valF['date_derniere_visite']= $this->regle($row['regle_date_derniere_visite'], 'regle_date_derniere_visite');
4273     }
4274     if(preg_match("/date_evenement/",$row['regle_date_contradictoire'])){
4275     $valF['date_contradictoire']= $this->regle($row['regle_date_contradictoire'], 'regle_date_contradictoire');
4276     }
4277     if(preg_match("/date_evenement/",$row['regle_date_retour_contradictoire'])){
4278     $valF['date_retour_contradictoire']= $this->regle($row['regle_date_retour_contradictoire'], 'regle_date_retour_contradictoire');
4279     }
4280     if(preg_match("/date_evenement/",$row['regle_date_ait'])){
4281     $valF['date_ait']= $this->regle($row['regle_date_ait'], 'regle_date_ait');
4282     }
4283     if(preg_match("/date_evenement/",$row['regle_date_transmission_parquet'])){
4284     $valF['date_transmission_parquet']= $this->regle($row['regle_date_transmission_parquet'], 'regle_date_transmission_parquet');
4285     }
4286     if ($row['regle_donnees_techniques1'] !== '') {
4287     $valF_dt[$row['cible_regle_donnees_techniques1']] = $this->regle($row['regle_donnees_techniques1'], 'regle_donnees_techniques1');
4288     }
4289     if ($row['regle_donnees_techniques2'] !== '') {
4290     $valF_dt[$row['cible_regle_donnees_techniques2']] = $this->regle($row['regle_donnees_techniques2'], 'regle_donnees_techniques2');
4291     }
4292     if ($row['regle_donnees_techniques3'] !== '') {
4293     $valF_dt[$row['cible_regle_donnees_techniques3']] = $this->regle($row['regle_donnees_techniques3'], 'regle_donnees_techniques3');
4294     }
4295     if ($row['regle_donnees_techniques4'] !== '') {
4296     $valF_dt[$row['cible_regle_donnees_techniques4']] = $this->regle($row['regle_donnees_techniques4'], 'regle_donnees_techniques4');
4297     }
4298     if ($row['regle_donnees_techniques5'] !== '') {
4299     $valF_dt[$row['cible_regle_donnees_techniques5']] = $this->regle($row['regle_donnees_techniques5'], 'regle_donnees_techniques5');
4300     }
4301     if ($row['regle_dossier_instruction_type'] !== '') {
4302     $valF['dossier_instruction_type'] = $this->regle($row['regle_dossier_instruction_type'], 'regle_dossier_instruction_type');
4303     }
4304 mbroquet 3730 }
4305 softime 13137 // Si des valeurs de données techniques ont été calculées alors on met à jour l'enregistrement
4306     if (count($valF_dt) > 0) {
4307     $dt_id = $this->getDonneesTechniques();
4308     // On met à jour le dossier
4309     $cle = " donnees_techniques='".$dt_id."'";
4310     $res1 = $this->f->db->autoExecute(DB_PREFIXE.'donnees_techniques', $valF_dt, DB_AUTOQUERY_UPDATE, $cle);
4311     $this->addToLog(
4312     __METHOD__."(): db->autoexecute(\"".DB_PREFIXE."donnees_techniques\", ".print_r($valF_dt, true).", DB_AUTOQUERY_UPDATE, \"".$cle."\");",
4313     VERBOSE_MODE
4314     );
4315     $this->f->isDatabaseError($res1);
4316     // Affichage d'informations à l'utilisateur
4317     $this->addToMessage(_('enregistrement')." ".$this->valF['dossier']." "._('table')." dossier [".$this->f->db->affectedRows()." "._('enregistrement')." "._('mis_a_jour')."]");
4318 mbroquet 3730 }
4319 softime 13137 // Si des valeurs ont été calculées alors on met à jour l'enregistrement
4320     if (count($valF) > 0) {
4321     $inst_dossier = $this->f->get_inst__om_dbform(array(
4322     "obj" => "dossier",
4323     "idx" => $this->valF['dossier'],
4324     ));
4325     $valF['instruction'] = $id;
4326     $valF['crud'] = 'update';
4327     $update_by_instruction = $inst_dossier->update_by_instruction($valF);
4328     if ($update_by_instruction === false) {
4329     $this->cleanMessage();
4330     $this->addToMessage(sprintf('%s %s', __("Une erreur s'est produite lors de la mise à jour du dossier d'instruction."), __("Veuillez contacter votre administrateur.")));
4331     return false;
4332     }
4333     // Affichage d'informations à l'utilisateur
4334     $this->addToMessage(_('enregistrement')." ".$this->valF['dossier']." "._('table')." dossier [".$this->f->db->affectedRows()." "._('enregistrement')." "._('mis_a_jour')."]");
4335 mbroquet 3730 }
4336     }
4337    
4338 softime 14064 // Par défaut les instructions à ajouter suite à la saisie d'une date
4339     // de retour signature ou de notification, utilisent l'action 0
4340     // Si la création d'événement d'instruction suivant est déclenchée par
4341     // une notification suite au traitement d'une tâche (démat') alors l'ajout
4342     // de la nouvelle instruction se fait avec l'action 176
4343     // Cela permet de ne pas contrôler la restriction lors de l'ajout de la
4344     // nouvelle instruction, depuis la méthode verifier()
4345     $code_action_add = 0;
4346     if ($this->getParameter("maj") == 175) {
4347     $code_action_add = 176;
4348     }
4349 mbroquet 3730 $restriction = $this->get_restriction($val['evenement']);
4350     $this->restriction_valid = $this->restrictionIsValid($restriction);
4351    
4352     if($restriction == "" || $this->restriction_valid ){
4353     // Récupération de tous les paramètres de l'événement sélectionné
4354 softime 14542 // TODO : remplacer cette requête par l'instanciation de l'evenement
4355     $qres = $this->f->get_all_results_from_db_query(
4356     sprintf(
4357     'SELECT
4358     *
4359     FROM
4360     %1$sevenement
4361     WHERE
4362     evenement = %2$d',
4363     DB_PREFIXE,
4364     intval($this->valF['evenement'])
4365     ),
4366     array(
4367     "origin" => __METHOD__
4368     )
4369     );
4370 nmeucci 3965 $current_id = $this->getVal($this->clePrimaire);
4371 softime 14542 foreach ($qres['result'] as $row) {
4372 mbroquet 3730 // Si la date de retour signature est éditée on vérifie si il existe un événement automatique
4373     if ($this->getVal('date_retour_signature') == "" AND
4374     $this->valF['date_retour_signature'] != "" AND
4375     $row['evenement_retour_signature'] != "") {
4376 softime 7996 $new_instruction = $this->f->get_inst__om_dbform(array(
4377     "obj" => "instruction",
4378     "idx" => "]",
4379     ));
4380 mbroquet 3730 // Création d'un tableau avec la liste des champs de l'instruction
4381     foreach($new_instruction->champs as $champ) {
4382     $valNewInstr[$champ] = "";
4383     }
4384     // Définition des valeurs de la nouvelle instruction
4385     $valNewInstr["evenement"] = $row['evenement_retour_signature'];
4386     $valNewInstr["destinataire"] = $this->valF['destinataire'];
4387     $valNewInstr["dossier"] = $this->valF['dossier'];
4388     $valNewInstr["date_evenement"] = $this->f->formatDate($this->valF['date_retour_signature']);
4389     $valNewInstr["date_envoi_signature"] = $this->f->formatDate($this->valF['date_envoi_signature']);
4390     $valNewInstr["date_retour_signature"] = $this->f->formatDate($this->valF['date_retour_signature']);
4391     $valNewInstr["date_envoi_rar"] = $this->f->formatDate($this->valF['date_envoi_rar']);
4392     $valNewInstr["date_retour_rar"] = $this->f->formatDate($this->valF['date_retour_rar']);
4393     $valNewInstr["date_envoi_controle_legalite"] = $this->f->formatDate($this->valF['date_envoi_controle_legalite']);
4394     $valNewInstr["date_retour_controle_legalite"] = $this->f->formatDate($this->valF['date_retour_controle_legalite']);
4395 softime 14064 $new_instruction->setParameter("maj", $code_action_add);
4396     $new_instruction->class_actions[$code_action_add]["identifier"] =
4397 softime 13528 sprintf(
4398     __("Ajout suite au retour signature de l'instruction %s"),
4399     $current_id
4400     );
4401 softime 8989 $retour = $new_instruction->ajouter($valNewInstr);
4402 mbroquet 3730
4403     //Si une erreur s'est produite et qu'il s'agit d'un problème
4404     //de restriction
4405     if ($retour == false && !$new_instruction->restriction_valid){
4406     $error_message = $this->get_restriction_error_message($restriction);
4407     $this->f->displayMessage("error", $error_message);
4408 softime 8989 $this->addToLog(__METHOD__."(): evenement retour ".
4409 mbroquet 3730 "instruction ".$this->valF[$this->clePrimaire]." : ".
4410     $new_instruction->msg);
4411     }
4412     //Si une erreur s'est produite après le test de la restriction
4413     elseif ($retour == false && $new_instruction->restriction_valid){
4414     $this->correct = false ;
4415     $this->msg .= $new_instruction->msg;
4416     return false;
4417     }
4418     }
4419     // Si la date de retour AR est éditée on vérifie si il existe un événement automatique
4420     if ($this->getVal('date_retour_rar') == "" AND
4421     $this->valF['date_retour_rar'] != "") {
4422    
4423     if($row['evenement_retour_ar'] != "") {
4424 softime 7996 $new_instruction = $this->f->get_inst__om_dbform(array(
4425     "obj" => "instruction",
4426     "idx" => "]",
4427     ));
4428 mbroquet 3730 // Création d'un tableau avec la liste des champs de l'instruction
4429     foreach($new_instruction->champs as $champ) {
4430     $valNewInstr[$champ] = "";
4431     }
4432     // Définition des valeurs de la nouvelle instruction
4433     $valNewInstr["evenement"] = $row['evenement_retour_ar'];
4434     $valNewInstr["destinataire"] = $this->valF['destinataire'];
4435     $valNewInstr["dossier"] = $this->valF['dossier'];
4436     $valNewInstr["date_evenement"] = $this->f->formatDate($this->valF['date_retour_rar']);
4437     $valNewInstr["date_envoi_signature"] = $this->f->formatDate($this->valF['date_envoi_signature']);
4438     $valNewInstr["date_retour_signature"] = $this->f->formatDate($this->valF['date_retour_signature']);
4439     $valNewInstr["date_envoi_rar"] = $this->f->formatDate($this->valF['date_envoi_rar']);
4440     $valNewInstr["date_retour_rar"] = $this->f->formatDate($this->valF['date_retour_rar']);
4441     $valNewInstr["date_envoi_controle_legalite"] = $this->f->formatDate($this->valF['date_envoi_controle_legalite']);
4442     $valNewInstr["date_retour_controle_legalite"] = $this->f->formatDate($this->valF['date_retour_controle_legalite']);
4443 softime 14064 $new_instruction->setParameter("maj", $code_action_add);
4444     $new_instruction->class_actions[$code_action_add]["identifier"] =
4445 softime 13137 sprintf(__("Ajout suite à la notification de l'instruction %s"), $current_id);
4446 softime 8989 $retour = $new_instruction->ajouter($valNewInstr);
4447 mbroquet 3730
4448     //Si une erreur s'est produite et qu'il s'agit d'un problème
4449     //de restriction
4450     if ($retour == false && !$new_instruction->restriction_valid) {
4451     $error_message = $this->get_restriction_error_message($restriction);
4452     $this->f->displayMessage("error", $error_message);
4453     $this->addToLog(
4454 softime 8989 __METHOD__."(): evenement retour instruction ".
4455 mbroquet 3730 $this->valF[$this->clePrimaire]." : ".
4456     $new_instruction->msg
4457     );
4458     }
4459     //Si une erreur s'est produite après le test de la restriction
4460     elseif ($retour == false && $new_instruction->restriction_valid){
4461     $this->correct = false ;
4462     $this->msg .= $new_instruction->msg;
4463     return false;
4464     }
4465     }
4466     }
4467     }
4468     }
4469    
4470 softime 13137 // Traitement en cas de mise à jour du dossier
4471     if ($update_dossier === true) {
4472     /**
4473     * Mise à jour de la date de dernière modification du dossier
4474     * d'instruction
4475     */
4476     $inst_di = $this->get_inst_dossier($this->getVal('dossier'));
4477     $inst_di->update_last_modification_date();
4478 softime 8640
4479 softime 13137 // Mise à jour des données du dossier d'autorisation
4480     $da = $this->f->get_inst__om_dbform(array(
4481     "obj" => "dossier_autorisation",
4482     "idx" => $this->getNumDemandeAutorFromDossier($this->valF['dossier']),
4483     ));
4484     $params = array(
4485     'di_id' => $this->getVal('dossier'),
4486     );
4487     if($da->majDossierAutorisation($params) === false) {
4488     $this->addToMessage(_("Erreur lors de la mise a jour des donnees du dossier d'autorisation. Contactez votre administrateur."));
4489     $this->correct = false;
4490     return false;
4491     }
4492 mbroquet 3730 }
4493 softime 7996
4494 softime 10573 // mise à jour des métadonnées issues des dates de suivi
4495     $dateRetourSignatureModified = ($this->valF['date_retour_signature'] != $this->getVal('date_retour_signature'));
4496     $dateRetourRARModified = ($this->valF['date_retour_rar'] != $this->getVal('date_retour_rar'));
4497     if ($dateRetourSignatureModified || $dateRetourRARModified) {
4498    
4499     // Calculs des nouvelles métadonnées
4500     $metadata = $this->getMetadata("om_fichier_instruction");
4501    
4502     // On vérifie si l'instruction à finaliser a un événement de type arrete
4503 softime 14064 // TODO : A voir pour remplacer par une instanciation de l'événement.
4504     // Voir également si l'événement ne dois pas être instancié en début de
4505     // méthode pour pouvoir être réutilisé.
4506     $qres = $this->f->get_one_result_from_db_query(
4507     sprintf(
4508     'SELECT
4509     type
4510     FROM
4511     %1$sevenement
4512     WHERE
4513     evenement = \'%2$d\'',
4514     DB_PREFIXE,
4515     intval($this->getVal("evenement"))
4516     ),
4517     array(
4518     "origin" => __METHOD__,
4519     "force_return" => true,
4520     )
4521     );
4522    
4523     if ($qres["code"] !== "OK") {
4524 softime 10573 $this->correct = false;
4525     $this->addToMessage(__("Erreur de traitement de fichier."));
4526 softime 14064 $this->addToLog(__METHOD__."() erreur BDD: ".var_export($qres['message'], true), DEBUG_MODE);
4527 softime 10573 return false;
4528     }
4529    
4530     // Si l'événement est de type arrete, on ajoute les métadonnées spécifiques
4531 softime 14064 if ($qres['result'] == 'arrete'){
4532 softime 10573 $metadata = array_merge($metadata, $this->getMetadata("arrete"));
4533     }
4534    
4535     // Filtre pour conserver uniquement les métadonnées liées aux dates
4536     $metadataToKeep = array(
4537     "statutAutorisation",
4538     "dateEvenementDocument",
4539     'date_cloture_metier',
4540     "NotificationArrete",
4541     "dateNotificationArrete",
4542     "controleLegalite",
4543     "dateSignature",
4544     "nomSignataire",
4545     "qualiteSignataire",
4546     "dateControleLegalite",
4547     );
4548     $metadata = array_filter(
4549     $metadata,
4550     function($key) use ($metadataToKeep) { return in_array($key, $metadataToKeep); },
4551     ARRAY_FILTER_USE_KEY
4552     );
4553    
4554     // Mise à jour des métadonnées du document en GED
4555     $docUid = $this->getVal("om_fichier_instruction");
4556     $operationOrUID = $this->f->storage->update_metadata($docUid, $metadata);
4557     if ($operationOrUID == 'OP_FAILURE') {
4558     $this->correct = false;
4559     $this->addToMessage(__("Erreur de traitement de fichier."));
4560     $this->addToLog(__METHOD__."() failed to update metadata: ".var_export($operationOrUID, true), DEBUG_MODE);
4561     return false;
4562     }
4563    
4564     // mise à jour de l'UID du document en BDD
4565     else {
4566     $valF = array('om_fichier_instruction' => $operationOrUID);
4567     $res = $this->f->db->autoExecute(DB_PREFIXE.$this->table, $valF, DB_AUTOQUERY_UPDATE, $this->getCle($id));
4568     $this->addToLog(__METHOD__.'() : db->autoExecute("'.DB_PREFIXE.$this->table.'", '.print_r($valF, true).', DB_AUTOQUERY_UPDATE, "'.$this->getCle($id).'")', VERBOSE_MODE);
4569     if ($this->f->isDatabaseError($res, true) === true) {
4570     $this->correct = false;
4571     $this->addToMessage(__("Erreur de traitement de fichier."));
4572     $this->addToLog(__METHOD__."() erreur BDD: ".var_export($res->getMessage(), true), DEBUG_MODE);
4573     return false;
4574     }
4575     $this->addToMessage(__("La mise a jour du document s'est effectuee avec succes."));
4576     }
4577     }
4578    
4579 softime 13137 // Déclenchement des notifications automatique après finalisation et
4580     // retour de signature
4581 softime 10808 if ($dateRetourSignatureModified === true
4582     && $this->valF['date_retour_signature'] !== ''
4583     && $this->valF['date_retour_signature'] !== null) {
4584 softime 13137
4585     // Message à afficher dans les logs pour indiquer quelle notification a échouée
4586 softime 13528 $msgLog = sprintf(
4587     '%s %s : %d',
4588     __('Erreur lors de la notification automatique du(des) pétitionnaire(s) après retour signature.'),
4589     __('Instruction notifiée'),
4590     $id
4591     );
4592 softime 13137
4593     // Récupération de l'instance de l'événement pour accéder au paramètrage
4594     // des notifications
4595 softime 10808 $ev = $this->get_inst_evenement($this->valF['evenement']);
4596 softime 13137 // Si la notification automatique des tiers consulté est active
4597     // déclenche le traitement de notification.
4598     // Ce traitement va envoyer des courriels de notification à tous les tiers concernés
4599     $typeNotifTiers = $ev->getVal('notification_tiers');
4600     $inst_di = $this->get_inst_dossier($this->getVal('dossier'));
4601     if ($typeNotifTiers === 'notification_automatique') {
4602     if ($this->traitement_notification_automatique_tiers_consulte($ev, $inst_di) === false) {
4603     $this->addToMessage(__('Le traitement de la notification automatique de tiers à échoué.'));
4604     $this->correct = false;
4605     }
4606     }
4607    
4608 softime 10808 if ($ev->getVal('notification') === 'notification_auto_signature_requise') {
4609     // Récupération de la liste des demandeurs à notifier et de la catégorie
4610     $categorie = $this->f->get_param_option_notification($collectivite_di);
4611 softime 14064 $isPortal = $categorie === PORTAL;
4612 softime 10869 $demandeursANotifie = $this->get_demandeurs_notifiable(
4613     $this->valF['dossier'],
4614     $isPortal
4615     );
4616 softime 10808
4617     // Création d'une notification et d'une tâche pour chaque demandeur à notifier
4618 softime 12124 $demandeurPrincipalNotifie = false;
4619 softime 10808 foreach ($demandeursANotifie as $demandeur) {
4620 softime 12124 // Identifie si le demandeur principal a été notifié ou pas
4621     // et récupère ses informations
4622     if ($demandeur['petitionnaire_principal'] == 't') {
4623     $demandeurPrincipalNotifie = true;
4624     // Si le demandeur principal est notifiable mais qu'il y a des erreurs dans
4625     // son paramétrage, on effectue pas le traitement et on passe à l'itération
4626     // suivante. On le considère également comme non notifié pour gérer l'envoie
4627     // des messages d'erreurs
4628     // Si la demande a été déposée via le portail alors le paramétrage n'a pas
4629     // d'impact sur la notification
4630     $erreursParam = $this->get_info_notification_fail();
4631     if (! $this->dossier_depose_sur_portail() && $erreursParam != array()) {
4632     $demandeurPrincipalNotifie = false;
4633     continue;
4634     }
4635     }
4636 softime 10808 // Ajout de la notif et récupération de son id
4637     $idNotif = $this->ajouter_notification(
4638     $this->valF[$this->clePrimaire],
4639     $this->f->get_connected_user_login_name(),
4640 softime 10968 $demandeur,
4641     $collectivite_di,
4642 softime 12433 array(),
4643 softime 10968 true
4644 softime 10808 );
4645     if ($idNotif === false) {
4646 softime 13528 $this->addToLog(
4647     sprintf('%s() : %s',__METHOD__, $msgLog),
4648     DEBUG_MODE
4649     );
4650 softime 10808 return false;
4651     }
4652     // Création de la tache en lui donnant l'id de la notification
4653     $notification_by_task = $this->notification_by_task(
4654     $idNotif,
4655     $this->valF['dossier'],
4656     $categorie
4657     );
4658     if ($notification_by_task === false) {
4659 softime 13528 $this->addToLog(
4660     sprintf('%s() : %s',__METHOD__, $msgLog),
4661     DEBUG_MODE
4662     );
4663 softime 10808 $this->addToMessage(
4664     __("Erreur lors de la génération de la notification au(x) pétitionnaire(s).")
4665     );
4666     return false;
4667     }
4668     }
4669 softime 12847 // Pour la notification par mail ou la notification via portal si le dossier a
4670     // été déposés via portal, si le demandeur principal n'est pas notifiable,
4671     // on créé une nouvelle notification en erreur avec en commentaire la raison pour
4672     // laquelle le demandeur principal n'a pas pu être notifié
4673     $depotPortal = $this->dossier_depose_sur_portail();
4674     if (! $demandeurPrincipalNotifie && ($isPortal === false || $depotPortal === true)) {
4675 softime 13137 // Précise dans les logs que le pétitionnaire principal n'a pas été notifié
4676 softime 13528 $msgLog .= sprintf(' %s', __('Le pétitionnaire principale n\'est pas notifiable.'));
4677 softime 12124 // Analyse pour savoir pourquoi le demandeur principal n'est pas notifiable
4678     $erreursParam = $this->get_info_notification_fail();
4679     $demandeurPrincipal = $this->get_info_petitionnaire_principal_dossier($this->getVal('dossier'));
4680     // Ajout de la notif et récupération de son id
4681     $idNotif = $this->ajouter_notification(
4682     $this->valF[$this->clePrimaire],
4683     $this->f->get_connected_user_login_name(),
4684     $demandeurPrincipal,
4685     $collectivite_di,
4686 softime 12433 array(),
4687 softime 12124 true,
4688     'Echec',
4689     implode(' ', $erreursParam)
4690     );
4691     if ($idNotif === false) {
4692 softime 13528 $this->addToLog(
4693     sprintf('%s() : %s', __METHOD__, $msgLog),
4694     DEBUG_MODE
4695     );
4696 softime 12124 $this->addToMessage(
4697     __('Erreur : la création de la notification a échouée.').
4698     __("Veuillez contacter votre administrateur.")
4699     );
4700     return false;
4701     }
4702     // Prépare un message d'alerte à destination de l'instructeur pour l'informer
4703     // de l'échec de la notification
4704     $dossier_message = $this->get_inst_dossier_message(0);
4705     $dossier_message_val = array(
4706     'dossier' => $this->getVal('dossier'),
4707     'type' => _('erreur expedition'),
4708     'emetteur' => $this->f->get_connected_user_login_name(),
4709     'login' => $_SESSION['login'],
4710     'date_emission' => date('Y-m-d H:i:s'),
4711     'contenu' => _('Échec lors de la notification de l\'instruction ').
4712     $ev->getVal('libelle').
4713     '.<br>'.
4714     implode("\n", $erreursParam).
4715     '<br>'.
4716     _('Veuillez corriger ces informations avant de renvoyer la notification.')
4717     );
4718     $add = $dossier_message->add_notification_message($dossier_message_val, true);
4719     // Si une erreur se produit pendant l'ajout
4720     if ($add !== true) {
4721 softime 13528 $this->addToLog(
4722     sprintf(
4723     '%s() : %s',
4724     __METHOD__,
4725     __("Le message d'alerte concernant l'echec de l'envoi de la notification n'a pas pu être envoyé.")
4726     ),
4727     DEBUG_MODE
4728     );
4729 softime 12124 return false;
4730     }
4731     }
4732 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.")));
4733     }
4734     }
4735    
4736 nmeucci 3933 return $this->add_log_to_dossier($id, $val);
4737 fmichon 4708 }
4738 mbroquet 3730
4739 softime 8989 /**
4740     * TRIGGER - triggersupprimer.
4741     *
4742     * @return boolean
4743     */
4744     function triggersupprimer($id, &$dnu1 = null, $val = array(), $dnu2 = null) {
4745     $this->addToLog(__METHOD__."(): start", EXTRA_VERBOSE_MODE);
4746 mbroquet 3730 /**
4747     * L'objectif ici est de repositionner les valeurs récupérées en
4748     * archive dans le dossier d'instruction avant de supprimer l'événement
4749 softime 10573 * d'instruction si les valeurs du dossier sont différentes
4750 mbroquet 3730 */
4751 softime 10573 $valF = array();
4752     $inst_di = $this->get_inst_dossier($this->getVal('dossier'));
4753     foreach ($inst_di->champs as $key => $champ) {
4754     // Si le champ du DI à une archive dans l'instruction
4755     if (isset($val[sprintf('archive_%s', $champ)]) === true) {
4756     // Si la valeur entre le champ du DI et son archive dans instruction
4757     // est différente
4758     if ($inst_di->getVal($champ) !== $val[sprintf('archive_%s', $champ)]) {
4759     $val[sprintf('archive_%s', $champ)] === '' ? $valF[$champ] = null : $valF[$champ] = $val[sprintf('archive_%s', $champ)];
4760 softime 15037 // Gestion du cas particulier 'accord_tacite' pour renvoyer la valeur ' ' (3 espaces vides) au lieu de null
4761     // Car les valeurs possibles du champ accord_tacite sont : 'Oui', 'Non' ou ' '
4762     if ($champ === "accord_tacite" && $valF[$champ] === null) {
4763     $valF[$champ] = ' ';
4764     }
4765 softime 10573 }
4766     }
4767 softime 5024 }
4768 softime 10573 // Spécificité du champ avis_decision dont le champ archive est nommé
4769     // différemment
4770     if ($inst_di->getVal('avis_decision') !== $val['archive_avis']) {
4771     $val['archive_avis'] === '' ? $valF['avis_decision'] = null : $valF['avis_decision'] = $val['archive_avis'];
4772 softime 5024 }
4773 softime 10573 // Spécificité de la date d'affichage dont la valeur n'ai jamais modifiée
4774     // par l'archive
4775     unset($valF['date_affichage']);
4776 softime 6565
4777 softime 9245 /**
4778     * Mise à jour de la version de clôture *version_clos* du dossier si et
4779     * seulement si l'instruction met à jour l'état du dossier.
4780     */
4781 softime 10573 if (isset($valF['etat']) === true
4782     && $valF['etat'] !== null
4783 softime 9245 && $valF['etat'] !== '') {
4784 softime 10573 // Récupère l'état actuel du dossier d'instruction
4785     $inst_current_etat = $this->f->get_inst__om_dbform(array(
4786     "obj" => "etat",
4787     "idx" => $inst_di->get_id_etat(),
4788     ));
4789 softime 9245 // Instanciation de l'état archivé appliqué sur le dossier
4790     $inst_etat = $this->f->get_inst__om_dbform(array(
4791     "obj" => "etat",
4792     "idx" => $valF['etat'],
4793     ));
4794     //
4795     $update_version_clos = null;
4796     // En cas de clôture du dossier par l'état archivé
4797     if ($inst_etat->getVal('statut') === 'cloture') {
4798     $update_version_clos = $inst_di->update_version_clos('up');
4799     }
4800     // En cas de réouverture du dossier par l'état archivé
4801     if ($inst_current_etat->getVal('statut') === 'cloture'
4802     && $inst_etat->getVal('statut') !== 'cloture') {
4803     //
4804     $update_version_clos = $inst_di->update_version_clos('down');
4805     //
4806     $this->set_att_di_reopened(true);
4807     }
4808     //
4809     if ($update_version_clos === false) {
4810     $this->f->addToLog(sprintf(
4811     "%s() : ERREUR - %s %s",
4812     __METHOD__,
4813     sprintf(
4814     __("Impossible de mettre à jour la version de clôture du dossier d'instruction %s."),
4815     $inst_di->getVal($inst_di->clePrimaire)
4816     ),
4817     sprintf(
4818     __("L'instruction tente d'appliquer l'état %s."),
4819     $inst_etat->getVal($inst_etat->clePrimaire)
4820     )
4821     ));
4822     $this->addToMessage(sprintf(
4823     "%s %s",
4824     __("Erreur lors de la mise à jour de la version de clôture du dossier d'instruction."),
4825     __("Veuillez contacter votre administrateur.")
4826     ));
4827     return false;
4828     }
4829     }
4830 softime 10808 // On supprime toutes les notications liées à l'instruction
4831 softime 12654 $notifASupprimer = $this->get_instruction_notification(
4832     $this->getVal($this->clePrimaire),
4833     array(
4834     'notification_recepisse',
4835     'notification_instruction',
4836     'notification_decision',
4837     'notification_service_consulte',
4838     'notification_tiers_consulte',
4839 softime 13137 'notification_depot_demat',
4840 softime 15037 'notification_commune',
4841     'notification_signataire'
4842 softime 12654 ),
4843     true
4844     );
4845    
4846 softime 10808 foreach ($notifASupprimer as $idNotif) {
4847     $inst_notif = $this->f->get_inst__om_dbform(array(
4848     "obj" => "instruction_notification",
4849     "idx" => $idNotif,
4850     ));
4851     $val_notif = array();
4852     foreach ($inst_notif->champs as $champ) {
4853     $val_notif[$champ] = $inst_notif->getVal($champ);
4854     }
4855     // La suppression des notifications entrainera la suppression des tâches qui y sont
4856     // liées
4857     $supprNotif = $inst_notif->supprimer($val_notif);
4858     if ($supprNotif == false) {
4859     $this->addToMessage(sprintf(
4860     "%s %s",
4861     __("Erreur lors de la suppression des notifications de l'instruction."),
4862     __("Veuillez contacter votre administrateur.")
4863     ));
4864     return false;
4865     }
4866     }
4867 softime 9245
4868 softime 10573 // On met à jour le dossier
4869     $valF['instruction'] = $id;
4870 softime 10968 $valF['crud'] = 'delete';
4871 softime 10573 $update_by_instruction = $inst_di->update_by_instruction($valF);
4872     if ($update_by_instruction === false) {
4873     $this->cleanMessage();
4874     $this->addToMessage(sprintf('%s %s', __("Une erreur s'est produite lors de la mise à jour du dossier d'instruction."), __("Veuillez contacter votre administrateur.")));
4875     return false;
4876     }
4877    
4878 softime 5024 // Affichage d'informations à l'utilisateur
4879 softime 8989 $this->addToMessage(_("Suppression de l'instruction")." [".$this->f->db->affectedRows()." "._('enregistrement')." "._('mis_a_jour')."]");
4880 softime 5024
4881     // Mise à jour de la demande si un récépissé d'instruction correspond à l'instruction à supprimer
4882 mbroquet 3730 }
4883    
4884 softime 8989 /**
4885     * TRIGGER - triggersupprimerapres.
4886     *
4887     * @return boolean
4888     */
4889     function triggersupprimerapres($id, &$dnu1 = null, $val = array(), $dnu2 = null) {
4890     $this->addToLog(__METHOD__."(): start", EXTRA_VERBOSE_MODE);
4891 softime 8640 /**
4892     * Mise à jour de la date de dernière modification du dossier
4893     * d'instruction
4894     */
4895     $inst_di = $this->get_inst_dossier($this->getVal('dossier'));
4896     $inst_di->update_last_modification_date();
4897    
4898     /**
4899     * Mise à jour des données du dossier d'autorisation
4900     */
4901 softime 7996 $da = $this->f->get_inst__om_dbform(array(
4902     "obj" => "dossier_autorisation",
4903     "idx" => $this->getNumDemandeAutorFromDossier($val["dossier"]),
4904     ));
4905 softime 8640 $params = array(
4906     'di_id' => $this->getVal('dossier'),
4907 softime 9245 'di_reopened' => $this->get_att_di_reopened(),
4908 softime 8640 );
4909     if($da->majDossierAutorisation($params) === false) {
4910 mbroquet 3730 $this->addToMessage(_("Erreur lors de la mise a jour des donnees du dossier d'autorisation. Contactez votre administrateur."));
4911     $this->correct = false;
4912     return false;
4913     }
4914 softime 7996
4915 softime 10573 /**
4916     * Gestion des tâches pour la dématérialisation
4917     */
4918     $inst_task_empty = $this->f->get_inst__om_dbform(array(
4919     "obj" => "task",
4920     "idx" => 0,
4921     ));
4922     foreach ($inst_di->task_types as $task_type) {
4923     $task_exists = $inst_task_empty->task_exists($task_type, $id);
4924     if ($task_exists !== false) {
4925     $inst_task = $this->f->get_inst__om_dbform(array(
4926     "obj" => "task",
4927     "idx" => $task_exists,
4928     ));
4929     if ($inst_task->getVal('state') === $inst_task::STATUS_NEW || $inst_task->getVal('state') === $inst_task::STATUS_DRAFT) {
4930     $task_val = array(
4931     'state' => $inst_task::STATUS_CANCELED,
4932     );
4933     $update_task = $inst_task->update_task(array('val' => $task_val));
4934     if ($update_task === false) {
4935     $this->addToMessage(sprintf('%s %s',
4936     sprintf(__("Une erreur s'est produite lors de la modification de la tâche %."), $inst_task->getVal($inst_task->clePrimaire)),
4937     __("Veuillez contacter votre administrateur.")
4938     ));
4939     $this->correct = false;
4940     return false;
4941     }
4942     }
4943     }
4944     }
4945    
4946 softime 7996 //
4947 softime 8640 $val['evenement'] = $this->getVal('evenement');
4948 nmeucci 3933 return $this->add_log_to_dossier($id, $val);
4949 mbroquet 3730 }
4950    
4951     /**
4952 softime 9245 * Permet de mettre la valeur passée en paramètre dans l'attribut de classe
4953     * "di_reopened".
4954     *
4955     * @param boolean $val
4956     */
4957     function set_att_di_reopened($val) {
4958     $this->di_reopened = $val;
4959     }
4960    
4961     /**
4962     * Permet de récupérer la valeur de l'attribut de classe "di_reopened".
4963     *
4964     * @return boolean
4965     */
4966     function get_att_di_reopened() {
4967     return $this->di_reopened;
4968     }
4969    
4970     /**
4971 mbroquet 3730 * Permet de composer un message d'erreur sur restriction non valide en
4972     * fonction du contexte.
4973     *
4974     * @param string $restriction formule de la restriction
4975     *
4976     * @return string message d'erreur
4977     */
4978     function get_restriction_error_message($restriction) {
4979     // Affichage du message si la restriction s'applique
4980     // Contexte du suivi des dates (message simple)
4981     $message_restrict = _("Probleme de dates :");
4982     // Split restriction
4983     $champs_restrict = preg_split(
4984     '/(\W+)/',
4985     $restriction,
4986     null,
4987     PREG_SPLIT_NO_EMPTY|PREG_SPLIT_DELIM_CAPTURE
4988     );
4989     $formated_restrict = "";
4990     // Ajout des chaînes à traduire
4991     foreach ($champs_restrict as $value) {
4992     $formated_restrict .= _($value)." ";
4993     }
4994     $formated_restrict = substr($formated_restrict, 0, -1);
4995     // Message d'erreur dans le contexte du suivi des dates
4996     if($this->getParameter("maj") == 170) {
4997     $message_restrict .= " "._("contactez l'instructeur du dossier");
4998     $message_restrict .= "<br/>(".$formated_restrict.")";
4999     } else {
5000     // Affichage du message si la restriction s'applique
5001     // Contexte instruction
5002     $message_restrict .= "<br/>".$formated_restrict;
5003     }
5004    
5005     return $message_restrict;
5006     }
5007    
5008     /**
5009 softime 12124 * Surcharge de la méthode verifier() de la classe om_dbform pour y ajouter
5010     * les vérifications suivantes :
5011     * - Si l'instruction à un événement associé et que cet événement à des restrictions :
5012     * 1. vérifie si la restriction est valide, si ce n'est pas le cas récupère et affiche
5013     * le message d'erreur associé à la restriction
5014     * 2. vérifie si les restrictions sont respectées. Si ce n'est pas le cas bloque l'ajout
5015     * et / ou la modification et affiche un message d'erreur
5016     * -
5017     * -
5018     * -
5019     * -
5020     * -
5021     * -
5022     *
5023     * @param array val : tableau contenant les valeurs issues du formulaire.
5024     * @param - dnu1 : Paramètre déprécié et non utilisé.
5025     * @param - dnu2 : Paramètre déprécié et non utilisé.
5026     *
5027 softime 8989 * @return void
5028 mbroquet 3730 */
5029 softime 8989 function verifier($val = array(), &$dnu1 = null, $dnu2 = null) {
5030     parent::verifier($val);
5031     //
5032 mbroquet 3730 if ( isset($val['evenement']) && is_numeric($val['evenement'])){
5033     $restriction = $this->get_restriction($val['evenement']);
5034    
5035     //Test qu'une restriction est présente
5036     if ($restriction != "" ){
5037    
5038 softime 14064 // Vérifie le contexte de la modification et test si la restriction est valide.
5039     // Si l'instruction est modifiée par une tache le dossier n'est pas impacté.
5040     // Il n'est donc pas nécessaire de vérifier les restrictions.
5041 mbroquet 3730 $this->restriction_valid = $this->restrictionIsValid($restriction);
5042 softime 14064 if ($this->getParameter("maj") != 176
5043     && !$this->restriction_valid) {
5044 mbroquet 3730
5045     // Affichage du message si la restriction s'applique
5046     $this->addToMessage(
5047     $this->get_restriction_error_message($restriction)
5048     );
5049     $this->correct=false;
5050     return false;
5051     }
5052    
5053     // Liste des opérateurs possible
5054 nmeucci 3873 $operateurs = array(">=", "<=", "+", "-", "&&", "||", "==", "!=");
5055 mbroquet 3730 // Supprime tous les espaces de la chaîne de caractère
5056     $restriction = str_replace(' ', '', $restriction);
5057    
5058     // Met des espace avant et après les opérateurs puis transforme la
5059     // chaine en un tableau
5060     $tabRestriction = str_replace($operateurs, " ", $restriction);
5061     // Tableau des champ
5062     $tabRestriction = explode(" ", $tabRestriction);
5063     // Supprime les numériques du tableau
5064     foreach ($tabRestriction as $key => $value) {
5065     if (is_numeric($value)) {
5066     unset($tabRestriction[$key]);
5067     }
5068     }
5069    
5070     // Vérifie les champs utilisés pour la restriction
5071     $check_field_exist = $this->f->check_field_exist($tabRestriction, 'instruction');
5072     if ($check_field_exist !== true) {
5073    
5074     // Liste des champs en erreur
5075     $string_error_fields = implode(", ", $check_field_exist);
5076    
5077     // Message d'erreur
5078     $error_message = _("Le champ %s n'est pas utilisable pour le champ %s");
5079     if (count($check_field_exist) > 1) {
5080     $error_message = _("Les champs %s ne sont pas utilisable pour le champ %s");
5081     }
5082    
5083     // Affiche l'erreur
5084     $this->correct=false;
5085     $this->addToMessage(sprintf($error_message, $string_error_fields, _("restriction")));
5086     $this->addToMessage(_("Veuillez contacter votre administrateur."));
5087     }
5088     }
5089    
5090     }
5091     if(!$this->updateDate("date_envoi_signature")) {
5092     return false;
5093     }
5094     if(!$this->updateDate("date_retour_signature")) {
5095     return false;
5096     }
5097     if(!$this->updateDate("date_envoi_rar")) {
5098     return false;
5099     }
5100     if(!$this->updateDate("date_retour_rar")) {
5101     return false;
5102     }
5103     if(!$this->updateDate("date_envoi_controle_legalite")) {
5104     return false;
5105     }
5106     if(!$this->updateDate("date_retour_controle_legalite")) {
5107     return false;
5108     }
5109    
5110     }
5111 softime 12124
5112     /**
5113     * Récupère et stocket dans un tableau toutes les infos du pétitionnaire
5114     * principal du dossier auquel appartiens l'instruction.
5115     * Renvoie un tableau contenant les informations du pétitionnaire principal.
5116     *
5117     * Si l'identifiant de l'instruction n'a pas pu etre récupéré renvoie false
5118     * et affiche un message dans les logs.
5119     * En cas d'erreur de base de donnée renvoie false et affiche un message d'erreur.
5120     *
5121     * @param string identifiant du dossier
5122     * @return array|boolean
5123     */
5124     protected function get_info_petitionnaire_principal_dossier($dossier = null) {
5125     // Si l'identifiant de l'instruction n'a pas été fournit on récupère celui de
5126     // l'objet courant
5127     if (empty($dossier)) {
5128     $dossier = $this->getVal('dossier');
5129     // Si la récupération de l'identifiant de l'instruction a échoué la méthode renvoie
5130     // false et on affiche un message d'erreur dans les logs
5131     if (empty($dossier)) {
5132     $this->addToLog(__METHOD__.' : L\'identifiant du dossier n\'a pas pu être récupéré');
5133     return false;
5134     }
5135     }
5136    
5137     // Requête sql servant à récupérer toutes les informations relatives au demandeurs
5138     // principal
5139 softime 13137 $qres = $this->f->get_all_results_from_db_query(
5140     sprintf(
5141     'SELECT
5142     -- Récupère toutes les informations du demandeur principal
5143     demandeur.*,
5144     CASE
5145     WHEN demandeur.qualite=\'particulier\'
5146     THEN TRIM(CONCAT(demandeur.particulier_nom, \' \', demandeur.particulier_prenom, \' \', demandeur.courriel))
5147     ELSE
5148     TRIM(CONCAT(demandeur.personne_morale_raison_sociale, \' \', demandeur.personne_morale_denomination, \' \', demandeur.courriel))
5149     END AS destinataire
5150     FROM
5151     %1$sdossier
5152     LEFT JOIN %1$slien_dossier_demandeur
5153     ON lien_dossier_demandeur.dossier = dossier.dossier
5154     LEFT JOIN %1$sdemandeur
5155     ON demandeur.demandeur = lien_dossier_demandeur.demandeur
5156     WHERE
5157     dossier.dossier = \'%2$s\'
5158     AND lien_dossier_demandeur.petitionnaire_principal IS TRUE',
5159     DB_PREFIXE,
5160     $this->f->db->escapeSimple($dossier)
5161     ),
5162     array(
5163     "origin" => __METHOD__,
5164     )
5165 softime 12124 );
5166 softime 13137 if (is_array($qres["result"]) === true
5167     && array_key_exists(0, $qres["result"]) === true) {
5168     //
5169     return $qres["result"][0];
5170 softime 12124 }
5171 softime 13137 return null;
5172 softime 12124 }
5173    
5174    
5175 mbroquet 3730
5176     /**
5177     * Finalisation des documents.
5178     * @param string $champ champ du fichier à finaliser
5179     * @param booleen $status permet de définir si on finalise ou définalise
5180     * @param string $sousform permet de savoir si se trouve dans un sousformulaire (passé au javascript)
5181     */
5182     function manage_finalizing($mode = null, $val = array()) {
5183 softime 5024 //
5184     $this->begin_treatment(__METHOD__);
5185 mbroquet 3730
5186 softime 5024 //
5187     $id_inst = $this->getVal($this->clePrimaire);
5188 mbroquet 3730
5189 softime 5024 //
5190     $admin_msg_error = _("Veuillez contacter votre administrateur.");
5191     $file_msg_error = _("Erreur de traitement de fichier.")
5192     ." ".$admin_msg_error;
5193     $bdd_msg_error = _("Erreur de base de données.")
5194     ." ".$admin_msg_error;
5195 softime 5169 $log_msg_error = "Finalisation non enregistrée - id instruction = %s - uid fichier = %s";
5196 mbroquet 3730
5197     // Si on finalise le document
5198     if ($mode == "finalize"){
5199 softime 5024 //
5200     $etat = _('finalisation');
5201 mbroquet 3730
5202     // Récupère la collectivite du dossier d'instruction
5203     $dossier_instruction_om_collectivite = $this->get_dossier_instruction_om_collectivite();
5204    
5205     //
5206     $collectivite = $this->f->getCollectivite($dossier_instruction_om_collectivite);
5207 softime 8593
5208     //
5209     $params = array(
5210     "specific" => array(),
5211     );
5212     // Si la rédaction libre est activée sur l'instruction
5213     if ($this->getVal("flag_edition_integrale") == 't') {
5214     $params["specific"]["corps"] = array(
5215     "mode" => "set",
5216     "value" => $this->getVal("corps_om_htmletatex"),
5217     );
5218     $params["specific"]["titre"] = array(
5219     "mode" => "set",
5220     "value" => $this->getVal("titre_om_htmletat"),
5221     );
5222     }
5223 mbroquet 3730 // Génération du PDF
5224 softime 8593 $result = $this->compute_pdf_output('lettretype', $this->getVal('lettretype'), $collectivite, null, $params);
5225 mbroquet 3730 $pdf_output = $result['pdf_output'];
5226 softime 10573
5227 mbroquet 3730 //Métadonnées du document
5228     $metadata = array(
5229 softime 5024 'filename' => 'instruction_'.$id_inst.'.pdf',
5230 mbroquet 3730 'mimetype' => 'application/pdf',
5231     'size' => strlen($pdf_output)
5232     );
5233    
5234     // Récupération des métadonnées calculées après validation
5235     $spe_metadata = $this->getMetadata("om_fichier_instruction");
5236    
5237     //On vérifie si l'instruction à finaliser a un événement de type arrete
5238 softime 14064 // TODO : A voir pour remplacer par une instanciation de l'événement.
5239     // Voir également si l'événement ne dois pas être instancié en début de
5240     // méthode pour pouvoir être réutilisé.
5241     $qres = $this->f->get_one_result_from_db_query(
5242     sprintf(
5243     'SELECT
5244     type
5245     FROM
5246     %1$sevenement
5247     WHERE
5248     evenement = \'%2$d\'',
5249     DB_PREFIXE,
5250     intval($this->getVal("evenement"))
5251     ),
5252     array(
5253     "origin" => __METHOD__,
5254     "force_return" => true,
5255     )
5256     );
5257    
5258     if ($qres["code"] !== "OK") {
5259 softime 5024 $this->correct = false;
5260     $this->addToMessage($bdd_msg_error);
5261     return $this->end_treatment(__METHOD__, false);
5262 mbroquet 3730 }
5263    
5264     //Initialisation de la variable
5265     $arrete_metadata = array();
5266     // Si l'événement est de type arrete, on ajoute les métadonnées spécifiques
5267 softime 14064 if ($qres['result'] === 'arrete'){
5268 mbroquet 3730 $arrete_metadata = $this->getMetadata("arrete");
5269     }
5270    
5271     $metadata = array_merge($metadata, $spe_metadata, $arrete_metadata);
5272    
5273 softime 10573 /*
5274     // transforme le tableau de métadonnées en objet
5275     $mdf = new MetadataFactory();
5276     $md = $mdf->build('Instruction', $metadata);
5277     */
5278    
5279 softime 5024 // Si le document a déjà été finalisé on le met à jour
5280     // en conservant son UID
5281 mbroquet 3730 if ($this->getVal("om_fichier_instruction") != ''){
5282     $uid = $this->f->storage->update(
5283     $this->getVal("om_fichier_instruction"), $pdf_output, $metadata);
5284     }
5285 softime 5024 // Sinon on crée un nouveau document et dont on récupère l'UID
5286 mbroquet 3730 else {
5287 softime 10573 $uid = $this->f->storage->create($pdf_output, $metadata, "from_content", $this->table.".om_fichier_instruction");
5288 mbroquet 3730 }
5289     }
5290    
5291 softime 5024 // Si on définalise le document
5292 mbroquet 3730 if ($mode == "unfinalize") {
5293 softime 5024 //
5294     $etat = _('définalisation');
5295 mbroquet 3730 // Récupération de l'uid du document finalisé
5296     $uid = $this->getVal("om_fichier_instruction");
5297     }
5298 softime 5024
5299     // Si on définalise l'UID doit être défini
5300     // Si on finalise la création/modification du fichier doit avoir réussi
5301 mbroquet 3730 if ($uid == '' || $uid == 'OP_FAILURE' ) {
5302 softime 5024 $this->correct = false;
5303     $this->addToMessage($file_msg_error);
5304 softime 8989 $this->addToLog(sprintf($log_msg_error, $id_inst, $uid), DEBUG_MODE);
5305 softime 5024 return $this->end_treatment(__METHOD__, false);
5306 mbroquet 3730 }
5307    
5308     //
5309     foreach ($this->champs as $key => $champ) {
5310     //
5311     $val[$champ] = $this->val[$key];
5312     }
5313    
5314     //
5315 softime 6565 $val['date_evenement'] = $this->dateDBToForm($val['date_evenement']);
5316     $val['archive_date_complet'] = $this->dateDBToForm($val['archive_date_complet']);
5317     $val['archive_date_rejet'] = $this->dateDBToForm($val['archive_date_rejet']);
5318     $val['archive_date_limite'] = $this->dateDBToForm($val['archive_date_limite']);
5319     $val['archive_date_notification_delai'] = $this->dateDBToForm($val['archive_date_notification_delai']);
5320     $val['archive_date_decision'] = $this->dateDBToForm($val['archive_date_decision']);
5321     $val['archive_date_validite'] = $this->dateDBToForm($val['archive_date_validite']);
5322     $val['archive_date_achevement'] = $this->dateDBToForm($val['archive_date_achevement']);
5323     $val['archive_date_chantier'] = $this->dateDBToForm($val['archive_date_chantier']);
5324     $val['archive_date_conformite'] = $this->dateDBToForm($val['archive_date_conformite']);
5325     $val['archive_date_dernier_depot'] = $this->dateDBToForm($val['archive_date_dernier_depot']);
5326     $val['archive_date_limite_incompletude'] = $this->dateDBToForm($val['archive_date_limite_incompletude']);
5327     $val['date_finalisation_courrier'] = $this->dateDBToForm($val['date_finalisation_courrier']);
5328     $val['date_envoi_signature'] = $this->dateDBToForm($val['date_envoi_signature']);
5329     $val['date_retour_signature'] = $this->dateDBToForm($val['date_retour_signature']);
5330     $val['date_envoi_rar'] = $this->dateDBToForm($val['date_envoi_rar']);
5331     $val['date_retour_rar'] = $this->dateDBToForm($val['date_retour_rar']);
5332     $val['date_envoi_controle_legalite'] = $this->dateDBToForm($val['date_envoi_controle_legalite']);
5333     $val['date_retour_controle_legalite'] = $this->dateDBToForm($val['date_retour_controle_legalite']);
5334     $val['archive_date_cloture_instruction'] = $this->dateDBToForm($val['archive_date_cloture_instruction']);
5335     $val['archive_date_premiere_visite'] = $this->dateDBToForm($val['archive_date_premiere_visite']);
5336     $val['archive_date_derniere_visite'] = $this->dateDBToForm($val['archive_date_derniere_visite']);
5337     $val['archive_date_contradictoire'] = $this->dateDBToForm($val['archive_date_contradictoire']);
5338     $val['archive_date_retour_contradictoire'] = $this->dateDBToForm($val['archive_date_retour_contradictoire']);
5339     $val['archive_date_ait'] = $this->dateDBToForm($val['archive_date_ait']);
5340     $val['archive_date_transmission_parquet'] = $this->dateDBToForm($val['archive_date_transmission_parquet']);
5341 softime 8989 $val['archive_date_affichage'] = $this->dateDBToForm($val['archive_date_affichage']);
5342 mbroquet 3730 $this->setvalF($val);
5343    
5344     // Verification de la validite des donnees
5345 softime 8989 $this->verifier($this->val);
5346 mbroquet 3730 // Si les verifications precedentes sont correctes, on procede a
5347     // la modification, sinon on ne fait rien et on retourne une erreur
5348 softime 5024 if ($this->correct === true) {
5349 mbroquet 3730 //
5350     $valF = array(
5351     "om_fichier_instruction" => $uid,
5352     "date_finalisation_courrier" => date('Y-m-d')
5353     );
5354     //
5355     if($mode=="finalize") {
5356     // état finalisé vrai
5357 softime 5024 $valF["om_final_instruction"] = true;
5358 mbroquet 3730 // ajout log utilisateur
5359     $login = $_SESSION['login'];
5360     $nom = "";
5361     $this->f->getUserInfos();
5362     if (isset($this->f->om_utilisateur["nom"])
5363     && !empty($this->f->om_utilisateur["nom"])) {
5364     $nom = $this->f->om_utilisateur["nom"];
5365     }
5366     $valF["om_final_instruction_utilisateur"] = $_SESSION['login'];
5367     if ($nom != "") {
5368     $valF["om_final_instruction_utilisateur"] .= " (".$nom.")";
5369     }
5370     } else {
5371     // état finalisé faux
5372 softime 5024 $valF["om_final_instruction"] = false;
5373 mbroquet 3730 // suppression log utilisateur
5374     $valF["om_final_instruction_utilisateur"] = '';
5375     }
5376    
5377     // Execution de la requête de modification des donnees de l'attribut
5378     // valF de l'objet dans l'attribut table de l'objet
5379 softime 8989 $res = $this->f->db->autoExecute(DB_PREFIXE.$this->table, $valF,
5380 softime 5024 DB_AUTOQUERY_UPDATE, $this->getCle($id_inst));
5381     $this->addToLog(__METHOD__."() : db->autoExecute(\"".DB_PREFIXE.$this->table."\", ".print_r($valF, true).", DB_AUTOQUERY_UPDATE, \"".$this->getCle($id_inst)."\")", VERBOSE_MODE);
5382     //
5383     if ($this->f->isDatabaseError($res, true) === true) {
5384     $this->correct = false;
5385     $this->addToMessage($bdd_msg_error);
5386     return $this->end_treatment(__METHOD__, false);
5387     }
5388 mbroquet 3730
5389 softime 5024 //
5390     $this->addToMessage(sprintf(_("La %s du document s'est effectuee avec succes."), $etat));
5391     //
5392     if ($this->add_log_to_dossier($id_inst, $val) === false) {
5393     return $this->end_treatment(__METHOD__, false);
5394     }
5395     //
5396     return $this->end_treatment(__METHOD__, true);
5397 mbroquet 3730 }
5398 softime 5024 // L'appel de verifier() a déjà positionné correct à false
5399     // et défini un message d'erreur.
5400 softime 8989 $this->addToLog(sprintf($log_msg_error, $id_inst, $uid), DEBUG_MODE);
5401 softime 5024 return $this->end_treatment(__METHOD__, false);
5402 mbroquet 3730 }
5403    
5404     /**
5405     * Récupération du numéro de dossier d'instruction à ajouter aux métadonnées
5406     * @return string numéro de dossier d'instruction
5407     */
5408 softime 10573 protected function getDossier($champ = null) {
5409 mbroquet 3730 if(empty($this->specificMetadata)) {
5410     $this->getSpecificMetadata();
5411     }
5412     return $this->specificMetadata->dossier;
5413     }
5414     /**
5415     * Récupération la version du dossier d'instruction à ajouter aux métadonnées
5416     * @return int Version
5417     */
5418     protected function getDossierVersion() {
5419     if(empty($this->specificMetadata)) {
5420     $this->getSpecificMetadata();
5421     }
5422     return $this->specificMetadata->version;
5423     }
5424     /**
5425     * Récupération du numéro de dossier d'autorisation à ajouter aux métadonnées
5426     * @return string numéro de dossier d'autorisation
5427     */
5428     protected function getNumDemandeAutor() {
5429     if(empty($this->specificMetadata)) {
5430     $this->getSpecificMetadata();
5431     }
5432     return $this->specificMetadata->dossier_autorisation;
5433     }
5434     /**
5435     * Récupération de la date de demande initiale du dossier à ajouter aux métadonnées
5436     * @return date de la demande initiale
5437     */
5438     protected function getAnneemoisDemandeAutor() {
5439     if(empty($this->specificMetadata)) {
5440     $this->getSpecificMetadata();
5441     }
5442     return $this->specificMetadata->date_demande_initiale;
5443     }
5444     /**
5445     * Récupération du type de dossier d'instruction à ajouter aux métadonnées
5446     * @return string type du dossier d'instruction
5447     */
5448     protected function getTypeInstruction() {
5449     if(empty($this->specificMetadata)) {
5450     $this->getSpecificMetadata();
5451     }
5452     return $this->specificMetadata->dossier_instruction_type;
5453     }
5454     /**
5455     * Récupération du statut du dossier d'autorisation à ajouter aux métadonnées
5456     * @return string avis
5457     */
5458     protected function getStatutAutorisation() {
5459     if(empty($this->specificMetadata)) {
5460     $this->getSpecificMetadata();
5461     }
5462     return $this->specificMetadata->statut;
5463     }
5464     /**
5465     * Récupération du type de dossier d'autorisation à ajouter aux métadonnées
5466     * @return string type du dossier d'autorisation
5467     */
5468     protected function getTypeAutorisation() {
5469     if(empty($this->specificMetadata)) {
5470     $this->getSpecificMetadata();
5471     }
5472     return $this->specificMetadata->dossier_autorisation_type;
5473     }
5474     /**
5475     * Récupération de la date d'ajout de document à ajouter aux métadonnées
5476     * @return date de l'évènement
5477     */
5478     protected function getDateEvenementDocument() {
5479     return date("Y-m-d");
5480     }
5481     /**
5482     * Récupération du groupe d'instruction à ajouter aux métadonnées
5483     * @return string Groupe d'instruction
5484     */
5485     protected function getGroupeInstruction() {
5486     if(empty($this->specificMetadata)) {
5487     $this->getSpecificMetadata();
5488     }
5489     return $this->specificMetadata->groupe_instruction;
5490     }
5491     /**
5492     * Récupération du libellé du type du document à ajouter aux métadonnées
5493     * @return string Groupe d'instruction
5494     */
5495     protected function getTitle() {
5496    
5497     // Récupère le champ événement
5498     if (isset($this->valF["evenement"]) AND $this->valF["evenement"] != "") {
5499     $evenement = $this->valF["evenement"];
5500     } else {
5501     $evenement = $this->getVal("evenement");
5502     }
5503    
5504     // Requête sql
5505 softime 14064 $evenement = $this->f->get_inst__om_dbform(array(
5506     "obj" => "evenement",
5507     "idx" => $evenement
5508     ));
5509    
5510 mbroquet 3730 // Retourne le libelle de l'événement
5511 softime 14064 return $evenement->getVal('libelle');
5512 mbroquet 3730 }
5513    
5514 softime 6272
5515 mbroquet 3730 /**
5516 softime 6272 * Récupération du champ ERP du dossier d'instruction.
5517     *
5518     * @return boolean
5519     */
5520     public function get_concerne_erp() {
5521     //
5522     if(empty($this->specificMetadata)) {
5523     $this->getSpecificMetadata();
5524     }
5525     //
5526     return $this->specificMetadata->erp;
5527     }
5528    
5529    
5530     /**
5531 mbroquet 3730 * Cette méthode permet de stocker en attribut toutes les métadonnées
5532     * nécessaire à l'ajout d'un document.
5533     */
5534     public function getSpecificMetadata() {
5535     if (isset($this->valF["dossier"]) AND $this->valF["dossier"] != "") {
5536     $dossier = $this->valF["dossier"];
5537     } else {
5538     $dossier = $this->getVal("dossier");
5539     }
5540     //Requête pour récupérer les informations essentiels sur le dossier d'instruction
5541 softime 14542 $qres = $this->f->get_all_results_from_db_query(
5542     sprintf(
5543     'SELECT
5544     dossier.dossier AS dossier,
5545     dossier_autorisation.dossier_autorisation AS dossier_autorisation,
5546     to_char(dossier.date_demande, \'YYYY/MM\') AS date_demande_initiale,
5547     dossier_instruction_type.code AS dossier_instruction_type,
5548     etat_dossier_autorisation.libelle AS statut,
5549     dossier_autorisation_type.code AS dossier_autorisation_type,
5550     groupe.code AS groupe_instruction,
5551     CASE WHEN dossier.erp IS TRUE
5552     THEN \'true\'
5553     ELSE \'false\'
5554     END AS erp
5555     FROM
5556     %1$sdossier
5557     LEFT JOIN %1$sdossier_instruction_type
5558 mbroquet 3730 ON dossier.dossier_instruction_type = dossier_instruction_type.dossier_instruction_type
5559 softime 14542 LEFT JOIN %1$sdossier_autorisation
5560 mbroquet 3730 ON dossier.dossier_autorisation = dossier_autorisation.dossier_autorisation
5561 softime 14542 LEFT JOIN %1$setat_dossier_autorisation
5562 mbroquet 3730 ON dossier_autorisation.etat_dossier_autorisation = etat_dossier_autorisation.etat_dossier_autorisation
5563 softime 14542 LEFT JOIN %1$sdossier_autorisation_type_detaille
5564 mbroquet 3730 ON dossier_autorisation.dossier_autorisation_type_detaille = dossier_autorisation_type_detaille.dossier_autorisation_type_detaille
5565 softime 14542 LEFT JOIN %1$sdossier_autorisation_type
5566 mbroquet 3730 ON dossier_autorisation_type_detaille.dossier_autorisation_type = dossier_autorisation_type.dossier_autorisation_type
5567 softime 14542 LEFT JOIN %1$sgroupe
5568 mbroquet 3730 ON dossier_autorisation_type.groupe = groupe.groupe
5569 softime 14542 WHERE
5570     dossier.dossier = \'%2$s\'',
5571     DB_PREFIXE,
5572     $this->f->db->escapeSimple($dossier)
5573     ),
5574     array(
5575     "origin" => __METHOD__,
5576     )
5577     );
5578     $row = array_shift($qres['result']);
5579 mbroquet 3730
5580     //Si il y a un résultat
5581 softime 14542 if (! empty($row)) {
5582 mbroquet 3730
5583 fmichon 3892 // Instrance de la classe dossier
5584     $inst_dossier = $this->get_inst_dossier($dossier);
5585 softime 14542 // TODO : améliorer ce code
5586     //
5587     // Avant l e résultat été récupéré dans un objet à partir de la requête mais en modifiant pour
5588     // utiliser la méthode get_all_results_from_db_query() c'est maintenant un tableau
5589     // qu'on obtiens. Pour garder le même fonctionnement on transforme le tableau des
5590     // valeurs issues de la requête en objet.
5591     $metadata = (object)$row;
5592 fmichon 3892 // Insère l'attribut version à l'objet
5593 softime 14542 $metadata->version = $inst_dossier->get_di_numero_suffixe();
5594 fmichon 3892
5595 mbroquet 3730 //Alors on créé l'objet dossier_instruction
5596 softime 14542 $this->specificMetadata = $metadata;
5597 mbroquet 3730
5598     }
5599     }
5600    
5601     /**
5602     * Retourne le statut du dossier d'instruction
5603     * @param string $idx Identifiant du dossier d'instruction
5604     * @return string Le statut du dossier d'instruction
5605     */
5606     function getStatutAutorisationDossier($idx){
5607    
5608     $statut = '';
5609    
5610     //Si l'identifiant du dossier d'instruction fourni est correct
5611     if ( $idx != '' ){
5612    
5613     //On récupère le statut de l'état du dossier à partir de l'identifiant du
5614     //dossier
5615 softime 14064 $qres = $this->f->get_one_result_from_db_query(
5616     sprintf(
5617     'SELECT
5618     etat.statut
5619     FROM
5620     %1$sdossier
5621     LEFT JOIN
5622     %1$setat
5623     ON
5624     dossier.etat = etat.etat
5625     WHERE
5626     dossier = \'%2$s\'',
5627     DB_PREFIXE,
5628     $this->f->db->escapeSimple($idx)
5629     ),
5630     array(
5631     "origin" => __METHOD__,
5632     )
5633     );
5634 mbroquet 3730 }
5635 softime 14064
5636     return $qres['result'];
5637 mbroquet 3730 }
5638    
5639     /**
5640     * Récupère les données du dossier
5641     * @return array
5642     */
5643     function get_dossier_actual() {
5644    
5645     // Initialisation de la valeur de retour
5646     $return = array();
5647    
5648     // Récupération de toutes les valeurs du dossier d'instruction en cours
5649 softime 14542 // TODO : remplacer cette requête par une instanciation de l'objet
5650     $qres = $this->f->get_all_results_from_db_query(
5651     sprintf(
5652     'SELECT
5653     *
5654     FROM
5655     %1$sdossier
5656     WHERE
5657     dossier = \'%2$s\'',
5658     DB_PREFIXE,
5659     $this->f->db->escapeSimple($this->valF['dossier'])
5660     ),
5661     array(
5662     'origin' => __METHOD__
5663     )
5664     );
5665 mbroquet 3730
5666 softime 14542 foreach ($qres['result'] as $row) {
5667 mbroquet 3730
5668     // Récupération de la valeur actuelle du délai, de l'accord tacite,
5669     // de l'état et de l'avis du dossier d'instruction
5670 softime 6565 $return['archive_delai'] = $row['delai'];
5671     $return['archive_accord_tacite'] = $row['accord_tacite'];
5672     $return['archive_etat'] = $row['etat'];
5673     $return['archive_avis'] = $row['avis_decision'];
5674     // Récupération de la valeur actuelle des dates du dossier
5675 mbroquet 3730 // d'instruction
5676 softime 6565 $return['archive_date_complet'] = $row['date_complet'];
5677     $return['archive_date_dernier_depot'] = $row['date_dernier_depot'];
5678     $return['archive_date_rejet'] = $row['date_rejet'];
5679     $return['archive_date_limite'] = $row['date_limite'];
5680     $return['archive_date_notification_delai'] = $row['date_notification_delai'];
5681     $return['archive_date_decision'] = $row['date_decision'];
5682     $return['archive_date_validite'] = $row['date_validite'];
5683     $return['archive_date_achevement'] = $row['date_achevement'];
5684     $return['archive_date_chantier'] = $row['date_chantier'];
5685     $return['archive_date_conformite'] = $row['date_conformite'];
5686     $return['archive_incompletude'] = $row['incompletude'];
5687     $return['archive_incomplet_notifie'] = $row['incomplet_notifie'];
5688     $return['archive_evenement_suivant_tacite'] = $row['evenement_suivant_tacite'];
5689     $return['archive_evenement_suivant_tacite_incompletude'] = $row['evenement_suivant_tacite_incompletude'];
5690     $return['archive_etat_pendant_incompletude'] = $row['etat_pendant_incompletude'];
5691     $return['archive_date_limite_incompletude'] = $row['date_limite_incompletude'];
5692     $return['archive_delai_incompletude'] = $row['delai_incompletude'];
5693     $return['archive_autorite_competente'] = $row['autorite_competente'];
5694 softime 8593 $return['archive_dossier_instruction_type'] = $row['dossier_instruction_type'];
5695 softime 6565 $return['duree_validite'] = $row['duree_validite'];
5696     $return['date_depot'] = $row['date_depot'];
5697 softime 10573 $return['date_depot_mairie'] = $row['date_depot_mairie'];
5698 softime 6565 $return['archive_date_cloture_instruction'] = $row['date_cloture_instruction'];
5699     $return['archive_date_premiere_visite'] = $row['date_premiere_visite'];
5700     $return['archive_date_derniere_visite'] = $row['date_derniere_visite'];
5701     $return['archive_date_contradictoire'] = $row['date_contradictoire'];
5702     $return['archive_date_retour_contradictoire'] = $row['date_retour_contradictoire'];
5703     $return['archive_date_ait'] = $row['date_ait'];
5704     $return['archive_date_transmission_parquet'] = $row['date_transmission_parquet'];
5705 softime 8989 $return['archive_date_affichage'] = $row['date_affichage'];
5706 softime 10573 $return['archive_pec_metier'] = $row['pec_metier'];
5707     $return['archive_a_qualifier'] = $row['a_qualifier'];
5708 mbroquet 3730 }
5709    
5710     // Retour de la fonction
5711     return $return;
5712    
5713     }
5714    
5715     /**
5716     * Permet de vérifier qu'un événement est verrouillable
5717     * @param integer $idx Identifiant de l'instruction
5718     * @return boolean
5719     */
5720     function checkEvenementNonVerrouillable($idx) {
5721     // Si la condition n'est pas vide
5722     if ($idx != "") {
5723    
5724     // Requête SQL
5725 softime 14064 $qres = $this->f->get_one_result_from_db_query(
5726     sprintf(
5727     'SELECT
5728     evenement.non_verrouillable
5729     FROM
5730     %1$sevenement
5731     LEFT JOIN %1$sinstruction
5732     ON instruction.evenement = evenement.evenement
5733     WHERE
5734     instruction.instruction = \'%2$s\'',
5735     DB_PREFIXE,
5736     intval($idx)
5737     ),
5738     array(
5739     "origin" => __METHOD__,
5740     )
5741     );
5742 mbroquet 3730 }
5743    
5744 softime 14064 // Si on a un résultat et que ce résultat indique que l'événement n'est
5745     // pas vérrouillable renvoie true, sinon renvoie false
5746     return isset($qres) && isset($qres['result']) && $qres['result'] == 't';
5747 mbroquet 3730 }
5748    
5749     /**
5750     * Mise à jour des champs archive_*
5751     * @param mixed $row La ligne de données
5752     */
5753     public function updateArchiveData($row){
5754    
5755     // Récupération de la valeur actuelle du délai, de l'accord tacite,
5756     // de l'état et de l'avis du dossier d'instruction
5757     $this->valF['archive_delai']=$row['delai'];
5758     $this->valF['archive_accord_tacite']=$row['accord_tacite'];
5759     $this->valF['archive_etat']=$row['etat'];
5760     $this->valF['archive_avis']=$row['avis_decision'];
5761     // Récupération de la valeur actuelle des 9 dates du dossier
5762     // d'instruction
5763     if ($row['date_complet'] != '') {
5764     $this->valF['archive_date_complet']=$row['date_complet'];
5765     }
5766     if ($row['date_dernier_depot'] != '') {
5767     $this->valF['archive_date_dernier_depot']=$row['date_dernier_depot'];
5768     }
5769 softime 6565 if ($row['date_rejet'] != '') {
5770 mbroquet 3730 $this->valF['archive_date_rejet']= $row['date_rejet'];
5771     }
5772 softime 6565 if ($row['date_limite'] != '') {
5773 mbroquet 3730 $this->valF['archive_date_limite']= $row['date_limite'];
5774     }
5775 softime 6565 if ($row['date_notification_delai'] != '') {
5776 mbroquet 3730 $this->valF['archive_date_notification_delai']= $row['date_notification_delai'];
5777     }
5778 softime 6565 if ($row['date_decision'] != '') {
5779 mbroquet 3730 $this->valF['archive_date_decision']= $row['date_decision'];
5780     }
5781 softime 6565 if ($row['date_validite'] != '') {
5782 mbroquet 3730 $this->valF['archive_date_validite']= $row['date_validite'];
5783     }
5784 softime 6565 if ($row['date_achevement'] != '') {
5785 mbroquet 3730 $this->valF['archive_date_achevement']= $row['date_achevement'];
5786     }
5787 softime 6565 if ($row['date_chantier'] != '') {
5788 mbroquet 3730 $this->valF['archive_date_chantier']= $row['date_chantier'];
5789     }
5790 softime 6565 if ($row['date_conformite'] != '') {
5791 mbroquet 3730 $this->valF['archive_date_conformite']= $row['date_conformite'];
5792     }
5793 softime 6565 if ($row['incompletude'] != '') {
5794 mbroquet 3730 $this->valF['archive_incompletude']= $row['incompletude'];
5795     }
5796 softime 6565 if ($row['incomplet_notifie'] != '') {
5797 mbroquet 3730 $this->valF['archive_incomplet_notifie']= $row['incomplet_notifie'];
5798     }
5799 softime 6565 if ($row['evenement_suivant_tacite'] != '') {
5800 mbroquet 3730 $this->valF['archive_evenement_suivant_tacite']= $row['evenement_suivant_tacite'];
5801     }
5802 softime 6565 if ($row['evenement_suivant_tacite_incompletude'] != '') {
5803 mbroquet 3730 $this->valF['archive_evenement_suivant_tacite_incompletude']= $row['evenement_suivant_tacite_incompletude'];
5804     }
5805 softime 6565 if ($row['etat_pendant_incompletude'] != '') {
5806 mbroquet 3730 $this->valF['archive_etat_pendant_incompletude']= $row['etat_pendant_incompletude'];
5807     }
5808 softime 6565 if ($row['date_limite_incompletude'] != '') {
5809 mbroquet 3730 $this->valF['archive_date_limite_incompletude']= $row['date_limite_incompletude'];
5810     }
5811 softime 6565 if ($row['delai_incompletude'] != '') {
5812 mbroquet 3730 $this->valF['archive_delai_incompletude']= $row['delai_incompletude'];
5813     }
5814 softime 6565 if ($row['autorite_competente'] != '') {
5815 mbroquet 3730 $this->valF['archive_autorite_competente']= $row['autorite_competente'];
5816     }
5817 softime 6565 if ($row['duree_validite'] != '') {
5818 mbroquet 3730 $this->valF['duree_validite']= $row['duree_validite'];
5819     }
5820 softime 6565 if ($row['date_depot'] != '') {
5821 nmeucci 3873 $this->valF['date_depot']= $row['date_depot'];
5822     }
5823 softime 10573 if ($row['date_depot_mairie'] != '') {
5824     $this->valF['date_depot_mairie']= $row['date_depot_mairie'];
5825     }
5826 softime 6565 // Dates concernant les dossiers contentieux
5827     if ($row['date_cloture_instruction'] != '') {
5828     $this->valF['archive_date_cloture_instruction']= $row['date_cloture_instruction'];
5829     }
5830     if ($row['date_premiere_visite'] != '') {
5831     $this->valF['archive_date_premiere_visite']= $row['date_premiere_visite'];
5832     }
5833     if ($row['date_derniere_visite'] != '') {
5834     $this->valF['archive_date_derniere_visite']= $row['date_derniere_visite'];
5835     }
5836     if ($row['date_contradictoire'] != '') {
5837     $this->valF['archive_date_contradictoire']= $row['date_contradictoire'];
5838     }
5839     if ($row['date_retour_contradictoire'] != '') {
5840     $this->valF['archive_date_retour_contradictoire']= $row['date_retour_contradictoire'];
5841     }
5842     if ($row['date_ait'] != '') {
5843     $this->valF['archive_date_ait']= $row['date_ait'];
5844     }
5845     if ($row['date_transmission_parquet'] != '') {
5846     $this->valF['archive_date_transmission_parquet']= $row['date_transmission_parquet'];
5847     }
5848 softime 8989 //
5849 softime 8593 if ($row['dossier_instruction_type'] != '') {
5850     $this->valF['archive_dossier_instruction_type']= $row['dossier_instruction_type'];
5851     }
5852 softime 8989 if ($row['date_affichage'] != '') {
5853     $this->valF['archive_date_affichage']= $row['date_affichage'];
5854     }
5855 softime 10573 if (isset($row['pec_metier']) === true && $row['pec_metier'] != '') {
5856     $this->valF['archive_pec_metier']= $row['pec_metier'];
5857     }
5858     if (isset($row['a_qualifier']) === true && $row['a_qualifier'] != '') {
5859     $this->valF['archive_a_qualifier']= $row['a_qualifier'];
5860     }
5861 mbroquet 3730 }
5862    
5863     // {{{
5864     // Méthodes de récupération des métadonnées arrêté
5865     /**
5866     * @return string Retourne le numéro d'arrêté
5867     */
5868     function getNumArrete() {
5869     return $this->getVal("numero_arrete");
5870     }
5871     /**
5872     * @return chaîne vide
5873     */
5874     function getReglementaireArrete() {
5875     return 'true';
5876     }
5877     /**
5878     * @return boolean de notification au pétitionnaire
5879     */
5880     function getNotificationArrete() {
5881     return 'true';
5882     }
5883     /**
5884     * @return date de notification au pétitionnaire
5885     */
5886     function getDateNotificationArrete() {
5887     if (empty($this->metadonneesArrete)) {
5888     $this->getArreteMetadata();
5889     }
5890     return $this->metadonneesArrete["datenotification"];
5891     }
5892     /**
5893     * @return boolean check si le document est passé au contrôle de légalité
5894     */
5895     function getControleLegalite() {
5896     return 'true';
5897     }
5898     /**
5899     * @return date de signature de l'arrêté
5900     */
5901     function getDateSignature() {
5902     if (empty($this->metadonneesArrete)) {
5903     $this->getArreteMetadata();
5904     }
5905     return $this->metadonneesArrete["datesignaturearrete"];
5906     }
5907     /**
5908     * @return string nom du signataire
5909     */
5910     function getNomSignataire() {
5911     if (empty($this->metadonneesArrete)) {
5912     $this->getArreteMetadata();
5913     }
5914     return $this->metadonneesArrete["nomsignataire"];
5915     }
5916     /**
5917     * @return string qualité du signataire
5918     */
5919     function getQualiteSignataire() {
5920     if (empty($this->metadonneesArrete)) {
5921     $this->getArreteMetadata();
5922     }
5923     return $this->metadonneesArrete["qualitesignataire"];
5924     }
5925     /**
5926     * @return string numéro du terrain
5927     */
5928     function getAp_numRue() {
5929     if (empty($this->metadonneesArrete)) {
5930     $this->getArreteMetadata();
5931     }
5932     return $this->metadonneesArrete["ap_numrue"];
5933     }
5934     /**
5935     * @return string nom de la rue du terrain
5936     */
5937     function getAp_nomDeLaVoie() {
5938     if (empty($this->metadonneesArrete)) {
5939     $this->getArreteMetadata();
5940     }
5941     return $this->metadonneesArrete["ap_nomdelavoie"];
5942     }
5943     /**
5944     * @return string code postal du terrain
5945     */
5946     function getAp_codePostal() {
5947     if (empty($this->metadonneesArrete)) {
5948     $this->getArreteMetadata();
5949     }
5950     return $this->metadonneesArrete["ap_codepostal"];
5951     }
5952     /**
5953     * @return string ville du terrain
5954     */
5955     function getAp_ville() {
5956     if (empty($this->metadonneesArrete)) {
5957     $this->getArreteMetadata();
5958     }
5959     return $this->metadonneesArrete["ap_ville"];
5960     }
5961     /**
5962     * @return string activité
5963     */
5964     function getActivite() {
5965     return "Droit du sol";
5966     }
5967     /**
5968     * @return string date du retour de controle légalité
5969     */
5970     function getDateControleLegalite() {
5971     if (empty($this->metadonneesArrete)) {
5972     $this->getArreteMetadata();
5973     }
5974     return $this->metadonneesArrete["datecontrolelegalite"];
5975     }
5976    
5977     // Fin des méthodes de récupération des métadonnées
5978     // }}}
5979    
5980     /**
5981     * Méthode de récupération des métadonnées arrêtés dans la base de données,
5982     * les données sont stockés dans l'attribut $this->metadonneesArrete
5983     */
5984     function getArreteMetadata() {
5985    
5986 softime 14542 //Récupération de la dernière instruction dont l'événement est de type 'arrete'
5987     $this->metadonneesArrete = array("nomsignataire"=>"", "qualitesignataire"=>"",
5988     "decisionarrete"=>"", "datenotification"=>"", "datesignaturearrete"=>"",
5989     "datecontrolelegalite"=>"", "ap_numrue"=>"", "ap_nomdelavoie"=>"",
5990     "ap_codepostal"=>"", "ap_ville"=>"");
5991 mbroquet 3730
5992 softime 14542 $qres = $this->f->get_all_results_from_db_query(
5993     sprintf(
5994     'SELECT
5995     signataire_arrete.prenom || \' \' ||signataire_arrete.nom as nomsignataire,
5996     signataire_arrete.qualite as qualitesignataire,
5997     instruction.etat as decisionarrete,
5998     instruction.date_retour_rar as datenotification,
5999     instruction.date_retour_signature as datesignaturearrete,
6000     instruction.date_retour_controle_legalite as datecontrolelegalite,
6001     dossier.terrain_adresse_voie_numero as ap_numrue,
6002     dossier.terrain_adresse_voie as ap_nomdelavoie,
6003     dossier.terrain_adresse_code_postal as ap_codepostal,
6004     dossier.terrain_adresse_localite as ap_ville
6005     FROM
6006     %1$sinstruction
6007     LEFT JOIN %1$ssignataire_arrete
6008     ON instruction.signataire_arrete = signataire_arrete.signataire_arrete
6009     LEFT JOIN %1$sdossier
6010     ON instruction.dossier = dossier.dossier
6011     LEFT JOIN %1$sdonnees_techniques
6012     ON donnees_techniques.dossier_instruction = dossier.dossier
6013     WHERE
6014     instruction.instruction = %2$d',
6015     DB_PREFIXE,
6016     intval($this->getVal('instruction'))
6017     ),
6018     array(
6019     'origin' => __METHOD__
6020     )
6021     );
6022     $this->metadonneesArrete = array_shift($qres['result']);
6023 mbroquet 3730 }
6024    
6025     /**
6026     * CONDITION - has_an_edition.
6027     *
6028     * Condition pour afficher le bouton de visualisation de l'édition.
6029     *
6030     * @return boolean
6031     */
6032     function has_an_edition() {
6033     // Récupère la valeur du champ lettretype
6034     $lettretype = $this->getVal("lettretype");
6035     // Si le champ est vide
6036 softime 7521 if ($lettretype !== '' && $lettretype !== null) {
6037 mbroquet 3730 //
6038 softime 7521 return true;
6039 mbroquet 3730 }
6040    
6041     //
6042 softime 7521 return false;
6043 mbroquet 3730 }
6044    
6045     /**
6046 softime 10573 * CONDITION - is_modifiable.
6047     *
6048     * Controle si l'évenement est modifiable.
6049     *
6050     * @return boolean
6051     */
6052     function is_evenement_modifiable() {
6053     $evenement = $this->get_inst_evenement($this->getVal('evenement'));
6054     return ! $this->get_boolean_from_pgsql_value($evenement->getVal('non_modifiable'));
6055     }
6056    
6057     /**
6058 mbroquet 3730 * CONDITION - is_editable.
6059     *
6060     * Condition pour la modification.
6061     *
6062     * @return boolean
6063     */
6064     function is_editable() {
6065 softime 10573
6066     // XXX
6067     // 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é)
6068     // Si cette tâche identifiée est DONE alors la suppression/modification de cette intruction est impossible
6069    
6070 mbroquet 3730 // Contrôle si l'utilisateur possède un bypass
6071 softime 7996 $bypass = $this->f->isAccredited($this->get_absolute_class_name()."_modifier_bypass");
6072 mbroquet 3730 //
6073     if ($bypass == true) {
6074     //
6075     return true;
6076     }
6077 softime 6565
6078 mbroquet 3730 // Si l'utilisateur est un instructeur, que le dossier est cloturé et
6079     // que l'événement n'est pas identifié comme non verrouillable
6080     if ($this->f->isUserInstructeur()
6081     && $this->getStatutAutorisationDossier($this->getParameter("idxformulaire")) == "cloture"
6082     && $this->checkEvenementNonVerrouillable($this->getVal("instruction")) === false) {
6083     //
6084     return false;
6085     }
6086    
6087 softime 6565 // Si l'utilisateur est un intructeur qui correspond à la division du
6088     // dossier
6089     if ($this->is_instructeur_from_division_dossier() === true) {
6090     //
6091     return true;
6092     }
6093    
6094     // Si l'utilisateur est instructeur de la commune du dossier et que
6095     // l'instruction est créée par un instructeur de la commune
6096     if ($this->is_instructeur_from_collectivite_dossier() === true and
6097     $this->getVal('created_by_commune') === 't') {
6098     return true;
6099     }
6100    
6101 mbroquet 3730 //
6102 softime 6565 return false;
6103 mbroquet 3730 }
6104    
6105     /**
6106 softime 10573 * Vérifie si l'événement est supprimable ou pas.
6107     *
6108     * @return boolean
6109     */
6110     function is_evenement_supprimable() {
6111     // Controle si l'évenement est supprimable
6112     $evenement = $this->get_inst_evenement($this->getVal('evenement'));
6113     return ! $this->get_boolean_from_pgsql_value($evenement->getVal('non_supprimable'));
6114     }
6115    
6116     /**
6117 mbroquet 3730 * CONDITION - is_deletable.
6118     *
6119 softime 6864 * Condition pour la suppression.
6120 mbroquet 3730 *
6121     * @return boolean
6122     */
6123     function is_deletable() {
6124 softime 10573
6125     // XXX
6126     // 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é)
6127     // Si cette tâche identifiée est DONE alors la suppression/modification de cette intruction est impossible
6128    
6129 softime 6864 // Contrôle si l'utilisateur possède un bypass intégral
6130 softime 7996 $bypass = $this->f->isAccredited($this->get_absolute_class_name()."_supprimer_bypass");
6131 mbroquet 3730 //
6132     if ($bypass == true) {
6133    
6134     //
6135     return true;
6136     }
6137    
6138     // Si l'utilisateur est un intructeur qui ne correspond pas à la
6139 softime 6864 // division du dossier et si l'utilisateur n'a pas la permission bypass
6140     // de la division
6141     if ($this->is_instructeur_from_division_dossier() === false
6142 softime 7996 && $this->f->isAccredited($this->get_absolute_class_name()."_supprimer_bypass_division") === false) {
6143 mbroquet 3730
6144     //
6145     return false;
6146     }
6147 softime 5024
6148     // l'événement est-il le dernier ?
6149     $dernier_evenement = false;
6150     // instanciation dossier
6151 softime 7996 $dossier = $this->f->get_inst__om_dbform(array(
6152     "obj" => "dossier",
6153     "idx" => $this->getVal('dossier'),
6154     ));
6155 softime 5024 // récupération dernier événement
6156     $id_dernier_evenement = $dossier->get_dernier_evenement();
6157     if ($id_dernier_evenement == $this->getVal($this->clePrimaire)) {
6158     $dernier_evenement = true;
6159     }
6160 mbroquet 3730
6161 softime 5024 // Si dossier cloturé ou si pas dernier événement
6162     // ou de type retour ou si une date est renseignée
6163     // ET utilisateur non administrateur
6164     if ($this->getStatutAutorisationDossier($this->getVal('dossier')) == 'cloture'
6165     || $dernier_evenement == false
6166     || $this->is_evenement_retour($this->getVal("evenement")) == true
6167     || $this->getVal('date_envoi_signature') != ''
6168     || $this->getVal('date_retour_signature') != ''
6169     || $this->getVal('date_envoi_rar') != ''
6170     || $this->getVal('date_retour_rar') != ''
6171     || $this->getVal('date_envoi_controle_legalite') != ''
6172     || $this->getVal('date_retour_controle_legalite') != '') {
6173     // pas le droit de supprimer
6174     return false;;
6175     }
6176    
6177 mbroquet 3730 //
6178     return true;
6179     }
6180 softime 6565
6181    
6182 mbroquet 3730 /**
6183 softime 6565 * Vérifie que l'utilisateur est instructeur et qu'il est de la division du
6184     * dossier.
6185     *
6186     * @return, boolean true/false
6187     */
6188     function is_instructeur_from_collectivite_dossier() {
6189     if ($this->f->isUserInstructeur() === true and
6190     $this->f->om_utilisateur["om_collectivite"] == $this->get_dossier_instruction_om_collectivite()) {
6191     return true;
6192     }
6193     return false;
6194     }
6195    
6196     /**
6197 mbroquet 3730 * CONDITION - is_addable.
6198     *
6199     * Condition pour afficher les boutons modifier et supprimer.
6200     *
6201     * @return boolean
6202     */
6203     function is_addable() {
6204     // Contrôle si l'utilisateur possède un bypass
6205 softime 7996 $bypass = $this->f->isAccredited($this->get_absolute_class_name()."_ajouter_bypass");
6206 mbroquet 3730 //
6207     if ($bypass == true) {
6208    
6209     //
6210     return true;
6211     }
6212 softime 6565 // Si l'utilisateur est un intructeur qui correspond à la
6213     // division du dossier ou qu'il peut changer la décision
6214     if ($this->is_instructeur_from_division_dossier() === true or
6215     $this->isInstrCanChangeDecision($this->getParameter('idxformulaire')) === true) {
6216 mbroquet 3730 //
6217 softime 6565 return true;
6218 mbroquet 3730 }
6219    
6220     //
6221 softime 6565 return false;
6222 mbroquet 3730 }
6223    
6224     /**
6225     * CONDITION - is_finalizable.
6226     *
6227     * Condition pour afficher le bouton.
6228     *
6229     * @return boolean
6230     */
6231     function is_finalizable() {
6232     // Contrôle si l'utilisateur possède un bypass
6233 softime 7996 $bypass = $this->f->isAccredited($this->get_absolute_class_name()."_finaliser_bypass");
6234 mbroquet 3730 //
6235     if ($bypass == true) {
6236     //
6237     return true;
6238     }
6239 softime 6565
6240 mbroquet 3730 // Si l'utilisateur est un instructeur, que le dossier est cloturé et
6241     // que l'événement n'est pas identifié comme non verrouillable
6242     if ($this->f->isUserInstructeur()
6243     && $this->getStatutAutorisationDossier($this->getParameter("idxformulaire")) == "cloture"
6244     && $this->checkEvenementNonVerrouillable($this->getVal("instruction")) === false) {
6245     //
6246     return false;
6247     }
6248 softime 6565
6249     // Si l'utilisateur est un intructeur qui correspond à la division du
6250     // dossier
6251     if ($this->is_instructeur_from_division_dossier() === true) {
6252     //
6253     return true;
6254     }
6255 mbroquet 3730
6256 softime 6565 // Si l'utilisateur est instructeur de la commune du dossier et que
6257     // l'instruction est créée par un instructeur de la commune
6258     if ($this->is_instructeur_from_collectivite_dossier() === true and
6259     $this->getVal('created_by_commune') === 't') {
6260     return true;
6261     }
6262    
6263 mbroquet 3730 //
6264 softime 6565 return false;
6265 mbroquet 3730 }
6266    
6267     /**
6268     * CONDITION - is_finalize_without_bypass.
6269     *
6270     * Condition pour afficher le bouton sans le bypass.
6271     *
6272     * @return boolean [description]
6273     */
6274     function is_finalizable_without_bypass() {
6275     // Récupère la valeur du champ finalisé
6276     $om_final_instruction = $this->getVal('om_final_instruction');
6277    
6278     // Si le rapport n'est pas finalisé
6279     if (empty($om_final_instruction)
6280     || $om_final_instruction == 'f') {
6281     //
6282     return true;
6283     }
6284    
6285     //
6286     return false;
6287     }
6288    
6289     /**
6290     * CONDITION - is_unfinalizable.
6291     *
6292     * Condition pour afficher le bouton.
6293     *
6294     * @return boolean
6295     */
6296     function is_unfinalizable(){
6297     // Contrôle si l'utilisateur possède un bypass
6298 softime 7996 $bypass = $this->f->isAccredited($this->get_absolute_class_name()."_definaliser_bypass");
6299 mbroquet 3730 //
6300     if ($bypass == true) {
6301     //
6302     return true;
6303     }
6304 softime 6565
6305     // Si l'utilisateur est un instructeur, que le dossier est cloturé et
6306     // que l'événement n'est pas identifié comme non verrouillable
6307 mbroquet 3730 if ($this->f->isUserInstructeur()
6308 softime 6565 && $this->getStatutAutorisationDossier($this->getParameter("idxformulaire")) == "cloture"
6309     && $this->checkEvenementNonVerrouillable($this->getVal("instruction")) === false) {
6310 mbroquet 3730 //
6311     return false;
6312     }
6313    
6314 softime 6565 // Si l'utilisateur est un intructeur qui correspond à la division du
6315     // dossier
6316     if ($this->is_instructeur_from_division_dossier() === true) {
6317     //
6318     return true;
6319 mbroquet 3730 }
6320    
6321 softime 6565 // Si l'utilisateur est instructeur de la commune du dossier et que
6322     // l'instruction est créée par un instructeur de la commune
6323     if ($this->is_instructeur_from_collectivite_dossier() === true and
6324     $this->getVal('created_by_commune') === 't') {
6325     return true;
6326 mbroquet 3730 }
6327    
6328     //
6329 softime 6565 return false;
6330 mbroquet 3730 }
6331    
6332     /**
6333     * CONDITION - is_unfinalizable_without_bypass.
6334     *
6335     * Condition pour afficher le bouton sans le bypass.
6336     *
6337     * @return boolean
6338     */
6339     function is_unfinalizable_without_bypass() {
6340     // Récupère la valeur du champ finalisé
6341     $om_final_instruction = $this->getVal('om_final_instruction');
6342    
6343     // Si l'instruction est finalisée
6344     if ($om_final_instruction == 't') {
6345     //
6346     return true;
6347     }
6348    
6349     //
6350     return false;
6351     }
6352    
6353 softime 5169
6354 mbroquet 3730 /**
6355 softime 6565 * Permet de définir si un instructeur commune peut editer une instruction
6356     *
6357     * @return boolean true si il peut
6358     */
6359     function isInstrCanChangeDecision($idx) {
6360    
6361     if ($this->f->isAccredited(array("instruction", "instruction_changer_decision"), "OR") !== true or
6362     $this->f->isUserInstructeur() !== true) {
6363     return false;
6364     }
6365    
6366    
6367    
6368     // Sinon on vérifie l'éligibilité du dossier au changement de décision
6369 softime 11876 // /!\ Requête lié à celles du widget indiquant les dossiers éligible au changement
6370     // de décision :
6371     // * dossier_instruction.class.php : view_widget_dossiers_evenement_retour_finalise()
6372     // * dossier_instruction.inc.php : si le paramètre filtre_decision = true
6373     $sql = sprintf(
6374     'SELECT
6375 softime 6565 dossier.dossier
6376     FROM
6377 softime 11876 %1$sdossier
6378     JOIN %1$setat
6379     ON dossier.etat = etat.etat AND etat.statut = \'encours\'
6380     JOIN %1$slien_dossier_demandeur
6381     ON dossier.dossier = lien_dossier_demandeur.dossier AND lien_dossier_demandeur.petitionnaire_principal IS TRUE
6382     JOIN %1$sdossier_instruction_type
6383     ON dossier.dossier_instruction_type=dossier_instruction_type.dossier_instruction_type
6384     JOIN %1$sinstruction
6385     -- Recherche de la dernière instruction qui ne soit pas liée à un événement retour
6386     ON instruction.instruction = (
6387     SELECT instruction
6388     FROM %1$sinstruction
6389     JOIN %1$sevenement ON instruction.evenement=evenement.evenement
6390     AND evenement.retour IS FALSE
6391     WHERE instruction.dossier = dossier.dossier
6392     ORDER BY date_evenement DESC, instruction DESC
6393     LIMIT 1
6394     )
6395     -- On ne garde que les dossiers pour lesquels la dernière instruction est finalisée
6396     -- ou alors pour laquelle l instruction a été ajouté par la commune et est
6397     -- non signée, non notifié, etc.
6398     AND (instruction.om_final_instruction IS TRUE
6399     OR instruction.created_by_commune IS TRUE)
6400     AND instruction.date_retour_signature IS NULL
6401     AND instruction.date_envoi_rar IS NULL
6402     AND instruction.date_retour_rar IS NULL
6403     AND instruction.date_envoi_controle_legalite IS NULL
6404     AND instruction.date_retour_controle_legalite IS NULL
6405     -- On vérifie que l instruction soit un arrêté ou un changement de décision
6406     JOIN %1$sevenement
6407     ON instruction.evenement=evenement.evenement
6408     AND (evenement.type = \'arrete\'
6409     OR evenement.type = \'changement_decision\')
6410     -- Recherche les informations du pétitionnaire principal pour l affichage
6411     JOIN %1$sdemandeur
6412     ON lien_dossier_demandeur.demandeur = demandeur.demandeur
6413     -- Recherche la collectivité rattachée à l instructeur
6414     JOIN %1$sinstructeur
6415     ON dossier.instructeur=instructeur.instructeur
6416     JOIN %1$sdivision
6417     ON instructeur.division=division.division
6418     JOIN %1$sdirection
6419     ON division.direction=direction.direction
6420     JOIN %1$som_collectivite
6421     ON direction.om_collectivite=om_collectivite.om_collectivite
6422 softime 6565 WHERE
6423 softime 11876 -- Vérification que la décision a été prise par l agglo
6424     om_collectivite.niveau = \'2\'
6425     AND dossier.dossier = \'%2$s\'
6426     ',
6427     DB_PREFIXE,
6428 softime 14064 $this->f->db->escapeSimple($idx)
6429 softime 11876 );
6430 softime 6565
6431    
6432     // Si collectivité de l'utilisateur niveau mono alors filtre sur celle-ci
6433     if ($this->f->isCollectiviteMono($_SESSION['collectivite']) === true) {
6434 softime 11876 $sql .= sprintf(
6435 softime 14064 ' AND dossier.om_collectivite = %1$d',
6436     intval($_SESSION['collectivite'])
6437 softime 11876 );
6438 softime 6565 }
6439 softime 14064 $qres = $this->f->get_one_result_from_db_query(
6440     $sql,
6441     array(
6442     "origin" => __METHOD__,
6443     )
6444     );
6445    
6446     return $qres['result'] !== null;
6447 softime 6565 }
6448    
6449    
6450     /**
6451 softime 5169 * CONDITION - can_monitoring_dates.
6452     *
6453     * Condition pour afficher le bouton de suivi des dates.
6454     *
6455     * @return boolean
6456     */
6457     public function can_monitoring_dates() {
6458     // Récupère la valeur du champ finalisé
6459     $om_final_instruction = $this->getVal('om_final_instruction');
6460    
6461     // Si l'instruction n'est pas finalisée
6462     if ($om_final_instruction !== 't') {
6463     //
6464     return false;
6465     }
6466    
6467     // Contrôle si l'utilisateur possède un bypass
6468 softime 7996 $bypass = $this->f->isAccredited($this->get_absolute_class_name()."_modification_dates_bypass");
6469 softime 5169 if ($bypass === true) {
6470     return true;
6471     }
6472    
6473 softime 8989 // Permission de modifier le suivi des dates sur un dossier cloturé pour
6474     // un utilisateur lié à un instructeur
6475     $perm_moni_dates_d_closed = $this->f->isAccredited($this->get_absolute_class_name()."_modification_dates_cloture");
6476    
6477     // On vérifie en premier lieu que le DI n'est pas clôturé et que
6478     // l'utilisateur ne possède pas la permission de modifier le suivi des
6479     // dates sur un dossier clôturé
6480 softime 5169 $inst_dossier = $this->get_inst_dossier();
6481 softime 8989 if ($inst_dossier->getStatut() === 'cloture'
6482     && $perm_moni_dates_d_closed === false) {
6483 softime 5169 //
6484     return false;
6485     }
6486     // On récupère ses infos
6487     $coll_di = $inst_dossier->getVal('om_collectivite');
6488     $div_di = $this->getDivisionFromDossier();
6489     // et celles de son éventuel instructeur
6490     $instr_di = $inst_dossier->getVal('instructeur');
6491    
6492 softime 6565 // Il faut disposer d'une entrée instructeur
6493     if ($this->f->isUserInstructeur() === false) {
6494     return false;
6495     }
6496    
6497 softime 5169 // Par défaut on prétend que l'instructeur n'est pas multi
6498     $instr_di_coll_multi = false;
6499     // Si un instructeur est affecté au dossier
6500     if ($instr_di !== '' && $instr_di !== null) {
6501     // Vérifie si l'instructeur est de la collectivité de niveau 2
6502 softime 5295 $instr_di_coll = $this->get_instructeur_om_collectivite($instr_di);
6503 softime 5169 if ($this->f->isCollectiviteMono($instr_di_coll) === false) {
6504     //
6505     $instr_di_coll_multi = true;
6506     }
6507     }
6508    
6509 softime 6565 // Il faut qu'il instruise le dossier ou soit de la même division
6510     if ($this->f->om_utilisateur['instructeur'] === $instr_di
6511     || $this->f->om_utilisateur['division'] === $div_di) {
6512 softime 5169 //
6513     return true;
6514     }
6515    
6516 softime 6565 // On donne également le droit s'il est de la même collectivité que
6517     // le dossier ET si l'instruction est déléguée à la communauté
6518     if ($this->f->isCollectiviteMono($this->f->om_utilisateur['om_collectivite']) === true
6519     && $this->f->om_utilisateur['om_collectivite'] === $coll_di
6520     && $instr_di_coll_multi === true) {
6521 softime 5169 //
6522     return true;
6523     }
6524    
6525 softime 6565 // Si l'instructeur ne rentre pas dans les deux cas précédents
6526 softime 5169 return false;
6527     }
6528    
6529    
6530     /**
6531 softime 12847 * CONDITION - is_finalized.
6532     *
6533     * Condition pour vérifier si une instruction est finalisée.
6534     *
6535     * @return boolean
6536     */
6537     public function is_finalized() {
6538    
6539     return $this->getVal('om_final_instruction') === "t";
6540     }
6541    
6542     /**
6543     * CONDITION - is_not_date_retour_signature_set.
6544     *
6545     * Condition pour vérifier si une date de retour signature n'est pas définie.
6546     *
6547     * @return boolean
6548     */
6549     public function is_not_date_retour_signature_set() {
6550    
6551     return $this->getVal('date_retour_signature') == null;
6552    
6553     }
6554    
6555    
6556     /**
6557 mbroquet 3730 * TREATMENT - finalize.
6558     *
6559     * Permet de finaliser un enregistrement.
6560     *
6561     * @param array $val valeurs soumises par le formulaire
6562     *
6563     * @return boolean
6564     */
6565     function finalize($val = array()) {
6566    
6567     // Cette méthode permet d'exécuter une routine en début des méthodes
6568     // dites de TREATMENT.
6569     $this->begin_treatment(__METHOD__);
6570 softime 10808 $message = '';
6571 softime 11585 $ev = $this->get_inst_evenement($this->getVal('evenement'));
6572 mbroquet 3730
6573 softime 11585 // Controle du signataire
6574     if (! $this->controle_signataire($ev)) {
6575     $this->addToMessage(__("Le document ne peut pas être finalisé car aucun signataire n'a été sélectionné."));
6576     // Termine le traitement
6577     return $this->end_treatment(__METHOD__, false);
6578     }
6579    
6580 mbroquet 3730 // Traitement de la finalisation
6581     $ret = $this->manage_finalizing("finalize", $val);
6582    
6583     // Si le traitement retourne une erreur
6584     if ($ret !== true) {
6585    
6586     // Termine le traitement
6587 softime 5024 return $this->end_treatment(__METHOD__, false);
6588 mbroquet 3730 }
6589    
6590 softime 10808 // Envoi des notifications aux demandeurs si la notification est automatique
6591     // et que la signature n'est pas requise
6592     if ($ev->getVal('notification') === 'notification_automatique') {
6593 softime 13137 // Préparation du message de log en cas d'erreur de notification
6594 softime 13528 $msgLog = sprintf(
6595     '%s %s : %d',
6596     __('Erreur lors de la notification automatique du(des) pétitionnaire(s) suite à la finalisation de l\'instruction.'),
6597     __('Instruction notifiée'),
6598     $this->getVal($this->clePrimaire)
6599     );
6600 softime 10808 // Récupération de la catégorie et envoie des notifications au(x) demandeur(s)
6601     $collectivite_di = $this->get_dossier_instruction_om_collectivite($this->getVal('dossier'));
6602     // Récupération de la liste des demandeurs à notifier et de la catégorie
6603     $categorie = $this->f->get_param_option_notification($collectivite_di);
6604 softime 14064 $isPortal = $categorie === PORTAL;
6605 softime 10869 $demandeursANotifie = $this->get_demandeurs_notifiable(
6606     $this->getVal('dossier'),
6607     $isPortal
6608     );
6609 softime 10808
6610     // Création d'une notification et d'une tâche pour chaque demandeur à notifier
6611 softime 12124 $demandeurPrincipalNotifie = false;
6612 softime 10813 if (count($demandeursANotifie) > 0) {
6613     foreach ($demandeursANotifie as $demandeur) {
6614 softime 12124 // Identifie si le demandeur principal a été notifié ou pas
6615     // et récupère ses informations
6616     if ($demandeur['petitionnaire_principal'] == 't') {
6617     $demandeurPrincipalNotifie = true;
6618     // Si le demandeur principal est notifiable mais qu'il y a des erreurs dans
6619     // son paramétrage, on effectue pas le traitement et on passe à l'itération
6620     // suivante. On le considère également comme non notifié pour gérer l'envoie
6621     // des messages d'erreurs
6622     // Si la demande a été déposée via le portail alors le paramétrage n'a pas
6623     // d'impact sur la notification
6624     $erreursParam = $this->get_info_notification_fail();
6625     if (! $this->dossier_depose_sur_portail() && $erreursParam != array()) {
6626     $demandeurPrincipalNotifie = false;
6627     continue;
6628     }
6629     }
6630 softime 10813 // Ajout de la notif et récupération de son id
6631     $idNotif = $this->ajouter_notification(
6632     $this->getVal($this->clePrimaire),
6633     $this->f->get_connected_user_login_name(),
6634 softime 10968 $demandeur,
6635     $collectivite_di,
6636 softime 12433 array(),
6637 softime 10968 true
6638 softime 10808 );
6639 softime 10813 if ($idNotif === false) {
6640     // Termine le traitement
6641 softime 13528 $this->addToLog(
6642     sprintf('%s() : %s', __METHOD__, $msgLog),
6643     DEBUG_MODE
6644     );
6645 softime 10813 return $this->end_treatment(__METHOD__, false);
6646     }
6647     $notification_by_task = $this->notification_by_task(
6648     $idNotif,
6649     $this->getVal('dossier'),
6650     $categorie
6651 softime 10808 );
6652 softime 10813 if ($notification_by_task === false) {
6653 softime 13528 $this->addToLog(
6654     sprintf('%s() : %s', __METHOD__, $msgLog),
6655     DEBUG_MODE
6656     );
6657 softime 10813 $this->addToMessage(
6658     __("Erreur lors de la génération de la notification au(x) pétitionnaire(s).")
6659     );
6660     // Termine le traitement
6661     return $this->end_treatment(__METHOD__, false);
6662     }
6663 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.")));
6664 softime 10808 }
6665     }
6666 softime 12847 // Pour la notification par mail ou la notification via portal si le dossier a
6667     // été déposés via portal, si le demandeur principal n'est pas notifiable,
6668     // on créé une nouvelle notification en erreur avec en commentaire la raison pour
6669     // laquelle le demandeur principal n'a pas pu être notifié
6670     $depotPortal = $this->dossier_depose_sur_portail();
6671     if (! $demandeurPrincipalNotifie && ($isPortal === false || $depotPortal === true)) {
6672 softime 13137 // Préparation des logs pour indiquer que le pétitionnaire principale n'est pas notifiable
6673 softime 13528 $msgLog .= sprintf(' %s', __('Le pétitionnaire principale n\'est pas notifiable.'));
6674 softime 12124 // Analyse pour savoir pourquoi le demandeur principal n'est pas notifiable
6675     $erreursParam = $this->get_info_notification_fail();
6676     $demandeurPrincipal = $this->get_info_petitionnaire_principal_dossier($this->getVal('dossier'));
6677     // Ajout de la notif et récupération de son id
6678     $idNotif = $this->ajouter_notification(
6679     $this->valF[$this->clePrimaire],
6680     $this->f->get_connected_user_login_name(),
6681     $demandeurPrincipal,
6682     $collectivite_di,
6683 softime 12433 array(),
6684 softime 12124 true,
6685     'Echec',
6686     implode(' ', $erreursParam)
6687     );
6688     if ($idNotif === false) {
6689     $this->addToMessage(
6690     __('Erreur : la création de la notification a échouée.').
6691     __("Veuillez contacter votre administrateur.")
6692     );
6693 softime 13528 $this->addToLog(
6694     sprintf('%s() : %s', __METHOD__, $msgLog),
6695     DEBUG_MODE
6696     );
6697 softime 12124 return false;
6698     }
6699     // Prépare un message d'alerte à destination de l'instructeur pour l'informer
6700     // de l'échec de la notification
6701     $dossier_message = $this->get_inst_dossier_message(0);
6702     $dossier_message_val = array(
6703     'dossier' => $this->getVal('dossier'),
6704     'type' => _('erreur expedition'),
6705     'emetteur' => $this->f->get_connected_user_login_name(),
6706     'login' => $_SESSION['login'],
6707     'date_emission' => date('Y-m-d H:i:s'),
6708     'contenu' => _('Échec lors de la notification de l\'instruction ').
6709     $ev->getVal('libelle').
6710     '.<br>'.
6711     implode("\n", $erreursParam).
6712     '<br>'.
6713     _('Veuillez corriger ces informations avant de renvoyer la notification.')
6714     );
6715     $add = $dossier_message->add_notification_message($dossier_message_val, true);
6716     // Si une erreur se produit pendant l'ajout
6717     if ($add !== true) {
6718     $this->addToLog(__METHOD__."(): Le message d'alerte concernant l'echec de l'envoi de la notification n'a pas pu être envoyé.", DEBUG_MODE);
6719     return false;
6720     }
6721     }
6722 softime 10808 }
6723    
6724 mbroquet 3730 // Termine le traitement
6725     return $this->end_treatment(__METHOD__, true);
6726     }
6727    
6728     /**
6729 softime 12124 * Récupère l'instance de dossier message.
6730     *
6731     * @param string $dossier_message Identifiant du message.
6732     *
6733     * @return object
6734     */
6735     private function get_inst_dossier_message($dossier_message = null) {
6736     //
6737     return $this->get_inst_common("dossier_message", $dossier_message);
6738     }
6739    
6740     /**
6741 softime 11585 * Vérifie si le signataire est obligatoire pour finaliser
6742     * le document apartir du paramétrage de l'événement.
6743     * Si c'est le cas, vérifie si il y a bien un signataire
6744     * renseigné.
6745     * Si c'est le cas renvoie true, sinon renvoie false.
6746     *
6747     * @param evenement évenement de l'instruction permettant de
6748     * récupérer le paramétrage
6749     * @return boolean
6750     */
6751     protected function controle_signataire($evenement) {
6752     // Vérifie si le signataire est obligatoire et si c'est le cas
6753     // vérifie si il y a bien un signataire pour le document
6754     if ($evenement->is_signataire_obligatoire() &&
6755     ($this->getVal('signataire_arrete') === null ||
6756     $this->getVal('signataire_arrete') === '')) {
6757     return false;
6758     }
6759     return true;
6760     }
6761    
6762     /**
6763 mbroquet 3730 * TREATMENT - unfinalize.
6764     *
6765     * Permet de définaliser un enregistrement.
6766     *
6767     * @param array $val valeurs soumises par le formulaire
6768     *
6769     * @return boolean
6770     */
6771     function unfinalize($val = array()) {
6772    
6773     // Cette méthode permet d'exécuter une routine en début des méthodes
6774     // dites de TREATMENT.
6775     $this->begin_treatment(__METHOD__);
6776    
6777     // Traitement de la finalisation
6778     $ret = $this->manage_finalizing("unfinalize", $val);
6779    
6780     // Si le traitement retourne une erreur
6781     if ($ret !== true) {
6782    
6783     // Termine le traitement
6784 softime 5024 return $this->end_treatment(__METHOD__, false);
6785 mbroquet 3730 }
6786    
6787     // Termine le traitement
6788     return $this->end_treatment(__METHOD__, true);
6789     }
6790    
6791     /**
6792     * VIEW - view_edition
6793     *
6794     * Edite l'édition de l'instruction ou affiche celle contenue dans le stockage.
6795     *
6796     * @return null Si l'action est incorrecte
6797     */
6798     function view_edition() {
6799    
6800     // Si l'instruction est finalisée
6801     if($this->getVal("om_final_instruction") == 't'
6802     && $this->getVal("om_final_instruction") != null) {
6803    
6804     // Ouvre le document
6805 softime 7996 $lien = '../app/index.php?module=form&snippet=file&obj='.$this->table.'&'.
6806 mbroquet 3730 'champ=om_fichier_instruction&id='.$this->getVal($this->clePrimaire);
6807     //
6808     header("Location: ".$lien);
6809     } else {
6810    
6811     // Récupère la collectivite du dossier d'instruction
6812     $dossier_instruction_om_collectivite = $this->get_dossier_instruction_om_collectivite();
6813    
6814     //
6815     $collectivite = $this->f->getCollectivite($dossier_instruction_om_collectivite);
6816    
6817     // Paramètre du PDF
6818     $params = array(
6819     "watermark" => true,
6820     "specific" => array(
6821     "mode" => "previsualisation",
6822     ),
6823     );
6824 softime 8593 // Si la rédaction libre est activée sur l'instruction
6825     if ($this->getVal("flag_edition_integrale") == 't') {
6826     $params["specific"]["corps"] = array(
6827     "mode" => "set",
6828     "value" => $this->getVal("corps_om_htmletatex"),
6829     );
6830     $params["specific"]["titre"] = array(
6831     "mode" => "set",
6832     "value" => $this->getVal("titre_om_htmletat"),
6833     );
6834     }
6835 mbroquet 3730
6836     // Génération du PDF
6837     $result = $this->compute_pdf_output('lettretype', $this->getVal("lettretype"), $collectivite, null, $params);
6838     // Affichage du PDF
6839     $this->expose_pdf_output(
6840     $result['pdf_output'],
6841     $result['filename']
6842     );
6843     }
6844     }
6845    
6846     /**
6847     * Récupère la collectivité du dossier d'instruction.
6848     *
6849 softime 7685 * @param string $dossier_instruction_id Identifiant du DI.
6850     *
6851 mbroquet 3730 * @return integer
6852     */
6853 softime 7685 function get_dossier_instruction_om_collectivite($dossier_instruction_id = null) {
6854 mbroquet 3730
6855 softime 7685 // Si l'identifiant n'est pas renseigné
6856     if ($dossier_instruction_id === null) {
6857 softime 8593 // Récupère la valeur
6858     if ($this->getVal('dossier') !== null && $this->getVal('dossier') !== '') {
6859     $dossier_instruction_id = $this->getVal('dossier');
6860     } elseif ($this->getParameter('idxformulaire') !== null
6861     && $this->getParameter('idxformulaire') !== '') {
6862     //
6863     $dossier_instruction_id = $this->getParameter('idxformulaire');
6864     } elseif ($this->f->get_submitted_get_value('idxformulaire') !== null
6865     && $this->f->get_submitted_get_value('idxformulaire') !== '') {
6866     //
6867     $dossier_instruction_id = $this->f->get_submitted_get_value('idxformulaire');
6868     }
6869 softime 7685 }
6870    
6871 mbroquet 3730 //
6872 softime 7996 $dossier_instruction = $this->f->get_inst__om_dbform(array(
6873     "obj" => "dossier_instruction",
6874     "idx" => $dossier_instruction_id,
6875     ));
6876 mbroquet 3730
6877     //
6878     return $dossier_instruction->getVal('om_collectivite');
6879     }
6880    
6881     /**
6882     * VIEW - view_bible
6883     *
6884     * Affiche la bible manuelle.
6885     *
6886     * @return void
6887     */
6888     function view_bible() {
6889     // Vérification de l'accessibilité sur l'élément
6890     $this->checkAccessibility();
6891    
6892     /**
6893     * Affichage de la structure HTML
6894     */
6895     //
6896 softime 8989 if ($this->f->isAjaxRequest()) {
6897 mbroquet 3730 //
6898     header("Content-type: text/html; charset=".HTTPCHARSET."");
6899     } else {
6900     //
6901 softime 8989 $this->f->setFlag("htmlonly");
6902     $this->f->display();
6903 mbroquet 3730 }
6904     //
6905 softime 8989 $this->f->displayStartContent();
6906 mbroquet 3730 //
6907 softime 8989 $this->f->setTitle(_("Liste des éléments de la bible en lien avec un evenement"));
6908     $this->f->displayTitle();
6909 mbroquet 3730
6910     /**
6911     *
6912     */
6913     //
6914 softime 8989 ($this->f->get_submitted_get_value("ev") ? $evenement = $this->f->get_submitted_get_value("ev") : $evenement = "");
6915 mbroquet 3730 $evenement = intval($evenement);
6916     //
6917 softime 8989 ($this->f->get_submitted_get_value("idx") ? $idx = $this->f->get_submitted_get_value("idx") : $idx = "");
6918 softime 5169 // Récupération du code du type de DA
6919     $code_da_type = '';
6920     if (preg_match('/[A-Za-z]{2,3}/', $idx, $matches) !== false) {
6921     $code_da_type = $matches[0];
6922     }
6923 mbroquet 3730 //
6924 softime 8989 ($this->f->get_submitted_get_value("complement") ? $complement = $this->f->get_submitted_get_value("complement") : $complement = "1");
6925 mbroquet 3730
6926     // Récupération de la collectivité du dossier
6927 softime 7996 $dossier = $this->f->get_inst__om_dbform(array(
6928     "obj" => "dossier",
6929     "idx" => $idx,
6930     ));
6931 mbroquet 3730
6932 softime 14542 $qres = $this->f->get_all_results_from_db_query(
6933     sprintf(
6934     'SELECT
6935     *,
6936     bible.libelle as bible_lib
6937     FROM
6938     %1$sbible
6939     LEFT OUTER JOIN %1$sdossier_autorisation_type
6940     ON bible.dossier_autorisation_type = dossier_autorisation_type.dossier_autorisation_type
6941     LEFT JOIN %1$som_collectivite
6942     ON bible.om_collectivite = om_collectivite.om_collectivite
6943     WHERE
6944     (evenement = %2$d
6945     OR evenement IS NULL)
6946     AND (complement = %3$d
6947     OR complement IS NULL)
6948     AND (bible.dossier_autorisation_type IS NULL
6949     OR dossier_autorisation_type.code = \'%4$s\')
6950     AND (om_collectivite.niveau = \'2\'
6951     OR bible.om_collectivite = %5$d)
6952     ORDER BY
6953     bible_lib ASC',
6954     DB_PREFIXE,
6955     intval($evenement),
6956     intval($complement),
6957     $this->f->db->escapeSimple($code_da_type),
6958     intval($dossier->getVal("om_collectivite"))
6959     ),
6960     array(
6961     'origin' => __METHOD__
6962     )
6963     );
6964 mbroquet 3730 //
6965     echo "<form method=\"post\" name=\"f3\" action=\"#\">\n";
6966     //
6967 softime 14542 if (count($qres['result']) > 0) {
6968 mbroquet 3730 //
6969     echo "\t<table id='tab-bible' width='100%'>\n";
6970     //
6971     echo "\t\t<tr class=\"ui-tabs-nav ui-accordion ui-state-default tab-title\">";
6972     echo "<th>"._("Choisir")."</th>";
6973     echo "<th>"._("Libelle")."</th>";
6974     echo "</tr>\n";
6975     //
6976     $i = 0;
6977     //
6978 softime 14542 foreach ($qres['result'] as $row) {
6979 mbroquet 3730 //
6980     echo "\t\t<tr";
6981     echo " class=\"".($i % 2 == 0 ? "odd" : "even")."\"";
6982     echo ">";
6983     //
6984     echo "<td class=\"center\"><input type=\"checkbox\" name=\"choix[]\" value=\"".$i."\" id=\"checkbox".$i."\" /></td>";
6985     // XXX utilisation de l'attribut titre pour afficher une infobulle
6986     echo "<td><span class=\"content\" title=\"".htmlentities($row['contenu'])."\" id=\"content".$i."\">".$row['bible_lib']."</span></td>";
6987     //
6988     echo "</tr>\n";
6989     //
6990     $i++;
6991     }
6992     echo "\t</table>\n";
6993     //
6994     echo "<div class=\"formControls\">\n";
6995 softime 8989 $this->f->layout->display_form_button(array(
6996 mbroquet 3730 "value" => _("Valider"),
6997     "onclick" => "bible_return('f2', 'complement".($complement == "1" ? "" : $complement)."_om_html'); return false;",
6998     ));
6999 softime 8989 $this->f->displayLinkJsCloseWindow();
7000 mbroquet 3730 echo "</div>\n";
7001    
7002     } else {
7003     //
7004     $message_class = "error";
7005     $message = _("Aucun element dans la bible pour l'evenement")." : ".$evenement;
7006 softime 8989 $this->f->displayMessage($message_class, $message);
7007 mbroquet 3730 //
7008     echo "<div class=\"formControls\">\n";
7009 softime 8989 $this->f->displayLinkJsCloseWindow();
7010 mbroquet 3730 echo "</div>\n";
7011     }
7012     //
7013     echo "</form>\n";
7014    
7015     /**
7016     * Affichage de la structure HTML
7017     */
7018     //
7019 softime 8989 $this->f->displayEndContent();
7020 mbroquet 3730 }
7021    
7022     /**
7023 softime 5169 * VIEW - view_bible_auto
7024 mbroquet 3730 *
7025 softime 5169 * Renvoie les valeurs de la bible à placer dans les compléments de l'instruction.
7026 mbroquet 3730 *
7027     * @return void
7028     */
7029     function view_bible_auto() {
7030     // Vérification de l'accessibilité sur l'élément
7031     $this->checkAccessibility();
7032     //
7033 softime 8989 $this->f->disableLog();
7034 mbroquet 3730
7035     $formatDate="AAAA-MM-JJ";
7036    
7037     // Récupération des paramètres
7038 softime 8989 $idx = $this->f->get_submitted_get_value('idx');
7039     $evenement = $this->f->get_submitted_get_value('ev');
7040 mbroquet 3730
7041     // Initialisation de la variable de retour
7042     $retour['complement_om_html'] = '';
7043     $retour['complement2_om_html'] = '';
7044     $retour['complement3_om_html'] = '';
7045     $retour['complement4_om_html'] = '';
7046 softime 14064
7047 mbroquet 3730 // Vérification d'une consultation liée à l'événement
7048 softime 14064 $instEvenement = $this->f->get_inst__om_dbform(array(
7049     "obj" => "evenement",
7050     "idx" => $evenement,
7051     ));
7052    
7053 mbroquet 3730 // Si consultation liée, récupération du retour d'avis
7054 softime 14064 if($instEvenement->getVal('consultation') == 'Oui'){
7055 softime 14542
7056     $qres = $this->f->get_all_results_from_db_query(
7057     sprintf(
7058     'SELECT
7059     date_retour,
7060     avis_consultation.libelle as avis_consultation,
7061     COALESCE(service.libelle, tiers_consulte.libelle) as service
7062     FROM
7063     %1$sconsultation
7064     LEFT JOIN %1$stiers_consulte
7065     ON consultation.tiers_consulte = tiers_consulte.tiers_consulte
7066     LEFT JOIN %1$sservice
7067     ON consultation.service = service.service
7068     LEFT JOIN %1$savis_consultation
7069     ON consultation.avis_consultation = avis_consultation.avis_consultation
7070     WHERE
7071     dossier = \'%2$s\'
7072     AND consultation.visible',
7073     DB_PREFIXE,
7074     $this->f->db->escapeSimple($idx)
7075     ),
7076     array(
7077     'origin' => __METHOD__
7078     )
7079 softime 11876 );
7080 mbroquet 3730 // Récupération des consultations
7081 softime 14542 foreach ($qres['result'] as $row) {
7082 mbroquet 3730 $correct=false;
7083     // date retour
7084     if ($row['date_retour']<>""){
7085     if ($formatDate=="AAAA-MM-JJ"){
7086     $date = explode("-", $row['date_retour']);
7087     // controle de date
7088     if (count($date) == 3 and
7089     checkdate($date[1], $date[2], $date[0])) {
7090     $date_retour_f= $date[2]."/".$date[1]."/".$date[0];
7091     $correct=true;
7092     }else{
7093     $msg= $msg."<br>La date ".$row['date_retour']." n'est pas une date.";
7094     $correct=false;
7095     }
7096     }
7097     }
7098     //
7099     $temp="Vu l'avis ".$row['avis_consultation']." du service ".$row['service'];
7100     if($correct == true){
7101     $temp=$temp." du ".$date_retour_f;
7102     }
7103     // Concaténation des retours d'avis de consultation
7104 softime 7067 $retour['complement_om_html'] .= $temp . "<br/><br/>";
7105 mbroquet 3730 } // while
7106    
7107     } // consultation
7108     // Récupération des bibles automatiques pour le champ complement_om_html
7109 softime 8989 $retour['complement_om_html'] .= $this->getBible($evenement, $idx, '1');
7110 mbroquet 3730 // Récupération des bibles automatiques pour le champ complement2_om_html
7111 softime 8989 $retour['complement2_om_html'] .= $this->getBible($evenement, $idx, '2');
7112 mbroquet 3730 // Récupération des bibles automatiques pour le champ complement3_om_html
7113 softime 8989 $retour['complement3_om_html'] .= $this->getBible($evenement, $idx, '3');
7114 mbroquet 3730 // Récupération des bibles automatiques pour le champ complement4_om_html
7115 softime 8989 $retour['complement4_om_html'] .= $this->getBible($evenement, $idx, '4');
7116 mbroquet 3730
7117    
7118    
7119     echo json_encode($retour);
7120     }
7121    
7122     /**
7123 softime 7521 * VIEW - view_pdf_temp
7124     *
7125     * @return void
7126     */
7127     function view_pdf_temp() {
7128     $this->checkAccessibility();
7129 softime 8593 // Utilisation de $_POST pour ne pas que les textes soient altérés.
7130 softime 7521 $this->f->set_submitted_value();
7131 softime 8593 $merge_fields = array();
7132     //
7133     if (array_key_exists('c1', $_POST) === true) {
7134 softime 11876 $merge_fields['[complement_instruction]'] = $_POST['c1'];
7135     $merge_fields['[complement1_instruction]'] = $_POST['c1'];
7136 softime 8593 }
7137     if (array_key_exists('c2', $_POST) === true) {
7138 softime 11876 $merge_fields['[complement2_instruction]'] = $_POST['c2'];
7139 softime 8593 }
7140     if (array_key_exists('c3', $_POST) === true) {
7141 softime 11876 $merge_fields['[complement3_instruction]'] = $_POST['c3'];
7142 softime 8593 }
7143     if (array_key_exists('c4', $_POST) === true) {
7144 softime 11876 $merge_fields['[complement4_instruction]'] = $_POST['c4'];
7145 softime 8593 }
7146 softime 7521 $params = array(
7147     "watermark" => true,
7148     "specific" => array(
7149     "merge_fields" => $merge_fields,
7150     ),
7151     );
7152 softime 8593 //
7153     if (array_key_exists('corps', $_POST) === true) {
7154     $params["specific"]["corps"] = array(
7155     "mode" => "set",
7156 softime 11876 "value" => $_POST['corps'],
7157 softime 8593 );
7158     }
7159     if (array_key_exists('titre', $_POST) === true) {
7160     $params["specific"]["titre"] = array(
7161     "mode" => "set",
7162 softime 11876 "value" => $_POST['titre'],
7163 softime 8593 );
7164     }
7165 softime 7521 $dossier_instruction_om_collectivite = $this->get_dossier_instruction_om_collectivite();
7166     $collectivite = $this->f->getCollectivite($dossier_instruction_om_collectivite);
7167     $result = $this->compute_pdf_output('lettretype', $this->getVal('lettretype'), $collectivite, null, $params);
7168     $retour = array(
7169     'base' => base64_encode($result['pdf_output']),
7170     );
7171     echo json_encode($retour);
7172     }
7173    
7174     /**
7175     * Dans le contexte de prévisualisation des éditions, génère le rendu du
7176     * PDF sans prise en compte de la valeur des compléments et le retourne en
7177     * base 64.
7178     *
7179     * @return string Rendu PDF converti en base 64.
7180     */
7181     function init_pdf_temp() {
7182     $params = array(
7183     "watermark" => true,
7184     );
7185 softime 8593 // Si la rédaction libre est activée sur l'instruction
7186     if ($this->getVal("flag_edition_integrale") == 't') {
7187     $params["specific"]["corps"] = array(
7188     "mode" => "set",
7189     "value" => $this->getVal("corps_om_htmletatex"),
7190     );
7191     $params["specific"]["titre"] = array(
7192     "mode" => "set",
7193     "value" => $this->getVal("titre_om_htmletat"),
7194     );
7195     }
7196 softime 7521 $dossier_instruction_om_collectivite = $this->get_dossier_instruction_om_collectivite();
7197     $collectivite = $this->f->getCollectivite($dossier_instruction_om_collectivite);
7198     $result = $this->compute_pdf_output('lettretype', $this->getVal('lettretype'), $collectivite, null, $params);
7199    
7200     return base64_encode($result['pdf_output']);
7201     }
7202    
7203     /**
7204 mbroquet 3730 * Récupération des éléments de bible.
7205     *
7206     * @param integer $event id de l'événement
7207     * @param string $idx id du dossier
7208     * @param integer $compnb numéro du champ complement
7209     *
7210     * @return string Chaîne de texte à insérer dans le champ complement
7211     */
7212 softime 8989 function getBible($event, $idx, $compnb) {
7213 mbroquet 3730 // Récupération de la collectivité du dossier
7214 softime 7996 $dossier = $this->f->get_inst__om_dbform(array(
7215     "obj" => "dossier",
7216     "idx" => $idx,
7217     ));
7218 softime 5169 // Récupération du code du type de DA
7219     $code_da_type = '';
7220     if (preg_match('/[A-Za-z]{2,3}/', $idx, $matches) !== false) {
7221     $code_da_type = $matches[0];
7222     }
7223 mbroquet 3730
7224 softime 14542 $qres = $this->f->get_all_results_from_db_query(
7225     sprintf(
7226     'SELECT
7227     *
7228     FROM
7229     %1$sbible
7230     LEFT OUTER JOIN %1$sdossier_autorisation_type
7231     ON bible.dossier_autorisation_type =
7232     dossier_autorisation_type.dossier_autorisation_type
7233     LEFT JOIN %1$som_collectivite
7234     ON bible.om_collectivite = om_collectivite.om_collectivite
7235     WHERE
7236     (evenement = %2$d
7237     OR evenement IS NULL)
7238     AND (complement = %3$d
7239     OR complement IS NULL)
7240     AND automatique = \'Oui\'
7241     AND (dossier_autorisation_type.code = \'%4$s\'
7242     OR bible.dossier_autorisation_type IS NULL)
7243     AND (om_collectivite.niveau = \'2\'
7244     OR bible.om_collectivite = %5$d)',
7245     DB_PREFIXE,
7246     intval($event),
7247     intval($compnb),
7248     $this->f->db->escapeSimple($code_da_type),
7249     intval($dossier->getVal("om_collectivite"))
7250     ),
7251     array(
7252     "origin" => __METHOD__
7253     )
7254     );
7255 mbroquet 3730 $temp = "";
7256 softime 14542 foreach ($qres['result'] as $row) {
7257 mbroquet 3730 // Remplacement des retours à la ligne par des br
7258     $temp .= preg_replace(
7259     '#(\\\r|\\\r\\\n|\\\n)#', '<br/>', $row['contenu']
7260     );
7261 softime 7521 // Ajout d'un saut de ligne entre chaque bible.
7262     $temp .= '<br/>';
7263 mbroquet 3730 } // fin while
7264     return $temp;
7265     }
7266    
7267     /**
7268     * VIEW - view_suivi_bordereaux.
7269     *
7270 nmeucci 4317 * Formulaire de choix du bordereau de suivi, permettant de générer les 4 bordereaux.
7271     * Si l'utilisateur est d'une collectivité de niveau 2 il a le choix de la
7272     * collectivité des dossiers affichés.
7273 mbroquet 3730 *
7274     * @return void
7275     */
7276     function view_suivi_bordereaux() {
7277     // Vérification de l'accessibilité sur l'élément
7278     $this->checkAccessibility();
7279    
7280     /**
7281     * Validation du formulaire
7282     */
7283     // Si le formulaire a été validé
7284 softime 8989 if ($this->f->get_submitted_post_value("validation") !== null) {
7285 mbroquet 3730 // Si un bordereau à été sélectionné
7286 softime 8989 if ($this->f->get_submitted_post_value("bordereau") !== null && $this->f->get_submitted_post_value("bordereau") == "" ) {
7287 mbroquet 3730 // Si aucun bordereau n'a été sélectionné
7288     $message_class = "error";
7289     $message = _("Veuillez selectionner un bordereau.");
7290     }
7291     // Sinon si les dates ne sont pas valide
7292 softime 8989 elseif (($this->f->get_submitted_post_value("date_bordereau_debut") !== null
7293     && $this->f->get_submitted_post_value("date_bordereau_debut") == "")
7294     || ($this->f->get_submitted_post_value("date_bordereau_fin") !== null
7295     && $this->f->get_submitted_post_value("date_bordereau_fin") == "")) {
7296 mbroquet 3730 // Si aucune date n'a été saisie
7297     $message_class = "error";
7298     $message = _("Veuillez saisir une date valide.");
7299     }
7300 softime 7366 // Sinon si les dates ne sont pas valides
7301 softime 8989 elseif ($this->f->get_submitted_post_value("bordereau") === "bordereau_avis_maire_prefet"
7302     && $this->f->getParameter("id_evenement_bordereau_avis_maire_prefet") == null) {
7303 softime 7366 // Si aucune date n'a été saisie
7304     $message_class = "error";
7305     $message = _("Erreur de parametrage. Contactez votre administrateur.");
7306     }
7307 mbroquet 3730 // Affiche le message de validation
7308     else {
7309     // On récupère le libellé du bordereau pour l'afficher à l'utilisateur
7310 softime 14064 $etat = $this->f->get_inst__om_dbform(array(
7311     "obj" => "om_etat",
7312     "idx" => $this->f->get_submitted_post_value("bordereau")
7313     ));
7314     $qres = $this->f->get_one_result_from_db_query(
7315     sprintf(
7316     'SELECT
7317     om_etat.libelle
7318     FROM
7319     %som_etat
7320     WHERE
7321     om_etat.id = \'%s\'',
7322     DB_PREFIXE,
7323     $this->f->db->escapeSimple($this->f->get_submitted_post_value("bordereau"))
7324     ),
7325     array(
7326     "origin" => __METHOD__,
7327     )
7328     );
7329    
7330 mbroquet 3730 //
7331     $message_class = "valid";
7332     $message = _("Cliquez sur le lien ci-dessous pour telecharger votre bordereau");
7333     $message .= " : <br/><br/>";
7334     $message .= "<a class='om-prev-icon pdf-16'";
7335     $message .= " title=\""._("Bordereau")."\"";
7336 softime 7996 $message .= "href='".OM_ROUTE_FORM."&obj=instruction";
7337 nmeucci 4317 $message .= "&action=220";
7338     $message .= "&idx=0";
7339 softime 8989 $message .= "&type_bordereau=".$this->f->get_submitted_post_value("bordereau");
7340     $message .= "&date_bordereau_debut=".$this->f->get_submitted_post_value("date_bordereau_debut");
7341     $message .= "&date_bordereau_fin=".$this->f->get_submitted_post_value("date_bordereau_fin");
7342 mbroquet 3730 // Si l'utilisateur est MULTI alors on ajoute le paramètre collectivite
7343 softime 8989 if ($this->f->get_submitted_post_value("om_collectivite") !== null) {
7344     $message .= "&collectivite=".$this->f->get_submitted_post_value("om_collectivite");
7345 mbroquet 3730 }
7346     $message .= "'"." target='_blank'>";
7347 softime 14064 $message .= $qres['result']." "._("du")." ".$this->f->get_submitted_post_value("date_bordereau_debut")
7348 softime 8989 ." "._("au")." ".$this->f->get_submitted_post_value("date_bordereau_fin");
7349 mbroquet 3730 $message .= "</a>";
7350     }
7351     }
7352    
7353     /**
7354     * Affichage des messages et du formulaire
7355     */
7356     // Affichage du message de validation ou d'erreur
7357     if (isset($message) && isset($message_class) && $message != "") {
7358 softime 8989 $this->f->displayMessage($message_class, $message);
7359 mbroquet 3730 }
7360     // Ouverture du formulaire
7361     printf("\t<form");
7362     printf(" method=\"post\"");
7363     printf(" id=\"suivi_bordereaux_form\"");
7364     printf(" action=\"\"");
7365     printf(">\n");
7366     // Paramétrage des champs du formulaire
7367     $champs = array("date_bordereau_debut", "date_bordereau_fin", "bordereau");
7368 softime 8989 // Si l'utilisateur est d'une collectivité de niveau 2 on affiche un select
7369 mbroquet 3730 // collectivité dans le formulaire
7370 softime 8989 if ($_SESSION["niveau"] == 2) {
7371 mbroquet 3730 array_push($champs, "om_collectivite");
7372     }
7373     // Création d'un nouvel objet de type formulaire
7374 softime 7996 $form = $this->f->get_inst__om_formulaire(array(
7375     "validation" => 0,
7376     "maj" => 0,
7377     "champs" => $champs,
7378     ));
7379 mbroquet 3730 // Paramétrage du champ date_bordereau_debut
7380     $form->setLib("date_bordereau_debut", _("date_bordereau_debut"));
7381     $form->setType("date_bordereau_debut", "date");
7382     $form->setTaille("date_bordereau_debut", 12);
7383     $form->setMax("date_bordereau_debut", 12);
7384     $form->setRequired("date_bordereau_debut");
7385     $form->setOnchange("date_bordereau_debut", "fdate(this)");
7386     $form->setVal("date_bordereau_debut", date("d/m/Y"));
7387     // Paramétrage du champ date_bordereau_fin
7388     $form->setLib("date_bordereau_fin", _("date_bordereau_fin"));
7389     $form->setType("date_bordereau_fin", "date");
7390     $form->setTaille("date_bordereau_fin", 12);
7391     $form->setMax("date_bordereau_fin", 12);
7392     $form->setRequired("date_bordereau_fin");
7393     $form->setOnchange("date_bordereau_fin", "fdate(this)");
7394     $form->setVal("date_bordereau_fin", date("d/m/Y"));
7395     // Paramétrage du champ bordereau
7396     $form->setLib("bordereau", _("bordereau"));
7397     $form->setType("bordereau", "select");
7398     $form->setRequired("bordereau");
7399     // Valeurs des champs
7400 softime 8989 if ($this->f->get_submitted_post_value("validation") !== null) {
7401     $form->setVal("date_bordereau_debut", $this->f->get_submitted_post_value("date_bordereau_debut"));
7402     $form->setVal("date_bordereau_fin", $this->f->get_submitted_post_value("date_bordereau_fin"));
7403     $form->setVal("bordereau", $this->f->get_submitted_post_value("bordereau"));
7404     $form->setVal("om_collectivite", $this->f->get_submitted_post_value("om_collectivite"));
7405 mbroquet 3730 }
7406     // Données du select - On récupère ici la liste de tous les états disponibles
7407     // dans la table om_etat qui ont un id qui commence par la cahine de caractères
7408     // 'bordereau_'
7409 softime 14542 $qres = $this->f->get_all_results_from_db_query(
7410     sprintf(
7411     'SELECT
7412     om_etat.id,
7413     om_etat.libelle
7414     FROM
7415     %1$som_etat
7416     WHERE
7417     om_etat.id LIKE \'bordereau_%%\'
7418     ORDER BY
7419     om_etat.id',
7420     DB_PREFIXE
7421     ),
7422     array(
7423     "origin" => __METHOD__
7424     )
7425     );
7426 mbroquet 3730 // Données du select
7427     $contenu = array(
7428     0 => array("", ),
7429     1 => array(_("choisir bordereau")),
7430     );
7431 softime 14542 foreach ($qres['result'] as $row) {
7432 mbroquet 3730 $contenu[0][] = $row['id'];
7433     $contenu[1][] = $row['libelle'];
7434     }
7435     $form->setSelect("bordereau", $contenu);
7436 softime 8989 //
7437     if ($_SESSION["niveau"] == 2) {
7438     $form->setLib("om_collectivite", _("collectivite"));
7439     $form->setType("om_collectivite", "select");
7440 mbroquet 3730
7441 softime 8989 // Données du select - On récupère ici la liste de tous toutes les collectivités
7442     // de niveau 1
7443 softime 14542 $qres = $this->f->get_all_results_from_db_query(
7444     sprintf(
7445     'SELECT
7446     om_collectivite,
7447     libelle
7448     FROM
7449     %1$som_collectivite
7450     WHERE
7451     niveau = \'1\'
7452     ORDER BY
7453     libelle',
7454     DB_PREFIXE
7455     ),
7456     array(
7457     "origin" => __METHOD__
7458     )
7459     );
7460 softime 8989 // La valeur par défaut du select est Toutes
7461     $list_collectivites = array(
7462     0 => array("", ),
7463     1 => array(_("toutes"))
7464     );
7465 mbroquet 3730
7466 softime 8989 $id_colls = "";
7467     // On stocke dans $id_colls l'id de toutes les collectivités de niveau 1 séparées
7468     // par des virgules, pour un traitement plus facile dans la requête de sous-état
7469 softime 14542 foreach ($qres['result'] as $row) {
7470 softime 8989 if ($id_colls != "") {
7471     $id_colls .= ",";
7472     }
7473     $id_colls .= $row['om_collectivite'];
7474     $list_collectivites[0][] = $row['om_collectivite'];
7475     $list_collectivites[1][] = $row['libelle'];
7476 mbroquet 3730 }
7477 softime 8989 // On affecte la liste d'identifiants à l'option Toutes
7478     $list_collectivites[0][0] = $id_colls ;
7479     $form->setSelect("om_collectivite", $list_collectivites);
7480 mbroquet 3730 }
7481     // Affichage du formulaire
7482     $form->entete();
7483     $form->afficher($champs, 0, false, false);
7484     $form->enpied();
7485     // Affichage du bouton
7486     printf("\t<div class=\"formControls\">\n");
7487 softime 8989 $this->f->layout->display_form_button(array("value" => _("Valider"), "name" => "validation"));
7488 mbroquet 3730 printf("\t</div>\n");
7489     // Fermeture du formulaire
7490     printf("\t</form>\n");
7491     }
7492    
7493 nmeucci 4317
7494     /**
7495     * VIEW - view_generate_suivi_bordereaux.
7496     *
7497     * Génère et affiche les bordereaux de suivi.
7498     *
7499     * @return [void]
7500     */
7501     function view_generate_suivi_bordereaux() {
7502     // Vérification de l'accessibilité sur l'élément
7503     $this->checkAccessibility();
7504     // Récupération du type de bordereau
7505     $bordereau = $this->f->get_submitted_get_value('type_bordereau');
7506     // Génération du PDF
7507     $result = $this->compute_pdf_output('etat', $bordereau, null, $this->getVal($this->clePrimaire));
7508     // Affichage du PDF
7509     $this->expose_pdf_output(
7510     $result['pdf_output'],
7511     $result['filename']
7512     );
7513     }
7514    
7515    
7516 mbroquet 3730 /**
7517     * VIEW - view_suivi_envoi_lettre_rar.
7518     *
7519 softime 8989 * Vue pour imprimer les AR.
7520 mbroquet 3730 *
7521     * @return void
7522     */
7523     function view_suivi_envoi_lettre_rar() {
7524     // Vérification de l'accessibilité sur l'élément
7525     $this->checkAccessibility();
7526    
7527     //
7528 softime 8989 if ($this->f->get_submitted_post_value("date") !== null) {
7529     $date = $this->f->get_submitted_post_value("date");
7530 mbroquet 3730 } else {
7531     $date = "";
7532     }
7533     //
7534 softime 8989 if ($this->f->get_submitted_post_value("liste_code_barres_instruction") !== null) {
7535     $liste_code_barres_instruction = $this->f->get_submitted_post_value("liste_code_barres_instruction");
7536 mbroquet 3730 } else {
7537     $liste_code_barres_instruction = "";
7538     }
7539    
7540     // Compteur du nombre de page générées
7541     $nbLettres = 0;
7542     // Liste d'id des instructions
7543     $id4Gen = array();
7544     //
7545     $error = "";
7546    
7547 softime 5504 // Initialisation du tableau qui va contenir les DI pour lister les liens
7548     $dossierTab = array();
7549     // On vérifie que l'utilisateur ait les droits pour afficher des consultations
7550     $isAccredited = $this->f->isAccredited(array("dossier_instruction","dossier_instruction_consulter"), "OR");
7551     $hasHidden = true;
7552     // S'il ne peut pas les consulter il aura des dossiers caché
7553     if ($isAccredited === true) {
7554     $hasHidden = false;
7555     }
7556    
7557 mbroquet 3730 /**
7558     * Validation du formulaire
7559     */
7560     // Si le formulaire a été validé
7561 softime 8989 if ($this->f->get_submitted_post_value('validation') !== null) {
7562 mbroquet 3730 //
7563     if (empty($date) || empty($liste_code_barres_instruction)) {
7564     //
7565     $message_class = "error";
7566     $message = _("Tous les champs doivent etre remplis.");
7567     } else {
7568     // Création d'un tableau d'instruction
7569 softime 8989 $liste = explode("\r\n", $this->f->get_submitted_post_value("liste_code_barres_instruction"));
7570 mbroquet 3730 //
7571     foreach ($liste as $code_barres) {
7572     // On enlève les éventuels espaces saisis
7573     $code_barres = trim($code_barres);
7574     // Vérification de l'existence de l'instruction
7575     if ($code_barres != "") {
7576     // Si la valeur transmise est numérique
7577     if (is_numeric($code_barres)) {
7578     //
7579 softime 6565 $sql = "SELECT count(*)
7580     FROM ".DB_PREFIXE."instruction
7581     INNER JOIN ".DB_PREFIXE."dossier
7582     ON dossier.dossier=instruction.dossier
7583     INNER JOIN ".DB_PREFIXE."dossier_instruction_type
7584     ON dossier.dossier_instruction_type = dossier_instruction_type.dossier_instruction_type
7585     INNER JOIN ".DB_PREFIXE."dossier_autorisation_type_detaille
7586     ON dossier_instruction_type.dossier_autorisation_type_detaille = dossier_autorisation_type_detaille.dossier_autorisation_type_detaille
7587     INNER JOIN ".DB_PREFIXE."dossier_autorisation_type
7588     ON dossier_autorisation_type_detaille.dossier_autorisation_type = dossier_autorisation_type.dossier_autorisation_type
7589     INNER JOIN ".DB_PREFIXE."groupe
7590     ON dossier_autorisation_type.groupe = groupe.groupe
7591     WHERE code_barres='".$this->f->db->escapesimple($code_barres)."'";
7592 softime 7067
7593     // Ajout d'un filtre sur les groupes auxquels l'utilisateur a accès
7594     $group_clause = array();
7595     foreach ($_SESSION["groupe"] as $key => $value) {
7596     $group_clause[$key] = "(groupe.code = '".$key."'";
7597     if($value["confidentiel"] !== true) {
7598     $group_clause[$key] .= " AND dossier_autorisation_type.confidentiel IS NOT TRUE";
7599     }
7600     $group_clause[$key] .= ")";
7601     }
7602     $conditions = implode(" OR ", $group_clause);
7603     $sql .= " AND (" . $conditions . ")";
7604    
7605 softime 14064 $qres = $this->f->get_one_result_from_db_query(
7606     $sql,
7607     array(
7608     "origin" => __METHOD__,
7609     )
7610     );
7611    
7612     if ($qres['result'] == "1") {
7613 mbroquet 3730 // Récupération de la date d'envoi de l'instruction bippé
7614 softime 14542 $qres = $this->f->get_all_results_from_db_query(
7615     sprintf(
7616     'SELECT
7617     to_char(date_envoi_rar, \'DD/MM/YYYY\') as date_envoi_rar,
7618     instruction
7619     FROM
7620     %1$sinstruction
7621     WHERE
7622     code_barres = \'%2$s\'',
7623     DB_PREFIXE,
7624     $this->f->db->escapeSimple($code_barres)
7625     ),
7626     array(
7627     'origin' => __METHOD__
7628     )
7629     );
7630     $row = array_shift($qres['result']);
7631 mbroquet 3730 // Si pas de date ou correspond à la date du formulaire on
7632     // effectue le traitement
7633     if ($row["date_envoi_rar"] == "" || $row["date_envoi_rar"] == $date) {
7634 softime 7996 $instr = $this->f->get_inst__om_dbform(array(
7635     "obj" => "instruction",
7636     "idx" => $row['instruction'],
7637     ));
7638 mbroquet 3730 $valF = array();
7639     foreach($instr->champs as $id => $champ) {
7640     $valF[$champ] = $instr->val[$id];
7641     }
7642 softime 5504
7643     # Si on peut consulter les dossiers et que le dossier n'existe pas déjà dans la liste
7644     if ($isAccredited === true
7645     && array_key_exists($instr->getVal("dossier"), $dossierTab) === false) {
7646 softime 7996 $dossier = $this->f->get_inst__om_dbform(array(
7647     "obj" => "dossier",
7648     "idx" => $instr->getVal("dossier"),
7649     ));
7650 softime 5504 if ($dossier->is_user_from_allowed_collectivite()){
7651     $dossierTab[$instr->getVal("dossier")] = $dossier;
7652     } else {
7653     $hasHidden = true;
7654     }
7655     }
7656    
7657 mbroquet 3730 $valF['date_evenement']=
7658     $instr->dateDBToForm($valF['date_evenement']);
7659     $valF['archive_date_complet']=
7660     $instr->dateDBToForm($valF['archive_date_complet']);
7661     $valF['archive_date_rejet']=
7662     $instr->dateDBToForm($valF['archive_date_rejet']);
7663     $valF['archive_date_limite']=
7664     $instr->dateDBToForm($valF['archive_date_limite']);
7665     $valF['archive_date_notification_delai']=
7666     $instr->dateDBToForm($valF['archive_date_notification_delai']);
7667     $valF['archive_date_decision']=
7668     $instr->dateDBToForm($valF['archive_date_decision']);
7669     $valF['archive_date_validite']=
7670     $instr->dateDBToForm($valF['archive_date_validite']);
7671     $valF['archive_date_achevement']=
7672     $instr->dateDBToForm($valF['archive_date_achevement']);
7673     $valF['archive_date_chantier']=
7674     $instr->dateDBToForm($valF['archive_date_chantier']);
7675     $valF['archive_date_conformite']=
7676     $instr->dateDBToForm($valF['archive_date_conformite']);
7677     $valF['archive_date_dernier_depot']=
7678     $instr->dateDBToForm($valF['archive_date_dernier_depot']);
7679     $valF['archive_date_limite_incompletude']=
7680     $instr->dateDBToForm($valF['archive_date_limite_incompletude']);
7681     $valF['date_finalisation_courrier']=
7682     $instr->dateDBToForm($valF['date_finalisation_courrier']);
7683     $valF['date_envoi_signature']=
7684     $instr->dateDBToForm($valF['date_envoi_signature']);
7685     $valF['date_retour_signature']=
7686     $instr->dateDBToForm($valF['date_retour_signature']);
7687     $valF['date_envoi_rar']=
7688     $instr->dateDBToForm($valF['date_envoi_rar']);
7689     $valF['date_retour_rar']=
7690     $instr->dateDBToForm($valF['date_retour_rar']);
7691     $valF['date_envoi_controle_legalite']=
7692     $instr->dateDBToForm($valF['date_envoi_controle_legalite']);
7693     $valF['date_retour_controle_legalite']=
7694     $instr->dateDBToForm($valF['date_retour_controle_legalite']);
7695     $valF['date_envoi_rar'] = $date;
7696    
7697     // Vérification de la finalisation du document
7698     // correspondant au code barres
7699     if($instr->getVal("om_final_instruction") === 't') {
7700     $instr->setParameter('maj', 1);
7701 nmeucci 3971 $instr->class_actions[1]["identifier"] =
7702     "envoi lettre RAR (depuis le menu suivi des pièces)";
7703 softime 8989 if ($instr->modifier($valF) == true) {
7704 mbroquet 3730 $id4Gen[] = $code_barres;
7705     $nbLettres ++;
7706     } else {
7707     //
7708     if ($error != "") {
7709     $error .= "<br/>";
7710     }
7711     $error .= sprintf(_("Une erreur s'est produite lors de la modification de l'instruction %s."),
7712     $code_barres);
7713     $error .= " ";
7714     $error .= _("Veuillez contacter votre administrateur.");
7715     }
7716     } else {
7717     //
7718     if ($error != "") {
7719     $error .= "<br/>";
7720     }
7721     $error .= sprintf(_("Le document correspondant au
7722     code barres %s n'est pas finalise,
7723     le bordereau ne sera pas genere."),
7724     $code_barres);
7725     }
7726    
7727     } else {
7728     //
7729     if ($error != "") {
7730     $error .= "<br/>";
7731     }
7732     $error .= _("Une lettre correspondante a l'instruction ayant pour code barres")." ".$code_barres." "._("a deja ete envoyee, le bordereau ne sera pas genere.");
7733     }
7734     } else {
7735     //
7736     if ($error != "") {
7737     $error .= "<br/>";
7738     }
7739     $error .= _("Le numero")." ".$code_barres." "._("ne correspond a aucun code barres d'instruction.");
7740     }
7741     } else {
7742     //
7743     if ($error != "") {
7744     $error .= "<br/>";
7745     }
7746     $error .= _("Le code barres d'instruction")." ".$code_barres." "._("n'est pas valide.");
7747     }
7748     }
7749     }
7750     }
7751     }
7752    
7753     /**
7754     * Affichage des messages et du formulaire
7755     */
7756     // Affichage du message de validation ou d'erreur
7757     if (isset($message) && isset($message_class) && $message != "") {
7758 softime 8989 $this->f->displayMessage($message_class, $message);
7759 mbroquet 3730 }
7760     // Affichage du message d'erreur
7761     if(!empty($error)) {
7762 softime 8989 $this->f->displayMessage("error", $error);
7763 mbroquet 3730 }
7764     // Affichage du message de validation de la saisie
7765     if ($nbLettres > 0) {
7766     //
7767 softime 5504 echo "\n<div class=\"message ui-widget ui-corner-all ui-state-highlight ui-state-valid\" >";
7768     echo "\n<p>";
7769     echo "\n<span class=\"ui-icon ui-icon-info\"></span>";
7770     echo "\n<span class=\"text\">";
7771     echo _("Cliquez sur le lien ci-dessous pour telecharger votre document");
7772     echo " : \n<br/><br/>";
7773     echo "\n<a class='om-prev-icon pdf-16'";
7774 softime 8989 echo "\n title=\""._("imprimer les AR")."\"";
7775 softime 7996 echo "\n href=\"".OM_ROUTE_FORM."&obj=instruction&action=180&idx=0&liste=".implode(",",$id4Gen)."\"";
7776 softime 5504 echo "\n target='_blank'>";
7777 softime 8989 echo _("Telecharger le document pour")." ".$nbLettres." "._("AR");
7778 softime 5504 echo "\n</a>";
7779     echo "\n</span>";
7780     echo "\n</p>";
7781     echo "\n<br/>\n";
7782     if ($isAccredited === true) {
7783     echo '<fieldset id="fieldset-form-rar-lien_di" class="cadre ui-corner-all startClosed" style="background-color: inherite;">';
7784     echo "\n<legend class=\"ui-corner-all ui-widget-content ui-state-active\" style=\"background-color: transparent; color: inherit;\">\n";
7785     echo _('Dossiers concernés par ce traitement');
7786     echo "\n</legend>";
7787     echo "\n<div class=\"fieldsetContent\" style=\"display: none;background-color: inherite\">";
7788    
7789     if ($hasHidden === true) {
7790     echo "\n<br/>";
7791     echo "\n<p>";
7792     echo "\n<span class='text'>";
7793     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.");
7794     echo "</span>";
7795     echo "\n</p>";
7796     echo "\n<br/>";
7797     }
7798     foreach ($dossierTab as $dossier) {
7799 softime 7067
7800     $inst_da = $this->get_inst_common("dossier_autorisation", $dossier->getVal('dossier_autorisation'));
7801     $inst_datd = $this->get_inst_common("dossier_autorisation_type_detaille", $inst_da->getVal('dossier_autorisation_type_detaille'));
7802     $code_datd = $inst_datd->getVal('code');
7803    
7804     $obj = "dossier_instruction";
7805     if ($code_datd === 'REC' OR $code_datd === 'REG') {
7806     $obj = "dossier_contentieux_tous_recours";
7807     }
7808     if ($code_datd === 'IN') {
7809     $obj = "dossier_contentieux_toutes_infractions";
7810     }
7811    
7812 softime 5504 echo "\n<div class=\"bloc group\">";
7813     echo "\n<div class=\"field field-type-text\">";
7814    
7815     echo "\n<p>";
7816     echo "\n<span class='text'>";
7817     echo "\n<a class=\"om-icon om-icon-16 consult-16\" title=\"" . _('Consulter') . "\"";
7818 softime 7996 echo "\n href=\"".OM_ROUTE_FORM."&obj=dossier_instruction&action=3&idx=";
7819 softime 5504 echo $dossier->getVal("dossier");
7820     echo "\">";
7821     echo "\n</a>";
7822    
7823     echo "\n<a title=\""._("Consulter")."\" style=\"vertical-align:middle;\"";
7824 softime 7996 echo " href=\"".OM_ROUTE_FORM."&obj=";
7825 softime 7067 echo $obj;
7826     echo "&action=3&idx=";
7827 softime 5504 echo $dossier->getVal("dossier");
7828     echo "\">";
7829     echo $dossier->getVal("dossier_libelle");
7830     echo "\n</a>";
7831     echo "\n</span>";
7832     echo "\n</p>";
7833    
7834     echo "\n</div>";
7835     echo "\n</div>";
7836     }
7837     echo "\n</div>";
7838     echo "\n</fieldset>";
7839     }
7840     echo "\n</div>";
7841     echo "\n</div>";
7842 mbroquet 3730 }
7843     // Ouverture du formulaire
7844     echo "\t<form";
7845     echo " method=\"post\"";
7846     echo " id=\"suivi_envoi_lettre_rar_form\"";
7847     echo " action=\"\"";
7848     echo ">\n";
7849     // Paramétrage des champs du formulaire
7850     $champs = array("date", "liste_code_barres_instruction");
7851     // Création d'un nouvel objet de type formulaire
7852 softime 7996 $form = $this->f->get_inst__om_formulaire(array(
7853     "validation" => 0,
7854     "maj" => 0,
7855     "champs" => $champs,
7856     ));
7857 mbroquet 3730 // Paramétrage du champ date du formulaire
7858     $form->setLib("date", _("Date")."* :");
7859     $form->setType("date", "date");
7860     $form->setOnchange("date", "fdate(this)");
7861     $form->setVal("date", ($date == "" ? date("d/m/Y") : $date));
7862     $form->setTaille("date", 10);
7863     $form->setMax("date", 10);
7864     // Paramétrage du champ liste_code_barres_instruction du formulaire
7865     $form->setLib("liste_code_barres_instruction", _("Liste des codes barres d'instructions scannes")."* :");
7866     $form->setType("liste_code_barres_instruction", "textarea");
7867     $form->setVal("liste_code_barres_instruction", $liste_code_barres_instruction);
7868     $form->setTaille("liste_code_barres_instruction", 20);
7869     $form->setMax("liste_code_barres_instruction", 20);
7870     // Affichage du formulaire
7871     $form->entete();
7872     $form->afficher($champs, 0, false, false);
7873     $form->enpied();
7874     // Affichage du bouton
7875     echo "\t<div class=\"formControls\">\n";
7876 softime 8989 $this->f->layout->display_form_button(array("value" => _("Valider"), "name" => "validation"));
7877 mbroquet 3730 echo "\t</div>\n";
7878     // Fermeture du formulaire
7879     echo "\t</form>\n";
7880     }
7881    
7882     /**
7883     * VIEW - view_suivi_mise_a_jour_des_dates.
7884     *
7885     * Vu pour mettre à jour les dates de suivi de l'instruction.
7886     *
7887     * @return void
7888     */
7889     function view_suivi_mise_a_jour_des_dates() {
7890     // Vérification de l'accessibilité sur l'élément
7891     $this->checkAccessibility();
7892    
7893     // Récupération des valeur passées en POST ou GET
7894 softime 8989 if($this->f->get_submitted_post_value("type_mise_a_jour") !== null) {
7895     $type_mise_a_jour = $this->f->get_submitted_post_value("type_mise_a_jour");
7896     } elseif($this->f->get_submitted_get_value('type_mise_a_jour') !== null) {
7897     $type_mise_a_jour = $this->f->get_submitted_get_value('type_mise_a_jour');
7898 mbroquet 3730 } else {
7899     $type_mise_a_jour = "";
7900     }
7901 softime 8989 if($this->f->get_submitted_post_value('date') !== null) {
7902     $date = $this->f->get_submitted_post_value('date');
7903     } elseif($this->f->get_submitted_get_value('date') !== null) {
7904     $date = $this->f->get_submitted_get_value('date');
7905 mbroquet 3730 } else {
7906     $date = "";
7907     }
7908 softime 8989 if($this->f->get_submitted_post_value('code_barres') !== null) {
7909     $code_barres = $this->f->get_submitted_post_value('code_barres');
7910     } elseif($this->f->get_submitted_get_value('code_barres') !== null) {
7911     $code_barres = $this->f->get_submitted_get_value('code_barres');
7912 mbroquet 3730 } else {
7913     $code_barres = "";
7914     }
7915     // Booléen permettant de définir si un enregistrement à eu lieu
7916     $correct = false;
7917     // Booléen permettant de définir si les dates peuvent êtres enregistrées
7918     $date_error = false;
7919     // Champs date à mettre à jour
7920     $liste_champs=array();
7921    
7922     // Si le formulaire a été validé
7923 softime 8989 if ($this->f->get_submitted_post_value('validation') !== null) {
7924 mbroquet 3730 if(!empty($type_mise_a_jour) and !empty($date) and !empty($code_barres)) {
7925    
7926 softime 7067 // Ajout d'un filtre sur les groupes auxquels l'utilisateur a accès
7927     $group_clause = array();
7928     foreach ($_SESSION["groupe"] as $key => $value) {
7929     $group_clause[$key] = "(groupe.code = '".$key."'";
7930     if($value["confidentiel"] !== true) {
7931     $group_clause[$key] .= " AND dossier_autorisation_type.confidentiel IS NOT TRUE";
7932     }
7933     $group_clause[$key] .= ")";
7934     }
7935     $conditions = implode(" OR ", $group_clause);
7936 softime 14542 $groupFilter = " AND (" . $conditions . ")";
7937 softime 7067
7938 softime 14542 $qres = $this->f->get_all_results_from_db_query(
7939     sprintf(
7940     'SELECT
7941     instruction
7942     FROM
7943     %1$sinstruction
7944     INNER JOIN %1$sdossier
7945     ON dossier.dossier = instruction.dossier
7946     INNER JOIN %1$sdossier_instruction_type
7947     ON dossier.dossier_instruction_type = dossier_instruction_type.dossier_instruction_type
7948     INNER JOIN %1$sdossier_autorisation_type_detaille
7949     ON dossier_instruction_type.dossier_autorisation_type_detaille = dossier_autorisation_type_detaille.dossier_autorisation_type_detaille
7950     INNER JOIN %1$sdossier_autorisation_type
7951     ON dossier_autorisation_type_detaille.dossier_autorisation_type = dossier_autorisation_type.dossier_autorisation_type
7952     INNER JOIN %1$sgroupe
7953     ON dossier_autorisation_type.groupe = groupe.groupe
7954     WHERE
7955     code_barres = \'%2$s\'
7956     %3$s',
7957     DB_PREFIXE,
7958     $this->f->db->escapeSimple($code_barres),
7959     $groupFilter
7960     ),
7961     array(
7962     'origin' => __METHOD__
7963     )
7964     );
7965     if(count($qres['result']) === 1) {
7966 mbroquet 3730 $liste_champs = explode(";", $type_mise_a_jour);
7967 softime 14542 $row = array_shift($qres['result']);
7968 softime 11418 $instr = $this->f->get_inst__om_dbform(array(
7969     "obj" => "instruction",
7970     "idx" => $row['instruction'],
7971     ));
7972 mbroquet 3730 // Mise à jour des dates après l'écran de verification
7973 softime 8989 if($this->f->get_submitted_post_value('is_valid') !== null and $this->f->get_submitted_post_value('is_valid') == "true") {
7974 mbroquet 3730 $valF = array();
7975     foreach($instr->champs as $id => $champ) {
7976     $valF[$champ] = $instr->val[$id];
7977     }
7978 softime 6565 $valF['date_evenement'] = $instr->dateDBToForm($valF['date_evenement']);
7979     $valF['archive_date_complet'] = $instr->dateDBToForm($valF['archive_date_complet']);
7980     $valF['archive_date_rejet'] = $instr->dateDBToForm($valF['archive_date_rejet']);
7981     $valF['archive_date_limite'] = $instr->dateDBToForm($valF['archive_date_limite']);
7982     $valF['archive_date_notification_delai'] = $instr->dateDBToForm($valF['archive_date_notification_delai']);
7983     $valF['archive_date_decision'] = $instr->dateDBToForm($valF['archive_date_decision']);
7984     $valF['archive_date_validite'] = $instr->dateDBToForm($valF['archive_date_validite']);
7985     $valF['archive_date_achevement'] = $instr->dateDBToForm($valF['archive_date_achevement']);
7986     $valF['archive_date_chantier'] = $instr->dateDBToForm($valF['archive_date_chantier']);
7987     $valF['archive_date_conformite'] = $instr->dateDBToForm($valF['archive_date_conformite']);
7988     $valF['archive_date_dernier_depot'] = $instr->dateDBToForm($valF['archive_date_dernier_depot']);
7989     $valF['archive_date_limite_incompletude'] = $instr->dateDBToForm($valF['archive_date_limite_incompletude']);
7990     $valF['date_finalisation_courrier'] = $instr->dateDBToForm($valF['date_finalisation_courrier']);
7991     $valF['date_envoi_signature'] = $instr->dateDBToForm($valF['date_envoi_signature']);
7992     $valF['date_retour_signature'] = $instr->dateDBToForm($valF['date_retour_signature']);
7993     $valF['date_envoi_rar'] = $instr->dateDBToForm($valF['date_envoi_rar']);
7994     $valF['date_retour_rar'] = $instr->dateDBToForm($valF['date_retour_rar']);
7995     $valF['date_envoi_controle_legalite'] = $instr->dateDBToForm($valF['date_envoi_controle_legalite']);
7996     $valF['date_retour_controle_legalite'] = $instr->dateDBToForm($valF['date_retour_controle_legalite']);
7997     $valF['archive_date_cloture_instruction'] = $instr->dateDBToForm($valF['archive_date_cloture_instruction']);
7998     $valF['archive_date_premiere_visite'] = $instr->dateDBToForm($valF['archive_date_premiere_visite']);
7999     $valF['archive_date_derniere_visite'] = $instr->dateDBToForm($valF['archive_date_derniere_visite']);
8000     $valF['archive_date_contradictoire'] = $instr->dateDBToForm($valF['archive_date_contradictoire']);
8001     $valF['archive_date_retour_contradictoire'] = $instr->dateDBToForm($valF['archive_date_retour_contradictoire']);
8002     $valF['archive_date_ait'] = $instr->dateDBToForm($valF['archive_date_ait']);
8003     $valF['archive_date_transmission_parquet'] = $instr->dateDBToForm($valF['archive_date_transmission_parquet']);
8004 mbroquet 3730
8005     foreach(explode(";", $type_mise_a_jour) as $maj_date) {
8006     $valF[$maj_date]=$date;
8007     }
8008    
8009     // Vérification de la finalisation du document
8010     // correspondant au code barres
8011     if($valF["om_final_instruction"] === 't' or
8012     $valF["lettretype"] == '') {
8013     $code_barres = "";
8014    
8015     //Désactivation de l'autocommit
8016 softime 8989 $this->f->db->autoCommit(false);
8017 mbroquet 3730
8018     //On modifie les valeurs de l'instruction
8019     $instr->setParameter('maj', 170);
8020 nmeucci 3965 $instr->class_actions[170]["identifier"] =
8021 nmeucci 3972 "mise à jour des dates (depuis le menu suivi des pièces)";
8022 softime 8989 $retour = $instr->modifier($valF);
8023 mbroquet 3730
8024     //Si une erreur s'est produite, on défait les modifications
8025     //qui ont été faites
8026     if (!$retour){
8027     $instr->undoValidation();
8028     }
8029     //Sinon, on valide en base de données les modifications
8030     else {
8031 softime 8989 $this->f->db->commit();
8032 mbroquet 3730 }
8033    
8034     // Variable correct retourné depuis la classe instruction
8035     $correct = $instr->correct;
8036    
8037     // Si la modification sur l'instruction a échoué
8038     if ($correct === false) {
8039    
8040     // Message d'erreur de la classe instruction
8041     $error = $instr->msg;
8042     }
8043    
8044     } else {
8045     // Indique que le traitement est en erreur
8046     $correct = false;
8047     // Message d'erreur
8048     $error = sprintf(_("Le document n'est pas finalise."),
8049     "<span class='bold'>".$code_barres."</span>");
8050     }
8051     } else {
8052     // Récupération des infos du dossier
8053 softime 14542 $qres = $this->f->get_all_results_from_db_query(
8054     sprintf(
8055     'SELECT
8056     dossier.dossier_libelle,
8057     evenement.libelle as evenement,
8058     autorite_competente.code as autorite_competente_code,
8059     autorite_competente.libelle as autorite_competente,
8060     evenement.type as evenement_type,
8061     to_char(date_envoi_signature,\'DD/MM/YYYY\') as date_envoi_signature,
8062     to_char(date_retour_signature,\'DD/MM/YYYY\') as date_retour_signature,
8063     to_char(date_envoi_controle_legalite,\'DD/MM/YYYY\') as date_envoi_controle_legalite,
8064     to_char(date_retour_controle_legalite,\'DD/MM/YYYY\') as date_retour_controle_legalite,
8065     to_char(date_envoi_rar,\'DD/MM/YYYY\') as date_envoi_rar,
8066     to_char(date_retour_rar,\'DD/MM/YYYY\') as date_retour_rar
8067     FROM
8068     %1$sinstruction
8069     INNER JOIN %1$sdossier
8070     ON dossier.dossier=instruction.dossier
8071     LEFT JOIN %1$sautorite_competente
8072     ON dossier.autorite_competente=autorite_competente.autorite_competente
8073     INNER JOIN %1$sevenement
8074     ON instruction.evenement=evenement.evenement
8075     WHERE
8076     code_barres = \'%2$s\'',
8077     DB_PREFIXE,
8078     $this->f->db->escapeSimple($code_barres)
8079     ),
8080     array(
8081     "origin" => __METHOD__
8082     )
8083     );
8084     $infos = array_shift($qres['result']);
8085 mbroquet 3730
8086     // Vérification de la non modification des dates de suivi
8087     foreach(explode(";", $type_mise_a_jour) as $champ) {
8088 softime 11418 if ($champ === 'date_envoi_controle_legalite') {
8089     if ($instr->is_sent_to_cl() === true) {
8090     $error = __("Les dates de suivis ne peuvent etre modifiees");
8091     $date_error = true;
8092     break;
8093     }
8094     }
8095 mbroquet 3730 if($infos[$champ] != "" AND $infos[$champ] != $date) {
8096     $error = _("Les dates de suivis ne peuvent etre modifiees");
8097     $date_error = true;
8098 softime 11418 break;
8099 mbroquet 3730 }
8100     }
8101     }
8102     } else {
8103     $error = _("Le numero saisi ne correspond a aucun code barres d'instruction.");
8104     }
8105    
8106     } else {
8107     $error = _("Tous les champs doivent etre remplis.");
8108     }
8109     }
8110    
8111     /**
8112     * Affichage des messages et du formulaire
8113     */
8114     // Affichage du message de validation ou d'erreur
8115     if (isset($message) && isset($message_class) && $message != "") {
8116 softime 8989 $this->f->displayMessage($message_class, $message);
8117 mbroquet 3730 }
8118     // Affichage du message d'erreur
8119     if(!empty($error)) {
8120 softime 8989 $this->f->displayMessage("error", $error);
8121 mbroquet 3730 }
8122    
8123     // Affichage du message de validation de la saisie
8124     if($correct === true) {
8125 softime 8989 $this->f->displayMessage("ok", _("Saisie enregistree"));
8126 mbroquet 3730 }
8127     // Ouverture du formulaire
8128     echo "\t<form";
8129     echo " method=\"post\"";
8130     echo " id=\"suivi_mise_a_jour_des_dates_form\"";
8131     echo " action=\"\"";
8132     echo ">\n";
8133     // Paramétrage des champs du formulaire
8134     if(isset($infos)) {
8135     $champs = array("type_mise_a_jour", "date", "code_barres", "dossier_libelle", "evenement"
8136     , "autorite_competente", "date_envoi_signature",
8137     "date_retour_signature", "date_envoi_controle_legalite",
8138     "date_retour_controle_legalite", "date_envoi_rar",
8139     "date_retour_rar", "is_valid");
8140     } else {
8141     $champs = array("type_mise_a_jour", "date", "code_barres");
8142     }
8143     // Création d'un nouvel objet de type formulaire
8144 softime 7996 $form = $this->f->get_inst__om_formulaire(array(
8145     "validation" => 0,
8146     "maj" => 0,
8147     "champs" => $champs,
8148     ));
8149 mbroquet 3730 // Paramétrage des champs du formulaire
8150     // Parametrage du champ type_mise_a_jour
8151     $form->setLib("type_mise_a_jour", _("Date a mettre a jour")."* :");
8152     if(isset($infos)) {
8153     $form->setType("type_mise_a_jour", "selecthiddenstatic");
8154    
8155     } else {
8156     $form->setType("type_mise_a_jour", "select");
8157    
8158     }
8159     $form->setVal("type_mise_a_jour", $type_mise_a_jour);
8160     $contenu = array();
8161    
8162     $contenu[0][0] = "date_envoi_signature";
8163     $contenu[1][0] = _("date d'envoi pour signature Mairie/Prefet");
8164    
8165     $contenu[0][1] = "date_retour_signature";
8166     $contenu[1][1] = _("date de retour de signature Mairie/Prefet");
8167    
8168     $contenu[0][2] = "date_retour_signature;date_envoi_controle_legalite";
8169     $contenu[1][2] = _("date de retour de signature + Envoi controle legalite");
8170    
8171     $contenu[0][3] = "date_envoi_controle_legalite";
8172     $contenu[1][3] = _("date d'envoi au controle de legalite");
8173    
8174     $contenu[0][4] = "date_retour_controle_legalite";
8175     $contenu[1][4] = _("date de retour de controle de legalite");
8176    
8177     $contenu[0][5] = "date_retour_rar";
8178 softime 8989 $contenu[1][5] = __("date de notification du correspondant");
8179 mbroquet 3730
8180     $form->setSelect("type_mise_a_jour", $contenu);
8181    
8182     // Parametrage du champ date
8183     $form->setLib("date", _("Date")."* :");
8184     if(isset($infos)) {
8185     $form->setType("date", "hiddenstaticdate");
8186    
8187     } else {
8188     $form->setType("date", "date");
8189     }
8190     $form->setVal("date", $date);
8191     $form->setTaille("date", 10);
8192     $form->setMax("date", 10);
8193    
8194     // Parametrage du champ code_barres
8195     $form->setLib("code_barres", _("Code barres d'instruction")."* :");
8196     if(isset($infos)) {
8197     $form->setType("code_barres", "hiddenstatic");
8198     } else {
8199     $form->setType("code_barres", "text");
8200     }
8201     $form->setVal("code_barres", $code_barres);
8202     $form->setTaille("code_barres", 20);
8203     $form->setMax("code_barres", 20);
8204    
8205     // Ajout des infos du dossier correspondantes à l'instruction séléctionnée
8206     if(isset($infos)) {
8207    
8208     // Tous les champs sont défini par defaut à static
8209     foreach ($infos as $key => $value) {
8210     $form->setType($key, "static");
8211     if(in_array($key, $liste_champs)) {
8212     $form->setVal($key, $date);
8213     } else {
8214     $form->setVal($key, $value);
8215     }
8216     }
8217    
8218     // Les champs dont on viens de définir la valeur sont en gras
8219     foreach ($liste_champs as $value) {
8220     $form->setBloc($value,'DF',"",'bold');
8221     }
8222    
8223     // Parametrage du champ dossier
8224     $form->setLib("dossier_libelle", _("dossier_libelle")." :");
8225     $form->setType("dossier_libelle", "static");
8226     $form->setVal("dossier_libelle", $infos['dossier_libelle']);
8227    
8228     // Parametrage du champ evenement
8229     $form->setLib("evenement", _("evenement")." :");
8230     $form->setType("evenement", "static");
8231     $form->setVal("evenement", $infos['evenement']);
8232    
8233     // Parametrage du champ autorite_competente
8234     $form->setLib("autorite_competente", _("Autorite competente")." :");
8235     $form->setType("autorite_competente", "static");
8236     $form->setVal("autorite_competente", $infos['autorite_competente']);
8237    
8238 softime 8989 // Parametrage des libellés d'envoi avec AR
8239     $form->setLib("date_envoi_rar", __("date_envoi_ar")." :");
8240     $form->setLib("date_retour_rar", __("date_notification")." :");
8241 mbroquet 3730
8242     $form->setLib("date_envoi_signature", _("date_envoi_signature")." :");
8243     $form->setLib("date_retour_signature", _("date_retour_signature")." :");
8244     $form->setLib("date_envoi_controle_legalite", _("date_envoi_controle_legalite")." :");
8245     $form->setLib("date_retour_controle_legalite", _("date_retour_controle_legalite")." :");
8246     // Configuration des libellé en fonction de l'autorité compétente
8247     if($infos['autorite_competente_code'] == 'ETAT') {
8248     $form->setType("date_envoi_controle_legalite", "hiddendate");
8249     $form->setType("date_retour_controle_legalite", "hiddendate");
8250     }
8251    
8252     // Ajout d'un champ hidden permettant de savoir que le formulaire précédant est celui de vérification
8253     $form->setLib("is_valid", _("Valide")." :");
8254     $form->setType("is_valid", "hidden");
8255     $form->setVal("is_valid", 'true');
8256    
8257     $form->setFieldset('dossier_libelle','D',_('Synthese'));
8258     $form->setFieldset('is_valid','F');
8259    
8260     }
8261    
8262    
8263     // Création du fieldset regroupant les champs permettant la mise à jour des date
8264     $form->setFieldset('type_mise_a_jour','D',_('Mise a jour'));
8265     $form->setFieldset('code_barres','F');
8266     // Affichage du formulaire
8267     $form->entete();
8268     $form->afficher($champs, 0, false, false);
8269     $form->enpied();
8270     // Affichage du bouton
8271     echo "\t<div class=\"formControls\">\n";
8272     //
8273     if(!$date_error) {
8274 softime 8989 $this->f->layout->display_form_button(array("value" => _("Valider"), "name" => "validation"));
8275 mbroquet 3730 }
8276     // Si pas sur l'écran de validation
8277     if(isset($infos)) {
8278 softime 7996 echo "<a class=\"retour\" href=\"".OM_ROUTE_FORM."&obj=instruction_suivi_mise_a_jour_des_dates&action=170&idx=0";
8279 mbroquet 3730 echo "&amp;type_mise_a_jour=".$type_mise_a_jour."&amp;date=".$date."&amp;code_barres=".$code_barres;
8280     echo "\">Retour</a>";
8281     }
8282     echo "\t</div>\n";
8283     // Fermeture du formulaire
8284     echo "\t</form>\n";
8285     }
8286    
8287     /**
8288     * [view_pdf_lettre_rar description]
8289     *
8290     * @return [type] [description]
8291     */
8292     function view_pdf_lettre_rar() {
8293     // Vérification de l'accessibilité sur l'élément
8294     $this->checkAccessibility();
8295 softime 8989 //
8296     $this->f->disableLog();
8297 mbroquet 3730
8298 softime 8989 if($this->f->get_submitted_get_value('liste') != null) {
8299     $listeCodeBarres = explode(',',$this->f->get_submitted_get_value('liste'));
8300 mbroquet 3730
8301     // Classe permettant la mise en page de l'édition pdf
8302     require_once "../obj/pdf_lettre_rar.class.php";
8303     $pdf_lettre_rar = new pdf_lettre_rar('P', 'mm', 'A4');
8304     // Initialisation de la mise en page
8305 softime 8989 $pdf_lettre_rar->init($this->f);
8306 mbroquet 3730
8307     foreach ($listeCodeBarres as $code_barres) {
8308    
8309 softime 7067 // On récupère le dossier
8310 softime 14064 $qres = $this->f->get_one_result_from_db_query(
8311     sprintf(
8312     'SELECT
8313     dossier
8314     FROM
8315     %1$sinstruction
8316     WHERE
8317     code_barres = \'%2$s\'',
8318     DB_PREFIXE,
8319     $this->f->db->escapeSimple($code_barres)
8320     ),
8321     array(
8322     "origin" => __METHOD__,
8323     )
8324     );
8325    
8326 softime 7996 $inst_dossier = $this->f->get_inst__om_dbform(array(
8327     "obj" => "dossier",
8328 softime 14064 "idx" => $qres['result'],
8329 softime 7996 ));
8330 softime 7067
8331     // En fonction du type de dossier, on récupère un demandeur différent dans les requêtes
8332     $groupe = $inst_dossier->get_type_affichage_formulaire();
8333     switch ($groupe) {
8334     case 'CTX IN':
8335     $sql_demandeur = "(lien_dossier_demandeur.petitionnaire_principal IS TRUE AND demandeur.type_demandeur='plaignant')";
8336     break;
8337     case 'CTX RE':
8338     $sql_demandeur = "(lien_dossier_demandeur.petitionnaire_principal IS TRUE AND demandeur.type_demandeur='requerant')";
8339     break;
8340     case 'ADS':
8341     case 'DPC':
8342 softime 10573 case 'CONSULTATION ENTRANTE':
8343 softime 7067 default:
8344     $sql_demandeur = "((lien_dossier_demandeur.petitionnaire_principal IS TRUE AND demandeur.type_demandeur='petitionnaire') OR demandeur.type_demandeur='delegataire')";
8345     break;
8346     }
8347    
8348 mbroquet 3730 // Test si l'evenement est de type arrete et si un délégataire a été nommé
8349 softime 14542 $qres = $this->f->get_all_results_from_db_query(
8350     sprintf(
8351     'SELECT
8352 mbroquet 3730 dossier.dossier_libelle,
8353     evenement.type,
8354 softime 3834 count(lien_dossier_demandeur) as nbdemandeur,
8355     CASE
8356     WHEN division.libelle IS NOT NULL AND phase.code IS NOT NULL
8357 softime 14542 THEN CONCAT(phase.code, \' - \', division.libelle)
8358 softime 3834 ELSE
8359     phase.code
8360     END AS code_phase
8361 softime 14542 FROM
8362     %1$sinstruction
8363     LEFT JOIN %1$sdossier
8364     ON instruction.dossier = dossier.dossier
8365     LEFT JOIN %1$sdivision
8366     ON dossier.division = division.division
8367     INNER JOIN %1$sevenement
8368     ON instruction.evenement=evenement.evenement
8369     LEFT JOIN %1$sphase
8370     ON evenement.phase = phase.phase
8371     inner JOIN %1$slien_dossier_demandeur
8372     ON instruction.dossier=lien_dossier_demandeur.dossier
8373     inner join %1$sdemandeur
8374     ON demandeur.demandeur=lien_dossier_demandeur.demandeur
8375     WHERE
8376     code_barres = \'%2$s\'
8377     AND %3$s
8378     GROUP BY
8379     dossier.dossier_libelle,
8380     evenement.type,
8381     phase.code,
8382     division.libelle',
8383     DB_PREFIXE,
8384     $this->f->db->escapeSimple($code_barres),
8385     $sql_demandeur
8386     ),
8387     array(
8388     "origin" => __METHOD__
8389     )
8390     );
8391     $testDemandeur = array_shift($qres['result']);
8392 mbroquet 3730
8393    
8394     // Recuperation de l'adresse de destination
8395     // Envoi pour delegataire ou petitionnaire principal selon le type d'evenement
8396 softime 14542 $sqlAdresse = " AND demandeur.type_demandeur='petitionnaire' AND lien_dossier_demandeur.petitionnaire_principal IS TRUE";
8397 mbroquet 3730 if($testDemandeur['type'] != 'arrete' AND $testDemandeur['nbdemandeur'] > 1) {
8398 softime 14542 $sqlAdresse = " AND demandeur.type_demandeur='delegataire'";
8399 mbroquet 3730 }
8400    
8401 softime 14542 $qres = $this->f->get_all_results_from_db_query(
8402     sprintf(
8403     'SELECT
8404     CASE WHEN demandeur.qualite = \'particulier\'
8405     THEN TRIM(CONCAT_WS(\' \', pc.libelle, demandeur.particulier_nom, demandeur.particulier_prenom))
8406     ELSE TRIM(demandeur.personne_morale_denomination)
8407     END as ligne1,
8408     CASE WHEN demandeur.qualite = \'personne_morale\'
8409     THEN TRIM(demandeur.personne_morale_raison_sociale)
8410     ELSE \'\'
8411     END as ligne1_1,
8412     CASE WHEN demandeur.qualite = \'personne_morale\' AND (demandeur.personne_morale_nom IS NOT NULL OR demandeur.personne_morale_prenom IS NOT NULL)
8413     THEN TRIM(CONCAT_WS(\' \', \'rep. par\', demandeur.personne_morale_nom, demandeur.personne_morale_prenom))
8414     ELSE \'\'
8415     END as ligne1_2,
8416     trim(concat(demandeur.numero,\' \',demandeur.voie)) as ligne2,
8417     CASE demandeur.complement
8418     WHEN null THEN \'\'
8419     ELSE trim(demandeur.complement)
8420     END as ligne3,
8421     CASE demandeur.lieu_dit
8422     WHEN null THEN \'\'
8423     ELSE trim(demandeur.lieu_dit)
8424     END as ligne4,
8425     CONCAT_WS(\' \', demandeur.code_postal, demandeur.localite,
8426     (CASE WHEN demandeur.bp IS NOT NULL
8427     THEN CONCAT_WS(\' \', \'BP\', demandeur.bp)
8428     ELSE \'\'
8429     END),
8430     (CASE WHEN demandeur.cedex IS NOT NULL
8431     THEN CONCAT_WS(\' \', \'CEDEX\', demandeur.cedex)
8432     ELSE \'\'
8433     END))
8434     as ligne5,
8435     code_barres as code_barres
8436     FROM
8437     %1$sinstruction
8438     INNER JOIN %1$sdossier
8439     ON dossier.dossier = instruction.dossier
8440     INNER JOIN %1$slien_dossier_demandeur
8441     ON dossier.dossier = lien_dossier_demandeur.dossier
8442     INNER JOIN %1$sdemandeur
8443     ON lien_dossier_demandeur.demandeur = demandeur.demandeur
8444     LEFT OUTER JOIN %1$scivilite AS pc
8445     ON demandeur.particulier_civilite = pc.civilite
8446     OR demandeur.personne_morale_civilite = pc.civilite
8447     WHERE
8448     instruction.code_barres = \'%2$s\'
8449     %3$s',
8450     DB_PREFIXE,
8451     $this->f->db->escapeSimple($code_barres),
8452     $sqlAdresse
8453     ),
8454     array(
8455     "origin" => __METHOD__
8456     )
8457     );
8458     $adresse_dest = array_shift($qres['result']);
8459 mbroquet 3730
8460     // Création adresse destinataire sans ligne vide
8461     $adresse_destinataire = array();
8462     if (!empty($adresse_dest['ligne1'])) {
8463     $adresse_destinataire[] = $adresse_dest['ligne1'];
8464     }
8465     if (!empty($adresse_dest['ligne1_1'])) {
8466     $adresse_destinataire[] = $adresse_dest['ligne1_1'];
8467     }
8468     if (!empty($adresse_dest['ligne1_2'])) {
8469     $adresse_destinataire[] = $adresse_dest['ligne1_2'];
8470     }
8471     $adresse_destinataire[] = $adresse_dest['ligne2'];
8472     if (!empty($adresse_dest['ligne3'])) {
8473     $adresse_destinataire[] = $adresse_dest['ligne3'];
8474     }
8475     if (!empty($adresse_dest['ligne4'])) {
8476     $adresse_destinataire[] = $adresse_dest['ligne4'];
8477     }
8478     $adresse_destinataire[] = $adresse_dest['ligne5'];
8479    
8480     // Création du champ specifique
8481     $specifique_content = array();
8482     $specifique_content[] = $adresse_dest['ligne1'];
8483     $specifique_content[] = $adresse_dest['ligne1_1'];
8484     $specifique_content[] = $adresse_dest['ligne1_2'];
8485     $specifique_content[] = $testDemandeur['dossier_libelle'];
8486     $specifique_content[] = "|||||".$adresse_dest['code_barres']."|||||";
8487     unset($adresse_dest['code_barres']);
8488     // Ajout d'une page aux pdf
8489 softime 3834 $pdf_lettre_rar->addLetter($adresse_destinataire, $specifique_content, $testDemandeur['code_phase']);
8490 mbroquet 3730
8491     }
8492     $pdf_output = $pdf_lettre_rar->output("lettre_rar".date("dmYHis").".pdf","S");
8493 softime 7685 $om_edition = $this->f->get_inst__om_edition();
8494 mbroquet 3730 $om_edition->expose_pdf_output($pdf_output, "lettre_rar".date("dmYHis").".pdf");
8495     }
8496     }
8497    
8498     /**
8499     * VIEW - view_bordereau_envoi_maire.
8500     *
8501     * Formulaire demandant :
8502     * - le code-barres de l'événement d'instruction
8503     * - la date d'envoi du courrier pour signature par le maire
8504     *
8505     * Lors de la validation :
8506     * => met à jour cette date dans l'événement d'instruction
8507     * => crée un lien permettant de générer en PDF le bordereau
8508     *
8509     * @return void
8510     */
8511     function view_bordereau_envoi_maire() {
8512     // Vérification de l'accessibilité sur l'élément
8513     $this->checkAccessibility();
8514    
8515     // Récupération des valeur passées en POST ou GET
8516     $code_barres = "";
8517     if($this->f->get_submitted_post_value('code_barres') !== null) {
8518     $code_barres = $this->f->get_submitted_post_value('code_barres');
8519     } elseif($this->f->get_submitted_get_value('code_barres')!==null) {
8520     $code_barres = $this->f->get_submitted_get_value('code_barres');
8521     }
8522     $date = "";
8523     if($this->f->get_submitted_post_value('date') !== null) {
8524     $date = $this->f->get_submitted_post_value('date');
8525     } elseif($this->f->get_submitted_get_value('date') !== null) {
8526     $date = $this->f->get_submitted_get_value('date');
8527     }
8528     $validation = 0;
8529     if($this->f->get_submitted_post_value('validation') !== null) {
8530     $validation = $this->f->get_submitted_post_value('validation');
8531     } elseif($this->f->get_submitted_get_value('validation') !== null) {
8532     $validation = $this->f->get_submitted_get_value('validation');
8533     }
8534    
8535     // Si le formulaire a été validé
8536     if ($this->f->get_submitted_post_value('validation') !== null) {
8537     // Tous les champs doivent obligatoirement être remplis
8538     if (!empty($date) && !empty($code_barres)) {
8539     $date_en = $this->dateDB($date);
8540     // Si date valide
8541     if ($date_en != "") {
8542     $id_instruction = $this->get_instruction_by_barcode($code_barres);
8543     // Si un événement d'instruction a été trouvé pour ce code-barres
8544     if ($id_instruction !== null) {
8545     $ret = $this->update_date_envoi_signature($id_instruction, $date_en);
8546     // Si mise à jour réussie de la date d'envoi du courrier
8547     // pour signature par l'autorité compétente
8548     if($ret === true) {
8549     // Message de validation avec lien PDF
8550     $message_class = "valid";
8551     $message = '&bullet; '._("Veuillez cliquer sur le lien ci-dessous pour telecharger votre bordereau");
8552     $message .= " : <br/><br/>";
8553     $message .= "<a class='om-prev-icon pdf-16'";
8554     $message .= " id=\"generer_bordereau_envoi_maire\"";
8555     $message .= " title=\""._("Bordereau")."\"";
8556 softime 7996 $message .= " href='".OM_ROUTE_FORM."&obj=instruction";
8557 mbroquet 3730 $message .= "&action=200";
8558     $message .= "&idx=".$id_instruction."'";
8559     $message .= " target='_blank'>";
8560     $message .= _("Bordereau d'envoi au maire");
8561     $message .= "</a><br/><br/>";
8562     $message .= '&bullet; '._("Rappel des informations saisies")." :<br/><br/>";
8563     $message .= _("Code du courrier")." : ".$code_barres."<br/>";
8564     $message .= _("Date d'envoi du courrier pour signature par le maire")." : ".$date;
8565    
8566     } else {
8567     // Message d'erreur
8568     $message_class = "error";
8569     $message = sprintf(_("Erreur lors de la mise a jour de l'evenement d'instruction correspondant au code barres %s."),
8570     $code_barres);
8571     }
8572     }
8573     else {
8574     $message_class = "error";
8575     $message = _("Le numero saisi ne correspond a aucun code-barres d'evenement d'instruction.");
8576     }
8577     }
8578     else {
8579     $message_class = "error";
8580     $message = _("La date est invalide.");
8581     }
8582     } else {
8583     $message_class = "error";
8584     $message = _("Tous les champs doivent etre remplis.");
8585     }
8586     }
8587    
8588     /**
8589     * Affichage des messages et du formulaire
8590     */
8591    
8592     // Affichage du message de validation ou d'erreur
8593     if (isset($message) && isset($message_class) && $message != "") {
8594     $this->f->displayMessage($message_class, $message);
8595     }
8596    
8597     // Ouverture du formulaire
8598     $datasubmit = $this->getDataSubmit();
8599     echo "\n<!-- ########## START DBFORM ########## -->\n";
8600     echo "<form";
8601     echo " id=\"bordereau_envoi_maire\"";
8602     echo " method=\"post\"";
8603     echo " name=\"f1\"";
8604     echo " action=\"";
8605     echo $datasubmit;
8606     echo "\"";
8607     echo ">\n";
8608    
8609     // Paramétrage des champs du formulaire
8610     $champs = array("code_barres","date");
8611    
8612     // Création d'un nouvel objet de type formulaire
8613 softime 7996 $form = $this->f->get_inst__om_formulaire(array(
8614     "validation" => 0,
8615     "maj" => 0,
8616     "champs" => $champs,
8617     ));
8618 mbroquet 3730
8619     $template_required_label = '%s *';
8620     // Parametrage du champ code_barres
8621     $form->setLib("code_barres", sprintf($template_required_label,_("Code du courrier")));
8622     $form->setType("code_barres", "text");
8623     $form->setVal("code_barres", $code_barres);
8624     $form->setTaille("code_barres", 20);
8625     $form->setMax("code_barres", 20);
8626     // Parametrage du champ date
8627     $form->setLib("date", sprintf($template_required_label,_("Date d'envoi du courrier pour signature par le maire")));
8628     $form->setType("date", "date") ;
8629     if (empty($date)) {
8630     $date = date('d/m/Y');
8631     }
8632     $form->setVal("date", $date);
8633     $form->setTaille("date", 10);
8634     $form->setMax("date", 10);
8635    
8636     // Création du bloc regroupant les champs
8637     $form->setBloc('code_barres','D');
8638     $form->setBloc('date','F');
8639     // Affichage du formulaire
8640     $form->entete();
8641     $form->afficher($champs, 0, false, false);
8642     $form->enpied();
8643     // Affichage du bouton
8644     printf("\t<div class=\"formControls\">\n");
8645     //
8646     $this->f->layout->display_form_button(array("value" => _("Valider"), "name" => "validation"));
8647     printf("\t</div>\n");
8648     // Fermeture du formulaire
8649     printf("\t</form>\n");
8650     }
8651    
8652     /**
8653     * VIEW - view_bordereau_envoi_maire.
8654     *
8655     * PDF de bordereau d'envoi au maire pour l'événement d'instruction instancié
8656     *
8657     * @return [void]
8658     */
8659     function view_generate_bordereau_envoi_maire() {
8660     // Vérification de l'accessibilité sur l'élément
8661     $this->checkAccessibility();
8662     // Récupération de la collectivité du dossier d'instruction
8663     $collectivite_di = $this->get_dossier_instruction_om_collectivite();
8664     // Récupération de ses paramètres
8665     $collectivite = $this->f->getCollectivite($collectivite_di);
8666     // Génération du PDF
8667     $result = $this->compute_pdf_output('etat', 'communaute_bordereau_envoi_maire', $collectivite, $this->getVal(($this->clePrimaire)));
8668     // Affichage du PDF
8669     $this->expose_pdf_output(
8670     $result['pdf_output'],
8671     $result['filename']
8672     );
8673     }
8674    
8675     /**
8676 softime 10808 * VIEW - view_rapport_instruction.
8677     *
8678     * Ouvre le sous-formulaire en ajaxIt dans un overlay.
8679     * Cette action est bindée pour utiliser la fonction popUpIt.
8680     *
8681     * @return void
8682     */
8683     function view_overlay_notification_manuelle() {
8684    
8685     // Vérification de l'accessibilité sur l'élément
8686     $this->checkAccessibility();
8687    
8688     printf(
8689     '<script type="text/javascript" >
8690     overlayIt(\'%1$s\',\'%2$s&objsf=%1$s&idxformulaire=%4$s&retourformulaire=dossier_instruction&obj=%1$s&action=411&idx=%3$s\', 1);
8691     </script>',
8692     'instruction_notification_manuelle',
8693     OM_ROUTE_SOUSFORM,
8694     $this->getVal($this->clePrimaire),
8695     $this->getVal('dossier')
8696     );
8697     }
8698    
8699     /**
8700 softime 11585 * VIEW - view_overlay_notification_service_consulte.
8701     *
8702     * Ouvre le sous-formulaire de notification des services consulte
8703     * en ajaxIt dans un overlay.
8704     * Cette action est bindée pour utiliser la fonction popUpIt.
8705     *
8706     * @return void
8707     */
8708     function view_overlay_notification_service_consulte() {
8709    
8710     // Vérification de l'accessibilité sur l'élément
8711     $this->checkAccessibility();
8712    
8713     printf(
8714     '<script type="text/javascript" >
8715     overlayIt(\'%1$s\',\'%2$s&objsf=%1$s&idxformulaire=%4$s&retourformulaire=dossier_instruction&obj=%1$s&action=420&idx=%3$s\', 1);
8716     </script>',
8717     'instruction_notification_manuelle',
8718     OM_ROUTE_SOUSFORM,
8719     $this->getVal($this->clePrimaire),
8720     $this->getVal('dossier')
8721     );
8722     }
8723    
8724     /**
8725     * VIEW - overlay_notification_tiers_consulte.
8726     *
8727     * Ouvre le sous-formulaire de notification des tiers consulte
8728     * en ajaxIt dans un overlay.
8729     * Cette action est bindée pour utiliser la fonction popUpIt.
8730     *
8731     * @return void
8732     */
8733     function view_overlay_notification_tiers_consulte() {
8734    
8735     // Vérification de l'accessibilité sur l'élément
8736     $this->checkAccessibility();
8737    
8738     printf(
8739     '<script type="text/javascript" >
8740     overlayIt(\'%1$s\',\'%2$s&objsf=%1$s&idxformulaire=%4$s&retourformulaire=dossier_instruction&obj=%1$s&action=430&idx=%3$s\', 1);
8741     </script>',
8742     'instruction_notification_manuelle',
8743     OM_ROUTE_SOUSFORM,
8744     $this->getVal($this->clePrimaire),
8745     $this->getVal('dossier')
8746     );
8747     }
8748 softime 12847
8749 softime 11585 /**
8750 softime 12847 * VIEW - view_modale_selection_document_signe
8751     *
8752     * Ouvre le sous-formulaire de notification des services consulte
8753     * en ajaxIt dans un overlay.
8754     * Cette action est bindée pour utiliser la fonction popUpIt.
8755     *
8756     * @return void
8757     */
8758     function view_modale_selection_document_signe() {
8759    
8760     // Vérification de l'accessibilité sur l'élément
8761     $this->checkAccessibility();
8762    
8763     printf(
8764     '<script type="text/javascript" >
8765     overlayIt(\'%1$s\',\'%2$s&objsf=%1$s&idxformulaire=%4$s&retourformulaire=dossier_instruction&obj=%1$s&action=115&idx=%3$s\', 1);
8766     </script>',
8767     'instruction_modale',
8768     OM_ROUTE_SOUSFORM,
8769     $this->getVal($this->clePrimaire),
8770     $this->getVal('dossier')
8771     );
8772     }
8773    
8774     /**
8775 softime 6565 * Retourne l'événement d'instruction dont on donne le code-barres, avec un filtre
8776     * pour exclure les dossiers du groupe contentieux.
8777 mbroquet 3730 *
8778     * @param [string] $barcode numéro du code-barres
8779     * @return [mixed] ID de son instruction ou null si aucun code
8780     */
8781     function get_instruction_by_barcode($barcode) {
8782     // Begin
8783     $this->begin_treatment(__METHOD__);
8784 softime 14064
8785 mbroquet 3730 // Vérification de l'existence de l'événement d'instruction
8786 softime 6565 // pour le code-barres donné, en excluant les dossiers liés au groupe CTX
8787 softime 14064 $qres = $this->f->get_one_result_from_db_query(
8788     sprintf(
8789     'SELECT
8790     instruction
8791     FROM
8792     %1$sinstruction
8793     INNER JOIN %1$sdossier
8794 softime 6565 ON dossier.dossier=instruction.dossier
8795 softime 14064 INNER JOIN %1$sdossier_instruction_type
8796 softime 6565 ON dossier.dossier_instruction_type = dossier_instruction_type.dossier_instruction_type
8797 softime 14064 INNER JOIN %1$sdossier_autorisation_type_detaille
8798 softime 6565 ON dossier_instruction_type.dossier_autorisation_type_detaille = dossier_autorisation_type_detaille.dossier_autorisation_type_detaille
8799 softime 14064 INNER JOIN %1$sdossier_autorisation_type
8800 softime 6565 ON dossier_autorisation_type_detaille.dossier_autorisation_type = dossier_autorisation_type.dossier_autorisation_type
8801 softime 14064 INNER JOIN %1$sgroupe
8802 softime 6565 ON dossier_autorisation_type.groupe = groupe.groupe
8803 softime 14064 AND groupe.code != \'CTX\'
8804     WHERE
8805     code_barres = \'%2$s\'',
8806     DB_PREFIXE,
8807     $this->f->db->escapeSimple($barcode)
8808     ),
8809     array(
8810     "origin" => __METHOD__,
8811     )
8812     );
8813    
8814 mbroquet 3730 // Retourne résultat
8815 softime 14064 return $this->end_treatment(__METHOD__, $qres['result']);
8816 mbroquet 3730 }
8817    
8818     /**
8819     * Met à jour le champ date d'envoi signature
8820     * avec la date fournie et pour l'instruction donnée
8821     *
8822     * @param [string] $id ID de l'événement d'instruction
8823     * @param [string] $date date au format EN
8824     * @return [boolean] true si mise à jour avec succès
8825     */
8826     function update_date_envoi_signature($id, $date) {
8827     // Préparation du tableau
8828     $valF = array();
8829     $valF['date_envoi_signature'] = $date;
8830     // Begin
8831     $this->begin_treatment(__METHOD__);
8832     // Requête
8833 softime 12847 $res = $this->f->db->autoexecute(
8834 mbroquet 3730 DB_PREFIXE.$this->table,
8835     $valF,
8836     DB_AUTOQUERY_UPDATE,
8837     $this->getCle($id)
8838     );
8839 softime 12847 $this->addToLog(
8840     __METHOD__."(): db->autoexecute(\"".DB_PREFIXE.'.'.$this->table."\", ".print_r($valF, true).", DB_AUTOQUERY_UPDATE, \"".$this->getCle($id)."\");",
8841     VERBOSE_MODE
8842     );
8843     if ($this->f->isDatabaseError($res, true) !== false) {
8844 mbroquet 3730 $this->end_treatment(__METHOD__, false);
8845     }
8846     //
8847     return $this->end_treatment(__METHOD__, true);
8848     }
8849    
8850     /**
8851     * Méthode permettant de définir des valeurs à envoyer en base après
8852     * validation du formulaire d'ajout.
8853     * @param array $val tableau des valeurs retournées par le formulaire
8854     */
8855 softime 6929 function setValFAjout($val = array()) {
8856 mbroquet 3730 // Mise à jour du flag created_by_commune lors d'un changement de décision
8857     // par un utilisateur de commune sur un dossier instruit par la comcom
8858 softime 6565 if ($this->isInstrCanChangeDecision($this->valF["dossier"])) {
8859 mbroquet 3730 $this->valF['created_by_commune'] = true;
8860     }
8861 softime 8593
8862     //
8863     if ($this->evenement_has_an_edition($this->valF['evenement']) === false) {
8864     if (isset($this->valF['flag_edition_integrale']) === true) {
8865     unset($this->valF['flag_edition_integrale']);
8866     }
8867     if (isset($this->valF['signataire_arrete']) === true) {
8868     unset($this->valF['signataire_arrete']);
8869     }
8870     }
8871 mbroquet 3730 }
8872 nmeucci 3876
8873 fmichon 3892
8874 fmichon 4708 /**
8875     * Récupère l'instance d'un événement de workflow.
8876     *
8877     * @param mixed $evenement Identifiant de l'événement.
8878     *
8879     * @return object
8880     */
8881     function get_inst_evenement($evenement = null) {
8882     //
8883     return $this->get_inst_common("evenement", $evenement);
8884     }
8885 softime 3976
8886 fmichon 3892 /**
8887 softime 3976 * Logue l'action de l'instruction dans son DI.
8888 nmeucci 3933 *
8889 softime 3976 * @param string $id Clé primaire de l'instruction.
8890     * @param array $val Valeurs de l'instruction.
8891     *
8892     * @return bool Vrai si traitement effectué avec succès
8893 nmeucci 3876 */
8894 softime 3976 private function add_log_to_dossier($id, array $val) {
8895 nmeucci 3933 $maj = $this->getParameter("maj");
8896 nmeucci 3943 // Action = Trace par défaut
8897     $action = $this->get_backtrace();
8898     // Action = Identifant de l'action si contexte connu
8899     if (empty($maj) === false
8900     || (empty($maj) === true && $maj === 0)) {
8901     $action = $this->get_action_param($maj, 'identifier');
8902 nmeucci 3965 if ($action === 'modifier_suivi') {
8903     $action = "modifier (via l'action suivi des dates)";
8904     }
8905 nmeucci 4108 if ($action === 'notifier_commune'
8906     && isset($val['mails_destinataires']) === true) {
8907     $action = "notification de la commune (courriels : ";
8908     $action .= $val['mails_destinataires'].")";
8909     }
8910 nmeucci 3943 }
8911 nmeucci 3876 // Création du log
8912     $log = array(
8913     'date' => date('Y-m-d H:i:s'),
8914     'user' => $_SESSION['login'],
8915     'action' => $action,
8916     'values' => array(
8917     'date_evenement' => $this->dateDB($val['date_evenement']),
8918     'date_retour_rar' => $this->dateDB($val['date_retour_rar']),
8919     'date_retour_signature' => $this->dateDB($val['date_retour_signature']),
8920     'evenement' => $val['evenement'],
8921     'action' => $val['action'],
8922 nmeucci 3963 'instruction' => $id,
8923 nmeucci 3876 'etat' => $val['etat'],
8924     ),
8925     );
8926     // Ajout du log
8927 softime 3976 $di = $this->get_inst_dossier($val['dossier']);
8928 nmeucci 3876 $ret = $di->add_log_instructions($log);
8929     if ($ret === false) {
8930     $this->correct = false;
8931     $this->msg = '';
8932     $this->addToMessage($di->msg);
8933     }
8934     return $ret;
8935     }
8936 nmeucci 3943
8937 softime 3976
8938 nmeucci 3943 /**
8939 softime 3976 * Retourne le contexte de déboguage formaté en HTML.
8940 nmeucci 3943 *
8941 softime 3976 * @return string Une ligne par trace
8942 nmeucci 3943 */
8943     private function get_backtrace() {
8944     $trace = debug_backtrace();
8945 nmeucci 3957 $backtrace = '';
8946     $i = 1;
8947 nmeucci 3943 foreach ($trace as $key => $value) {
8948 nmeucci 3957 $func = $trace[$key]['function'];
8949     // On ne s'autolog pas
8950     if ($func === 'get_backtrace'
8951     || $func === 'add_log_to_dossier') {
8952     continue;
8953     }
8954     $backtrace .= $i.') ';
8955     // Si dans une classe
8956     if (isset($trace[$key]['class']) === true
8957     && empty($trace[$key]['class']) === false) {
8958 nmeucci 3963 $backtrace .= $trace[$key]['class'].'->'.$func;
8959 nmeucci 3957 }
8960     // Si procédural
8961     else {
8962     $file = $trace[$key]['file'];
8963 nmeucci 3963 $line = $trace[$key]['line'];
8964 softime 3976 $truncated_file = $this->f->get_relative_path($file);
8965 nmeucci 3963 if ($truncated_file !== false) {
8966     $file = $truncated_file;
8967     }
8968     $backtrace .= $func.' IN<br/>&nbsp;&nbsp;&nbsp;&nbsp; '.$file.':'.$line;
8969 nmeucci 3957 }
8970     $backtrace .= '<br/>';
8971     $i++;
8972 nmeucci 3943 }
8973 nmeucci 3957 return $backtrace;
8974 nmeucci 3943 }
8975 nmeucci 3963
8976 nmeucci 4108 /**
8977     * CONDITION - is_notifiable.
8978     *
8979     * Condition pour afficher l'action notifier_commune.
8980     *
8981     * @return boolean
8982     */
8983     public function is_notifiable() {
8984     // L'instruction doit être finalisée, ce qui revient à dire
8985     // définalisable sans bypass
8986     if ($this->is_unfinalizable_without_bypass() === false) {
8987     return false;
8988     }
8989     // La collectivité de l'utilisateur doit être de niveau multi
8990     if ($this->f->has_collectivite_multi() === false) {
8991     return false;
8992     }
8993     // Le paramètre multi de l'objet du courriel doit exister
8994     if ($this->f->getParameter('param_courriel_de_notification_commune_objet_depuis_instruction') === NULL) {
8995     return false;
8996     }
8997     // Le paramètre multi du modèle du courriel doit exister
8998     if ($this->f->getParameter('param_courriel_de_notification_commune_modele_depuis_instruction') === NULL) {
8999     return false;
9000     }
9001     // A ce stade toutes les conditions sont satisfaites
9002     return true;
9003     }
9004 nmeucci 3963
9005 nmeucci 4108 /**
9006     * TREATMENT - notifier_commune.
9007     *
9008     * Notifie aux communes et par courriel la finalisation d'une instruction.
9009     *
9010     * @return boolean
9011     */
9012     public function notifier_commune() {
9013     // Cette méthode permet d'exécuter une routine en début des méthodes
9014     // dites de TREATMENT.
9015     $this->begin_treatment(__METHOD__);
9016 softime 14542 $message = __('Erreur de paramétrage :');
9017 softime 12654 $erreurParametrage = false;
9018     // Récupération du paramétrage de la collectivité du dossier
9019 nmeucci 4108 $id_di = $this->getVal('dossier');
9020     $di = $this->get_inst_dossier($id_di);
9021     $collectivite_di = $di->getVal('om_collectivite');
9022 softime 12654 // Récupération de l'url permettant d'accèder à l'instruction et au dossier
9023     $urlAcces = $this->f->get_parametre_notification_url_acces($collectivite_di);
9024     if (empty($urlAcces) && empty(PATH_BASE_URL)) {
9025     $erreurParametrage = true;
9026     $message .= '<br>'.__("* l'url de notification n'est pas correctement paramétré");
9027 nmeucci 4108 }
9028 softime 12654
9029     // Récupération de la liste des mails
9030     $adresses = $this->f->get_param_courriel_de_notification_commune($collectivite_di);
9031     if (empty($adresses)) {
9032     $erreurParametrage = true;
9033     $message .= '<br>'.__("* aucun courriel valide de destinataire de la commune");
9034 nmeucci 4108 }
9035 softime 12654
9036     // Vérification du paramétrage des mails
9037     $paramMail = $this->f->get_notification_commune_parametre_courriel_type($collectivite_di);
9038     if (empty($paramMail) || empty($paramMail['parametre_courriel_type_message'])) {
9039     $erreurParametrage = true;
9040     $message .= '<br>'.__("* le modèle du courriel envoyé aux communes est vide");
9041 nmeucci 4108 }
9042 softime 12654 if (empty($paramMail) || empty($paramMail['parametre_courriel_type_titre'])) {
9043     $erreurParametrage = true;
9044     $message .= '<br>'.__("* l'objet du courriel envoyé aux communes est vide");
9045 nmeucci 4108 }
9046 softime 12654
9047     // Si il y a des erreurs de paramétrage on ne déclenche pas la notification et
9048     // un message a destination de l'utilisateur est affiché
9049     if ($erreurParametrage) {
9050     $message .= '<br>'.__("Veuillez contacter votre administrateur.");
9051     $this->addToMessage($message);
9052 nmeucci 4108 return $this->end_treatment(__METHOD__, false);
9053     }
9054 softime 12654
9055     // Création d'un notification et de sa tâche associé pour chaque mail
9056     foreach ($adresses as $adresse) {
9057     // Ajout de la notif et récupération de son id
9058     $destinataire = array(
9059     'destinataire' => $adresse,
9060     'courriel' => $adresse
9061     );
9062     $idNotif = $this->ajouter_notification(
9063     $this->getVal($this->clePrimaire),
9064     $this->f->get_connected_user_login_name(),
9065     $destinataire,
9066     $collectivite_di
9067     );
9068     if ($idNotif === false) {
9069     $this->addToMessage(__("Veuillez contacter votre administrateur."));
9070     return $this->end_treatment(__METHOD__, false);
9071 nmeucci 4108 }
9072 softime 12654 // Création de la tache en lui donnant l'id de la notification
9073     $notification_by_task = $this->notification_by_task(
9074     $idNotif,
9075     $this->getVal('dossier'),
9076     'mail',
9077     'notification_commune'
9078     );
9079     if ($notification_by_task === false) {
9080     $this->addToMessage(__("Erreur lors de la préparation de la notification des communes."));
9081     $this->addToMessage(__("Veuillez contacter votre administrateur."));
9082     return $this->end_treatment(__METHOD__, false);
9083     }
9084 nmeucci 4108 }
9085 softime 12654 $this->addToMessage(__('La commune a été notifiée.'));
9086 nmeucci 4108 return $this->end_treatment(__METHOD__, true);
9087     }
9088    
9089     /**
9090 softime 5169 * Récupère l'instance de l'instructeur
9091     *
9092     * @param integer $instructeur Identifiant de l'instructeur.
9093     *
9094     * @return object
9095     */
9096     protected function get_inst_instructeur($instructeur) {
9097     //
9098     return $this->get_inst_common("instructeur", $instructeur);
9099     }
9100    
9101    
9102     /**
9103     * Récupère l'instance de l'utilisateur
9104     *
9105     * @param integer $om_utilisateur Identifiant de l'utilisateur.
9106     *
9107     * @return object
9108     */
9109     protected function get_inst_om_utilisateur($om_utilisateur) {
9110     //
9111     return $this->get_inst_common("om_utilisateur", $om_utilisateur);
9112     }
9113    
9114    
9115 softime 6565 /**
9116 softime 5295 * Récupère l'instance de la division.
9117     *
9118     * @param integer $division Identifiant de la division.
9119     *
9120     * @return object
9121     */
9122     protected function get_inst_division($division) {
9123     //
9124     return $this->get_inst_common("division", $division);
9125     }
9126    
9127    
9128     /**
9129     * Récupère l'instance de la direction.
9130     *
9131     * @param integer $direction Identifiant de la direction.
9132     *
9133     * @return object
9134     */
9135     protected function get_inst_direction($direction) {
9136     //
9137     return $this->get_inst_common("direction", $direction);
9138     }
9139    
9140    
9141     /**
9142     * Récupère la collectivité d'un instructeur en passant par sa division puis
9143     * par sa direction.
9144     *
9145     * @param integer $instructeur Identifiant de l'instructeur.
9146     *
9147     * @return integer
9148     */
9149     protected function get_instructeur_om_collectivite($instructeur) {
9150     // Chemin vers la collectivité d'un instructeur
9151     $inst_instr = $this->get_inst_instructeur($instructeur);
9152     $inst_division = $this->get_inst_division($inst_instr->getVal('division'));
9153     $inst_direction = $this->get_inst_direction($inst_division->getVal('direction'));
9154    
9155     // Collectivité
9156     $om_collectivite = $inst_direction->getVal('om_collectivite');
9157    
9158     //
9159     return $om_collectivite;
9160     }
9161    
9162 softime 6565 /*
9163     * CONDITION - can_user_access_dossier_contexte_ajout
9164     *
9165     * Vérifie que l'utilisateur a bien accès au dossier d'instruction passé dans le
9166     * formulaire d'ajout.
9167     * Cette méthode vérifie que l'utilisateur est lié au groupe du dossier, et si le
9168     * dossier est confidentiel qu'il a accès aux confidentiels de ce groupe.
9169     *
9170     */
9171     function can_user_access_dossier_contexte_ajout() {
9172 softime 5295
9173 softime 6565 ($this->f->get_submitted_get_value('idxformulaire') !== null ? $id_dossier =
9174     $this->f->get_submitted_get_value('idxformulaire') : $id_dossier = "");
9175     //
9176     if ($id_dossier !== "") {
9177 softime 7996 $dossier = $this->f->get_inst__om_dbform(array(
9178     "obj" => "dossier_instruction",
9179     "idx" => $id_dossier,
9180     ));
9181 softime 6565 //
9182     return $dossier->can_user_access_dossier();
9183     }
9184     return false;
9185     }
9186    
9187     /*
9188     * CONDITION - can_user_access_dossier
9189     *
9190     * Vérifie que l'utilisateur a bien accès au dossier lié à l'instruction instanciée.
9191     * Cette méthode vérifie que l'utilisateur est lié au groupe du dossier, et si le
9192     * dossier est confidentiel qu'il a accès aux confidentiels de ce groupe.
9193     *
9194     */
9195     function can_user_access_dossier_contexte_modification() {
9196    
9197     $id_dossier = $this->getVal('dossier');
9198     //
9199     if ($id_dossier !== "" && $id_dossier !== null) {
9200 softime 7996 $dossier = $this->f->get_inst__om_dbform(array(
9201     "obj" => "dossier_instruction",
9202     "idx" => $id_dossier,
9203     ));
9204 softime 6565 //
9205     return $dossier->can_user_access_dossier();
9206     }
9207     return false;
9208     }
9209    
9210 softime 8593 /**
9211 softime 10713 * TREATMENT - envoyer_a_signature_sans_relecture
9212     *
9213     * Permet d'envoyer le document de l'instruction au parapheur pour signature sans relecture
9214     *
9215     * @return boolean true si l'envoi a été effectué avec succès false sinon
9216     */
9217     function envoyer_a_signature_sans_relecture() {
9218     return $this->envoyer_a_signature();
9219     }
9220    
9221     /**
9222     * TREATMENT - envoyer_a_signature_avec_relecture
9223     *
9224     * Permet d'envoyer le document de l'instruction au parapheur pour signature avec relecture
9225     *
9226     * @return boolean true si l'envoi a été effectué avec succès false sinon
9227     */
9228     function envoyer_a_signature_avec_relecture() {
9229 softime 10808 $is_forced_view_files = true;
9230     return $this->envoyer_a_signature($is_forced_view_files);
9231 softime 10713 }
9232    
9233     /**
9234 softime 10573 * TREATMENT - envoyer_a_signature
9235     *
9236     * Permet d'envoyer le document de l'instruction au parapheur pour signature
9237 softime 10713 *
9238     * @param boolean $is_forced_view_files Indique si il y a une relecture (true) ou non (false)
9239 softime 10573 *
9240     * @return boolean true si l'envoi a été effectué avec succès false sinon
9241     */
9242 softime 10713 function envoyer_a_signature($is_forced_view_files = false) {
9243 softime 10573 $this->begin_treatment(__METHOD__);
9244     $this->correct = true;
9245    
9246     // Instanciation de l'objet signataire_arrete
9247     $inst_signataire_arrete = $this->f->get_inst__om_dbform(array(
9248     'obj' => 'signataire_arrete',
9249     'idx' => $this->getVal('signataire_arrete'),
9250     ));
9251    
9252     // Instanciation de l'objet dossier
9253     $inst_dossier = $this->f->get_inst__om_dbform(array(
9254     'obj' => 'dossier',
9255     'idx' => $this->getVal('dossier'),
9256     ));
9257    
9258 softime 15037 //Instanciation de la classe electronicsignature
9259     $inst_es = $this->get_electronicsignature_instance();
9260     if ($inst_es === false) {
9261     $this->correct = false;
9262     return $this->end_treatment(__METHOD__, false);
9263     }
9264    
9265     // Vérifie si la notification se fait via l'application ou via le parapheur
9266     try {
9267     $notification_required = $inst_es->signer_notification_is_delegated();
9268     } catch(electronicsignature_connector_method_not_implemented_exception $_) {
9269     // Si la méthode n'existe pas, on considère que la notification est faite par le parapheur
9270     $notification_required = false;
9271     }
9272    
9273     // Si la notification est faite par l'application vérifie que l'adresse mail du
9274     // signataire est correcte. Si ce n'est pas le cas le document n'est pas envoyé
9275     // au parapheur car il ne sera pas accessible sans le lien transmis dans la
9276     // notification
9277     if ($notification_required === true) {
9278     $signer_mail = $inst_signataire_arrete->getVal('email');
9279     $signer_name = trim($inst_signataire_arrete->getVal('prenom').' '.$inst_signataire_arrete->getVal('nom'));
9280    
9281     $err_msg = __('Le document n\'a pas pu être envoyé en signature car ');
9282    
9283     if (empty($signer_mail)) {
9284     $this->correct = false;
9285     $err_detail = sprintf(__("l'email du signataire '%s' est vide."), $signer_name);
9286     $this->addToMessage($err_msg.$err_detail);
9287     $this->addToLog(__METHOD__.$err_msg.$err_detail.' Instruction : '.$this->getVal($this->clePrimaire), DEBUG_MODE);
9288     return $this->end_treatment(__METHOD__, false);
9289     }
9290     if (! $this->f->checkValidEmailAddress($signer_mail)) {
9291     $this->correct = false;
9292     $err_detail = sprintf(__("l'email du signataire '%s' est invalide (%s)."), $signer_name, $signer_mail);
9293     $this->addToMessage($err_msg.$err_detail);
9294     $this->addToLog(__METHOD__.$err_msg.$err_detail.' Instruction : '.$this->getVal($this->clePrimaire), DEBUG_MODE);
9295     return $this->end_treatment(__METHOD__, false);
9296     }
9297     }
9298    
9299 softime 10573 // Récupération du document à signer
9300     $file = $this->f->storage->get($this->getVal('om_fichier_instruction'));
9301     if ($file === OP_FAILURE) {
9302     $this->correct = false;
9303     $this->addToMessage(__("Une erreur est survenue lors de la récupération du contenu du document de l'instruction."));
9304     // Termine le traitement
9305     return $this->end_treatment(__METHOD__, false);
9306     }
9307    
9308     // Initialisation des paramètre à passer pour l'envoi en signature
9309 softime 10808 $data = array(
9310 softime 10573 "om_utilisateur_email" => $this->f->om_utilisateur['email'],
9311     "om_utilisateur_nom" => $this->f->om_utilisateur['nom'],
9312     "signataire_arrete_email" => $inst_signataire_arrete->getVal('email'),
9313     "signataire_arrete_nom" => $inst_signataire_arrete->getVal('nom'),
9314     "signataire_arrete_prenom" => $inst_signataire_arrete->getVal('prenom'),
9315 softime 11876 // Permet d'envoyer en signature l'instruction le jour de la date limite
9316 softime 14064 "date_limite_instruction" => $this->compute_date_limite(1) != null ? $this->compute_date_limite(1) : null,
9317 softime 10573 "dossier" => $this->getVal('dossier'),
9318 softime 10713 "is_forced_view_files" => $is_forced_view_files,
9319     'commentaire_signature' => $is_forced_view_files === true ? __('relecture demandee.') : null
9320 softime 10573 );
9321    
9322 softime 10808 // Initialisation des métadonnées
9323     $metadonnee_dossier = $file['metadata'];
9324 softime 11228 // récupération de l'extension du fichier
9325     $extension = substr($metadonnee_dossier['filename'], strrpos($metadonnee_dossier['filename'], '.'));
9326     // Modification du libellé du document transmis au parapheur
9327     // pour le mettre sous la forme : instruction_xxx_libelle_lettretype.extension
9328     $metadonnee_dossier['filename'] = $this->getDocumentLibelle().$extension;
9329     $metadonnee_dossier['titre_document'] = $this->getDocumentTitre();
9330 softime 10808
9331     $metadonnee_dossier['url_di'] = sprintf(
9332 softime 15037 '%1$sapp/index.php?module=form&direct_link=true&obj=dossier_instruction&action=3&idx=%2$s&direct_field=dossier&direct_form=document_numerise&direct_action=4&direct_idx=%2$s',
9333 softime 11418 $this->f->get_param_base_path_metadata_url_di() !== null ? $this->f->get_param_base_path_metadata_url_di() : PATH_BASE_URL,
9334 softime 15037 $this->getVal('dossier')
9335 softime 10808 );
9336    
9337     $optional_data = null;
9338     // Si il y a des paramètres supplémentaire spécifié dans le signataire alors on les récupère
9339     if ($inst_signataire_arrete->getVal('parametre_parapheur') !== null && $inst_signataire_arrete->getVal('parametre_parapheur') !== '') {
9340     $optional_data = json_decode($inst_signataire_arrete->getVal('parametre_parapheur'), true);
9341     if (json_last_error() !== JSON_ERROR_NONE) {
9342     $this->correct = false;
9343     $this->addToMessage(__("Les paramètres supplémentaires envoyés au parapheur ne sont pas au bon format."));
9344     $this->addToLog(__METHOD__."(): ".
9345     __("Erreur lors du décodage du format json des paramètres supplémentaires envoyé au parapheur.
9346     Tableau : ").var_export($inst_signataire_arrete->getVal('parametre_parapheur'), true)
9347     );
9348     // Termine le traitement
9349     return $this->end_treatment(__METHOD__, false);
9350     }
9351     }
9352    
9353 softime 10573 // Appel de la méthode de l'abstracteur send_for_signature()
9354     // Cette méthode doit retourner un tableau de valeur
9355     try {
9356 softime 10808 $result = $inst_es->send_for_signature($data, $file['file_content'], $metadonnee_dossier, $optional_data);
9357 softime 10573 } catch (electronicsignature_exception $e) {
9358     $this->handle_electronicsignature_exception($e);
9359     return $this->end_treatment(__METHOD__, false);
9360     }
9361    
9362     // Après avoir reçu le résultat du parapheur, il faut mettre à jour les champs
9363     $valF = array();
9364    
9365     // Pour appeler la fonction modifier il faut traiter tous les champs de l'objet
9366     foreach($this->champs as $identifiant => $champ) {
9367     $valF[$champ] = $this->val[$identifiant];
9368     }
9369     // On fait ensuite nos modifications spécifiques
9370     $valF['id_parapheur_signature'] = $result['id_parapheur_signature'];
9371     $valF['statut_signature'] = $result['statut'];
9372     $valF['commentaire_signature'] = isset($result['commentaire_signature']) == true ? $result['commentaire_signature'] : null;
9373     $valF['date_envoi_signature'] = date("Y-m-d", strtotime($result['date_envoi_signature']));
9374     $valF['historique_signature'] = $this->get_updated_historique_signature($result);
9375 softime 15037 $valF['parapheur_lien_page_signature'] = isset($result['signature_page_url']) ? $result['signature_page_url'] : null;
9376 softime 10573 $ret = $this->modifier($valF);
9377    
9378     if ($ret === false) {
9379     $this->correct = false;
9380     $this->addToMessage(__("Une erreur est survenue lors de la mise à jour des champs."));
9381     // Termine le traitement
9382     return $this->end_treatment(__METHOD__, false);
9383     }
9384    
9385 softime 15037 // Notification du signataire
9386     if ($notification_required === true) {
9387     if ($this->notify_signer($signer_name, $signer_mail, $data['om_utilisateur_nom']) === false) {
9388     $msg = __("Une erreur s'est produite lors de la notification du signataire \"%s (%s)\". Annulation de l'envoi pour signature du document%s.");
9389     $this->addToMessage(sprintf($msg, $signer_name, $signer_mail, ''));
9390     $this->addToLog(sprintf($msg, $signer_name, $signer_mail, ' : '.$this->getVal($this->clePrimaire)), DEBUG_MODE);
9391     // Met à jour les valeurs de l'objet courant pour prendre en compte les modifications faites
9392     // precedemment
9393     $this->init_record_data($this->getVal($this->clePrimaire));
9394     $this->annuler_envoi_en_signature();
9395     $this->correct = false;
9396     return $this->end_treatment(__METHOD__, true);
9397     }
9398     }
9399    
9400 softime 10573 // Message
9401     $this->addToMessage(__("Le document a été envoyé pour signature dans le parapheur."));
9402 softime 15037 if ($this->f->is_option_enabled('option_afficher_lien_parapheur') === true
9403     && array_key_exists('signature_page_url', $result) === true) {
9404 softime 10573 $this->addToMessage(sprintf(
9405 softime 11228 '<br> > <a href="%1$s" title="%2$s" target="_blank">%2$s</a>',
9406     $result['signature_page_url'],
9407     __("Signez directement le document")
9408 softime 10573 ));
9409     }
9410 softime 15037 if ($notification_required !== true) {
9411     $this->addToMessage(__("L'envoi de la notification au signataire est effectué par la plateforme."));
9412     }
9413 softime 10573
9414     // Tout s'est bien passé, on termine le traitement
9415     return $this->end_treatment(__METHOD__, true);
9416     }
9417    
9418     /**
9419 softime 15037 * Notifie le signataire d'un document à signer.
9420     * Gère l'affichage des messages à destination de l'utilisateur selon l'état du traitement.
9421     * En cas d'erreur ajoute une ligne dans les logs de l'application.
9422     *
9423     * @param string $signer_name Nom du signataire
9424     * @param string $signer_mail Mail du signataire
9425     * @param string $user_name Nom de l'utilisateur openADS courant
9426     *
9427     * @return boolean true si succés, false si erreur
9428     */
9429     protected function notify_signer($signer_name, $signer_mail, $user_name) {
9430     // message d'erreur
9431     $err_msg_log = sprintf(
9432     __("Échec de la notification du signataire \"%s (%s)\" lors de l'envoi au parapaheur du document de l'instruction : %s"),
9433     $signer_name,
9434     $signer_mail,
9435     $this->getVal($this->clePrimaire)
9436     );
9437     $err_msg = sprintf(
9438     '%s %s (%s)"',
9439     __("Échec de la notification du signataire"),
9440     $signer_name,
9441     $signer_mail
9442     );
9443    
9444     // vérification des informations requises
9445     if (empty($signer_name)) {
9446     $err_detail = __("le nom du signataire est vide");
9447     $this->addToLog(__METHOD__.', '.$err_msg_log.', '.$err_detail, DEBUG_MODE);
9448     $this->addToMessage($err_msg.', '.$err_detail);
9449     return false;
9450     }
9451     if (empty($signer_mail)) {
9452     $err_detail = __("le courriel du signataire est vide");
9453     $this->addToLog(__METHOD__.', '.$err_msg_log.', '.$err_detail, DEBUG_MODE);
9454     $this->addToMessage($err_msg.', '.$err_detail);
9455     return false;
9456     }
9457     if (empty($this->getVal('dossier'))) {
9458     $err_detail = __("l'identifiant du dossier est vide");
9459     $this->addToLog(__METHOD__.', '.$err_msg_log.', '.$err_detail, DEBUG_MODE);
9460     $this->addToMessage($err_msg.', '.$err_detail);
9461     return false;
9462     }
9463    
9464     // ajout de la notification à la liste des notifications de l'instruction
9465     $instruction_id = $this->getVal($this->clePrimaire);
9466     $inst_notif = $this->f->get_inst__om_dbform(array(
9467     "obj" => "instruction_notification",
9468     "idx" => "]",
9469     ));
9470     $notif_val = array(
9471     'instruction_notification' => null,
9472     'instruction' => $instruction_id,
9473     'automatique' => true,
9474     'emetteur' => $user_name,
9475     'date_envoi' => null,
9476     'destinataire' => "$signer_name <$signer_mail>",
9477     'courriel' => $signer_mail,
9478     'date_premier_acces' => null,
9479     'statut' => '',
9480     'commentaire' => ''
9481     );
9482     $add_notif = $inst_notif->ajouter($notif_val);
9483     if ($add_notif === false) {
9484     $err_detail = __("Échec de l'ajout de la notification.");
9485     $this->addToLog(__METHOD__.' '.$err_msg_log.'. '.$err_detail.' Notification : '.var_export($notif_val, true), DEBUG_MODE);
9486     $this->addToMessage($err_msg);
9487     return false;
9488     }
9489     $notification_id = $inst_notif->getVal($inst_notif->clePrimaire);
9490    
9491     // ajout d'une tâche de notification (envoi du mail)
9492     $notification_task = $this->notification_by_task(
9493     $notification_id,
9494     $this->getVal('dossier'),
9495     'mail',
9496     'notification_signataire'
9497     );
9498     if ($notification_task === false) {
9499     $err_detail = sprintf(
9500     __("Échec de l'ajout de la tâche de notification (notification %s)."),
9501     $notification_id);
9502     $this->addToLog(__METHOD__.' '.$err_msg_log.'. '.$err_detail, DEBUG_MODE);
9503     $this->addToMessage($err_msg);
9504     return false;
9505     }
9506    
9507     // Vérification de la réussite de l'envoi du mail
9508     // Fais une requête pour récupérer la liste des notifications de signataire faites par mail
9509     // et associées à l'instruction en cours. Récupère uniquement la dernière qui doit être celle
9510     // qui viens d'être créée.
9511     // Si la tâche d'envoi du mail est en erreur alors on considère que l'envoi du mail a échoué.
9512     $qres = $this->f->get_one_result_from_db_query(
9513     sprintf(
9514     'SELECT
9515     state
9516     FROM
9517     %1$stask
9518     WHERE
9519     type = \'notification_signataire\'
9520     AND category = \'mail\'
9521     AND dossier = \'%2$s\'
9522     ORDER BY
9523     task DESC
9524     LIMIT 1',
9525     DB_PREFIXE,
9526     $this->f->db->escapeSimple($this->getVal('dossier'))
9527     ),
9528     array(
9529     'origin' => __METHOD__
9530     )
9531     );
9532     if ($qres['result'] === 'error') {
9533     $err_detail = sprintf(
9534     __("Échec de l'envoi du mail de notification (notification %s)."),
9535     $notification_id);
9536     $this->addToLog(__METHOD__.' '.$err_msg_log.'. '.$err_detail, DEBUG_MODE);
9537     $this->addToMessage($err_msg);
9538     return false;
9539     }
9540    
9541     // succès de la planification de la notification
9542     $this->addToMessage(sprintf(
9543     __('Le signataire "%s (%s)" sera notifié prochainement'),
9544     $signer_name,
9545     $signer_mail));
9546     return true;
9547     }
9548    
9549     /**
9550 softime 11876 * Permet de récupérer la bonne date limite en fonction de si l'instruction
9551     * est en incomplet notifié ou non.
9552     * On peut ajouter des jours à cette date grâce au paramètre "delay".
9553     * Cette fonction est utilisée dans un cas spécifique où on veut envoyer
9554     * l'instruction en signature le jour de la date limite.
9555     *
9556     * @param int $delay Le nombre de jour à ajouter à la date limite.
9557     *
9558     * @return string $date_limite la date limite calculé ou false
9559     */
9560     private function compute_date_limite($delay) {
9561     // Instanciation de l'objet dossier
9562     $inst_dossier = $this->f->get_inst__om_dbform(array(
9563     'obj' => 'dossier',
9564     'idx' => $this->getVal('dossier'),
9565     ));
9566    
9567     $date_to_compute = null;
9568     if ($inst_dossier->getVal('incomplet_notifie') === 't') {
9569     $date_to_compute = $inst_dossier->getVal('date_limite_incompletude');
9570     } else {
9571     $date_to_compute = $inst_dossier->getVal('date_limite');
9572     }
9573 softime 14064 if ($date_to_compute != null) {
9574     return date("Y-m-d", strtotime($date_to_compute."+ $delay days"));
9575     }
9576 softime 11876
9577 softime 14064 return null;
9578 softime 11876 }
9579    
9580     /**
9581 softime 10573 * Permet de récupérer la traduction de la valeur de statut_signature
9582     *
9583     * @return string la valeur de statut_signature traduite | false
9584     */
9585     function get_trad_for_statut($value_to_trad){
9586     $statut_signature_tab = array(
9587     'waiting' => __('en préparation'),
9588     'in_progress' => __('en cours de signature'),
9589     'canceled' => __('signature annulée'),
9590 softime 10808 'expired' => __('délai de signature expiré'),
9591 softime 10573 'finished' => __('signé')
9592     );
9593     if (array_key_exists($value_to_trad, $statut_signature_tab) === true) {
9594     return $statut_signature_tab[$value_to_trad];
9595     }
9596    
9597     return false;
9598     }
9599    
9600     /**
9601     * Permet de mettre à jour le tableau json sotcké dans le champ historique_signature
9602     *
9603     * @return string (json) la valeur de historique_signature mis à jour | false
9604     */
9605     function get_updated_historique_signature($historique_signature_values) {
9606    
9607     $historique_signature_value_tab = $this->get_historique_signature_decoded();
9608    
9609     if ($historique_signature_value_tab === false) {
9610     $this->addToLog(__METHOD__."(): erreur historique signature", DEBUG_MODE);
9611     return false;
9612     }
9613    
9614     $last_val_historique_signature = array();
9615    
9616     // Si la tableau récupéré n'est pas vide alors
9617     // on récupère la dernière ligne du tableau
9618     if (empty($historique_signature_value_tab) === false) {
9619     $last_val_historique_signature = end($historique_signature_value_tab);
9620     }
9621    
9622     $format_date = '';
9623     $format_date_hour = '';
9624     $date_converted=array();
9625    
9626     $date_to_convert = array(
9627     'date_envoi_signature' => $historique_signature_values['date_envoi_signature'],
9628 softime 11876 'date_limite_instruction' => $this->compute_date_limite(0),
9629 softime 10573 'date_retour_signature' => $historique_signature_values['date_retour_signature']
9630     );
9631    
9632     // Conversion des dates en fonction de leur format
9633     foreach ($date_to_convert as $key => $value) {
9634     $date_converted[$key] = null;
9635     if ($value != null) {
9636     $format_date = 'd/m/Y';
9637     $format_date_hour = 'd/m/Y H:i:s';
9638     $date_converted[$key] = empty(date_parse($value)['hour']) === false ? date($format_date_hour, strtotime($value)) : date($format_date, strtotime($value));
9639     }
9640     }
9641    
9642     // Ce tableau permet de lister les colonnes de historique_signature et de les rendre traduisibles.
9643     // Il faut en effet mettre les gettext avec l'intitulé explicite au moins
9644     // une fois afin qu'il puisse être reconnu par le logiciel de traduction.
9645     $tab_for_columns_trad = array(
9646     __('entry_date'),
9647     __('id_parapheur_signature'),
9648     __('emetteur'),
9649     __('signataire'),
9650     __('date_envoi'),
9651     __('date_limite'),
9652     __('date_retour'),
9653     __('statut_signature'),
9654     __('commentaire_signature')
9655     );
9656    
9657     array_push($historique_signature_value_tab, array(
9658     'entry_date' => date('d/m/Y H:i:s'),
9659     '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'],
9660     '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'],
9661     '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'],
9662     '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'],
9663     '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'],
9664     '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'],
9665     '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']),
9666     'commentaire_signature' => isset($historique_signature_values['commentaire_signature']) === false || $historique_signature_values['commentaire_signature'] == null ? null : $historique_signature_values['commentaire_signature'],
9667     ));
9668    
9669     return json_encode($historique_signature_value_tab, JSON_HEX_APOS);
9670     }
9671 softime 11876
9672     /**
9673     * TREATMENT - annuler_envoi_en_signature
9674     *
9675     * Permet d'annuler l'envoi du document de l'instruction au parapheur pour signature
9676     *
9677     * @return boolean true si l'annulation a été effectué avec succès false sinon
9678     */
9679     function annuler_envoi_en_signature() {
9680     $this->begin_treatment(__METHOD__);
9681     $this->correct = true;
9682 softime 10573
9683 softime 11876 //Instanciation de la classe electronicsignature
9684     $inst_es = $this->get_electronicsignature_instance();
9685     if ($inst_es === false) {
9686     $this->correct = false;
9687     return $this->end_treatment(__METHOD__, false);
9688     }
9689 softime 10573
9690 softime 11876 $data = array();
9691     if (! empty($this->getVal('id_parapheur_signature'))) {
9692     $data['id_parapheur_signature'] = $this->getVal('id_parapheur_signature');
9693     } else {
9694     $this->correct = false;
9695     $this->addToMessage(__("Il n'y a pas d'identifiant de parapheur."));
9696     return $this->end_treatment(__METHOD__, false);
9697     }
9698    
9699     // Appel de la méthode de l'abstracteur cancel_send_for_signature()
9700     // Cette méthode doit retourner un tableau de valeur
9701     try {
9702     $result = $inst_es->cancel_send_for_signature($data);
9703     } catch (electronicsignature_exception $e) {
9704     $this->handle_electronicsignature_exception($e);
9705     return $this->end_treatment(__METHOD__, false);
9706     }
9707    
9708     // Après avoir reçu le résultat du parapheur, il faut mettre à jour les champs
9709     $valF = array();
9710    
9711     // Pour appeler la fonction modifier il faut traiter tous les champs de l'objet
9712     foreach($this->champs as $identifiant => $champ) {
9713     $valF[$champ] = $this->val[$identifiant];
9714     }
9715     // On fait ensuite nos modifications spécifiques
9716     $valF['id_parapheur_signature'] = null;
9717     $valF['statut_signature'] = $result['statut'];
9718     $valF['commentaire_signature'] = isset($result['commentaire_signature']) == true ? $result['commentaire_signature'] : null;
9719     $valF['date_envoi_signature'] = null;
9720     $valF['historique_signature'] = $this->get_updated_historique_signature($result);
9721    
9722     $ret = $this->modifier($valF);
9723    
9724     if ($ret === false) {
9725     $this->correct = false;
9726     $this->addToMessage(__("Une erreur est survenue lors de la mise à jour des champs."));
9727     // Termine le traitement
9728     return $this->end_treatment(__METHOD__, false);
9729     }
9730    
9731     // Message
9732     $this->addToMessage(__("L'annulation a été effectuée avec succès."));
9733    
9734     // Tout s'est bien passé, on termine le traitement
9735     return $this->end_treatment(__METHOD__, true);
9736     }
9737    
9738    
9739 softime 10573 /**
9740     * Récupère le contenu du champ historique_signature et le converti en tableau
9741     *
9742     * @return array sinon false en cas d'erreur
9743     */
9744     protected function get_historique_signature_decoded() {
9745 softime 11876 $val = str_replace("'", '"', $this->getVal('historique_signature'));
9746     if ($val === '' || $val == 'false') {
9747 softime 10573 $val = json_encode(array());
9748     }
9749     if($this->isJson($val) === false) {
9750     return false;
9751     }
9752     return json_decode($val, true);
9753     }
9754    
9755 softime 10808 /**
9756     * Récupère les informations à afficher dans le tableau de suivi à l'aide
9757     * d'une requête sql. Stocke ces informations dans un tableau.
9758 softime 12433 * Converti le tableau au format json et renvoi le json obtenu.
9759 softime 10808 *
9760 softime 12433 * Pour identifier quel suivi est affiché (notification des demandeurs, des services ou
9761     * de tiers) ce sont les tâches liées aux notifications qui sont utilisés.
9762     * La clause where de la requête est construite à partir du tableau contenant les types
9763     * de tâches fourni en paramètre.
9764     * Il est également possible d'afficher les notifications n'étant pas lié à des tâches.
9765     *
9766     * Si le suivi concerne la notification des demandeurs via le portail citoyen,
9767     * la date de premier accès ne sera pas affichée.
9768     *
9769     * @param array liste des tâches permettant d'identifier quelles notification afficher
9770     * @param boolean permet d'afficher les notifications non liées à des tâches
9771 softime 10808 * @return json
9772     */
9773 softime 15037 public function get_json_suivi_notification($typeTache, $nonLieTache = false) {
9774 softime 11585 $whereTypeTache = '';
9775 softime 15037 $sqlTaskNull = 'INNER';
9776 softime 12654
9777     // Liste des champs à afficher. Permet également la traduction des noms de colonnes.
9778     $listeChampsTrad = array(
9779     __('emetteur'),
9780     __('date_envoi'),
9781     __('destinataire'),
9782     __('date_premier_acces'),
9783     __('instruction'),
9784     __('annexes'),
9785     __('statut'),
9786     __('commentaire')
9787     );
9788     $listeChamps = array(
9789     'emetteur',
9790     'date_envoi',
9791     'destinataire',
9792     'date_premier_acces',
9793     'instruction',
9794     'annexes',
9795     'statut',
9796     'commentaire'
9797     );
9798    
9799 softime 12124 // Défini si on veux que la requête récupère également les notifications qui n'ont pas
9800     // de tâches associées. C'est le cas pour les notifications de demandeurs lorsque la
9801     // notification du demandeur principal n'a pas pu être envoyée à cause d'un mauvais
9802     // paramétrage
9803     if(is_bool($nonLieTache) && $nonLieTache === true) {
9804 softime 15037 $sqlTaskNull = 'LEFT';
9805 softime 12124 }
9806     // Prépare la clause where pour ne récupérer que les notifications liées à certain type de tâches
9807     // Permet de différencier les notifications des demandeurs de celle des services et de celles des
9808     // tiers consulté
9809 softime 12433 if (is_array($typeTache) && $typeTache != array()) {
9810 softime 11585 if (is_array($typeTache)) {
9811     $whereTypeTache = sprintf(
9812 softime 15037 'AND (task.type IN (%1$s))',
9813     "'".implode("', '", $typeTache)."'"
9814 softime 11585 );
9815     }
9816 softime 12433 // La date de premier accès n'a pas besoin d'être renseigné pour
9817     // les notifications des demandeurs via le portail citoyen.
9818     // Les notifications des demandeurs sont liés à 3 types de tâches
9819     // notification_recepisse, notification_instruction, notification_decision
9820     // Si le suivi de la notification concerne un de ces types de tâches on
9821     // considère que c'est une notification de demandeurs.
9822     // Dans ce cas on vérifie si cette notification est paramétrée pour passer
9823     // via le portail. Par défaut si rien n'est paramétré on considère que la
9824     // notification est faite via le portail
9825     if ((in_array('notification_recepisse', $typeTache) ||
9826     in_array('notification_instruction', $typeTache) ||
9827     in_array('notification_decision', $typeTache))) {
9828     $dossier = $this->getVal('dossier');
9829     $collectivite_di = $this->get_dossier_instruction_om_collectivite($dossier);
9830     $modeNotification = $this->f->get_param_option_notification($collectivite_di);
9831 softime 14064 if ($modeNotification === PORTAL) {
9832 softime 12654 $listeChamps = array(
9833     'emetteur',
9834     'date_envoi',
9835     'destinataire',
9836     'instruction',
9837     'annexes',
9838     'statut',
9839     'commentaire'
9840     );
9841 softime 12433 }
9842     }
9843 softime 12654 // Il n'y a pas d'annexe pour la notification des communes donc pas besoin
9844     // de les afficher dans le suivi
9845     if (in_array('notification_depot_demat', $typeTache)) {
9846     $listeChamps = array(
9847     'emetteur',
9848     'date_envoi',
9849     'destinataire',
9850     'instruction',
9851     'statut',
9852     'commentaire'
9853     );
9854     }
9855 softime 11585 }
9856 softime 12433
9857 softime 10808 $valSuivi = array();
9858     // Récupération des infos nécessaires à l'affichage du tableau
9859     $sql = sprintf(
9860 softime 11585 'SELECT DISTINCT
9861 softime 10869 instruction_notification.instruction_notification,
9862 softime 12124 -- Affiche la mention automatique avec le nom de l emetteur si la notification a été envoyé automatiquement
9863 softime 10869 CASE WHEN instruction_notification.automatique = TRUE
9864     THEN TRIM(CONCAT(instruction_notification.emetteur, \' \', \'(automatique)\'))
9865     ELSE instruction_notification.emetteur
9866     END as emetteur,
9867 softime 10808 date_envoi,
9868     instruction_notification.destinataire,
9869 softime 10869 instruction_notification.date_premier_acces,
9870 softime 10808 evenement.libelle as instruction,
9871 softime 10869 instruction_notification.statut,
9872     instruction_notification.commentaire,
9873 softime 12433 annexes.instruction_annexe as annexes
9874 softime 10808 FROM
9875     %1$sinstruction_notification
9876     LEFT JOIN %1$sinstruction
9877     ON instruction.instruction = instruction_notification.instruction
9878     LEFT JOIN %1$sevenement
9879     ON instruction.evenement = evenement.evenement
9880 softime 10869 LEFT JOIN %1$sinstruction_notification_document
9881     ON instruction_notification.instruction_notification = instruction_notification_document.instruction_notification
9882     AND instruction_notification_document.annexe = true
9883 softime 12124 -- Récupère les tâches liées au notification pour pouvoir par la suite identifier le type de notification
9884 softime 15037 %4$s JOIN %1$stask
9885 softime 11585 ON instruction_notification.instruction_notification::CHARACTER VARYING = task.object_id
9886 softime 15037 %3$s
9887 softime 12124 -- Récupération de la liste des annexes sous la forme d une liste
9888 softime 11585 LEFT JOIN (
9889     SELECT
9890     instruction_notification,
9891 softime 12124 -- Récupère la liste des annexes de la notification
9892 softime 12433 -- sous la forme d un json pour récupérer toutes les informatiosn nécessaire
9893     -- à l affichage du lien vers les annexes
9894     CONCAT(
9895     \'[\',
9896     STRING_AGG(
9897     -- Affiche le nom du fichier selon le type de document/pièce
9898     CASE
9899     WHEN instruction_notification_document.document_type = \'instruction\'
9900     THEN CONCAT(
9901     \'{
9902     "obj" : "instruction",
9903     "champs" : "om_fichier_instruction",
9904     "label" : "\', evenement.libelle, \'",
9905     "id" : "\', instruction.instruction,\'"
9906     }\'
9907     )
9908     WHEN instruction_notification_document.document_type = \'consultation\'
9909     THEN CONCAT(
9910 softime 15218 \'{
9911     "obj" : "consultation",
9912     "champs" : "fichier",
9913     "label" : "\', CONCAT_WS( \' - \', \'Avis\', service.libelle, to_char(consultation.date_retour,\'DD/MM/YYYY\')), \'",
9914     "id" : "\', consultation.consultation, \'"
9915     }\'
9916 softime 12433 )
9917     ELSE
9918     CONCAT(
9919     \'{
9920     "obj" : "document_numerise",
9921     "champs" : "uid",
9922     "label" : "\', document_numerise.nom_fichier, \' - \', document_numerise_type.libelle, \'",
9923     "id" : "\', document_numerise.document_numerise,\'"
9924     }\'
9925     )
9926     END,
9927     \', \'),
9928     \']\'
9929 softime 11585 ) AS instruction_annexe
9930     FROM
9931     %1$sinstruction_notification_document
9932     LEFT JOIN %1$sinstruction
9933     ON instruction_notification_document.instruction = instruction.instruction
9934     LEFT JOIN %1$sevenement
9935     ON instruction.evenement = evenement.evenement
9936     LEFT JOIN %1$sconsultation
9937     ON instruction_notification_document.document_id = consultation.consultation
9938     LEFT JOIN %1$sservice
9939     ON consultation.service = service.service
9940 softime 12433 LEFT JOIN %1$sdocument_numerise
9941     ON instruction_notification_document.document_id = document_numerise.document_numerise
9942     LEFT JOIN %1$sdocument_numerise_type
9943     ON document_numerise.document_numerise_type = document_numerise_type.document_numerise_type
9944 softime 11585 WHERE
9945     instruction_notification_document.annexe = \'t\'
9946     GROUP BY
9947     instruction_notification
9948     ) AS annexes
9949     ON
9950     annexes.instruction_notification = instruction_notification.instruction_notification
9951 softime 10808 WHERE
9952 softime 10869 instruction.instruction = %2$s
9953     ORDER BY
9954     date_envoi ASC, instruction_notification.destinataire ASC',
9955 softime 10808 DB_PREFIXE,
9956 softime 14542 intval($this->getVal('instruction')),
9957 softime 15037 $whereTypeTache,
9958     $sqlTaskNull
9959 softime 10808 );
9960 softime 14542 $qres = $this->f->get_all_results_from_db_query($sql, array(
9961     "origin" => __METHOD__
9962     )
9963     );
9964 softime 12433 // Préparation du lien de téléchargement des annexes
9965     $htmlList =
9966     '<style>
9967     #content .gridjs-td a.lien_annexe {
9968     text-decoration : underline dotted 1px;
9969     }
9970     #content a.lien_annexe:hover {
9971     text-decoration : underline solid 1px;
9972     color : #46aede;
9973     }
9974     ol {padding-left : 10px;}
9975     </style>
9976     <ol>%1$s</ol>';
9977     $lienTelechargement =
9978     '<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">
9979     Annexe
9980     </a>';
9981 softime 10808 // Stockage des infos de chaque notification dans un tableau
9982 softime 14542 foreach ($qres['result'] as $row) {
9983 softime 10808 $valNotif = array();
9984     foreach($listeChamps as $champ) {
9985     $valNotif[$champ] = $row[$champ];
9986 softime 10815 if (($champ === 'date_envoi'
9987     || $champ === 'date_premier_acces')
9988     && $row[$champ] !== null
9989     && $row[$champ] !== '') {
9990 softime 10814 //
9991     $valNotif[$champ] = date('d/m/Y H:i:s', strtotime($row[$champ]));
9992 softime 12433 } else if ($champ === 'annexes') {
9993     $listeAnnexe = '';
9994     $infoAnnexes = json_decode($row[$champ], true);
9995     if (! empty($infoAnnexes) && json_last_error() === JSON_ERROR_NONE) {
9996     // A partir des infos récupérées prépare le code html du lien vers chacune
9997     // des annexes et ajoute un élément de liste par annexe
9998     foreach($infoAnnexes as $annexe) {
9999     $listeAnnexe .= sprintf(
10000     '<li>%s</li>',
10001     sprintf($lienTelechargement,
10002     $annexe['obj'],
10003     $annexe['champs'],
10004     $annexe['id'],
10005     $annexe['label']
10006     )
10007     );
10008     }
10009     // Construction de la liste des annexes
10010     $valNotif[$champ] = sprintf(
10011     $htmlList,
10012     $listeAnnexe
10013     );
10014     }
10015 softime 10814 }
10016 softime 10808 }
10017     array_push($valSuivi, $valNotif);
10018     }
10019    
10020     // Passage du tableau au format json
10021     return json_encode($valSuivi, JSON_HEX_APOS);
10022     }
10023    
10024 softime 10573 /**
10025     * Traitement des erreurs retournées par l'abstracteur electronicsignature.
10026     *
10027     * @param electronicsignature_exception $exception Exception retournée par l'abstracteur.
10028     *
10029     * @return void
10030     */
10031     public function handle_electronicsignature_exception(electronicsignature_exception $exception) {
10032     $this->f->displayMessage('error', $exception->getMessage());
10033     }
10034    
10035    
10036     /**
10037     * Retourne une instance du connecteur electronicsignature, et la créer si elle n'existe pas.
10038     *
10039     * @param boolean $with_handle_error Flag pour afficher ou non le message d'erreur à l'utilisateur.
10040     * @return electronicsignature Instance de l'abstracteur.
10041     */
10042     public function get_electronicsignature_instance($with_handle_error = true) {
10043     if(isset($this->electronicsignature_instance)) {
10044     return $this->electronicsignature_instance;
10045     }
10046     // Instanciation du connecteur electronicsignature
10047     try {
10048     require_once "electronicsignature.class.php";
10049     $collectivites = array("collectivite_idx" => $this->get_dossier_instruction_om_collectivite(), "collectivite_multi_idx" => $this->f->get_idx_collectivite_multi());
10050     $this->electronicsignature_instance = new electronicsignature($collectivites);
10051     } catch (electronicsignature_exception $e) {
10052     if ($with_handle_error === true) {
10053     $this->handle_electronicsignature_exception($e);
10054     }
10055     return false;
10056     }
10057     return $this->electronicsignature_instance;
10058     }
10059    
10060     /**
10061 softime 11418 * TREATMENT - envoyer_au_controle_de_legalite
10062     *
10063     * Ajoute la tâche envoi_CL.
10064     * C'est le traitement de la tâche qui mettra à jour la date d'envoi au contrôle de légalité.
10065     *
10066     * @return [type] [description]
10067     */
10068     function envoyer_au_controle_de_legalite() {
10069     $this->begin_treatment(__METHOD__);
10070     $this->correct = true;
10071    
10072     //
10073     if ($this->can_be_sended_to_cl() === true) {
10074     // Création de la task 'envoi_CL'
10075     $inst_task = $this->f->get_inst__om_dbform(array(
10076     "obj" => "task",
10077     "idx" => 0,
10078     ));
10079     $task_val = array(
10080     'type' => 'envoi_CL',
10081     'object_id' => $this->getVal('instruction'),
10082     'dossier' => $this->getVal('dossier'),
10083     );
10084     // Change l'état de la tâche de notification en fonction de l'état de
10085     // transmission du dossier d'instruction
10086     $inst_di = $this->get_inst_dossier($this->getVal('dossier'));
10087     if ($this->f->is_option_mode_service_consulte_enabled() === false
10088     && ($inst_di->getVal('etat_transmission_platau') == 'non_transmissible'
10089     || $inst_di->getVal('etat_transmission_platau') == 'transmis_mais_non_transmissible')) {
10090     //
10091     $task_val['state'] = $inst_task::STATUS_DRAFT;
10092     }
10093     $add_task = $inst_task->add_task(array('val' => $task_val));
10094     if ($add_task === false) {
10095     $this->addToMessage(sprintf('%s %s',
10096     __("Une erreur s'est produite lors de la création tâche."),
10097     __("Veuillez contacter votre administrateur.")
10098     ));
10099     $this->correct = false;
10100     return $this->end_treatment(__METHOD__, false);
10101     }
10102     // Mise à jour du champs 'envoye_cl_platau'
10103     $instr_val = array(
10104     'envoye_cl_platau' => 't',
10105     );
10106     $res = $this->f->db->autoExecute(
10107     DB_PREFIXE.$this->table,
10108     $instr_val,
10109     DB_AUTOQUERY_UPDATE,
10110     $this->getCle($this->getVal($this->clePrimaire))
10111     );
10112 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);
10113 softime 11418 if ($this->f->isDatabaseError($res, true) === true) {
10114     $this->addToMessage(sprintf('%s %s',
10115     __("Une erreur s'est produite lors de la mise à jour de l'instruction."),
10116     __("Veuillez contacter votre administrateur.")
10117     ));
10118     $this->correct = false;
10119     return $this->end_treatment(__METHOD__, false);
10120     }
10121     // Message de validation à l'utilisateur
10122     $this->addToMessage(__('Votre demande de transfert au contrôle de légalité à bien été prise en compte.'));
10123     $this->addToMessage(__("La date d'envoi au contrôle de légalité sera mise à jour ultérieurement."));
10124     }
10125     //
10126     return $this->end_treatment(__METHOD__, true);
10127     }
10128    
10129    
10130     /**
10131 softime 8593 * Retourne le lien de retour (VIEW formulaire et VIEW sousformulaire).
10132     *
10133     * @param string $view Appel dans le contexte de la vue 'formulaire' ou de
10134     * la vue 'sousformulaire'.
10135     *
10136     * @return string
10137     */
10138     function get_back_link($view = "formulaire") {
10139     //
10140     $href = parent::get_back_link($view);
10141     //
10142     $crud = $this->get_action_crud();
10143 mbroquet 3730
10144 softime 8593 // Redirection vers le formulaire de modification à la validation du
10145     // formulaire d'ajout si l'événement associé possède une lettre type
10146     if (($crud === 'create'
10147     || ($crud === null
10148     && $this->getParameter('maj') == 0))
10149     && $this->correct == true
10150     && $this->evenement_has_an_edition($this->valF['evenement']) === true) {
10151 softime 7996
10152 softime 8593 // On instancie l'instruction
10153     $inst_instruction = $this->f->get_inst__om_dbform(array(
10154     "obj" => "instruction",
10155     "idx" => $this->valF[$this->clePrimaire],
10156     ));
10157    
10158     // Si l'instruction n'est pas finalisée automatiquement
10159     if ($inst_instruction->getVal('om_final_instruction') !== 't') {
10160     $href = str_replace("&action=3", "&action=1", $href);
10161     //
10162     if (strpos($href, "&retour=tab") !== false) {
10163     $href = str_replace("&retour=tab", "&retour= form", $href);
10164     } else {
10165     $href .= "&retour=form";
10166     }
10167     }
10168     }
10169    
10170     //
10171     return $href;
10172     }
10173    
10174 softime 10573 public function view_json_data() {
10175     $this->checkAccessibility();
10176     $this->f->disableLog();
10177     $view = $this->get_json_data();
10178     printf(json_encode($view));
10179     }
10180    
10181     public function get_json_data() {
10182     $val = array_combine($this->champs, $this->val);
10183     foreach ($val as $key => $value) {
10184     $val[$key] = strip_tags($value);
10185     }
10186     $val['tacite'] = 'f';
10187     $inst_ad = $this->f->get_inst__om_dbform(array(
10188     "obj" => "avis_decision",
10189     "idx" => $val['avis_decision'],
10190     ));
10191     if (preg_match('/[tT]acite/', $inst_ad->getVal('libelle')) === 1) {
10192     $val['tacite'] = 't';
10193     }
10194     return $val;
10195     }
10196    
10197 softime 13528 /**
10198     * Permet de récupérer l'identifiant de l'instruction sur le dossier, ayant
10199     * comme événement lié le suivant définit dans l'événement de l'instruction
10200     * instanciée.
10201     *
10202     * @param string $next_type Correspond aux trois déclenchement automatique
10203     * de création d'instruction paramétré sur un événement.
10204     * @param integer $instruction Identifiant de l'instruction à instancier.
10205     * @return mixed Identifiant de l'instruction recherchée ou false.
10206     */
10207 softime 11418 public function get_related_instructions_next($next_type = 'retour_signature', $instruction = null) {
10208     if (in_array($next_type, array('retour_signature', 'retour_ar', 'suivant_tacite', )) === false) {
10209     return false;
10210     }
10211     $result = array();
10212     $evenements = array();
10213     if ($instruction === null) {
10214     $instruction = $this->getVal($this->clePrimaire);
10215     $evenement = $this->getVal('evenement');
10216     $dossier = $this->getVal('dossier');
10217     } else {
10218     $inst = $this->f->get_inst__om_dbform(array(
10219     "obj" => "instruction",
10220     "idx" => $instruction,
10221     ));
10222     $evenement = $inst->getVal('evenement');
10223     $dossier = $inst->getVal('dossier');
10224     }
10225 softime 13528 // Récupération de l'identifiant de l'événement paramétré comme suivant
10226     // sur l'instruction instanciée
10227 softime 13137 $qres = $this->f->get_one_result_from_db_query(
10228     sprintf(
10229     'SELECT
10230     evenement_%3$s
10231     FROM
10232     %1$sevenement
10233     WHERE
10234     evenement = %2$s',
10235     DB_PREFIXE,
10236     intval($evenement),
10237     $next_type
10238     ),
10239     array(
10240     "origin" => __METHOD__,
10241     "force_return" => true,
10242     )
10243 softime 11418 );
10244 softime 13137 if ($qres["code"] !== "OK") {
10245 softime 11418 return false;
10246     }
10247 softime 13137 $ev_next = $qres["result"];
10248 softime 13528 // Récupération de l'instruction dans le dossier utilisant l'événement
10249     // suivant identifié dans la requête précédente
10250     $qres = $this->f->get_one_result_from_db_query(
10251 softime 13137 sprintf(
10252     'SELECT
10253     MAX(instruction.instruction) as instruction
10254     FROM
10255     %1$sinstruction
10256     WHERE
10257     dossier = \'%3$s\'
10258     AND evenement = %2$s',
10259     DB_PREFIXE,
10260     intval($ev_next),
10261 softime 14064 $this->f->db->escapeSimple($dossier)
10262 softime 13137 ),
10263     array(
10264     "origin" => __METHOD__,
10265     "force_return" => true,
10266     )
10267 softime 11418 );
10268 softime 13137 if ($qres["code"] !== "OK") {
10269 softime 11418 return false;
10270     }
10271 softime 13137 return $qres["result"];
10272 softime 11418 }
10273    
10274 softime 10573 public function get_related_instructions($instruction = null) {
10275     $result = array();
10276     $evenements = array();
10277     if ($instruction === null) {
10278     $instruction = $this->getVal($this->clePrimaire);
10279     $evenement = $this->getVal('evenement');
10280     $dossier = $this->getVal('dossier');
10281     } else {
10282     $inst = $this->f->get_inst__om_dbform(array(
10283     "obj" => "instruction",
10284     "idx" => $instruction,
10285     ));
10286     $evenement = $inst->getVal('evenement');
10287     $dossier = $inst->getVal('dossier');
10288     }
10289     //
10290 softime 13137 $qres = $this->f->get_one_result_from_db_query(
10291     sprintf(
10292     'SELECT
10293     evenement
10294     FROM
10295     %1$sevenement
10296     WHERE
10297     evenement_retour_ar = %2$s
10298     OR evenement_retour_signature = %2$s',
10299     DB_PREFIXE,
10300     intval($evenement)
10301     ),
10302     array(
10303     "origin" => __METHOD__,
10304     "force_return" => true,
10305     )
10306 softime 10573 );
10307 softime 13137 if ($qres["code"] !== "OK") {
10308 softime 10573 return false;
10309     }
10310 softime 13137 $ev_parent = $qres["result"];
10311 softime 10573 //
10312 softime 13137 $qres = $this->f->get_one_result_from_db_query(
10313     sprintf(
10314     'SELECT
10315     MAX(instruction.instruction) as instruction
10316     FROM
10317     %1$sinstruction
10318     WHERE
10319     dossier = \'%3$s\'
10320     AND evenement = %2$s',
10321     DB_PREFIXE,
10322     intval($ev_parent),
10323     $this->f->db->escapeSimple($dossier)
10324     ),
10325     array(
10326     "origin" => __METHOD__,
10327     "force_return" => true,
10328     )
10329 softime 10573 );
10330 softime 13137 if ($qres["code"] !== "OK") {
10331 softime 10573 return false;
10332     }
10333 softime 13137 $result[] = $qres["result"];
10334 softime 10573 //
10335 softime 13137 $qres = $this->f->get_one_result_from_db_query(
10336     sprintf(
10337     'SELECT
10338     evenement_retour_ar
10339     FROM
10340     %1$sevenement
10341     WHERE
10342 softime 14542 evenement = %2$d
10343     AND evenement_retour_ar != %3$d',
10344 softime 13137 DB_PREFIXE,
10345     intval($ev_parent),
10346     intval($evenement)
10347     ),
10348     array(
10349     "origin" => __METHOD__,
10350     "force_return" => true,
10351     )
10352 softime 10573 );
10353 softime 13137 if ($qres["code"] !== "OK") {
10354 softime 10573 return false;
10355     }
10356 softime 13137 $evenements[] = $qres["result"];
10357 softime 10573 //
10358 softime 13137 $qres = $this->f->get_one_result_from_db_query(
10359     sprintf(
10360     'SELECT
10361     evenement_retour_signature
10362     FROM
10363     %1$sevenement
10364     WHERE
10365     evenement = %2$s
10366     AND evenement_retour_signature != %3$s
10367     ',
10368     DB_PREFIXE,
10369     intval($ev_parent),
10370     intval($evenement)
10371     ),
10372     array(
10373     "origin" => __METHOD__,
10374     "force_return" => true,
10375     )
10376 softime 10573 );
10377 softime 13137 if ($qres["code"] !== "OK") {
10378 softime 10573 return false;
10379     }
10380 softime 13137 $evenements[] = $qres["result"];
10381 softime 10573 foreach ($evenements as $value) {
10382     if ($value !== null) {
10383 softime 13137 $qres = $this->f->get_one_result_from_db_query(
10384     sprintf(
10385     'SELECT
10386     MAX(instruction.instruction) as instruction
10387     FROM
10388     %1$sinstruction
10389     WHERE
10390     dossier = \'%3$s\'
10391     AND evenement = %2$s',
10392     DB_PREFIXE,
10393     intval($value),
10394     $this->f->db->escapeSimple($dossier)
10395     ),
10396     array(
10397     "origin" => __METHOD__,
10398     "force_return" => true,
10399     )
10400 softime 10573 );
10401 softime 13137 if ($qres["code"] !== "OK") {
10402 softime 10573 return false;
10403     }
10404 softime 13137 $result[] = $qres["result"];
10405 softime 10573 }
10406     }
10407     return $result;
10408     }
10409    
10410     protected function getDocumentType($champ = null) {
10411     $evenementId = $this->getVal('evenement');
10412     if (! empty($evenementId)) {
10413     $evenement = $this->f->findObjectById('evenement', $evenementId);
10414     if (! empty($evenement)) {
10415     return __("Instruction").':'.$evenement->getVal('libelle');
10416     }
10417     }
10418     return parent::getDocumentType();
10419     }
10420    
10421 softime 10808 /**
10422     * Récupère à l'aide d'une requête sql la liste des demandeurs
10423     * pouvant être notifié. C'est à dire les demandeurs acceptant
10424     * les notifications et pour lesquels une adresse mail existe.
10425     *
10426     * Dans le cas, d'une notification pour le portail citoyen, seul
10427     * le pétitionnaire principal doit être notifier et uniquement si
10428     * il a une adress mail et qu'il accepte les notifications.
10429     *
10430     * @param string identifiant du dossier
10431     * @param boolean true si il faut récupérer la liste des demandeurs notifiable
10432     * pour une notification de categorie portail
10433     * @return array liste des demandeurs pouvant être notifié
10434     */
10435     protected function get_demandeurs_notifiable($idDossier = null, $portail = false) {
10436     if ($idDossier === null) {
10437     $idDossier = $this->getVal('dossier');
10438     }
10439     // Ajoute une condition sur le where pour ne récupérer que le pétitionnaire principal
10440     // pour une notification depuis le portail citoyen
10441     $sqlPetitionnairePrincipal = '';
10442 softime 12124 // Gestion des champs nécessaires pour la notification d'un demandeur
10443     $condition_demandeur = "AND demandeur.notification = 't'
10444     AND demandeur.courriel IS NOT NULL";
10445 softime 10808 if ($portail === true) {
10446     $sqlPetitionnairePrincipal = 'AND lien_dossier_demandeur.petitionnaire_principal = true';
10447 softime 12124 $condition_demandeur = "AND (
10448     (notification = 't' AND courriel IS NOT NULL)
10449     OR demande.source_depot = 'portal'
10450     )";
10451 softime 10808 }
10452    
10453     $listeDemandeursNotifiable = array();
10454    
10455     // Requête de récupération des demandeurs
10456 softime 14542 $qres = $this->f->get_all_results_from_db_query(
10457     sprintf(
10458     'SELECT
10459     demandeur.demandeur,
10460     CASE
10461     WHEN demandeur.qualite=\'particulier\'
10462     THEN TRIM(CONCAT(demandeur.particulier_nom, \' \', demandeur.particulier_prenom, \' \', demandeur.courriel))
10463     ELSE
10464     TRIM(CONCAT(demandeur.personne_morale_raison_sociale, \' \', demandeur.personne_morale_denomination, \' \', demandeur.courriel))
10465     END AS destinataire,
10466     demandeur.courriel,
10467     petitionnaire_principal
10468     FROM
10469     %1$sdossier
10470     INNER JOIN %1$slien_dossier_demandeur
10471     ON dossier.dossier = lien_dossier_demandeur.dossier
10472     INNER JOIN %1$sdemandeur
10473     ON lien_dossier_demandeur.demandeur = demandeur.demandeur
10474     -- Récupération de la plus ancienne demande associée au dossier (la demande
10475     -- de création du dossier)
10476     INNER JOIN (
10477     SELECT
10478     demande,
10479     dossier_instruction,
10480     source_depot
10481     FROM
10482     %1$sdemande
10483     WHERE
10484     dossier_instruction = \'%2$s\'
10485     ORDER BY
10486     demande ASC
10487     LIMIT 1
10488     ) as demande
10489     ON dossier.dossier = demande.dossier_instruction
10490     WHERE
10491     dossier.dossier = \'%2$s\'
10492     %3$s
10493     %4$s',
10494     DB_PREFIXE,
10495     $this->f->db->escapeSimple($idDossier),
10496     $condition_demandeur,
10497     $sqlPetitionnairePrincipal
10498     ),
10499     array(
10500     "origin" => __METHOD__
10501     )
10502 softime 10808 );
10503     // Récupération des infos des demandeurs et stockage dans un tableau
10504     // ayant pour clé les id des demandeurs
10505 softime 14542 foreach ($qres['result'] as $row) {
10506 softime 10869 $listeDemandeursNotifiable[$row['demandeur']] = $row;
10507 softime 10808 }
10508    
10509     return $listeDemandeursNotifiable;
10510     }
10511    
10512     /**
10513     * Renvoie la liste des notifications liées à l'instruction
10514     *
10515     * @param integer id de l'instruction dont on cherche les notifications
10516     * @return array liste des instruction_notification liés à l'instruction
10517     */
10518 softime 12124 public function get_instruction_notification($id_instruction, $typeNotification = null, $nonLieTache = false) {
10519 softime 11585 $whereTypeTache = '';
10520 softime 15037 $sqlTaskNull = 'INNER';
10521 softime 12124 // Défini si on veux que la requête récupère également les notifications qui n'ont pas
10522     // de tâches associées. C'est le cas pour les notifications de demandeurs lorsque la
10523     // notification du demandeur principal n'a pas pu être envoyée à cause d'un mauvais
10524     // paramétrage
10525     if(is_bool($nonLieTache) && $nonLieTache === true) {
10526 softime 15037 $sqlTaskNull = 'LEFT';
10527 softime 12124 }
10528 softime 11585 if ($typeNotification != null) {
10529     if (is_array($typeNotification)) {
10530     $whereTypeTache = sprintf(
10531 softime 15037 'AND (task.type IN (%1$s))',
10532     "'".implode("', '", $typeNotification)."'"
10533 softime 11585 );
10534     } else {
10535     $whereTypeTache = sprintf(
10536 softime 15037 'AND (task.type = \'%1$s\')',
10537     $typeNotification
10538 softime 11585 );
10539     }
10540     }
10541 softime 10808 $listeInstrNotif = array();
10542 softime 14542 $qres = $this->f->get_all_results_from_db_query(
10543     sprintf('
10544     SELECT
10545     instruction_notification.instruction_notification
10546     FROM
10547     %1$sinstruction_notification
10548 softime 15037 %4$s JOIN %1$stask
10549 softime 14542 ON instruction_notification.instruction_notification::CHARACTER VARYING = task.object_id
10550 softime 15037 %3$s
10551 softime 14542 WHERE
10552 softime 15037 instruction = %2$s',
10553 softime 14542 DB_PREFIXE,
10554     intval($id_instruction),
10555 softime 15037 $whereTypeTache,
10556     $sqlTaskNull
10557 softime 14542 ),
10558     array(
10559     "origin" => __METHOD__
10560     )
10561 softime 10808 );
10562 softime 14542 foreach ($qres['result'] as $row) {
10563 softime 10808 $listeInstrNotif[] = $row['instruction_notification'];
10564     }
10565     return $listeInstrNotif;
10566     }
10567    
10568     /**
10569     * Crée une clé d'accès unique permettant à un utilisateur
10570     * anonyme de récupérer le document.
10571     *
10572     * @return string clé d'accès du document
10573     */
10574     protected function getCleAccesDocument() {
10575 softime 10869 // Initialisation d'un tableau
10576     $number_list = array();
10577    
10578     // Génération aléatoire d'un nombre sur 4 caractères, 4 fois
10579     for ($i = 0; $i < 4; $i++) {
10580     $number_list[] = str_pad(mt_rand(0, 9999), 4, 0, STR_PAD_LEFT);
10581     }
10582    
10583     // Transformation en chaîne tout en séparant les nombres par un "-"
10584     $result = implode('-', $number_list);
10585    
10586     // Vérifie si la clé existe déjà et si c'est le cas génére une nouvelle clé
10587     if ($this->getUidDocumentInstructionWithKey($result) != null) {
10588     return $this->getCleAccesDocument();
10589     }
10590    
10591     //
10592     return $result;
10593 softime 10808 }
10594    
10595     /**
10596 softime 10869 * Récupère une clé et renvoie l'uid du document liée à cette
10597     * clé. Si la clé n'existe pas renvoie null.
10598     *
10599     * @param string $cleGen clé dont on cherche l'instruction
10600     * @return integer|null
10601     */
10602     protected function getUidDocumentInstructionWithKey($cleGen) {
10603 softime 14064 $qres = $this->f->get_one_result_from_db_query(
10604     sprintf(
10605     'SELECT
10606     instruction.om_fichier_instruction
10607     FROM
10608     %1$sinstruction_notification_document
10609     LEFT JOIN %1$sinstruction
10610     ON instruction_notification_document.instruction = instruction.instruction
10611     WHERE
10612     instruction_notification_document.cle = \'%2$s\'',
10613     DB_PREFIXE,
10614     $this->f->db->escapeSimple($cleGen)
10615     ),
10616     array(
10617     "origin" => __METHOD__,
10618     )
10619 softime 10869 );
10620 softime 14064
10621     return $qres['result'];
10622 softime 10869 }
10623    
10624     /**
10625     * Récupère une clé, fait une requête pour récupérer l'id de la notification liée a cette clé.
10626     * Récupère l'instance de instruction_notification dont l'id a été récupéré et la renvoie.
10627     *
10628     * @param string $cleGen
10629     * @return instruction_notification
10630     */
10631     protected function getInstanceNotificationWithKey($key) {
10632 softime 14064 $qres = $this->f->get_one_result_from_db_query(
10633     sprintf(
10634     'SELECT
10635     instruction_notification
10636     FROM
10637     %1$sinstruction_notification_document
10638     WHERE
10639     cle = \'%2$s\'',
10640     DB_PREFIXE,
10641     $this->f->db->escapeSimple($key)
10642     ),
10643     array(
10644     "origin" => __METHOD__,
10645     )
10646 softime 10869 );
10647    
10648     // Récupération de l'instance de notification
10649     $instNotif = $this->f->get_inst__om_dbform(array(
10650     "obj" => "instruction_notification",
10651 softime 14064 "idx" => $qres['result'],
10652 softime 10869 ));
10653     return $instNotif;
10654     }
10655    
10656    
10657     /**
10658 softime 10808 * Affiche la page de téléchargement du document de la notification.
10659     *
10660     * @param boolean $content_only Affiche le contenu seulement.
10661     *
10662     * @return void
10663     */
10664 softime 10869 public function view_telecharger_document_anonym() {
10665 softime 10808 // Par défaut on considère qu'on va afficher le formulaire
10666     $idx = 0;
10667     // Flag d'erreur
10668     $error = false;
10669     // Message d'erreur
10670     $message = '';
10671    
10672 softime 10869 // Paramètres GET : récupération de la clé d'accès
10673     $cle_acces_document = $this->f->get_submitted_get_value('key');
10674 softime 10808 $cle_acces_document = $this->f->db->escapeSimple($cle_acces_document);
10675 softime 10869 // Vérification de l'existence de la clé et récupération de l'uid du fichier
10676     $uidFichier = $this->getUidDocumentInstructionWithKey($cle_acces_document);
10677     if ($uidFichier != null) {
10678     // Récupération du document
10679     $file = $this->f->storage->get($uidFichier);
10680 softime 10808
10681 softime 10869 // Headers
10682     header("Cache-Control: no-cache, must-revalidate"); // HTTP/1.1
10683     header("Expires: Sat, 26 Jul 1997 05:00:00 GMT"); // Date dans le passé
10684     header("Content-Type: ".$file['metadata']['mimetype']);
10685     header("Accept-Ranges: bytes");
10686     header("Content-Disposition: inline; filename=\"".$file['metadata']['filename']."\";" );
10687     // Affichage du document
10688     echo $file['file_content'];
10689 softime 10808
10690 softime 10869 // Récupération de la date de premier accès et maj du suivi uniquement
10691     // si la date de 1er accès n'a pas encore été remplis
10692     $inst_notif = $this->getInstanceNotificationWithKey($cle_acces_document);
10693     if ($inst_notif->getVal('date_premier_acces') == null ||
10694     $inst_notif->getVal('date_premier_acces') == '') {
10695     $notif_val = array();
10696     foreach ($inst_notif->champs as $champ) {
10697     $notif_val[$champ] = $inst_notif->getVal($champ);
10698     }
10699     $notif_val['date_premier_acces'] = date("d/m/Y H:i:s");
10700     $notif_val['statut'] = 'vu';
10701     $notif_val['commentaire'] = 'Le document a été vu';
10702     $suivi_notif = $inst_notif->modifier($notif_val);
10703 softime 10808 }
10704    
10705     } else {
10706 softime 10869 // Page vide 404
10707     printf('Ressource inexistante');
10708     header('HTTP/1.0 404 Not Found');
10709 softime 10808 }
10710     }
10711    
10712 softime 11228 /**
10713     * Récupère le titre du document envoyé au parapheur
10714     */
10715 softime 10808 protected function getDocumentTitre($champ = null) {
10716     $title = $this->getTitle();
10717     $dossier = $this->getDossier();
10718     return $dossier.' '.$title;
10719     }
10720    
10721 softime 10869 /**
10722 softime 11228 * Compose le nom du document à transmettre au parapheur.
10723     * Le nom ets composé de cette manière :
10724     * instruction_xxx_libelle_de_la_lettre_type_associee
10725     * ou xxx correspond au numéro de l'instruction
10726     */
10727     protected function getDocumentLibelle() {
10728     // Récupère le champ instruction
10729     $instruction = $this->getVal("instruction");
10730    
10731     // Requête sql servant à récupérer le titre du document
10732     // TO_CHAR() introduit un espace avant l'affichage du nombre
10733     // comme les espaces sont remplacé par des '_' dans le retour de la fonction
10734     // il n'est pas nécessaire de mettre un '_' après le mot instruction.
10735 softime 14064 $documentLibelle = $this->f->get_one_result_from_db_query(
10736     sprintf(
10737     'SELECT
10738     CONCAT(
10739     \'instruction\',
10740     TO_CHAR(instruction.instruction, \'000\'),
10741     \'_\',
10742     LOWER(om_lettretype.libelle)
10743     ) AS nom_fichier
10744     FROM
10745     %1$sinstruction
10746     LEFT JOIN %1$som_lettretype
10747     ON om_lettretype.id = instruction.lettretype
10748     WHERE
10749     instruction = %2$d',
10750     DB_PREFIXE,
10751     intval($instruction)
10752     ),
10753     array(
10754     "origin" => __METHOD__,
10755     )
10756 softime 11228 );
10757    
10758 softime 14064 $documentLibelle = $documentLibelle['result'];
10759    
10760 softime 11228 // Transforamtion des ' ' en '_', des accents en lettres sans accents et des
10761     // caractères spéciaux en '_'
10762     // La méthode normalize_string est utilisé pour gérer les accents
10763     $documentLibelle = $this->f->normalize_string($documentLibelle);
10764     // TODO : comparer cette liste et celle de la méthode normalize_string
10765     // pour éviter les doublons + vérifier qu'il n'y a pas de doublons dans cette
10766     // liste
10767     $invalid = array('Œ'=>'oe', 'œ'=>'oe', 'Ÿ'=>'y', 'ü'=>'u',
10768     '¢' => '_', 'ß' => '_', '¥' => '_', '£' => '_', '™' => '_', '©' => '_',
10769     '®' => '_', 'ª' => '_', '×' => '_', '÷' => '_', '±' => '_', '²' => '_',
10770     '³' => '_', '¼' => '_', '½' => '_', '¾' => '_', 'µ' => '_', '¿' => '_',
10771     '¶' => '_', '·' => '_', '¸' => '_', 'º' => '_', '°' => '_', '¯' => '_',
10772     '§' => '_', '…' => '_', '¤' => '_', '¦' => '_', '≠' => '_', '¬' => '_',
10773     'ˆ' => '_', '¨' => '_', '‰' => '_', '¤' => '_', '€' => '_', '$' => '_',
10774     '«' => '_', '»' => '_', '‹' => '_', '›' => '_', 'ƒ' => '_', '¥' => '_',
10775     '‘‘' => '_', '‚' => '_', '!' => '_', '¡' => '_', '¢' => '_', '£' => '_',
10776     '?' => '_', '[' => '_', ']' => '_', '´' => '_', '`' => '_', '^' => '_',
10777     '~' => '_', '˜' => '_', '#' => '_', '*' => '_', '.' => '_', ':' => '_',
10778     ';' => '_', '•' => '_', '¯' => '_', '‾' => '_', '–' => '_', '–' => '_',
10779     '—' => '_', '_' => '_', '|' => '_', '¦‌' => '_', '‡' => '_', '§' => '_',
10780     '¶' => '_', '©' => '_', '®' => '_', '™' => '_', '&' => '_', '@' => '_',
10781     '/' => '_', '\\' => '_', '◊' => '_', '♠' => '_', '♣' => '_', '♥' => '_',
10782     '♦' => '_', '←' => '_', '↑' => '_', '→' => '_', '↓' => '_', '↔' => '_',
10783     '°' => '_', 'µ' => '_', '<' => '_', '>' => '_', '≤' => '_', '≥' => '_',
10784     '=' => '_', '≈' => '_', '≠' => '_', '≡' => '_', '±' => '_', '−' => '_',
10785     '+' => '_', '×' => '_', '÷' => '_', '⁄' => '_', '%' => '_', '‰' => '_',
10786     '¼' => '_', '½' => '_', '¾' => '_', '¹' => '_', '²' => '_', '³' => '_',
10787     '' => '_', 'º' => '_', 'ª' => '_', 'ƒ' => '_', '′' => '_', '″' => '_',
10788     '∂' => '_', '∏' => '_', '∑' => '_', '√' => '_', '∞' => '_', '¬' => '_',
10789     '∩' => '_', '∫' => '_', 'α' => '_', 'Α' => '_', 'β' => '_', 'Β' => '_',
10790     'γ' => '_', 'Γ' => '_', 'δ' => '_', 'Δ' => '_', 'ε' => '_', 'Ε' => '_',
10791     'ζ' => '_', 'Ζ' => '_', 'η' => '_', 'Η' => '_', 'θ' => '_', 'Θ' => '_',
10792     'ι' => '_', 'Ι' => '_', 'κ' => '_', 'Κ' => '_', 'λ' => '_', 'Λ' => '_',
10793     'μ' => '_', 'Μ' => '_', 'ν' => '_', 'Ν' => '_', 'ξ' => '_', 'Ξ' => '_',
10794     'ο' => '_', 'Ο' => '_', 'π' => '_', 'Π' => '_', 'ρ' => '_', 'Ρ' => '_',
10795     'σ' => '_', 'ς' => '_', 'Σ' => '_', 'τ' => '_', 'Τ' => '_', 'υ' => '_',
10796     'Υ' => '_', 'φ' => '_', 'Φ' => '_', 'χ' => '_', 'Χ' => '_', 'ψ' => '_',
10797     'Ψ' => '_', 'ω' => '_', 'Ω' => '_', ',' => '_', ' ' => '_'
10798     );
10799    
10800     return str_replace(array_keys($invalid), array_values($invalid), $documentLibelle);
10801     }
10802    
10803     /**
10804 softime 10869 * Surcharge permettant de ne pas afficher le fil d'Ariane dans
10805     * l'overlay de notification des demandeurs.
10806     */
10807     function getSubFormTitle($ent) {
10808 softime 11876 $actionSansPath = array('411', '420', '430');
10809     if (in_array($this->getParameter('maj'), $actionSansPath)) {
10810 softime 10869 return '';
10811     }
10812     return parent::getSubFormTitle($ent);
10813     }
10814 softime 13137
10815     /**
10816     * Traitement de la notification automatique des tiers consulté.
10817     *
10818     * Récupère la liste des adresses mails des tiers notifiables. Pour chaque adresses
10819     * récupérées ajoute une notification et une tâche de notification par mail.
10820     * La création de la tâche de notification par mail déclenchera l'envoi du mail
10821     * et la mise à jour du suivi.
10822     *
10823     * Les tiers notifiables sont ceux :
10824     * - n’ayant pas un ID PLAT’AU correspondant à l’ID PLAT’AU du service consultant
10825     * - ayant une habilitation dont le type est listé dans les paramètres de
10826     * notification de l’événement,
10827     * - intervenant sur la commune ou le département du dossier
10828     * - ayant au moins une adresse mail valide
10829     *
10830     * @param evenement instance de l'événement associée à l'instruction
10831     * @param dossier instance du dossier de l'instruction
10832     * @return boolean indique si le traitement à réussi
10833     */
10834     protected function traitement_notification_automatique_tiers_consulte($evenement, $dossier) {
10835     // Récupération de l'identifiant plat'au du service consultant
10836     $consultationEntrante = $dossier->get_inst_consultation_entrante();
10837     // Récupération de la liste des types d'habilitations autorisées pour
10838     // cette notification
10839     $typesHabilitationsNotifiable = $evenement->get_types_habilitation_notifiable();
10840     // Récupération du département et de la commune du dossier
10841     $commune = $dossier->getVal('commune');
10842     // Le département est récupéré à partir de la commune du dossier donc si la
10843     // commune n'a pas pu être récupéré on ne récupère pas non plus le département.
10844     $idDepartement = null;
10845     if (! empty($commune)) {
10846     $departement = $dossier->get_inst_departement_dossier();
10847     $idDepartement = $departement->getVal($departement->clePrimaire);
10848     }
10849     // Récupération des courriels des tiers notifiables
10850     $tiersANotifier = $this->get_courriels_tiers_notifiable(
10851     $typesHabilitationsNotifiable,
10852     $consultationEntrante->getVal('service_consultant_id'),
10853     $commune,
10854     $idDepartement
10855     );
10856     // Traitement de chacune des listes de diffusion pour extraire les
10857     // courriels, vérifier la validité des courriels et envoyer la
10858     // notification
10859     $notificationSend = false;
10860     if (empty($tiersANotifier)) {
10861     $this->addToLog(
10862     sprintf(
10863 softime 14542 '%s() : %s %s : %s',
10864 softime 13137 __METHOD__,
10865     __("La récupération des tiers à échoué."),
10866     __('Paramétrage'),
10867     var_export(
10868     array(
10869     'types_habilitations_notifiable' => $typesHabilitationsNotifiable,
10870     'service_consultant' => $consultationEntrante->getVal('service_consultant_id'),
10871     'id_commune' => $commune,
10872     'id_departement' => $idDepartement
10873     ),
10874     true
10875     )
10876     ),
10877     DEBUG_MODE
10878     );
10879     return false;
10880     }
10881     foreach($tiersANotifier as $tierANotifier) {
10882     // Découpe la liste de diffusion pour stocker les adresses mails
10883     // des tiers dans un tableau
10884     $courriels =
10885     array_filter(
10886     array_map(
10887     'trim',
10888     preg_split("/\r\n|\n|\r/", $tierANotifier['liste_diffusion'])));
10889    
10890     foreach ($courriels as $courriel) {
10891     // Pour chaque adresse mail vérifie si l'adresse est valide
10892     if (! $this->f->checkValidEmailAddress($courriel)) {
10893     continue;
10894     }
10895     $destinataire = array(
10896     'destinataire' => $tierANotifier['libelle'].' : '.$courriel,
10897     'courriel' => $courriel
10898     );
10899     // Si l'adresse est valide ajoute une nouvelle notification
10900     // et une tâche d'envoi de mails
10901     $idNotif = $this->ajouter_notification(
10902     $this->getVal($this->clePrimaire),
10903     $this->f->get_connected_user_login_name(),
10904     $destinataire,
10905     $this->get_dossier_instruction_om_collectivite(),
10906     array(),
10907     true
10908     );
10909     if ($idNotif === false) {
10910     $this->addToLog(
10911     __METHOD__.
10912     __("L'ajout de la notification a échoué."),
10913     DEBUG_MODE
10914     );
10915     return false;
10916     }
10917     // Création de la tache en lui donnant l'id de la notification
10918     $notification_by_task = $this->notification_by_task(
10919     $idNotif,
10920     $dossier->getVal('dossier'),
10921     'mail',
10922     'notification_tiers_consulte'
10923     );
10924     if ($notification_by_task === false) {
10925     $this->addToLog(
10926     __METHOD__.
10927     __("L'ajout de la tâche de notification a échoué."),
10928     DEBUG_MODE
10929     );
10930     $this->addToMessage(
10931     __("Erreur lors de la génération de la notification au(x) pétitionnaire(s).")
10932     );
10933     return false;
10934     }
10935     $notificationSend = true;
10936     }
10937     }
10938     // Si aucune notification n'a été envoyé car il n'y a pas de courriels
10939     // valide, affiche un message dans les logs pour avoir un suivi.
10940     if (! $notificationSend) {
10941     $this->addToLog(
10942     sprintf(
10943     '%s %s : %s %s : %s',
10944     __METHOD__,
10945     __("Il n'y a pas de tiers notifiable pour l'instruction"),
10946     $evenement->getVal('libelle'),
10947     __("du dossier"),
10948     $this->getVal('dossier')
10949     ),
10950     DEBUG_MODE
10951     );
10952     }
10953     return true;
10954     }
10955    
10956     /**
10957     * Récupère, à l'aide d'une requête, la liste de diffusion des tiers
10958     * respectant les conditions suvantes :
10959     * - le tiers consulté dois accepté les notifications
10960     * - la liste de diffusion ne dois pas être vide
10961     * - l'uid du tiers consulté ne dois pas être celui passé en paramètre
10962     * si pas d'uid passé en paramètre alors on ne filtre pas selon l'uid
10963     * du tiers
10964     * - le type d'habilitation des tiers dois appartenir à la liste
10965     * fournie en paramètre
10966     * - le tiers dois être associé à la commune ou au département passé
10967     * en paramètre
10968     *
10969     * @param array $typesHabilitations tableau contenant la liste des types d'habilitation
10970     * pouvant être notifiée
10971     * @param integer $idPlautau uid de l'acteur plat'au du dossier qui ne dois pas être notifié
10972     * @param integer $commune identifiant de la commune du dossier
10973     * @param integer $departement identifiant du département du dossier
10974     *
10975     * @return array listes de diffusion des tiers notifiable
10976     */
10977     protected function get_courriels_tiers_notifiable(array $typesHabilitations, $idPlatau, $commune, $departement) {
10978     // Si paramètre non renseigné alors ne renvoie rien
10979     if (empty($typesHabilitations) || empty($commune) || empty($departement)) {
10980     return false;
10981     }
10982     // Si il n'y a pas d'acteur associé au dossier alors on ne filtre pas sur l'uid de l'acteur
10983     $filtreServiceConsulteDI = '';
10984     if (! empty($idPlatau)) {
10985     $filtreServiceConsulteDI = sprintf(
10986 softime 14064 "-- Filtre les tiers ayant une ligne correspondante a l uid platau du service
10987     -- en charge du dossier
10988     AND (tiers_consulte.uid_platau_acteur !~ ('\y' || '%s' || '\y')
10989     OR tiers_consulte.uid_platau_acteur IS NULL)",
10990 softime 13137 $this->f->db->escapeSimple($idPlatau)
10991     );
10992     }
10993     $rst = $this->f->get_all_results_from_db_query(
10994     sprintf(
10995     'SELECT
10996 softime 14064 -- Tiers notifiables lié à la commune du dossier
10997 softime 13137 tiers_consulte.liste_diffusion,
10998     tiers_consulte.libelle
10999     FROM
11000     %1$shabilitation_tiers_consulte
11001     LEFT JOIN %1$stiers_consulte
11002     ON habilitation_tiers_consulte.tiers_consulte = tiers_consulte.tiers_consulte
11003     LEFT JOIN %1$slien_habilitation_tiers_consulte_commune
11004     ON habilitation_tiers_consulte.habilitation_tiers_consulte = lien_habilitation_tiers_consulte_commune.habilitation_tiers_consulte
11005 softime 14064 -- Conservation uniquement des tiers acteur de dossiers
11006     JOIN %1$slien_dossier_tiers
11007     ON tiers_consulte.tiers_consulte = lien_dossier_tiers.tiers
11008     WHERE
11009     tiers_consulte.accepte_notification_email IS TRUE
11010     AND tiers_consulte.liste_diffusion IS NOT NULL
11011     %3$s
11012     AND habilitation_tiers_consulte.type_habilitation_tiers_consulte IN (%2$s)
11013     AND lien_habilitation_tiers_consulte_commune.commune = %4$d
11014     -- Filtre sur les tiers acteur du dossier
11015     AND lien_dossier_tiers.dossier = \'%6$s\'
11016     UNION
11017     SELECT
11018     -- Tiers notifiables lié au département du dossier
11019     tiers_consulte.liste_diffusion,
11020     tiers_consulte.libelle
11021     FROM
11022     %1$shabilitation_tiers_consulte
11023     LEFT JOIN %1$stiers_consulte
11024     ON habilitation_tiers_consulte.tiers_consulte = tiers_consulte.tiers_consulte
11025 softime 13137 LEFT JOIN %1$slien_habilitation_tiers_consulte_departement
11026     ON habilitation_tiers_consulte.habilitation_tiers_consulte = lien_habilitation_tiers_consulte_departement.habilitation_tiers_consulte
11027 softime 14064 -- Conservation uniquement des tiers acteur de dossiers
11028     JOIN %1$slien_dossier_tiers
11029     ON tiers_consulte.tiers_consulte = lien_dossier_tiers.tiers
11030 softime 13137 WHERE
11031     tiers_consulte.accepte_notification_email IS TRUE
11032     AND tiers_consulte.liste_diffusion IS NOT NULL
11033     %3$s
11034     AND habilitation_tiers_consulte.type_habilitation_tiers_consulte IN (%2$s)
11035 softime 14064 AND lien_habilitation_tiers_consulte_departement.departement = %5$d
11036     -- Filtre sur les tiers acteur du dossier
11037     AND lien_dossier_tiers.dossier = \'%6$s\'',
11038 softime 13137 DB_PREFIXE,
11039     implode(', ', $typesHabilitations),
11040     $filtreServiceConsulteDI,
11041     intval($commune),
11042 softime 14064 intval($departement),
11043     $this->f->db->escapeSimple($this->getVal('dossier'))
11044 softime 13137 ),
11045     array(
11046     "origin" => __METHOD__
11047     )
11048     );
11049 softime 14064 // Faire un order by sur un union ne fonctionne pas. A la place
11050     // c'est le tableau des résultats qui est ordonné.
11051     usort($rst['result'], function($a, $b) {
11052     return strcmp($a['libelle'], $b['libelle']);
11053     });
11054 softime 13137 return $rst['result'];
11055     }
11056     }

Properties

Name Value
svn:keywords "Id"

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26