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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 14064 - (hide annotations)
Thu Feb 16 22:52:47 2023 UTC (23 months, 1 week ago) by softime
File size: 465804 byte(s)
chore(branch): fusion de la branche d'intégration 5.16.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     "method" => "notifier_demandeur_principal",
505     "permission_suffix" => "modifier",
506     );
507    
508 softime 11585 // ACTION - 420 - Notifier les services consultés (mail)
509     $this->class_actions[420] = array(
510     "identifier" => "overlay_notification_service_consulte",
511     "portlet" => array(
512     "libelle" => __("Notifier les services consultés"),
513     "type" => "action-self",
514     "class" => "notifier_commune-16",
515     ),
516     "condition" => array(
517     "is_service_notifiable"
518     ),
519     "view" => "view_overlay_notification_service_consulte",
520     "permission_suffix" => "tab",
521     );
522    
523     // ACTION - 430 - Notifier les tiers consultés (mail)
524     $this->class_actions[430] = array(
525     "identifier" => "overlay_notification_tiers_consulte",
526     "portlet" => array(
527     "libelle" => __("Notifier les tiers consultés"),
528     "type" => "action-self",
529     "class" => "notifier_commune-16",
530     ),
531     "condition" => array(
532     "is_tiers_notifiable"
533     ),
534     "view" => "view_overlay_notification_tiers_consulte",
535     "permission_suffix" => "tab",
536     );
537    
538 softime 10573 //
539 softime 11418 $this->class_actions[403] = array(
540     "identifier" => "envoyer_au_controle_de_legalite",
541     "portlet" => array(
542     "libelle" => __("Envoyer au contrôle de légalité"),
543     "type" => "action-direct-with-confirmation",
544     "class" => "envoyer_au_controle_de_legalite-16",
545     ),
546     "view" => "formulaire",
547     "method" => "envoyer_au_controle_de_legalite",
548     "condition" => array(
549     "can_be_sended_to_cl"
550     ),
551     "permission_suffix" => "envoyer_au_controle_de_legalite",
552     );
553    
554     //
555 softime 10573 $this->class_actions[998] = array(
556     "identifier" => "json_data",
557     "view" => "view_json_data",
558     "permission_suffix" => "consulter",
559     );
560 mbroquet 3730 }
561    
562 softime 8593 /**
563 softime 8989 * Clause select pour la requête de sélection des données de l'enregistrement.
564     *
565     * @return array
566     */
567     function get_var_sql_forminc__champs() {
568     return array(
569     "instruction",
570     "destinataire",
571     "instruction.evenement",
572 softime 10573 "instruction.commentaire",
573 softime 8989 "date_evenement",
574     "instruction.lettretype",
575     "signataire_arrete",
576     "flag_edition_integrale",
577     "om_final_instruction_utilisateur",
578     "date_finalisation_courrier",
579     "date_envoi_signature",
580     "date_envoi_rar",
581     "date_envoi_controle_legalite",
582    
583     "date_retour_signature",
584     "date_retour_rar",
585     "date_retour_controle_legalite",
586    
587     "numero_arrete",
588    
589     "complement_om_html",
590     "'' as bible_auto",
591     "'' as bible",
592     "complement2_om_html",
593     "'' as bible2",
594     "complement3_om_html",
595     "'' as bible3",
596     "complement4_om_html",
597     "'' as bible4",
598    
599     "titre_om_htmletat",
600     "corps_om_htmletatex",
601    
602     "'' as btn_preview",
603     "'' as btn_redaction",
604    
605     "'' as btn_refresh",
606     "'' as live_preview",
607    
608     "dossier",
609     "instruction.action",
610     "instruction.delai",
611     "instruction.etat",
612     "instruction.autorite_competente",
613     "instruction.accord_tacite",
614     "instruction.delai_notification",
615     "instruction.avis_decision",
616     "archive_delai",
617     "archive_accord_tacite",
618     "archive_etat",
619     "archive_avis",
620     "archive_date_complet",
621     "archive_date_rejet",
622     "archive_date_limite",
623     "archive_date_notification_delai",
624     "archive_date_decision",
625     "archive_date_validite",
626     "archive_date_achevement",
627     "archive_date_conformite",
628     "archive_date_chantier",
629     "archive_date_dernier_depot",
630     "date_depot",
631 softime 10573 "date_depot_mairie",
632 softime 8989 "complement5_om_html",
633     "'' as bible5",
634     "complement6_om_html",
635     "'' as bible6",
636     "complement7_om_html",
637     "'' as bible7",
638     "complement8_om_html",
639     "'' as bible8",
640     "complement9_om_html",
641     "'' as bible9",
642     "complement10_om_html",
643     "'' as bible10",
644     "complement11_om_html",
645     "'' as bible11",
646     "complement12_om_html",
647     "complement13_om_html",
648     "complement14_om_html",
649     "complement15_om_html",
650     "archive_incompletude",
651     "archive_incomplet_notifie",
652     "archive_evenement_suivant_tacite",
653     "archive_evenement_suivant_tacite_incompletude",
654     "archive_etat_pendant_incompletude",
655     "archive_date_limite_incompletude",
656     "archive_delai_incompletude",
657     "archive_autorite_competente",
658     "code_barres",
659     "om_fichier_instruction",
660     "om_final_instruction",
661     "om_fichier_instruction_dossier_final",
662     "document_numerise",
663     "duree_validite_parametrage",
664     "duree_validite",
665     "created_by_commune",
666     "archive_date_cloture_instruction",
667     "archive_date_premiere_visite",
668     "archive_date_derniere_visite",
669     "archive_date_contradictoire",
670     "archive_date_retour_contradictoire",
671     "archive_date_ait",
672     "archive_date_transmission_parquet",
673     "archive_dossier_instruction_type",
674     "archive_date_affichage",
675 softime 10573 "pec_metier",
676     "archive_pec_metier",
677     "archive_a_qualifier",
678     "id_parapheur_signature",
679     "statut_signature",
680     "commentaire_signature",
681     "historique_signature",
682 softime 10808 "'' as suivi_notification",
683 softime 11585 "'' as suivi_notification_service",
684     "'' as suivi_notification_tiers",
685 softime 12654 "'' as suivi_notification_commune",
686 softime 10573
687     "'' as preview_edition",
688 softime 11418 "envoye_cl_platau",
689 softime 12124 "'' as log_instruction"
690 softime 8989 );
691     }
692    
693     /**
694 softime 8593 * CONDITION - is_edition_integrale_enabled
695     *
696     * Vérifie que la rédaction libre est activée sur l'instruction en cours.
697     *
698     * @return boolean
699     */
700     function is_edition_integrale_enabled() {
701     if ($this->getVal("flag_edition_integrale") == 't') {
702     return true;
703     }
704     return false;
705     }
706 mbroquet 3730
707     /**
708 softime 8593 * CONDITION - is_edition_integrale_not_enabled
709     *
710     * Vérifie que la rédaction libre est désactivée sur l'instruction en cours.
711     *
712     * @return boolean
713     */
714     function is_edition_integrale_not_enabled() {
715     return !$this->is_edition_integrale_enabled();
716     }
717    
718     /**
719     * CONDITION - is_option_redaction_libre_enabled
720     *
721     * Vérifie que l'option de rédaction libre est activée.
722     *
723     * @return boolean
724     */
725     function is_option_redaction_libre_enabled() {
726     $collectivite_di = $this->get_dossier_instruction_om_collectivite();
727     return $this->f->is_option_redaction_libre_enabled($collectivite_di);
728     }
729    
730     /**
731 softime 10713 * CONDITION - is_option_parapheur_relecture_enabled
732     *
733     * Vérifie que l'option de relecture lors de l'envoi en signature est activée.
734     *
735     * @return boolean
736     */
737 softime 10808 function is_parapheur_relecture_parameter_enabled() {
738     //Instanciation de la classe electronicsignature
739     $inst_es = $this->get_electronicsignature_instance();
740     if ($inst_es === false) {
741     return false;
742     }
743    
744     if ($inst_es->get_conf('is_forced_view_files') !== 'true' && $inst_es->get_conf('is_forced_view_files') !== true) {
745     return false;
746     }
747    
748     return true;
749 softime 10713 }
750    
751 softime 11876 /**
752     * CONDITION - is_parapheur_annulation_parameter_enabled
753     *
754     * Vérifie que l'option d'annulation de l'envoi en signature est activée.
755     *
756     * @return boolean
757     */
758     function is_parapheur_annulation_parameter_enabled() {
759     //Instanciation de la classe electronicsignature
760     $inst_es = $this->get_electronicsignature_instance();
761     if ($inst_es === false) {
762     return false;
763     }
764 softime 10713
765 softime 11876 if ($inst_es->get_conf('cancel_send') !== 'true' && $inst_es->get_conf('cancel_send') !== true) {
766     return false;
767     }
768    
769     return true;
770     }
771    
772    
773 softime 10713 /**
774 softime 10573 * CONDITION - is_sent_for_signature
775     *
776     * Vérifie que l'instruction a été envoyé à signature
777     *
778     * @return boolean
779     */
780     function is_sent_for_signature() {
781     // Si un parapheur a été configuré
782     // et que le champ id_parapheur_signature n'est pas vide
783     // que le status est différent de "canceled" ou "expired"
784     // alors l'évènement a été envoyé en signature
785     if ($this->has_connector_electronicsignature() === true
786     && empty($this->getVal("id_parapheur_signature")) === false
787     && ($this->getVal("statut_signature") != "canceled"
788 softime 12124 && $this->getVal("statut_signature") != "expired"
789     && $this->getVal("statut_signature") != "finished")) {
790 softime 10573 //
791     return true;
792     }
793    
794     return false;
795     }
796    
797     /**
798     * CONDITION - is_not_sent_for_signature
799     *
800     * Vérifie que l'instruction n'a pas été envoyé à signature
801     *
802     * @return boolean
803     */
804     function is_not_sent_for_signature() {
805 softime 10968 // Contrôle si l'utilisateur possède un bypass
806     $bypass = $this->f->isAccredited($this->get_absolute_class_name()."_definaliser_bypass");
807     if ($bypass == true) {
808     return true;
809     }
810    
811 softime 10573 return !$this->is_sent_for_signature();
812     }
813    
814    
815     /**
816     * CONDITION - is_signed
817     *
818     * Vérifie que l'instruction a été signé
819     *
820     * @return boolean
821     */
822     function is_signed() {
823     // Si un parapheur a été configuré
824     // et que le champ id_parapheur_signature n'est pas vide
825     // et que le statut est égal à "finished"
826     // alors le document de l'instruciton à été signé
827     if ($this->has_connector_electronicsignature() === true
828     && empty($this->getVal("id_parapheur_signature")) === false
829     && $this->getVal("statut_signature") == "finished") {
830     //
831     return true;
832     }
833    
834     return false;
835     }
836    
837 softime 11876
838 softime 12433 /**
839     * is_sent_to_cl
840     *
841     * Vérifie que l'instruction a été envoyé au contrôle de légalité
842     *
843     * @return boolean
844     */
845 softime 11418 function is_sent_to_cl() {
846 softime 12433 // Si la case à cocher de l'instruction envoye_cl_platau est à "t"
847     if ($this->getVal('envoye_cl_platau') === 't') {
848     //
849     return true;
850 softime 11418 }
851     //
852     return false;
853     }
854    
855 softime 10808 /**
856     * CONDITION - is_portail_notification
857     *
858     * Vérifie si la notification est une notification de catégorie portail
859     *
860     * @return boolean
861     */
862 softime 10869 function is_portail_notification_sans_annexe() {
863 softime 10808 $collectiviteDi = $this->get_dossier_instruction_om_collectivite();
864 softime 10869 $ev = $this->get_inst_evenement($this->getVal('evenement'));
865 softime 14064 if ($this->f->get_param_option_notification($collectiviteDi) === PORTAL
866 softime 10869 && $ev->getVal('notification') != 'notification_manuelle_annexe'
867     && $ev->getVal('notification') != 'notification_manuelle_annexe_signature_requise'
868     ) {
869 softime 10808 return true;
870     }
871     return false;
872     }
873 softime 10573
874     /**
875 softime 10808 * CONDITION - is_not_portail_notification
876     *
877     * Vérifie si la notification n'est pas une notification de catégorie portail
878     *
879     * @return boolean
880     */
881 softime 10869 function is_not_portail_notification_sans_annexe() {
882     return (! $this->is_portail_notification_sans_annexe());
883 softime 10808 }
884    
885     /**
886 softime 10573 * CONDITION - can_be_signed
887     *
888     * Vérifie que le document de l'instruction peut être envoyé au parapheur pour signature
889     *
890     * @return boolean
891     */
892     function can_be_signed() {
893     // Instanciation de l'objet signataire_arrete
894     $inst_signataire_arrete = $this->f->get_inst__om_dbform(array(
895     "obj" => "signataire_arrete",
896     "idx" => $this->getVal("signataire_arrete"),
897     ));
898     // Si un parapheur a été configuré, que le document est finalisé, que le signataire
899     // possède une adresse email, on vérifie le champ id_parapheur_signature
900     // S'il est vide l'évènement peut être envoyé en signature
901     // S'il ne l'est pas, alors on vérifie le champ statut_signature
902     // Si la valeur de ce champ est égal à "canceled" ou "expired"
903     // alors l'évènement peut être envoyé en signature
904     if ($this->has_connector_electronicsignature() === true
905     && $this->getVal("om_final_instruction") == 't'
906     && empty($inst_signataire_arrete->getVal('email')) === false) {
907     //
908     if (empty($this->getVal("id_parapheur_signature")) === true
909     || $this->getVal("statut_signature") == "canceled"
910     || $this->getVal("statut_signature") == "expired") {
911     //
912     return true;
913     }
914     }
915    
916     $this->addToLog(__METHOD__."() has_connector_electronicsignature: ".var_export($this->has_connector_electronicsignature(), true), EXTRA_VERBOSE_MODE);
917     $this->addToLog(__METHOD__."() om_final_instruction: ".var_export($this->getVal("om_final_instruction"), true), EXTRA_VERBOSE_MODE);
918     $this->addToLog(__METHOD__."() email: ".var_export($inst_signataire_arrete->getVal('email'), true), EXTRA_VERBOSE_MODE);
919     $this->addToLog(__METHOD__."() id_parapheur_signature: ".var_export($this->getVal("id_parapheur_signature"), true), EXTRA_VERBOSE_MODE);
920     $this->addToLog(__METHOD__."() statut_signature: ".var_export($this->getVal("statut_signature"), true), EXTRA_VERBOSE_MODE);
921    
922     return false;
923     }
924    
925     /**
926     * CONDITION - has_connector_electronicsignature
927     *
928     * Vérifie qu'un parapheur est paramétré
929     *
930     * @return boolean
931     */
932     function has_connector_electronicsignature() {
933     $inst_es = $this->get_electronicsignature_instance(false);
934     if ($inst_es === false) {
935     return false;
936     }
937     return true;
938     }
939    
940     /**
941     * CONDITION - can_display_parapheur
942     *
943     * Vérifie que le fieldset "Suivi Parapheur" soit affichable
944     *
945     * @return boolean
946     */
947     function can_display_parapheur() {
948     $evenement_id = $this->getVal("evenement");
949     $inst_evenement = $this->get_inst_evenement($evenement_id);
950     if ($this->has_connector_electronicsignature() === true
951     && $inst_evenement->getVal('lettretype') !== ''
952     && $inst_evenement->getVal('lettretype') !== null
953     && (empty($this->getVal("id_parapheur_signature")) === false
954     || empty($this->getVal("historique_signature")) === false)) {
955     //
956     return true;
957     }
958    
959     return false;
960     }
961    
962     /**
963 softime 10808 * CONDITION - can_display_notification
964     *
965 softime 11585 * Vérifie que le champs "Suivi notification" est affichable
966 softime 10808 *
967     * @return boolean
968     */
969 softime 11585 function can_display_notification_demandeur() {
970 softime 10808 // Le suivi des notification est affiché si l'événement est notifiable
971     // et si des notifications ont été envoyées
972     $evenement_id = $this->getVal("evenement");
973     $inst_evenement = $this->get_inst_evenement($evenement_id);
974     if ($inst_evenement->getVal('notification') != null &&
975     $inst_evenement->getVal('notification') != '') {
976     // Des notifications ont été envoyé si il existe au moins une notification
977     // liées à l'instruction
978 softime 11585 $idsNotifs = $this->get_instruction_notification(
979     $this->getVal($this->clePrimaire),
980     array(
981     'notification_recepisse',
982     'notification_instruction',
983     'notification_decision',
984 softime 12124 ),
985     true
986 softime 11585 );
987 softime 10808 if (isset($idsNotifs) && $idsNotifs !== array()) {
988     return true;
989     }
990     }
991     return false;
992     }
993    
994     /**
995 softime 11585 * CONDITION - can_display_notification
996     *
997     * Vérifie que le champs "suivi_notification_service" est affichable
998     *
999     * @return boolean
1000     */
1001     function can_display_notification_service() {
1002     // Le suivi des notification est affiché si l'événement est notifiable
1003     // et si des notifications ont été envoyées
1004     $evenement_id = $this->getVal("evenement");
1005     $inst_evenement = $this->get_inst_evenement($evenement_id);
1006     if ($this->get_boolean_from_pgsql_value($inst_evenement->getVal('notification_service')) == true) {
1007     // Des notifications ont été envoyé si il existe au moins une notification
1008     // de type notification_service_consulte liées à l'instruction
1009     $idsNotifs = $this->get_instruction_notification(
1010     $this->getVal($this->clePrimaire),
1011     'notification_service_consulte'
1012     );
1013     if (isset($idsNotifs) && $idsNotifs !== array()) {
1014     return true;
1015     }
1016     }
1017     return false;
1018     }
1019    
1020    
1021     /**
1022     * CONDITION - can_display_notification_tiers
1023     *
1024     * Vérifie que le champs "suivi_notification_tiers" est affichable
1025     *
1026     * @return boolean
1027     */
1028     function can_display_notification_tiers() {
1029     // Le suivi des notification est affiché si l'événement est notifiable
1030     // et si des notifications ont été envoyées
1031     $evenement_id = $this->getVal("evenement");
1032     $inst_evenement = $this->get_inst_evenement($evenement_id);
1033 softime 13137 if (! empty($inst_evenement->getVal('notification_tiers'))) {
1034 softime 11585 // Des notifications ont été envoyé si il existe au moins une notification
1035     // de type notification_tiers_consulte liées à l'instruction
1036     $idsNotifs = $this->get_instruction_notification(
1037     $this->getVal($this->clePrimaire),
1038     'notification_tiers_consulte'
1039     );
1040     if (isset($idsNotifs) && $idsNotifs !== array()) {
1041     return true;
1042     }
1043     }
1044     return false;
1045     }
1046    
1047     /**
1048 softime 12654 * CONDITION - can_display_notification_commune
1049     *
1050     * Vérifie que le champs "suivi_notification_commune" est affichable
1051     *
1052     * @return boolean
1053     */
1054     function can_display_notification_commune() {
1055     // Le suivi des notification si il existe au moins une notification
1056     // de type notification_depot_demat liées à l'instruction
1057     $idsNotifs = $this->get_instruction_notification(
1058     $this->getVal($this->clePrimaire),
1059     array('notification_depot_demat', 'notification_commune')
1060     );
1061     if (isset($idsNotifs) && $idsNotifs !== array()) {
1062     return true;
1063     }
1064     return false;
1065     }
1066    
1067     /**
1068 softime 8593 * TREATMENT - disable_edition_integrale.
1069     *
1070     * Cette methode permet de passer la consultation en "lu"
1071     *
1072     * @return boolean true si maj effectué false sinon
1073     */
1074     function disable_edition_integrale() {
1075     // Cette méthode permet d'exécuter une routine en début des méthodes
1076     // dites de TREATMENT.
1077     $this->begin_treatment(__METHOD__);
1078     $this->correct = true;
1079     $valF = array(
1080     "flag_edition_integrale" => false,
1081     "titre_om_htmletat" => null,
1082     "corps_om_htmletatex" => null,
1083     );
1084     $res = $this->f->db->autoExecute(
1085     DB_PREFIXE.$this->table,
1086     $valF,
1087     DB_AUTOQUERY_UPDATE,
1088     $this->clePrimaire."=".$this->getVal($this->clePrimaire)
1089     );
1090     if ($this->f->isDatabaseError($res, true)) {
1091     // Appel de la methode de recuperation des erreurs
1092     $this->erreur_db($res->getDebugInfo(), $res->getMessage(), '');
1093     $this->correct = false;
1094     // Termine le traitement
1095     return $this->end_treatment(__METHOD__, false);
1096     } else {
1097     $this->addToMessage(_("Rédaction par compléments activé."));
1098     return $this->end_treatment(__METHOD__, true);
1099     }
1100    
1101     // Termine le traitement
1102     return $this->end_treatment(__METHOD__, false);
1103     }
1104    
1105     /**
1106     * TREATMENT - enable_edition_integrale.
1107     *
1108     * Cette methode permet de passer la consultation en "lu"
1109     *
1110     * @return boolean true si maj effectué false sinon
1111     */
1112     function enable_edition_integrale() {
1113     // Cette méthode permet d'exécuter une routine en début des méthodes
1114     // dites de TREATMENT.
1115     $this->begin_treatment(__METHOD__);
1116     $this->correct = true;
1117    
1118     // Récupère la collectivite du dossier d'instruction
1119     $dossier_instruction_om_collectivite = $this->get_dossier_instruction_om_collectivite();
1120     $collectivite = $this->f->getCollectivite($dossier_instruction_om_collectivite);
1121     //
1122     $params = array(
1123     "specific" => array(
1124     "corps" => array(
1125     "mode" => "get",
1126     )
1127     ),
1128     );
1129     $result = $this->compute_pdf_output('lettretype', $this->getVal('lettretype'), $collectivite, null, $params);
1130     $corps = $result['pdf_output'];
1131     //
1132     $params = array(
1133     "specific" => array(
1134     "titre" => array(
1135     "mode" => "get",
1136     )
1137     ),
1138     );
1139     $result = $this->compute_pdf_output('lettretype', $this->getVal('lettretype'), $collectivite, null, $params);
1140     $titre = $result['pdf_output'];
1141     //
1142     $valF = array(
1143     "flag_edition_integrale" => true,
1144     "titre_om_htmletat" => $titre,
1145     "corps_om_htmletatex" => $corps,
1146     );
1147     $res = $this->f->db->autoExecute(
1148     DB_PREFIXE.$this->table,
1149     $valF,
1150     DB_AUTOQUERY_UPDATE,
1151     $this->clePrimaire."=".$this->getVal($this->clePrimaire)
1152     );
1153     if ($this->f->isDatabaseError($res, true)) {
1154     // Appel de la methode de recuperation des erreurs
1155     $this->erreur_db($res->getDebugInfo(), $res->getMessage(), '');
1156     $this->correct = false;
1157     // Termine le traitement
1158     return $this->end_treatment(__METHOD__, false);
1159     } else {
1160     $this->addToMessage(_("Rédaction libre activé."));
1161     return $this->end_treatment(__METHOD__, true);
1162     }
1163    
1164     // Termine le traitement
1165     return $this->end_treatment(__METHOD__, false);
1166     }
1167    
1168     /**
1169 softime 14064 * Cette méthode instancie le dossier à partir de l'identifiant passé
1170     * en paramètre et renvoie l'identifiant du dossier d'autorisation (DA)
1171     * associé au dossier.
1172     * Si l'identifiant du dossier n'est pas fourni alors cette méthode
1173     * renverra NULL
1174     *
1175     * @param string identifiant du dossier
1176     * @return null|string null ou identifiant du DA
1177 mbroquet 3730 */
1178     function getNumDemandeAutorFromDossier($id) {
1179     if (!isset($id)) {
1180     return NULL;
1181     }
1182 softime 14064
1183     $dossier = $this->f->get_inst__om_dbform(array(
1184     'obj' => 'dossier',
1185     'idx' => $id,
1186     ));
1187    
1188     return $dossier->getVal('dossier_autorisation');
1189 mbroquet 3730 }
1190    
1191 softime 14064
1192 mbroquet 3730 function setType(&$form, $maj) {
1193 softime 8593 // Récupération du mode de l'action
1194     $crud = $this->get_action_crud($maj);
1195     // Récupère la collectivité du dossier d'instruction
1196     $collectivite_di = $this->get_dossier_instruction_om_collectivite();
1197 mbroquet 3730
1198 softime 8593 // Cache tous les champs
1199     foreach ($this->champs as $value) {
1200     $form->setType($value, 'hidden');
1201     }
1202 softime 6565
1203 softime 10573 // Les champs historique_signature et statut_signature ne sont pas saisissable dans tous les cas
1204 softime 11228 if ($this->can_display_parapheur() === true && $maj == 3) {
1205 softime 10573 $form->setType('statut_signature', 'selectstatic');
1206     $form->setType('historique_signature', 'jsontotab');
1207     if ($this->getVal('commentaire_signature') == null) {
1208     $form->setType('commentaire_signature', 'hidden');
1209     } else {
1210     $form->setType('commentaire_signature', 'hiddenstatic');
1211     }
1212     }
1213    
1214 softime 11585 // Le champ de suivi des notifications des demandeurs n'est pas affichable dans tous les cas
1215 softime 12654 if ($maj == 3 && $this->can_display_notification_demandeur() === true) {
1216 softime 10808 $form->setType('suivi_notification', 'jsontotab');
1217     }
1218 softime 11585 // Le champ de suivi des notifications des services n'est pas affichable dans tous les cas
1219 softime 12654 if ($maj == 3 && $this->can_display_notification_service() === true) {
1220 softime 11585 $form->setType('suivi_notification_service', 'jsontotab');
1221     }
1222     // Le champ de suivi des notifications des tiers n'est pas affichable dans tous les cas
1223 softime 12654 if ($maj == 3 && $this->can_display_notification_tiers() === true) {
1224 softime 11585 $form->setType('suivi_notification_tiers', 'jsontotab');
1225     }
1226 softime 12654 // Le champ de suivi des notifications des communes n'est pas affichable dans tous les cas
1227     if ($maj == 3 && $this->can_display_notification_commune() === true) {
1228     $form->setType('suivi_notification_commune', 'jsontotab');
1229     }
1230 softime 10808
1231 softime 8593 // MODE AJOUTER
1232     if ($this->getParameter('maj') == 0) {
1233 softime 10573 $form->setType('commentaire', 'textareahidden');
1234     // Si l'option est active passage du champ date en lecture seule
1235     if ($this->f->is_option_date_evenement_instruction_lecture_seule($collectivite_di) === true) {
1236     $form->setType("date_evenement", "hiddenstaticdate");
1237     } else {
1238     $form->setType("date_evenement", "date");
1239     }
1240 softime 8989 if ($this->is_in_context_of_foreign_key("evenement", $this->getParameter("retourformulaire"))) {
1241 softime 8593 $form->setType("evenement", "selecthiddenstatic");
1242     } else {
1243     $form->setType("evenement", "select");
1244     }
1245 softime 8989 if ($this->is_in_context_of_foreign_key("signataire_arrete", $this->getParameter("retourformulaire"))) {
1246 softime 8593 $form->setType("signataire_arrete", "selecthiddenstatic");
1247     } else {
1248     $form->setType("signataire_arrete", "select");
1249     }
1250     if ($this->is_option_redaction_libre_enabled() === true) {
1251     $form->setType("flag_edition_integrale", "select");
1252     }
1253 mbroquet 3730 }
1254    
1255 softime 8593 // MODE MODIFIER
1256     if ($this->getParameter('maj') == 1) {
1257 softime 10573 // Si l'option est active passage du champ date en lecture seule
1258     if ($this->f->is_option_date_evenement_instruction_lecture_seule($collectivite_di) === true) {
1259     $form->setType("date_evenement", "hiddenstaticdate");
1260     } else {
1261     $form->setType("date_evenement", "date");
1262     }
1263 softime 8593 $form->setType("evenement", "selecthiddenstatic");
1264     if ($this->has_an_edition() === true) {
1265     $form->setType('lettretype', 'hiddenstatic');
1266 softime 8989 if ($this->is_in_context_of_foreign_key("signataire_arrete", $this->getParameter("retourformulaire"))) {
1267 softime 8593 $form->setType("signataire_arrete", "selecthiddenstatic");
1268     } else {
1269     $form->setType("signataire_arrete", "select");
1270     }
1271     if ($this->getVal("flag_edition_integrale") == "t") {
1272     $form->setType("titre_om_htmletat", "htmlEtat");
1273     $form->setType("corps_om_htmletatex", "htmlEtatEx");
1274     } else {
1275     $form->setType("complement_om_html", "html");
1276     $form->setType("complement2_om_html", "html");
1277     $form->setType("complement3_om_html", "html");
1278     $form->setType("complement4_om_html", "html");
1279     $form->setType('bible_auto', 'httpclick');
1280     $form->setType('bible', 'httpclick');
1281     $form->setType('bible2', 'httpclick');
1282     $form->setType('bible3', 'httpclick');
1283     $form->setType('bible4', 'httpclick');
1284     }
1285     if ($this->f->is_option_preview_pdf_enabled($collectivite_di) === true) {
1286     //
1287     $form->setType('btn_refresh', 'httpclickbutton');
1288     $form->setType('btn_preview', 'httpclickbutton');
1289     $form->setType('btn_redaction', 'httpclickbutton');
1290 softime 11876 // /!\ le type du champs est utilisé dans un selecteur dans le jscript.js
1291     // pour identifiant le champ de prévisualisation et régler sa taille à
1292     // l'affichage du champ. En cas de modification, le selecteur doit également
1293     // être mis à jour
1294 softime 11418 $form->setType('live_preview', 'previsualiser_pdf');
1295 softime 7521 }
1296 softime 8593
1297 mbroquet 3730 // necessaire pour calcul de date en modification
1298     //$form->setType('delai', 'hiddenstatic');
1299     // les administrateurs technique et fonctionnel peuvent
1300     // modifier tous les champs de date
1301     // si l'instruction a déjà été finalisée au moins une fois
1302 softime 7996 if (($this->f->isAccredited(array($this->get_absolute_class_name(), $this->get_absolute_class_name()."modification_dates"), "OR")
1303 softime 6565 || $this->f->isAccredited(array('instruction', 'instruction_modification_dates'), "OR"))
1304 mbroquet 3730 && $this->getVal("date_finalisation_courrier") != '') {
1305 softime 8593 //
1306 mbroquet 3730 $form->setType('date_envoi_signature', 'date');
1307     $form->setType('date_retour_signature', 'date');
1308 softime 10573 if ($this->is_sent_for_signature() === true
1309     && $this->is_signed() === true) {
1310     //
1311     $form->setType("date_envoi_signature", "datereadonly");
1312     $form->setType("date_retour_signature", "datereadonly");
1313     }
1314 mbroquet 3730 $form->setType('date_envoi_rar', 'date');
1315     $form->setType('date_retour_rar', 'date');
1316     $form->setType('date_envoi_controle_legalite', 'date');
1317 softime 11418 if ($this->is_sent_to_cl() === true) {
1318 softime 12124 $form->setType("date_envoi_controle_legalite", "datedisabled");
1319 softime 11418 }
1320 mbroquet 3730 $form->setType('date_retour_controle_legalite', 'date');
1321     $form->setType('date_finalisation_courrier', 'date');
1322     }
1323     }
1324     }
1325    
1326 softime 10808 // MODE CONSULTER + SUPPRIMER + SUIVI DES DATES 125 + NOTIFICATION MANUELLE
1327 softime 8593 if ($this->getParameter('maj') == 3
1328     || $this->getParameter('maj') == 2
1329 softime 10808 || $this->getParameter('maj') == 125
1330     || $this->getParameter('maj') == 410) {
1331 softime 8593 //
1332     $form->setType("date_evenement", "datestatic");
1333     $form->setType("evenement", "selecthiddenstatic");
1334     if ($this->has_an_edition() === true) {
1335     $form->setType('lettretype', 'hiddenstatic');
1336     $form->setType("signataire_arrete", "selecthiddenstatic");
1337     if ($this->getVal("om_final_instruction") == 't') {
1338     $form->setType('om_final_instruction_utilisateur', 'textareastatic');
1339     } else {
1340     $form->setType('om_final_instruction_utilisateur', 'hidden');
1341     }
1342     }
1343 softime 10573 if ($this->evenement_has_a_commentaire($this->getVal('evenement')) === true ) {
1344     $form->setType('commentaire', 'textareastatic');
1345     }
1346 mbroquet 3730 }
1347    
1348 softime 10808 // MODE CONSULTER + SUPPRIMER + NOTIFICATION MANUELLE
1349     if ($this->getParameter('maj') == 3
1350     || $this->getParameter('maj') == 2
1351     || $this->getParameter('maj') == 410) {
1352 softime 10573 // Si il n'y a pas de lettre type (edition) associé à l'événement
1353     // les dates de suivi ne sont pas affichée
1354 softime 8593 if ($this->has_an_edition() === true) {
1355 softime 10573 $form->setType('date_envoi_signature', 'datestatic');
1356     $form->setType('date_retour_signature', 'datestatic');
1357     $form->setType('date_envoi_rar', 'datestatic');
1358     $form->setType('date_retour_rar', 'datestatic');
1359     $form->setType('date_envoi_controle_legalite', 'datestatic');
1360     $form->setType('date_retour_controle_legalite', 'datestatic');
1361     $form->setType('date_finalisation_courrier', 'datestatic');
1362 softime 8593 if ($this->getVal("flag_edition_integrale") == "t") {
1363     $form->setType("titre_om_htmletat", "htmlstatic");
1364     $form->setType("corps_om_htmletatex", "htmlstatic");
1365     } else {
1366     $form->setType("complement_om_html", "htmlstatic");
1367     $form->setType("complement2_om_html", "htmlstatic");
1368     $form->setType("complement3_om_html", "htmlstatic");
1369     $form->setType("complement4_om_html", "htmlstatic");
1370     }
1371 mbroquet 3730 }
1372     }
1373 softime 8593
1374     // MODE SUIVI DES DATES 125
1375     if ($this->getParameter('maj') == 125) {
1376     $form->setType("date_evenement", "hiddenstaticdate");
1377     $form->setType('om_final_instruction_utilisateur', 'hiddenstatic');
1378     $form->setType('date_envoi_signature', 'date');
1379     $form->setType('date_retour_signature', 'date');
1380 softime 10573 if ($this->is_sent_for_signature() === true
1381     || $this->is_signed() === true) {
1382     //
1383     $form->setType("date_envoi_signature", "datereadonly");
1384     $form->setType("date_retour_signature", "datereadonly");
1385     }
1386 softime 8593 $form->setType('date_envoi_rar', 'date');
1387     $form->setType('date_retour_rar', 'date');
1388     $form->setType('date_envoi_controle_legalite', 'date');
1389 softime 11418 if ($this->is_sent_to_cl() === true) {
1390 softime 12124 $form->setType("date_envoi_controle_legalite", "datedisabled");
1391 softime 11418 }
1392 softime 8593 $form->setType('date_retour_controle_legalite', 'date');
1393     $form->setType('date_finalisation_courrier', 'date');
1394     }
1395 softime 10573
1396     if ($maj == 401) {
1397     foreach ($this->champs as $champ) {
1398     $form->setType($champ, 'hidden');
1399     }
1400 softime 11418 $form->setType('preview_edition', 'previsualiser');
1401 softime 10573 }
1402 softime 12124
1403     // Si l'instruction a été envoyé au contrôle de légalité et que la
1404     // tâche envoi_cl lié n'a pas encore été traité il faut indiquer à
1405     // l'utilisateur que l'envoi au cl est en cours de traitement.
1406     if ($this->is_sent_to_cl() === true
1407     && empty($this->getVal('date_envoi_controle_legalite'))
1408     && $maj == 3) {
1409     $form->setType("date_envoi_controle_legalite", "hiddenstatic");
1410     }
1411 mbroquet 3730 }
1412    
1413 softime 8593 function setOnchange(&$form,$maj){
1414     parent::setOnchange($form,$maj);
1415    
1416     // MODE AJOUTER
1417     if ($this->getParameter('maj') == 0) {
1418 softime 10573 $form->setOnchange(
1419     "evenement",
1420     "manage_instruction_evenement_lettretype(this.value, '".addslashes($this->getParameter('idxformulaire'))."');
1421     manage_instruction_evenement_commentaire(this.value, '".addslashes($this->getParameter('idxformulaire'))."');"
1422     );
1423 softime 8593 }
1424     }
1425    
1426     function evenement_has_an_edition($evenement_id) {
1427     $evenement = $this->get_inst_evenement($evenement_id);
1428     $lettretype = $evenement->getVal('lettretype');
1429     if ($lettretype !== '' && $lettretype !== null) {
1430     return true;
1431     }
1432     return false;
1433     }
1434    
1435     function view_evenement_has_an_edition_json() {
1436     $json_return = array(
1437     "lettretype" => $this->evenement_has_an_edition($this->f->get_submitted_get_value('evenement_id')),
1438     "option_redaction_libre_enabled" => $this->is_option_redaction_libre_enabled(),
1439     );
1440     echo json_encode($json_return);
1441     }
1442    
1443 softime 10573 function evenement_has_a_commentaire($evenement_id) {
1444     $evenement = $this->get_inst_evenement($evenement_id);
1445     return $this->get_boolean_from_pgsql_value($evenement->getVal('commentaire'));
1446     }
1447    
1448     function view_evenement_has_a_commentaire_json() {
1449     $json_return = array(
1450     "commentaire" => $this->evenement_has_a_commentaire($this->f->get_submitted_get_value('evenement_id'))
1451     );
1452     echo json_encode($json_return);
1453     }
1454    
1455 softime 11418
1456 softime 8989 /**
1457 softime 11418 * CONDITION - can_be_sended_to_cl
1458 softime 8989 *
1459 softime 11418 * Vérifie que le contrôle de légalité est disponible
1460     *
1461     * @return boolean
1462     */
1463     function can_be_sended_to_cl() {
1464     // Si l'instruction a une édition
1465     // et que l'événement est paramétré pour envoyer le contrôle de légalité
1466     // par Plat'AU
1467     // et que la date de retour signature est renseignée
1468     // et que la date d'envoi au contrôle légalité n'est pas renseignée
1469     // et qu'il n'existe pas de task envoi_CL en cours (!= done ou canceled)
1470     if ($this->has_an_edition() === true) {
1471     $inst_di = $this->get_inst_dossier($this->getVal('dossier'));
1472     $inst_evenement = $this->get_inst_evenement($this->getVal('evenement'));
1473     if ($inst_evenement->getVal('envoi_cl_platau') === 't'
1474     && empty($this->getVal('date_retour_signature')) === false
1475     && empty($this->getVal('date_envoi_controle_legalite')) === true
1476     && $this->getVal('envoye_cl_platau') === 'f'
1477     && $this->f->is_type_dossier_platau($inst_di->getVal('dossier_autorisation')) === true
1478     && $inst_di->getVal('etat_transmission_platau') !== 'jamais_transmissible') {
1479     //
1480     return true;
1481     }
1482     }
1483     //
1484     return false;
1485     }
1486    
1487     /**
1488     *
1489 softime 8989 * @return string
1490     */
1491     function get_var_sql_forminc__sql_signataire_arrete() {
1492 softime 11585 return sprintf(
1493     "SELECT
1494     signataire_arrete.signataire_arrete,
1495     CONCAT_WS(
1496     ' - ',
1497     CONCAT_WS(' ', signataire_arrete.prenom, signataire_arrete.nom),
1498     signataire_habilitation.libelle,
1499     signataire_arrete.description
1500     )
1501     FROM
1502     %1\$ssignataire_arrete
1503     LEFT JOIN %1\$ssignataire_habilitation
1504     ON signataire_arrete.signataire_habilitation = signataire_habilitation.signataire_habilitation
1505     WHERE
1506     ((signataire_arrete.om_validite_debut IS NULL
1507     AND (signataire_arrete.om_validite_fin IS NULL
1508     OR signataire_arrete.om_validite_fin > CURRENT_DATE))
1509     OR (signataire_arrete.om_validite_debut <= CURRENT_DATE
1510     AND (signataire_arrete.om_validite_fin IS NULL
1511     OR signataire_arrete.om_validite_fin > CURRENT_DATE)))
1512     ORDER BY
1513     signataire_arrete.prenom,
1514     signataire_arrete.nom",
1515     DB_PREFIXE
1516     );
1517 softime 8989 }
1518    
1519     /**
1520     *
1521     * @return string
1522     */
1523     function get_var_sql_forminc__sql_signataire_arrete_by_id() {
1524 softime 11585 return sprintf(
1525     "SELECT
1526     signataire_arrete.signataire_arrete,
1527     CONCAT_WS(
1528     ' - ',
1529     CONCAT_WS(' ', signataire_arrete.prenom, signataire_arrete.nom),
1530     signataire_habilitation.libelle,
1531     signataire_arrete.description
1532     )
1533     FROM
1534     %1\$ssignataire_arrete
1535     LEFT JOIN %1\$ssignataire_habilitation
1536     ON signataire_arrete.signataire_habilitation = signataire_habilitation.signataire_habilitation
1537     WHERE
1538     signataire_arrete.signataire_arrete = <idx>",
1539     DB_PREFIXE
1540     );
1541 softime 8989 }
1542    
1543     /**
1544     *
1545     * @return string
1546     */
1547     function get_var_sql_forminc__sql_signataire_arrete_by_di() {
1548 softime 11585 return sprintf(
1549     "SELECT
1550     signataire_arrete.signataire_arrete,
1551     CONCAT_WS(
1552     ' - ',
1553     CONCAT_WS(' ', signataire_arrete.prenom, signataire_arrete.nom),
1554     signataire_habilitation.libelle,
1555     signataire_arrete.description
1556     )
1557     FROM
1558     %1\$ssignataire_arrete
1559     LEFT JOIN %1\$som_collectivite
1560     ON signataire_arrete.om_collectivite = om_collectivite.om_collectivite
1561     LEFT JOIN %1\$ssignataire_habilitation
1562     ON signataire_arrete.signataire_habilitation = signataire_habilitation.signataire_habilitation
1563     WHERE
1564     ((signataire_arrete.om_validite_debut IS NULL
1565     AND (signataire_arrete.om_validite_fin IS NULL
1566     OR signataire_arrete.om_validite_fin > CURRENT_DATE))
1567     OR (signataire_arrete.om_validite_debut <= CURRENT_DATE
1568     AND (signataire_arrete.om_validite_fin IS NULL
1569     OR signataire_arrete.om_validite_fin > CURRENT_DATE)))
1570     AND (om_collectivite.niveau = '2'
1571     OR signataire_arrete.om_collectivite = <collectivite_di>)
1572     ORDER BY
1573     signataire_arrete.prenom, signataire_arrete.nom",
1574     DB_PREFIXE
1575     );
1576 softime 8989 }
1577    
1578     /**
1579     *
1580     * @return string
1581     */
1582     function get_var_sql_forminc__sql_signataire_arrete_defaut() {
1583 softime 11585 return sprintf(
1584     "SELECT
1585     signataire_arrete.signataire_arrete,
1586     CONCAT_WS(
1587     ' - ',
1588     CONCAT_WS(' ', signataire_arrete.prenom, signataire_arrete.nom),
1589     signataire_habilitation.libelle,
1590     signataire_arrete.description
1591     )
1592     FROM
1593     %1\$ssignataire_arrete
1594     LEFT JOIN %1\$ssignataire_habilitation
1595     ON signataire_arrete.signataire_habilitation = signataire_habilitation.signataire_habilitation
1596     WHERE
1597     ((signataire_arrete.om_validite_debut IS NULL
1598     AND (signataire_arrete.om_validite_fin IS NULL
1599     OR signataire_arrete.om_validite_fin > CURRENT_DATE))
1600     OR (signataire_arrete.om_validite_debut <= CURRENT_DATE
1601     AND (signataire_arrete.om_validite_fin IS NULL
1602     OR signataire_arrete.om_validite_fin > CURRENT_DATE)))
1603     AND signataire_arrete.defaut IS TRUE
1604     ORDER BY
1605     signataire_arrete.prenom, signataire_arrete.nom",
1606     DB_PREFIXE
1607     );
1608 softime 8989 }
1609    
1610     /**
1611     *
1612     * @return string
1613     */
1614     function get_var_sql_forminc__sql_signataire_arrete_defaut_by_di() {
1615 softime 11585 return sprintf(
1616     "SELECT
1617     signataire_arrete.signataire_arrete,
1618     CONCAT_WS(
1619     ' - ',
1620     CONCAT_WS(' ', signataire_arrete.prenom, signataire_arrete.nom),
1621     signataire_habilitation.libelle,
1622     signataire_arrete.description
1623     )
1624     FROM
1625     %1\$ssignataire_arrete
1626     LEFT JOIN %1\$ssignataire_habilitation
1627     ON signataire_arrete.signataire_habilitation = signataire_habilitation.signataire_habilitation
1628     LEFT JOIN %1\$som_collectivite
1629     ON signataire_arrete.om_collectivite = om_collectivite.om_collectivite
1630     WHERE
1631     ((signataire_arrete.om_validite_debut IS NULL
1632     AND (signataire_arrete.om_validite_fin IS NULL
1633     OR signataire_arrete.om_validite_fin > CURRENT_DATE))
1634     OR (signataire_arrete.om_validite_debut <= CURRENT_DATE
1635     AND (signataire_arrete.om_validite_fin IS NULL
1636     OR signataire_arrete.om_validite_fin > CURRENT_DATE)))
1637     AND signataire_arrete.defaut IS TRUE
1638     AND (om_collectivite.niveau = '2'
1639     OR signataire_arrete.om_collectivite = <collectivite_di>)
1640     ORDER BY
1641     signataire_arrete.prenom,
1642     signataire_arrete.nom",
1643     DB_PREFIXE
1644     );
1645 softime 8989 }
1646    
1647     /**
1648     * SETTER_FORM - setSelect.
1649     *
1650     * @return void
1651     */
1652     function setSelect(&$form, $maj, &$dnu1 = null, $dnu2 = null) {
1653     //parent::setSelect($form, $maj);
1654 mbroquet 3730 /**
1655     * On ne surcharge pas la méthode parent car une requête sur la table
1656     * dossier est mauvaise pour les performances, car la requête qui
1657     * concerne evenement est plus complexe que celle générée et car les
1658     * champs action, avis_decision et etat ne sont pas utilisés comme des
1659     * select
1660     */
1661     //// action
1662 softime 8989 //$this->init_select($form, $this->f->db, $maj, null, "action",
1663 mbroquet 3730 // $sql_action, $sql_action_by_id, false);
1664    
1665     //// avis_decision
1666 softime 8989 //$this->init_select($form, $this->f->db, $maj, null, "avis_decision",
1667 mbroquet 3730 // $sql_avis_decision, $sql_avis_decision_by_id, false);
1668    
1669     //// dossier
1670 softime 8989 //$this->init_select($form, $this->f->db, $maj, null, "dossier",
1671 mbroquet 3730 // $sql_dossier, $sql_dossier_by_id, false);
1672    
1673     //// etat
1674 softime 8989 //$this->init_select($form, $this->f->db, $maj, null, "etat",
1675 mbroquet 3730 // $sql_etat, $sql_etat_by_id, false);
1676    
1677     //// evenement
1678 softime 8989 //$this->init_select($form, $this->f->db, $maj, null, "evenement",
1679 mbroquet 3730 // $sql_evenement, $sql_evenement_by_id, false);
1680    
1681     // signataire_arrete
1682     // si contexte DI
1683     if ($this->getParameter("retourformulaire") == "dossier"
1684 softime 12847 || $this->f->contexte_dossier_instruction()) {
1685 mbroquet 3730 // on recupère les signataires de la multicollectivité et de celle du DI
1686 softime 7996 $di = $this->f->get_inst__om_dbform(array(
1687     "obj" => "dossier_instruction",
1688     "idx" => $this->getParameter('idxformulaire'),
1689     ));
1690 softime 8989 $sql_signataire_arrete_by_di = str_replace(
1691     '<collectivite_di>',
1692     $di->getVal("om_collectivite"),
1693     $this->get_var_sql_forminc__sql("signataire_arrete_by_di")
1694     );
1695     $this->init_select(
1696     $form,
1697     $this->f->db,
1698     $maj,
1699     null,
1700     "signataire_arrete",
1701     $sql_signataire_arrete_by_di,
1702     $this->get_var_sql_forminc__sql("signataire_arrete_by_id"),
1703     true
1704     );
1705 mbroquet 3730 } else {
1706 softime 8989 $this->init_select(
1707     $form,
1708     $this->f->db,
1709     $maj,
1710     null,
1711     "signataire_arrete",
1712     $this->get_var_sql_forminc__sql("signataire_arrete"),
1713     $this->get_var_sql_forminc__sql("signataire_arrete_by_id"),
1714     true
1715     );
1716 mbroquet 3730 }
1717    
1718     /**
1719     * Gestion du filtre sur les événements de workflow disponibles
1720     * On récupère ici en fonction de l'état du dossier d'instruction en
1721     * cours et du type du dossier d'instruction en cours la liste
1722     * événements disponibles.
1723     */
1724     if ($maj == 0) {
1725     // Récupération des événements par une jointure entre la table dossier
1726     // et la table transition et la table evenement et la table
1727     // lien_dossier_instruction_type_evenement en fonction de l'identifiant
1728     // du dossier d'instruction en cours
1729     $sql = "SELECT
1730     evenement.evenement,
1731     evenement.libelle as lib
1732     FROM ".DB_PREFIXE."dossier
1733     INNER JOIN ".DB_PREFIXE."lien_dossier_instruction_type_evenement
1734     ON dossier.dossier_instruction_type=lien_dossier_instruction_type_evenement.dossier_instruction_type
1735     INNER JOIN ".DB_PREFIXE."evenement
1736     ON evenement.evenement=lien_dossier_instruction_type_evenement.evenement
1737     INNER JOIN ".DB_PREFIXE."transition
1738     ON evenement.evenement = transition.evenement
1739     AND dossier.etat=transition.etat
1740 softime 8989 WHERE dossier.dossier='".$this->getParameter("idxformulaire")."' ";
1741 mbroquet 3730
1742     // Si changement de décision par instructeur commune
1743     if($this->f->isUserInstructeur() === true
1744 softime 8989 && $this->getDivisionFromDossier($this->getParameter("idxformulaire")) != $_SESSION["division"]
1745     && $this->isInstrCanChangeDecision($this->getParameter("idxformulaire")) === true) {
1746 mbroquet 3730 $sql .= "AND evenement.type IN ('arrete', 'changement_decision') ";
1747     }
1748     $sql .= "ORDER BY evenement.libelle, evenement.action";
1749 softime 8989 $res = $this->f->db->query($sql);
1750 softime 12847 $this->addToLog(__METHOD__."(): db->query(\"".$sql."\");", VERBOSE_MODE);
1751     $this->f->isDatabaseError($res);
1752 mbroquet 3730 // Remplissage du tableau du select
1753     $contenu = array(
1754     0 => array("",),
1755     1 => array(_('choisir')." "._('evenement'),)
1756     );
1757     while ($row=& $res->fetchRow()) {
1758     $contenu[0][] = $row[0];
1759     $contenu[1][] = $row[1];
1760     }
1761     $form->setSelect("evenement", $contenu);
1762 softime 8593
1763 mbroquet 3730 } else {
1764 softime 14064 // Instanciation de l'événement pour récupérer son libellé
1765     $evenement = $this->f->get_inst__om_dbform(array(
1766     "obj" => "evenement",
1767     "idx" => $this->getVal("evenement"),
1768     ));
1769    
1770 mbroquet 3730 $contenu = array(
1771     0 => array($this->getVal("evenement"),),
1772 softime 14064 1 => array($evenement->getVal('libelle'),)
1773 mbroquet 3730 );
1774     $form->setSelect("evenement", $contenu);
1775     }
1776    
1777     /**
1778     * Gesion des liens vers la bible
1779     */
1780     // lien bible_auto
1781     $contenu = array(_("automatique"));
1782     $form->setSelect("bible_auto",$contenu);
1783     // lien bible1
1784     $contenu = array(_("bible"));
1785     $form->setSelect("bible",$contenu);
1786     // lien bible2
1787     $contenu = array(_("bible"));
1788     $form->setSelect("bible2",$contenu);
1789     // lien bible3
1790     $contenu = array(_("bible"));
1791     $form->setSelect("bible3",$contenu);
1792     // lien bible4
1793     $contenu = array(_("bible"));
1794     $form->setSelect("bible4",$contenu);
1795 softime 7521
1796     if ($maj == 1) {
1797     $base64 = $this->init_pdf_temp();
1798     $form->setSelect('live_preview', array('base64'=>$base64));
1799 softime 8593 $form->setSelect("btn_refresh", array(_('Prévisualiser')));
1800     $form->setSelect("btn_preview", array(_('Prévisualiser >>')));
1801     $form->setSelect("btn_redaction", array(_('<< Rédiger')));
1802 softime 7521 }
1803 softime 8593
1804     // Selection du type de rédaction à l'ajout
1805     $content = array(
1806     0 => array('f', 't', ),
1807     1 => array(_('Rédaction par compléments'), _('Rédaction libre'), ),
1808     );
1809     $form->setSelect('flag_edition_integrale', $content);
1810 softime 10573
1811     $contenu = array();
1812     foreach(array('waiting', 'in_progress', 'canceled', 'expired', 'finished') as $value) {
1813     $contenu[0][] = $value;
1814     $contenu[1][] = $this->get_trad_for_statut($value);
1815     }
1816     $form->setSelect('statut_signature', $contenu);
1817    
1818    
1819     if ($maj == 401) {
1820     $file = $this->f->storage->get($this->getVal('om_fichier_instruction'));
1821 softime 11418 $form->setSelect('preview_edition', array(
1822     'base64' => base64_encode($file['file_content']),
1823     'mimetype' => $file['metadata']['mimetype'],
1824     'label' => 'instruction_'.$this->getVal($this->clePrimaire),
1825     'href' => sprintf(
1826     '../app/index.php?module=form&snippet=file&obj=instruction&champ=om_fichier_instruction&id=%1$s',
1827     $this->getVal($this->clePrimaire)
1828     )
1829     ));
1830 softime 10573 }
1831 mbroquet 3730 }
1832    
1833 softime 8989 function cleSecondaire($id, &$dnu1 = null, $val = array(), $dnu2 = null) {
1834 mbroquet 3730 //
1835 softime 11228 // Vérifie uniquementla cle secondaire : demande
1836     $this->rechercheTable($this->f->db, "demande", "instruction_recepisse", $id);
1837 mbroquet 3730
1838     $id = $this->getVal($this->clePrimaire);
1839    
1840     //Requête de vérification que cet événement d'instruction n'est pas lié
1841     //à la création d'un dossier d'instruction
1842 softime 14064 $qres = $this->f->get_one_result_from_db_query(
1843     sprintf(
1844     'SELECT
1845     demande_type.dossier_instruction_type
1846     FROM
1847     %1$sdemande_type
1848     LEFT JOIN %1$sdemande
1849     ON demande.demande_type = demande_type.demande_type
1850     WHERE
1851     demande.instruction_recepisse = \'%2$d\'',
1852     DB_PREFIXE,
1853     intval($id)
1854     ),
1855     array(
1856     "origin" => __METHOD__,
1857     )
1858     );
1859 mbroquet 3730
1860     // Aucune clé secondaire n'a été trouvée ou c'est un événement sans
1861     //création de dossier d'instruction, l'événement d'instruction peut être
1862     //supprimé
1863 softime 14064 if ( $this->correct !== false || $qres['result'] == null || $qres['result'] == ""){
1864 mbroquet 3730 // Requête de vérification que cet événement d'instruction est lié
1865     // à une demande
1866 softime 14064 $qres = $this->f->get_one_result_from_db_query(
1867     sprintf(
1868     'SELECT
1869     demande
1870     FROM
1871     %1$sdemande
1872     WHERE
1873     instruction_recepisse = \'%2$d\'',
1874     DB_PREFIXE,
1875     intval($id)
1876     ),
1877     array(
1878     "origin" => __METHOD__,
1879     )
1880     );
1881 mbroquet 3730
1882     //Si c'est un événement d'instruction lié à une demande
1883 softime 14064 if ($qres['result'] != null || $qres['result'] != ""){
1884 softime 7996 $demande = $this->f->get_inst__om_dbform(array(
1885     "obj" => "demande",
1886 softime 14064 "idx" => $qres['result'],
1887 softime 7996 ));
1888 mbroquet 3730
1889 softime 14064 //On met à jour la demande en supprimant la liaison vers
1890 mbroquet 3730 //l'événement d'instruction
1891     $demande->setParameter("maj", 1);
1892     $valF = array();
1893     foreach($demande->champs as $identifiant => $champ) {
1894     $valF[$champ] = $demande->val[$identifiant];
1895     }
1896     $valF['date_demande']=$demande->dateDBToForm($valF['date_demande']);
1897     $valF['instruction_recepisse']=NULL;
1898 softime 8989 $ret = $demande->modifier($valF);
1899 mbroquet 3730 }
1900    
1901     /**
1902     * Vérification que l'élément supprimé est le dernier pour pouvoir
1903     * remodifier les données de manière itérative.
1904     */
1905 softime 14064 $qres = $this->f->get_one_result_from_db_query(
1906     sprintf(
1907     'SELECT
1908     max(instruction)
1909     FROM
1910     %1$sinstruction
1911     WHERE
1912     dossier = \'%2$s\'',
1913     DB_PREFIXE,
1914     $this->f->db->escapeSimple($this->getParameter("idxformulaire"))
1915     ),
1916     array(
1917     "origin" => __METHOD__,
1918     )
1919     );
1920    
1921 mbroquet 3730 // Si on se trouve effectivement sur le dernier evenement d'instruction
1922 softime 14064 // alors on valide la suppression sinon on l'annule
1923     $this->correct = false;
1924     $message = __("Seul le dernier evenement d'instruction peut etre supprime.");
1925     if ($qres['result'] == $id) {
1926 mbroquet 3730 // Alors on valide la suppression
1927     $this->correct = true;
1928 softime 14064 $message = __('Destruction_chronologique');
1929 mbroquet 3730 }
1930 softime 14064 $this->addToMessage($message);
1931 mbroquet 3730 }
1932     }
1933    
1934     /**
1935     * Vérification de la possibilité ou non de modifier des dates de suivi
1936     * @param string $champ champ date à vérifier
1937     */
1938     function updateDate($champ) {
1939    
1940     //Si le retourformulaire est "dossier_instruction"
1941     if ($this->getParameter("retourformulaire") == "dossier"
1942 softime 12847 || $this->f->contexte_dossier_instruction()) {
1943 mbroquet 3730
1944     // Vérification de la possibilité de modifier les dates si déjà éditées
1945     if($this->valF[$champ] != "" AND !$this->f->user_is_admin) {
1946     // si l'utilisateur n'est pas un admin
1947     if($this->getVal($champ) != "" AND $this->getVal($champ) != $this->valF[$champ]) {
1948     $this->correct = false;
1949     $this->addToMessage(_("Les dates de suivis ne peuvent etre modifiees"));
1950     }
1951     }
1952     }
1953    
1954     //
1955     return true;
1956     }
1957    
1958 softime 8989 /**
1959     * SETTER_FORM - setValsousformulaire (setVal).
1960     *
1961     * @return void
1962     */
1963     function setValsousformulaire(&$form, $maj, $validation, $idxformulaire, $retourformulaire, $typeformulaire, &$dnu1 = null, $dnu2 = null) {
1964     // parent::setValsousformulaire($form, $maj, $validation, $idxformulaire, $retourformulaire, $typeformulaire);
1965 mbroquet 3730 //
1966 softime 8989 $this->retourformulaire = $retourformulaire;
1967     //
1968 mbroquet 3730 if ($maj == 0) {
1969 softime 8989 $form->setVal("destinataire", $this->getParameter("idxformulaire"));
1970     $form->setVal("dossier", $this->getParameter("idxformulaire"));
1971 mbroquet 3730 }
1972 softime 12124
1973     // Si l'instruction a été envoyé au contrôle de légalité et que la
1974     // tâche envoi_cl lié n'a pas encore été traité il faut indiquer à
1975     // l'utilisateur que l'envoi au cl est en cours de traitement.
1976     if ($this->is_sent_to_cl() === true
1977     && empty($this->getVal('date_envoi_controle_legalite'))
1978     && $maj == 3) {
1979     $form->setVal("date_envoi_controle_legalite", __("En cours de traitement."));
1980     }
1981 mbroquet 3730 //
1982     $this->set_form_default_values($form, $maj, $validation);
1983     }
1984    
1985     /**
1986 softime 8989 * SETTER_FORM - set_form_default_values (setVal).
1987     *
1988     * @return void
1989 mbroquet 3730 */
1990     function set_form_default_values(&$form, $maj, $validation) {
1991 softime 8989 //
1992 mbroquet 3730 if ($maj == 0) {
1993     // si contexte DI
1994     if ($this->getParameter("retourformulaire") == "dossier"
1995 softime 12847 || $this->f->contexte_dossier_instruction()) {
1996 mbroquet 3730 // on recupère les signataires de la multicollectivité et de celle du DI
1997 softime 7996 $di = $this->f->get_inst__om_dbform(array(
1998     "obj" => "dossier_instruction",
1999 softime 8989 "idx" => $this->getParameter("idxformulaire"),
2000 softime 7996 ));
2001 softime 8989 $sql = str_replace(
2002     "<collectivite_di>",
2003     $di->getVal("om_collectivite"),
2004     $this->get_var_sql_forminc__sql("signataire_arrete_defaut_by_di")
2005     );
2006 mbroquet 3730 } else {
2007 softime 8989 $sql = $this->get_var_sql_forminc__sql("signataire_arrete_defaut");
2008 mbroquet 3730 }
2009     $res = $this->f->db->query($sql);
2010 softime 8989 $this->f->addToLog(__METHOD__."(): db->query(\"".$sql."\")", VERBOSE_MODE);
2011     $this->f->isDatabaseError($res);
2012 mbroquet 3730 $row = $res->fetchrow(DB_FETCHMODE_ASSOC);
2013 softime 8989 if (isset($row["signataire_arrete"])
2014     && is_numeric($row["signataire_arrete"])) {
2015     //
2016     $form->setVal("signataire_arrete", $row["signataire_arrete"]);
2017 mbroquet 3730 }
2018 softime 8989 // Date du jour
2019     $form->setVal("date_evenement", date("Y-m-d"));
2020 mbroquet 3730 }
2021 softime 8989 //
2022 mbroquet 3730 if ($maj == 0 || $maj == 1 || $maj == 125) {
2023 softime 8989 $form->setVal("bible_auto", "bible_auto()");
2024     $form->setVal("bible", "bible(1)");
2025     $form->setVal("bible2", "bible(2)");
2026     $form->setVal("bible3", "bible(3)");
2027     $form->setVal("bible4", "bible(4)");
2028 mbroquet 3730 }
2029 softime 8989 //
2030 softime 7521 $collectivite_di = $this->get_dossier_instruction_om_collectivite();
2031 softime 8989 if ($maj == 1
2032     && $this->f->is_option_preview_pdf_enabled($collectivite_di) === true
2033 softime 7521 && $this->has_an_edition() === true) {
2034 softime 8989 //
2035     $form->setVal("live_preview", $this->getVal($this->clePrimaire));
2036     $form->setVal("btn_refresh", "reload_pdf_viewer()");
2037     $form->setVal("btn_preview", "show_instr_preview()");
2038     $form->setVal("btn_redaction", "show_instr_redaction()");
2039 softime 7521 }
2040 softime 10808
2041 softime 12654 // Gestion de l'affichage des suivis de notification des demandeurs, des services, des tiers et
2042     // des communes
2043     if ($maj == 3) {
2044     if ($this->can_display_notification_demandeur()) {
2045     $typeNotification = array(
2046     'notification_recepisse',
2047     'notification_instruction',
2048     'notification_decision',
2049     );
2050     $form->setVal("suivi_notification", $this->get_json_suivi_notification($typeNotification, true));
2051     }
2052     if ($this->can_display_notification_service()) {
2053     $form->setVal("suivi_notification_service", $this->get_json_suivi_notification(array('notification_service_consulte')));
2054     }
2055     if ($this->can_display_notification_tiers()) {
2056     $form->setVal("suivi_notification_tiers", $this->get_json_suivi_notification(array('notification_tiers_consulte')));
2057     }
2058     if ($this->can_display_notification_commune()) {
2059     $form->setVal("suivi_notification_commune", $this->get_json_suivi_notification(array('notification_depot_demat', 'notification_commune')));
2060     }
2061 softime 10808 }
2062 mbroquet 3730 }
2063    
2064     function setLayout(&$form, $maj){
2065 softime 12124 // En consultation, pour les dossiers qui n'ont pas été transmis par le portail
2066     // citoyen, si la notification des demandeurs est activée sur l'évenement
2067     // d'instruction et que le paramétrage du demandeur principal n'est pas
2068     // correct alors un message a destination de l'instructeur est affiché.
2069     if ($maj == 3) {
2070 softime 12847 // Si le dossier n'a pas été déposé sur le portail citoyen (ou si
2071     // la requête permettant de savoir le type de demande à échouée) et si
2072     // la notification se fait par mail vérifie si il y a des erreurs de
2073     // paramétrage et si c'est le cas on affiche un message d'information
2074     $collectivite = $this->get_dossier_instruction_om_collectivite($this->getVal('dossier'));
2075     $categorieNotif = $this->f->get_param_option_notification($collectivite);
2076     if (($this->dossier_depose_sur_portail() == null ||
2077     ! $this->dossier_depose_sur_portail()) &&
2078 softime 14064 $categorieNotif === 'mail' ) {
2079 softime 12124 $erreurParam = $this->get_info_notification_fail();
2080     // Récupération de l'évenement d'instruction
2081     $instEV = $this->get_inst_evenement();
2082     if (! empty($instEV->getVal('notification')) && $erreurParam != array()) {
2083     $class = 'text-info ui-state-highlight ui-state-info';
2084     $message = __("Attention l'envoi de notification automatique n'est pas possible.");
2085     $this->f->display_panel_information(
2086     $class,
2087     $message,
2088     $erreurParam,
2089     __('Veuillez corriger les informations suivantes.'),
2090     'erreur_param_notif'
2091     );
2092     }
2093     }
2094     }
2095 softime 8593 $form->setBloc('evenement','D',"","sousform-instruction-action-".$maj);
2096 mbroquet 3730
2097 softime 8593 $form->setFieldset('evenement','D',_('Evenement'));
2098     $form->setFieldset('om_final_instruction_utilisateur','F','');
2099    
2100     $form->setBloc('om_final_instruction_utilisateur','F');
2101 mbroquet 3730
2102 softime 8593 $form->setBloc('date_finalisation_courrier','D',"","");
2103 mbroquet 3730
2104 softime 8593 $form->setFieldset('date_finalisation_courrier','D',_('Dates'));
2105     $form->setBloc('date_finalisation_courrier','D',"","col_6");
2106     $form->setBloc('date_envoi_controle_legalite','F');
2107 mbroquet 3730
2108 softime 8593 $form->setBloc('date_retour_signature','D',"","col_6");
2109     $form->setBloc('date_retour_controle_legalite','F');
2110     $form->setFieldset('date_retour_controle_legalite','F','');
2111    
2112     $form->setBloc('date_retour_controle_legalite','F');
2113 mbroquet 3730
2114 softime 10573 $form->setBloc('statut_signature','D');
2115     $form->setFieldset('statut_signature','D','Suivi Parapheur');
2116     $form->setBloc('commentaire_signature','F');
2117     $form->setBloc('historique_signature','D');
2118     $form->setFieldset('historique_signature', 'DF', __("Historique"), "collapsible, startClosed");
2119     $form->setBloc('historique_signature','F');
2120     $form->setFieldset('historique_signature','F');
2121    
2122 softime 10808 $form->setFieldset('suivi_notification', 'D', __("Suivi notification"), "collapsible");
2123     $form->setFieldset('suivi_notification','F');
2124 softime 11585 $form->setFieldset('suivi_notification_service', 'D', __("Suivi notification service"), "collapsible");
2125     $form->setFieldset('suivi_notification_service','F');
2126     $form->setFieldset('suivi_notification_tiers', 'D', __("Suivi notification tiers"), "collapsible");
2127     $form->setFieldset('suivi_notification_tiers','F');
2128 softime 12654 $form->setFieldset('suivi_notification_commune', 'D', __("Suivi notification commune"), "collapsible");
2129     $form->setFieldset('suivi_notification_commune','F');
2130 softime 10808
2131 softime 8593 if ($maj == 1) {
2132     // Récupère la collectivité du dossier d'instruction
2133     $collectivite_di = $this->get_dossier_instruction_om_collectivite();
2134 mbroquet 3730
2135 softime 8593 //
2136     if ($this->f->is_option_preview_pdf_enabled($collectivite_di) === true
2137     && $this->has_an_edition() === true) {
2138 softime 7521 //
2139 softime 8593 $form->setBloc('complement_om_html','D',"","container_instr_edition");
2140     $form->setBloc('complement_om_html','D',"","hidelabel box_instr_edition redaction_instr_edition");
2141     $form->setBloc('complement_om_html','D',"","box_instr_edition_main");
2142     $form->setFieldset('complement_om_html','D',_('Complement'));
2143     $form->setFieldset('bible','F','');
2144     $form->setFieldset('complement2_om_html','D',_('Complement 2'));
2145     $form->setFieldset('bible2','F','');
2146     $form->setFieldset('complement3_om_html','D',_('Complement 3'));
2147     $form->setFieldset('bible3','F','');
2148     $form->setFieldset('complement4_om_html','D',_('Complement 4'));
2149     $form->setFieldset('bible4','F','');
2150     $form->setFieldset('titre_om_htmletat','DF',_('Titre'), 'startClosed');
2151     $form->setFieldset('corps_om_htmletatex','DF',_('Corps'));
2152     $form->setBloc('corps_om_htmletatex','F');
2153     $form->setBloc('btn_preview','DF',"","box_instr_edition_btn");
2154     $form->setBloc('btn_preview','F');
2155     $form->setBloc('btn_redaction','D', '',"hidelabel box_instr_edition preview_instr_edition");
2156     $form->setBloc('btn_redaction','DF',"","box_instr_edition_btn");
2157     $form->setFieldset('btn_refresh','D',_('Prévisualisation'), "box_instr_edition_main");
2158     $form->setFieldset('live_preview','F');
2159     $form->setBloc('live_preview','F');
2160     $form->setBloc('live_preview','F');
2161 softime 7521 } else {
2162 softime 8593 $form->setBloc('complement_om_html','D',"","hidelabel");
2163 softime 7521 $form->setFieldset('complement_om_html','D',_('Complement'));
2164     $form->setFieldset('bible','F','');
2165     $form->setFieldset('complement2_om_html','D',_('Complement 2'));
2166     $form->setFieldset('bible2','F','');
2167     $form->setFieldset('complement3_om_html','D',_('Complement 3'));
2168     $form->setFieldset('bible3','F','');
2169     $form->setFieldset('complement4_om_html','D',_('Complement 4'));
2170     $form->setFieldset('bible4','F','');
2171 softime 8593 $form->setFieldset('titre_om_htmletat','DF',_('Titre'), 'startClosed');
2172     $form->setFieldset('corps_om_htmletatex','DF',_('Corps'));
2173     $form->setBloc('corps_om_htmletatex','F');
2174 softime 7521 }
2175 softime 8593 } else {
2176     $form->setBloc('complement_om_html','D',"","hidelabel");
2177     $form->setFieldset('complement_om_html','D',_('Complement'));
2178     $form->setFieldset('bible','F','');
2179     $form->setFieldset('complement2_om_html','D',_('Complement 2'));
2180     $form->setFieldset('bible2','F','');
2181     $form->setFieldset('complement3_om_html','D',_('Complement 3'));
2182     $form->setFieldset('bible3','F','');
2183     $form->setFieldset('complement4_om_html','D',_('Complement 4'));
2184     $form->setFieldset('bible4','F','');
2185     $form->setFieldset('titre_om_htmletat','DF',_('Titre'), 'startClosed');
2186     $form->setFieldset('corps_om_htmletatex','DF',_('Corps'));
2187     $form->setBloc('corps_om_htmletatex','F');
2188 mbroquet 3730 }
2189     }
2190    
2191     function setLib(&$form, $maj) {
2192     //
2193     parent::setLib($form, $maj);
2194     //
2195     $form->setLib('bible_auto', "");
2196     $form->setLib('bible', "");
2197     $form->setLib('bible2', "");
2198     $form->setLib('bible3', "");
2199     $form->setLib('bible4', "");
2200 softime 7521 $form->setLib('btn_refresh', "");
2201 softime 8593 $form->setLib('btn_preview', "");
2202     $form->setLib('btn_redaction', "");
2203 softime 7521 $form->setLib('live_preview', "");
2204 mbroquet 3730 $form->setLib('om_final_instruction_utilisateur', _("finalise par"));
2205 softime 8989 $form->setLib('date_envoi_rar', __("date_envoi_ar"));
2206     $form->setLib('date_retour_rar', __("date_notification"));
2207 softime 10573 $form->setLib('statut_signature', __("statut"));
2208     $form->setLib('commentaire_signature', __("commentaire"));
2209     $form->setLib('historique_signature', '');
2210 softime 10808 $form->setLib('suivi_notification', '');
2211 softime 11585 $form->setLib('suivi_notification_service', '');
2212     $form->setLib('suivi_notification_tiers', '');
2213 softime 12654 $form->setLib('suivi_notification_commune', '');
2214 softime 10573 $form->setLib('preview_edition', "");
2215 softime 8593
2216     // Ajout d'une infobulle d'aide lorsque le formulaire est en mode
2217     // ajout et que l'option de rédaction libre est activée sur la
2218     // collectivité du dossier
2219     if ($maj === '0' && $this->is_option_redaction_libre_enabled() === true) {
2220     //
2221     $help_text_template = '%s <span class="info-16" title="%s"></span>';
2222     $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.");
2223     $form->setLib('flag_edition_integrale', sprintf($help_text_template, _("Type de rédaction"), $help_text));
2224     }
2225     else {
2226     $form->setLib('flag_edition_integrale', _("Type de rédaction"));
2227     }
2228    
2229     // Ajout d'une infobulle d'aide lorsque le formulaire est en mode
2230     // modification et que l'option de prévisualisation de l'édition est
2231     // activée sur la collectivité du dossier
2232     if ($maj === '1'
2233     && $this->f->is_option_preview_pdf_enabled($this->get_dossier_instruction_om_collectivite()) === true) {
2234     //
2235     $help_text_template = '%s <span class="info-16" title="%s"></span>';
2236     $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.");
2237     $form->setLib('date_evenement', sprintf($help_text_template, _('date_evenement'), $help_text));
2238     $form->setLib('signataire_arrete', sprintf($help_text_template, _('signataire_arrete'), $help_text));
2239     }
2240 mbroquet 3730 }
2241    
2242 softime 8989 /**
2243     * TRIGGER - triggerajouter.
2244     *
2245     * @return boolean
2246     */
2247     function triggerajouter($id, &$dnu1 = null, $val = array(), $dnu2 = null) {
2248     $this->addToLog(__METHOD__."(): start", EXTRA_VERBOSE_MODE);
2249 mbroquet 3730 /**
2250     * Le code suivant permet de récupérer des valeurs des tables evenement
2251     * et dossier pour les stocker dans l'instruction :
2252     * DEPUIS L'EVENEMENT
2253     * - action
2254     * - delai
2255     * - accord_tacite
2256     * - etat
2257     * - avis_decision
2258     * - delai_notification
2259     * - lettretype
2260     * - autorite_competente
2261 softime 10573 * - pec_metier
2262 softime 6565 * - complement_om_html
2263     * - complement2_om_html
2264     * - complement3_om_html
2265     * - complement4_om_html
2266     * - complement5_om_html
2267 mbroquet 3730 * DEPUIS LE DOSSIER D'INSTRUCTION
2268     * - archive_delai
2269     * - archive_accord_tacite
2270     * - archive_etat
2271     * - archive_avis
2272     * - date_complet
2273     * - date_rejet
2274     * - date_limite
2275     * - date_notification_delai
2276     * - date_decision
2277     * - date_validite
2278     * - date_achevement
2279     * - date_chantier
2280     * - date_conformite
2281     * - avis_decision
2282     */
2283     // Récupération de tous les paramètres de l'événement sélectionné
2284     $sql = "SELECT * FROM ".DB_PREFIXE."evenement
2285     WHERE evenement=".$this->valF['evenement'];
2286 softime 8989 $res = $this->f->db->query($sql);
2287     $this->addToLog(__METHOD__."(): db->query(\"".$sql."\");", VERBOSE_MODE);
2288 softime 12847 $this->f->isDatabaseError($res);
2289 mbroquet 3730 while ($row=& $res->fetchRow(DB_FETCHMODE_ASSOC)) {
2290     // Récupération de l'identifiant de l'action
2291     // si une action est paramétrée dans l'événement
2292     $this->valF['action'] = NULL;
2293     if (isset($row['action']) and !empty($row['action'])) {
2294     $this->valF['action']=$row['action'];
2295     }
2296     // Récupération de la valeur du délai
2297     $this->valF['delai'] = $row['delai'];
2298     // Récupération de l'identifiant de l'état
2299     // si un état est paramétré dans l'événement
2300     $this->valF['etat']=NULL;
2301     if (isset($row['etat']) and !empty($row['etat'])) {
2302     $this->valF['etat']=$row['etat'];
2303     }
2304     // Récupération de la valeur d'accord tacite
2305     $this->valF['accord_tacite']=$row['accord_tacite'];
2306     // Récupération de la valeur du délai de notification
2307     $this->valF['delai_notification']=$row['delai_notification'];
2308     // Récupération de l'identifiant de l'avis
2309     // si un avis est paramétré dans l'événement
2310     $this->valF['avis_decision'] = NULL;
2311     if(isset($row['avis_decision']) and !empty($row['avis_decision'])) {
2312     $this->valF['avis_decision']=$row['avis_decision'];
2313     }
2314     // Récupération de la valeur de l'autorité compétente
2315     // si l'autorité compétente est paramétré dans l'événement
2316     $this->valF['autorite_competente'] = NULL;
2317     if(isset($row['autorite_competente']) and !empty($row['autorite_competente'])) {
2318     $this->valF['autorite_competente']=$row['autorite_competente'];
2319     }
2320     // Récupération de la valeur de la lettre type
2321     $this->valF['lettretype']=$row['lettretype'];
2322 softime 10573 // Récupération de la valeur de la prise en compte métier
2323     // si la prise en compte métier est paramétrée dans l'événement
2324     $this->valF['pec_metier'] = NULL;
2325     if(isset($row['pec_metier']) === true and empty($row['pec_metier']) === false) {
2326     $this->valF['pec_metier'] = $row['pec_metier'];
2327     }
2328 mbroquet 3730 }
2329     // Récupération de toutes les valeurs du dossier d'instruction en cours
2330     $sql = "SELECT * FROM ".DB_PREFIXE."dossier
2331     WHERE dossier='".$this->valF['dossier']."'";
2332 softime 8989 $res = $this->f->db->query($sql);
2333     $this->addToLog(__METHOD__."(): db->query(\"".$sql."\");", VERBOSE_MODE);
2334 softime 12847 $this->f->isDatabaseError($res);
2335 mbroquet 3730 $row=& $res->fetchRow(DB_FETCHMODE_ASSOC);
2336     $this->updateArchiveData($row);
2337    
2338     // Récupération de la duree de validite du dossier d'autorisation
2339 softime 14064 $qres = $this->f->get_one_result_from_db_query(
2340     sprintf(
2341     'SELECT
2342     duree_validite_parametrage
2343     FROM
2344     %1$sdossier_autorisation_type_detaille
2345     LEFT JOIN %1$sdossier_autorisation
2346     ON dossier_autorisation.dossier_autorisation_type_detaille = dossier_autorisation_type_detaille.dossier_autorisation_type_detaille
2347     LEFT JOIN %1$sdossier
2348     ON dossier.dossier_autorisation = dossier_autorisation.dossier_autorisation
2349     WHERE
2350     dossier.dossier = \'%2$s\'',
2351     DB_PREFIXE,
2352     $this->f->db->escapeSimple($this->valF['dossier'])
2353     ),
2354     array(
2355     "origin" => __METHOD__,
2356     )
2357     );
2358    
2359     if ($qres['result'] != '') {
2360     $this->valF['duree_validite_parametrage'] = $qres['result'];
2361 mbroquet 3730 }
2362    
2363     // Identifiant du type de courrier
2364     $idTypeCourrier = '11';
2365     $idCourrier = str_pad($this->valF["instruction"], 10, "0", STR_PAD_LEFT);
2366     // Code barres
2367     $this->valF["code_barres"] = $idTypeCourrier . $idCourrier;
2368     }
2369    
2370 softime 12124 /**
2371     * Test si une restriction est valide.
2372     *
2373     * @return boolean
2374     */
2375 mbroquet 3730 function restrictionIsValid($restriction){
2376     if($this->restriction_valid != null) {
2377     return $this->restriction_valid;
2378     }
2379     if(empty($restriction)) {
2380     $this->restriction_valid = true;
2381     return $this->restriction_valid;
2382     }
2383 nmeucci 3873 // Liste des opérateurs possibles sans espace
2384     $operateurs = array(">=", "<=", "+", "-", "&&", "||", "==", "!=");
2385     // Liste identique mais avec le marqueur §
2386     $mark = "§";
2387     $operateurs_marked = array();
2388     foreach ($operateurs as $operateur) {
2389     $operateurs_marked[] = $mark.$operateur.$mark;
2390     }
2391 mbroquet 3730
2392     // Supprime tous les espaces de la chaîne de caractère
2393 nmeucci 3873 $restriction = preg_replace('/\s+/', '', $restriction);
2394 mbroquet 3730
2395 nmeucci 3873 // Met un marqueur avant et après les opérateurs
2396     // puis transforme la chaine en un tableau
2397     $restriction = str_replace($operateurs, $operateurs_marked,
2398 mbroquet 3730 $restriction);
2399    
2400 nmeucci 3873 // Pour chaque opérateur logique
2401     foreach (array('&&', '||') as $operator) {
2402    
2403     // S'il est absent on ne fait aucun traitement
2404     if (strpos($restriction, $mark.$operator.$mark) === false) {
2405     continue;
2406     }
2407     // Sinon on vérifie les deux conditions avec le OU/ET logique
2408     $restrictions = explode($mark.$operator.$mark, $restriction);
2409     $restrictions[0] = explode($mark, $restrictions[0]);
2410     $restrictions[1] = explode($mark, $restrictions[1]);
2411     $res_bool = false;
2412     if ($operator == '&&') {
2413     if ($this->is_restriction_satisfied($restrictions[0], $operateurs)
2414     && $this->is_restriction_satisfied($restrictions[1], $operateurs)) {
2415     $res_bool = true;
2416     }
2417     }
2418     if ($operator == '||') {
2419     if ($this->is_restriction_satisfied($restrictions[0], $operateurs)
2420     || $this->is_restriction_satisfied($restrictions[1], $operateurs)) {
2421     $res_bool = true;
2422     }
2423     }
2424     return $res_bool;
2425     }
2426     $tabRestriction = explode($mark, $restriction);
2427     return $this->is_restriction_satisfied($tabRestriction, $operateurs);
2428    
2429     }
2430    
2431     function is_restriction_satisfied($restriction, $operateurs) {
2432 mbroquet 3730 // Tableau comprenant les résultat
2433     $res = array();
2434     // Compteur pour les résultat
2435     // commence à 1 car le 0 doit rester inchangé tout au long du traitement
2436     $j = 1;
2437     // Comparateur du calcul
2438     $comparateur = '';
2439     // Booléen retourné
2440     $res_bool = true;
2441    
2442     // S'il y a un comparateur
2443 nmeucci 3873 if (in_array(">=", $restriction)
2444     || in_array("<=", $restriction)
2445     || in_array("==", $restriction)
2446     || in_array("!=", $restriction)) {
2447 mbroquet 3730
2448     // Si le tableau n'est pas vide
2449 nmeucci 3873 if (count($restriction) > 0) {
2450 mbroquet 3730
2451     // Boucle dans le tableau pour récupérer seulement les valeurs
2452 nmeucci 3873 foreach ($restriction as $key => $value) {
2453 mbroquet 3730 //
2454     if (!in_array($value, $operateurs)) {
2455     if ($this->getRestrictionValue($value) != false) {
2456     $res[] = $this->getRestrictionValue($value);
2457     } else {
2458     // Message d'erreur
2459     $error_message = sprintf(_("Le champ %s de l'instruction %s est vide"), "<span class='bold'>".$value."</span>", "<span class='bold'>".$this->valF["instruction"]."</span>");
2460     $this->addToMessage($error_message);
2461     // Arrête le traitement
2462     return false;
2463     }
2464     }
2465     }
2466    
2467     // Boucle dans le tableau
2468     // commence à 1 car le 0 doit rester inchangé tout au long du
2469     // traitement
2470 nmeucci 3873 for ($i = 1; $i<count($restriction); $i++) {
2471 mbroquet 3730
2472     // Récupère le comparateur
2473 nmeucci 3873 if ($restriction[$i] === ">="
2474     || $restriction[$i] === "<="
2475     || $restriction[$i] === "=="
2476     || $restriction[$i] === "!=") {
2477     $comparateur = $restriction[$i];
2478 mbroquet 3730 }
2479    
2480     // Si l'opérateur qui suit est un "+"
2481 nmeucci 3873 if ($restriction[$i] === "+") {
2482 mbroquet 3730 $dateDep = $res[$j];
2483     unset($res[$j]);$j++;
2484     $duree = $res[$j];
2485     unset($res[$j]);
2486     $res[$j] = $this->f->mois_date($dateDep, $duree, "+");
2487     }
2488    
2489     // Si l'opérateur qui suit est un "-"
2490 nmeucci 3873 if ($restriction[$i] === "-") {
2491 mbroquet 3730 $dateDep = $res[$j];
2492     unset($res[$j]);$j++;
2493     $duree = $res[$j];
2494     unset($res[$j]);
2495     $res[$j] = $this->f->mois_date($dateDep, $duree, "-");
2496     }
2497     }
2498    
2499     }
2500    
2501     // Si les tableau des résultats n'est pas vide
2502     if (count($res) > 0) {
2503     //
2504     $res_bool = false;
2505     // Effectue le test
2506     if ($comparateur === ">=") {
2507     //
2508     if (strtotime($res[0]) >= strtotime($res[$j])) {
2509     $res_bool = true;
2510     }
2511     }
2512     if ($comparateur === "<=") {
2513 nmeucci 3873 //
2514 mbroquet 3730 if (strtotime($res[0]) <= strtotime($res[$j])) {
2515     $res_bool = true;
2516     }
2517     }
2518 nmeucci 3873 if ($comparateur === "==") {
2519     //
2520     if (strtotime($res[0]) == strtotime($res[$j])) {
2521     $res_bool = true;
2522     }
2523     }
2524     if ($comparateur === "!=") {
2525     //
2526     if (strtotime($res[0]) != strtotime($res[$j])) {
2527     $res_bool = true;
2528     }
2529     }
2530 mbroquet 3730 }
2531     // Sinon une erreur s'affiche
2532     } else {
2533    
2534     // Message d'erreur
2535     $error_message = _("Mauvais parametrage de la restriction.")." ".
2536     _("Contactez votre administrateur");
2537     $this->addToMessage($error_message);
2538     // Arrête le traitement
2539     return false;
2540     }
2541    
2542     return $res_bool;
2543    
2544     }
2545    
2546     /**
2547     * Permet de définir si l'événement passé en paramètre est un événement retour.
2548     * @param integer $evenement événement à tester
2549     *
2550     * @return boolean retourne true si événement retour sinon false
2551     */
2552     function is_evenement_retour($evenement) {
2553     if(empty($evenement) || !is_numeric($evenement)) {
2554     return "";
2555     }
2556 softime 14064
2557     $evenement = $this->f->get_inst__om_dbform(array(
2558     "obj" => "evenement",
2559     "idx" => $evenement,
2560     ));
2561    
2562     return $evenement->getVal('retour') == 't';
2563 mbroquet 3730 }
2564    
2565     /**
2566     * Retourne le champ restriction de l'événement passé en paramètre.
2567     *
2568     * @param integer $evenement id de l'événement sur lequel récupérer la restriction
2569     *
2570     * @return string contenu du champ restriction
2571     */
2572     function get_restriction($evenement) {
2573     if(empty($evenement) || !is_numeric($evenement)) {
2574     return "";
2575     }
2576     //Récupère la restriction
2577 softime 14064 $evenement = $this->f->get_inst__om_dbform(array(
2578     "obj" => "evenement",
2579     "idx" => $evenement,
2580     ));
2581    
2582     return $evenement->getVal('restriction');
2583 mbroquet 3730 }
2584    
2585     /**
2586     * Récupère la valeur du champ dans la restriction
2587     * @param string $restrictionValue Nom du champ
2588     * @return mixed Valeur du champ
2589     */
2590     function getRestrictionValue($restrictionValue){
2591    
2592     // Initialisation de la valeur de retour
2593     $return = false;
2594    
2595     // Récupére les valeurs du dossier
2596     $value_dossier = $this->get_dossier_actual();
2597    
2598     //
2599     if (is_numeric($restrictionValue)) {
2600     $return = $restrictionValue;
2601     }elseif (isset($value_dossier[$restrictionValue])) {
2602     $return = $value_dossier[$restrictionValue];
2603     }elseif (isset($this->valF[$restrictionValue])) {
2604     $return = $this->valF[$restrictionValue];
2605     }
2606    
2607     // Retourne la valeur du champ
2608     return $return;
2609     }
2610    
2611 softime 6565
2612 mbroquet 3730 /**
2613 softime 6565 * Calcul des règle d'action selon leur type.
2614     *
2615     * Types de règle :
2616     * - date
2617     * - numeric
2618     * - text
2619     * - bool
2620     * - specific
2621     * - technical_data
2622 mbroquet 3730 *
2623 softime 6565 * @param string $rule Règle d'action.
2624     * @param string $rule_name Nom de la règle.
2625     * @param string $type Type de la règle.
2626     *
2627 mbroquet 3730 * @return mixed Résultat de la règle
2628     */
2629 softime 6565 public function regle($rule, $rule_name, $type = null) {
2630 mbroquet 3730
2631     // Supprime tous les espaces de la chaîne de caractère
2632     $rule = str_replace(' ', '', $rule);
2633     // Coupe la chaîne au niveau de l'opérateur
2634     $operands = explode ("+", $rule);
2635     // Nombre d'opérande
2636     $nb_operands = count($operands);
2637    
2638     // Règle à null
2639     if ($rule == "null") {
2640     return null;
2641     }
2642    
2643     // Tableau des champs de type date
2644     $rule_type_date = array(
2645     "regle_date_limite",
2646     "regle_date_notification_delai",
2647     "regle_date_complet",
2648     "regle_date_validite",
2649     "regle_date_decision",
2650     "regle_date_chantier",
2651     "regle_date_achevement",
2652     "regle_date_conformite",
2653     "regle_date_rejet",
2654     "regle_date_dernier_depot",
2655     "regle_date_limite_incompletude",
2656 softime 6565 "regle_date_cloture_instruction",
2657     "regle_date_premiere_visite",
2658     "regle_date_derniere_visite",
2659     "regle_date_contradictoire",
2660     "regle_date_retour_contradictoire",
2661     "regle_date_ait",
2662     "regle_date_transmission_parquet",
2663 softime 8989 "regle_date_affichage",
2664 mbroquet 3730 );
2665     // Tableau des champs de type numérique
2666     $rule_type_numeric = array(
2667     "regle_delai",
2668     "regle_delai_incompletude",
2669     );
2670 softime 6565 // Tableau des champs de type text
2671     $rule_type_text = array(
2672     );
2673     // Tableau des champs de type booléen
2674     $rule_type_bool = array(
2675 softime 10573 "regle_a_qualifier",
2676     "regle_incompletude",
2677     "regle_incomplet_notifie",
2678     "regle_evenement_suivant_tacite_incompletude",
2679 softime 6565 );
2680     // Tableau des champs spécifiques
2681     $rule_type_specific = array(
2682     "regle_autorite_competente",
2683     "regle_etat",
2684     "regle_accord_tacite",
2685     "regle_avis",
2686 softime 10573 "regle_pec_metier",
2687     "regle_etat_pendant_incompletude",
2688 softime 6565 );
2689     // Tableau des champs de données techniques
2690     $rule_type_technical_data = array(
2691     'regle_donnees_techniques1',
2692     'regle_donnees_techniques2',
2693     'regle_donnees_techniques3',
2694     'regle_donnees_techniques4',
2695     'regle_donnees_techniques5',
2696     );
2697 softime 8593 // Tableau des champs simple
2698     $rule_type_simple = array(
2699     "regle_dossier_instruction_type",
2700     );
2701 mbroquet 3730
2702     // Définit le type du champ
2703     if (in_array($rule_name, $rule_type_date) == true) {
2704     $type = "date";
2705     }
2706     if (in_array($rule_name, $rule_type_numeric) == true) {
2707     $type = "numeric";
2708     }
2709 softime 6565 if (in_array($rule_name, $rule_type_text) === true) {
2710     $type = "text";
2711     }
2712     if (in_array($rule_name, $rule_type_bool) === true) {
2713     $type = "bool";
2714     }
2715     if (in_array($rule_name, $rule_type_specific) === true) {
2716     $type = "specific";
2717     }
2718     if (in_array($rule_name, $rule_type_technical_data) === true) {
2719     $type = 'text';
2720     }
2721 softime 8593 if (in_array($rule_name, $rule_type_simple) === true) {
2722     $type = 'simple';
2723     }
2724 mbroquet 3730
2725 softime 6565 // Si c'est un type spécifique ou booléen alors il n'a qu'un opérande
2726     // Récupère directement la valeur de l'opérande
2727 softime 10573 if ($type === 'specific') {
2728 softime 6565 //
2729     return $this->get_value_for_rule($rule);
2730     }
2731    
2732 mbroquet 3730 // Initialisation des variables
2733     $key_date = 0;
2734     $total_numeric = 0;
2735 softime 6565 $res_text = '';
2736 mbroquet 3730
2737     // Pour chaque opérande
2738     foreach ($operands as $key => $operand) {
2739    
2740     // Si c'est une règle de type date
2741     if ($type == 'date') {
2742     // Vérifie si au moins une des opérandes est une date
2743 softime 6565 if (is_numeric($operand) === false
2744     && $this->get_value_for_rule($operand) !== null
2745     && $this->f->check_date($this->get_value_for_rule($operand)) == true) {
2746 mbroquet 3730 // Récupère la position de la date
2747     $key_date = $key;
2748     }
2749     // Les autres opérandes doivent être que des numériques
2750     if (is_numeric($operand) == true) {
2751     // Ajoute l'opérande au total
2752     $total_numeric += $operand;
2753     }
2754 softime 6565 if (is_numeric($operand) === false
2755     && $this->get_value_for_rule($operand) !== null
2756     && is_numeric($this->get_value_for_rule($operand)) == true) {
2757 mbroquet 3730 // Ajoute l'opérande au total
2758 softime 6565 $total_numeric += $this->get_value_for_rule($operand);
2759 mbroquet 3730 }
2760     }
2761    
2762     // Si c'est une règle de type numérique
2763     if ($type == 'numeric') {
2764     // Les opérandes doivent être que des numériques
2765     if (is_numeric($operand) == true) {
2766     // Ajoute l'opérande au total
2767     $total_numeric += $operand;
2768     }
2769 softime 6565 if (is_numeric($operand) === false
2770     && $this->get_value_for_rule($operand) !== null
2771     && is_numeric($this->get_value_for_rule($operand)) == true) {
2772 mbroquet 3730 // Ajoute l'opérande au total
2773 softime 6565 $total_numeric += $this->get_value_for_rule($operand);
2774 mbroquet 3730 }
2775     }
2776 softime 6565
2777     // Si c'est une règle de type text
2778     if ($type === 'text') {
2779     // Concatène toutes les chaînes de caractère
2780     $res_text .= $this->get_value_for_rule($operand);
2781     }
2782 mbroquet 3730 }
2783    
2784     // Résultat pour une règle de type date
2785     if ($type == 'date') {
2786     // Retourne le calcul de la date
2787     return $this->f->mois_date($this->valF[$operands[$key_date]],
2788     $total_numeric, "+");
2789     }
2790    
2791     // Résultat pour une règle de type numérique
2792     if ($type == 'numeric') {
2793     // Retourne le calcul
2794     return $total_numeric;
2795     }
2796 softime 6565
2797     // Résultat pour une règle de type text
2798     if ($type === 'text') {
2799     // Retourne la chaîne de caractère
2800     return $res_text;
2801     }
2802 softime 10573 if ($type === 'simple' || $type === 'bool') {
2803 softime 8593 // Retourne la valeur du champs rule
2804     return $rule;
2805     }
2806 softime 6565 }
2807    
2808    
2809     /**
2810     * Récupère la valeur du champs dans l'instruction ou dans les données
2811     * techniques.
2812     * Spécifique au calcul des règles.
2813     *
2814     * @param string $field Champ
2815     *
2816     * @return mixed Valeur du champ
2817     */
2818     private function get_value_for_rule($field) {
2819     // Si le champ n'existe pas dans la table instruction
2820     if (array_key_exists($field, $this->valF) === false) {
2821     // Récupère l'instance de la classe donnees_techniques
2822     $inst_donnees_techniques = $this->get_inst_donnees_techniques();
2823     // Retourne la valeur de la donnée technique
2824     return $inst_donnees_techniques->getVal($field);
2825     }
2826    
2827     //
2828     return $this->valF[$field];
2829     }
2830    
2831    
2832     /**
2833     * [get_inst_donnees_techniques description]
2834     *
2835     * @param [type] $donnees_techniques [description]
2836     *
2837     * @return [type] [description]
2838     */
2839     function get_inst_donnees_techniques($donnees_techniques = null) {
2840     //
2841     if (isset($this->inst_donnees_techniques) === false or
2842     $this->inst_donnees_techniques === null) {
2843     //
2844     if (is_null($donnees_techniques)) {
2845     $donnees_techniques = $this->getDonneesTechniques();
2846     }
2847     //
2848 softime 7996 $this->inst_donnees_techniques = $this->f->get_inst__om_dbform(array(
2849     "obj" => "donnees_techniques",
2850     "idx" => $donnees_techniques,
2851     ));
2852 softime 6565 }
2853     //
2854     return $this->inst_donnees_techniques;
2855     }
2856    
2857    
2858     /**
2859     * Retourne l'identifiant des données techniques liées du dossier
2860     * @return string L'identifiant des données techniques liées du dossier
2861     */
2862     function getDonneesTechniques() {
2863 softime 14064
2864     $qres = $this->f->get_one_result_from_db_query(
2865     sprintf(
2866     'SELECT
2867     donnees_techniques
2868     FROM
2869     %1$sdonnees_techniques
2870     WHERE
2871     dossier_instruction = \'%2$s\'',
2872     DB_PREFIXE,
2873     $this->f->db->escapeSimple($this->valF["dossier"])
2874     ),
2875     array(
2876     "origin" => __METHOD__,
2877     )
2878     );
2879 mbroquet 3730
2880 softime 14064 return $qres['result'];
2881 mbroquet 3730 }
2882    
2883 fmichon 4708 /**
2884     * TRIGGER - triggerajouterapres.
2885     *
2886     * - Mise à jour des informations liées au workflow sur le dossier
2887     * - Interface avec le référentiel ERP [105][111]
2888     * - Mise à jour du DA
2889     * - Historisation de la vie du DI
2890     *
2891     * @return boolean
2892     */
2893 softime 8989 function triggerajouterapres($id, &$dnu1 = null, $val = array(), $dnu2 = null) {
2894     $this->addToLog(__METHOD__."(): start", EXTRA_VERBOSE_MODE);
2895 fmichon 4708
2896     // On a besoin de l'instance du dossier lié à l'événement d'instruction
2897     $inst_di = $this->get_inst_dossier($this->valF['dossier']);
2898     // Instance de la classe evenement
2899     $inst_evenement = $this->get_inst_evenement($this->valF['evenement']);
2900 softime 9245 // Instance de l'état courant du dossier d'instruction
2901     $inst_current_etat = $this->f->get_inst__om_dbform(array(
2902     "obj" => "etat",
2903     "idx" => $inst_di->get_id_etat(),
2904     ));
2905 fmichon 4708
2906 mbroquet 3730 /**
2907     * Mise à jour des valeurs du dossier en fonction des valeurs calculées
2908     * par l'action
2909     */
2910 fmichon 4708 // état de complétude actuel du dossier
2911     $incompletude = ($inst_di->getVal('incompletude') == 't' ? true : false);
2912 softime 10573 // L'événement suivant tacite paramétré est destiné à la gestion de l'incomplétude
2913     $ev_suiv_tacite_incompletude = false;
2914 mbroquet 3730 // Initialisation
2915 softime 9245 $valF = array();
2916     $valF_dt = array();
2917 fmichon 4708 //
2918 mbroquet 3730 // Récupération des paramètres de l'action
2919     $sql = "SELECT * FROM ".DB_PREFIXE."action
2920     WHERE action='".$this->valF['action']."'";
2921 softime 8989 $res = $this->f->db->query($sql);
2922     $this->addToLog(__METHOD__."(): db->query(\"".$sql."\");", VERBOSE_MODE);
2923 softime 12847 $this->f->isDatabaseError($res);
2924 mbroquet 3730 while ($row=& $res->fetchRow(DB_FETCHMODE_ASSOC)) {
2925    
2926     // pour chacune des regles, on applique la regle
2927 softime 6565 if ($row['regle_delai'] != '') {
2928 mbroquet 3730 $valF['delai'] = $this->regle($row['regle_delai'], 'regle_delai');
2929     }
2930 softime 6565 if ($row['regle_accord_tacite'] != '') {
2931 mbroquet 3730 $valF['accord_tacite'] = $this->regle($row['regle_accord_tacite'], 'regle_accord_tacite');
2932     }
2933 softime 6565 if ($row['regle_avis'] != '') {
2934 mbroquet 3730 $valF['avis_decision'] = $this->regle($row['regle_avis'], 'regle_avis');
2935     }
2936 softime 6565 if ($row['regle_date_limite'] != '') {
2937     $valF['date_limite'] = $this->regle($row['regle_date_limite'], 'regle_date_limite');
2938 mbroquet 3730 }
2939 softime 6565 if ($row['regle_date_complet'] != '') {
2940     $valF['date_complet'] = $this->regle($row['regle_date_complet'], 'regle_date_complet');
2941 mbroquet 3730 }
2942 softime 6565 if ($row['regle_date_dernier_depot'] != '') {
2943     $valF['date_dernier_depot'] = $this->regle($row['regle_date_dernier_depot'], 'regle_date_dernier_depot');
2944 mbroquet 3730 }
2945 softime 6565 if ($row['regle_date_notification_delai'] != '') {
2946     $valF['date_notification_delai'] = $this->regle($row['regle_date_notification_delai'], 'regle_date_notification_delai');
2947 mbroquet 3730 }
2948 softime 6565 if ($row['regle_date_decision'] != '') {
2949     $valF['date_decision'] = $this->regle($row['regle_date_decision'], 'regle_date_decision');
2950 mbroquet 3730 }
2951 softime 6565 if ($row['regle_date_rejet'] != '') {
2952     $valF['date_rejet'] = $this->regle($row['regle_date_rejet'], 'regle_date_rejet');
2953 mbroquet 3730 }
2954 softime 6565 if ($row['regle_date_validite'] != '') {
2955     $valF['date_validite'] = $this->regle($row['regle_date_validite'], 'regle_date_validite');
2956 mbroquet 3730 }
2957 softime 6565 if ($row['regle_date_chantier'] != '') {
2958     $valF['date_chantier'] = $this->regle($row['regle_date_chantier'], 'regle_date_chantier');
2959 mbroquet 3730 }
2960 softime 6565 if ($row['regle_date_achevement'] != '') {
2961     $valF['date_achevement'] = $this->regle($row['regle_date_achevement'], 'regle_date_achevement');
2962 mbroquet 3730 }
2963 softime 6565 if ($row['regle_date_conformite'] != '') {
2964     $valF['date_conformite'] = $this->regle($row['regle_date_conformite'], 'regle_date_conformite');
2965 mbroquet 3730 }
2966 softime 6565 if ($row['regle_date_limite_incompletude'] != '') {
2967     $valF['date_limite_incompletude'] = $this->regle($row['regle_date_limite_incompletude'], 'regle_date_limite_incompletude');
2968 mbroquet 3730 }
2969 softime 6565 if ($row['regle_delai_incompletude'] != '') {
2970     $valF['delai_incompletude'] = $this->regle($row['regle_delai_incompletude'], 'regle_delai_incompletude');
2971 mbroquet 3730 }
2972 softime 6565 if ($row['regle_autorite_competente'] != '') {
2973     $valF['autorite_competente'] = $this->regle($row['regle_autorite_competente'], 'regle_autorite_competente');
2974 mbroquet 3730 }
2975 softime 6565 if ($row['regle_etat'] != '') {
2976 softime 10573 $valF['etat'] = $this->regle($row['regle_etat'], 'regle_etat');
2977 mbroquet 3730 }
2978 softime 6565 if ($row['regle_date_cloture_instruction'] !== '') {
2979     $valF['date_cloture_instruction'] = $this->regle($row['regle_date_cloture_instruction'], 'regle_date_cloture_instruction');
2980     }
2981     if ($row['regle_date_premiere_visite'] !== '') {
2982     $valF['date_premiere_visite'] = $this->regle($row['regle_date_premiere_visite'], 'regle_date_premiere_visite');
2983     }
2984     if ($row['regle_date_derniere_visite'] !== '') {
2985     $valF['date_derniere_visite'] = $this->regle($row['regle_date_derniere_visite'], 'regle_date_derniere_visite');
2986     }
2987     if ($row['regle_date_contradictoire'] !== '') {
2988     $valF['date_contradictoire'] = $this->regle($row['regle_date_contradictoire'], 'regle_date_contradictoire');
2989     }
2990     if ($row['regle_date_retour_contradictoire'] !== '') {
2991     $valF['date_retour_contradictoire'] = $this->regle($row['regle_date_retour_contradictoire'], 'regle_date_retour_contradictoire');
2992     }
2993     if ($row['regle_date_ait'] !== '') {
2994     $valF['date_ait'] = $this->regle($row['regle_date_ait'], 'regle_date_ait');
2995     }
2996     if ($row['regle_donnees_techniques1'] !== '') {
2997     $valF_dt[$row['cible_regle_donnees_techniques1']] = $this->regle($row['regle_donnees_techniques1'], 'regle_donnees_techniques1');
2998     }
2999     if ($row['regle_donnees_techniques2'] !== '') {
3000     $valF_dt[$row['cible_regle_donnees_techniques2']] = $this->regle($row['regle_donnees_techniques2'], 'regle_donnees_techniques2');
3001     }
3002     if ($row['regle_donnees_techniques3'] !== '') {
3003     $valF_dt[$row['cible_regle_donnees_techniques3']] = $this->regle($row['regle_donnees_techniques3'], 'regle_donnees_techniques3');
3004     }
3005     if ($row['regle_donnees_techniques4'] !== '') {
3006     $valF_dt[$row['cible_regle_donnees_techniques4']] = $this->regle($row['regle_donnees_techniques4'], 'regle_donnees_techniques4');
3007     }
3008     if ($row['regle_donnees_techniques5'] !== '') {
3009     $valF_dt[$row['cible_regle_donnees_techniques5']] = $this->regle($row['regle_donnees_techniques5'], 'regle_donnees_techniques5');
3010     }
3011     if ($row['regle_date_transmission_parquet'] !== '') {
3012     $valF['date_transmission_parquet'] = $this->regle($row['regle_date_transmission_parquet'], 'regle_date_transmission_parquet');
3013     }
3014 softime 8593 if ($row['regle_dossier_instruction_type'] !== '') {
3015     $valF['dossier_instruction_type'] = $this->regle($row['regle_dossier_instruction_type'], 'regle_dossier_instruction_type');
3016     }
3017 softime 8989 // La date d'affichage est modifiée seulement si le champ n'est pas
3018     // renseigné
3019     if ($row['regle_date_affichage'] !== ''
3020     && ($inst_di->getVal('date_affichage') === ''
3021     || $inst_di->getVal('date_affichage') === null)) {
3022     //
3023     $valF['date_affichage'] = $this->regle($row['regle_date_affichage'], 'regle_date_affichage');
3024     }
3025 softime 10573 //
3026     if ($row['regle_pec_metier'] != '') {
3027     $valF['pec_metier'] = $this->regle($row['regle_pec_metier'], 'regle_pec_metier');
3028     }
3029     if ($row['regle_a_qualifier'] != '') {
3030     $valF['a_qualifier'] = $this->regle($row['regle_a_qualifier'], 'regle_a_qualifier');
3031     }
3032     //
3033     if ($row['regle_incompletude'] != '') {
3034     $valF['incompletude'] = $this->regle($row['regle_incompletude'], 'regle_incompletude');
3035     }
3036     if ($row['regle_incomplet_notifie'] != '') {
3037     $valF['incomplet_notifie'] = $this->regle($row['regle_incomplet_notifie'], 'regle_incomplet_notifie');
3038     }
3039     if ($row['regle_etat_pendant_incompletude'] != '') {
3040     $valF['etat_pendant_incompletude'] = $this->regle($row['regle_etat_pendant_incompletude'], 'regle_etat_pendant_incompletude');
3041     }
3042     if ($row['regle_evenement_suivant_tacite_incompletude'] != '') {
3043     $resti = $this->regle($row['regle_evenement_suivant_tacite_incompletude'], 'regle_evenement_suivant_tacite_incompletude');
3044     if (strtolower($resti) === 't' || strtolower($resti) === 'true') {
3045     $ev_suiv_tacite_incompletude = true;
3046     }
3047     }
3048 mbroquet 3730 }
3049 softime 6063
3050     // Si l'événement a un événement suivant tacite
3051     if($inst_evenement->getVal('evenement_suivant_tacite') != '') {
3052 softime 10573 // En fonction de l'action de l'événement, l'événement suivant tacite ne sera
3053     // pas associé de le même façon au dossier d'instruction
3054     if ($ev_suiv_tacite_incompletude === false) {
3055 softime 6063 $valF['evenement_suivant_tacite'] = $inst_evenement->getVal('evenement_suivant_tacite');
3056 softime 10573 }
3057     if ($ev_suiv_tacite_incompletude === true) {
3058 softime 6063 $valF['evenement_suivant_tacite_incompletude'] = $inst_evenement->getVal('evenement_suivant_tacite');
3059 nhaye 5254 }
3060 mbroquet 3730 }
3061 softime 6565 // Si des valeurs de données techniques ont été calculées alors on met à jour l'enregistrement
3062 softime 9245 if (count($valF_dt) > 0) {
3063 softime 6565 $dt_id = $this->getDonneesTechniques();
3064     // On met à jour le dossier
3065     $cle = " donnees_techniques='".$dt_id."'";
3066 softime 12847 $res1 = $this->f->db->autoexecute(DB_PREFIXE.'donnees_techniques', $valF_dt, DB_AUTOQUERY_UPDATE, $cle);
3067     $this->addToLog(
3068     __METHOD__."(): db->autoexecute(\"".DB_PREFIXE."donnees_techniques\", ".print_r($valF_dt, true).", DB_AUTOQUERY_UPDATE, \"".$cle."\");",
3069     VERBOSE_MODE
3070     );
3071     $this->f->isDatabaseError($res1);
3072 softime 6565 // Affichage d'informations à l'utilisateur
3073 softime 8989 $this->addToMessage(_('enregistrement')." ".$this->valF['dossier']." "._('table')." dossier [".$this->f->db->affectedRows()." "._('enregistrement')." "._('mis_a_jour')."]");
3074 softime 6565 }
3075 mbroquet 3730 // Si des valeurs ont été calculées alors on met à jour l'enregistrement
3076 softime 9245 if (count($valF) > 0) {
3077 softime 10573 //
3078     $inst_dossier = $this->f->get_inst__om_dbform(array(
3079     "obj" => "dossier",
3080     "idx" => $this->valF['dossier'],
3081     ));
3082     $valF['instruction'] = $id;
3083 softime 10968 $valF['crud'] = 'create';
3084 softime 10573 $update_by_instruction = $inst_dossier->update_by_instruction($valF);
3085     if ($update_by_instruction === false) {
3086     $this->cleanMessage();
3087     $this->addToMessage(sprintf('%s %s', __("Une erreur s'est produite lors de la mise à jour du dossier d'instruction."), __("Veuillez contacter votre administrateur.")));
3088     return false;
3089 mbroquet 3730 }
3090     // Affichage d'informations à l'utilisateur
3091 softime 8989 $this->addToMessage(_('enregistrement')." ".$this->valF['dossier']." "._('table')." dossier [".$this->f->db->affectedRows()." "._('enregistrement')." "._('mis_a_jour')."]");
3092 mbroquet 3730 }
3093    
3094     /**
3095 fmichon 4708 * Interface avec le référentiel ERP.
3096     *
3097     * (WS->ERP)[105] Arrêté d'un dossier PC effectué -> PC qui concerne un ERP
3098     * (WS->ERP)[111] Décision de conformité effectuée -> PC qui concerne un ERP
3099     * Déclencheur :
3100     * - L'option ERP est activée
3101     * - Le dossier est marqué comme "connecté au référentiel ERP"
3102     * - Le dossier est de type PC
3103     * - Le formulaire d'ajout d'un événement d'instruction est validé
3104     * avec un événement pour lequel les services ERP doivent être
3105     * informé
3106 mbroquet 3730 */
3107 fmichon 4708 //
3108 softime 7521 if ($this->f->is_option_referentiel_erp_enabled() === true
3109 fmichon 4708 && $inst_di->is_connected_to_referentiel_erp() === true
3110     && $this->f->getDATCode($this->valF['dossier']) == $this->f->getParameter('erp__dossier__nature__pc')
3111     && in_array($inst_evenement->getVal($inst_evenement->clePrimaire), explode(";", $this->f->getParameter('erp__evenements__decision__pc')))) {
3112 mbroquet 3730 //
3113 fmichon 4708 $infos = array(
3114     "dossier_instruction" => $this->valF['dossier'],
3115     "decision" => $inst_evenement->getVal("libelle"),
3116     );
3117 mbroquet 3730 //
3118 fmichon 4708 $ret = $this->f->send_message_to_referentiel_erp(105, $infos);
3119     if ($ret !== true) {
3120     $this->cleanMessage();
3121     $this->addToMessage(_("Une erreur s'est produite lors de la notification (105) du référentiel ERP. Contactez votre administrateur."));
3122     return false;
3123 mbroquet 3730 }
3124 fmichon 4708 $this->addToMessage(_("Notification (105) du référentiel ERP OK."));
3125     }
3126 mbroquet 3730
3127 softime 8989 // Si le mode en rédaction intégrale est activé
3128     if (isset($this->valF['flag_edition_integrale']) === true
3129     && $this->valF['flag_edition_integrale'] === true) {
3130     $redactionIntegraleValF = array();
3131    
3132     // Récupère la collectivite du dossier d'instruction
3133     $dossier_instruction_om_collectivite = $this->get_dossier_instruction_om_collectivite();
3134     $collectivite = $this->f->getCollectivite($dossier_instruction_om_collectivite);
3135     // Récupère le corps de la lettre type
3136     $params = array(
3137     "specific" => array(
3138     "corps" => array(
3139     "mode" => "get",
3140     )
3141     ),
3142     );
3143     $result = $this->compute_pdf_output('lettretype', $this->valF['lettretype'], $collectivite, $id, $params);
3144     $redactionIntegraleValF['corps_om_htmletatex'] = $result['pdf_output'];
3145     // Récupère le titre de la lettre type
3146     $params = array(
3147     "specific" => array(
3148     "titre" => array(
3149     "mode" => "get",
3150     )
3151     ),
3152     );
3153     $result = $this->compute_pdf_output('lettretype', $this->valF['lettretype'], $collectivite, $id, $params);
3154     $redactionIntegraleValF['titre_om_htmletat'] = $result['pdf_output'];
3155    
3156     // mise à jour en base de données
3157     $res = $this->f->db->autoExecute(
3158     DB_PREFIXE.$this->table,
3159     $redactionIntegraleValF,
3160     DB_AUTOQUERY_UPDATE,
3161     $this->clePrimaire."=".$id
3162     );
3163     $this->addToLog(__METHOD__."(): db->autoexecute(\"".DB_PREFIXE.'.'.$this->table."\", ".print_r($redactionIntegraleValF, true).", DB_AUTOQUERY_UPDATE, \"".$this->clePrimaire."=".$id."\");", VERBOSE_MODE);
3164     if ($this->f->isDatabaseError($res, true) === true) {
3165     return false;
3166     }
3167     }
3168    
3169 fmichon 4708 /**
3170 softime 7996 * Finalisation automatique de l'instruction si le paramétrage de l'événement l'autorise
3171     */
3172     // Si la finalisation automatique de l'événement est activée
3173     // ET si l'instruction n'a pas déjà été finalisée
3174     // ET s'il existe une lettre type associée
3175     if ($inst_evenement->getVal('finaliser_automatiquement') === 't'
3176     && $inst_evenement->getVal('om_final_instruction') !== 't'
3177     && $inst_evenement->getVal('lettretype') !== ''
3178     && $inst_evenement->getVal('lettretype') !== null) {
3179    
3180     // On instancie l'instruction
3181     $inst_instruction = $this->f->get_inst__om_dbform(array(
3182     "obj" => "instruction",
3183     "idx" => $this->valF[$this->clePrimaire],
3184     ));
3185    
3186     // On finalise l'instruction dans le contexte de finalisation : action 100
3187     $inst_instruction->setParameter('maj', 100);
3188     $finalize = $inst_instruction->finalize($inst_instruction->valF);
3189    
3190     // Une erreur de finalisation renvoie 'false' : ajout dans les logs
3191     // et dans le message d'erreur
3192     if ($finalize === false) {
3193     $this->f->addToLog(__METHOD__."() : ERROR - Impossible de finaliser l'instruction.", DEBUG_MODE);
3194     $this->addToMessage(_("Erreur lors de la finalisation de l'instruction. Contactez votre administrateur."));
3195     return false;
3196     }
3197     }
3198    
3199     /**
3200 softime 7521 * Finalisation automatique des instructions tacites ou retours.
3201     */
3202 softime 7685 // Si l'option de finalisation automatique des instructions tacites ou
3203     // retours est activée et l'événement d'instruction a une lettre type
3204     // associée
3205     $collectivite_di = $this->get_dossier_instruction_om_collectivite($val['dossier']);
3206     if ($this->f->is_option_finalisation_auto_enabled($collectivite_di) === true
3207     && $inst_evenement->getVal('lettretype') !== ''
3208 softime 7521 && $inst_evenement->getVal('lettretype') !== null) {
3209    
3210     // Rècupère l'identifiant de l'événement
3211     $evenement_id = $inst_evenement->getVal($inst_evenement->clePrimaire);
3212    
3213     // Si l'événement d'instruction est identifié comme un événement
3214     // retour
3215     // OU l'événement d'instruction est l'événement suivant tacite du
3216     // dossier d'instruction (incomplétude prise en compte)
3217 softime 7996 // ET l'événement d'instruction n'a pas déjà été finalisé
3218     if (($inst_evenement->getVal("retour") === 't'
3219 softime 7521 || ($inst_di->getVal('evenement_suivant_tacite_incompletude') === $evenement_id
3220 softime 7996 || $inst_di->getVal('evenement_suivant_tacite') === $evenement_id))
3221     && ($inst_evenement->getVal('om_final_instruction') !== 't')) {
3222 softime 7521
3223     // Finalise l'instruction
3224 softime 7996 $inst_instruction = $this->f->get_inst__om_dbform(array(
3225     "obj" => "instruction",
3226     "idx" => $this->valF[$this->clePrimaire],
3227     ));
3228 softime 7521 $inst_instruction->setParameter('maj', 100);
3229     $finalize = $inst_instruction->finalize($inst_instruction->valF);
3230     if ($finalize === false) {
3231     //
3232     return false;
3233     }
3234     }
3235     }
3236    
3237     /**
3238 softime 9245 * Mise à jour de la version de clôture *version_clos* du dossier si et
3239     * seulement si l'instruction met à jour l'état du dossier.
3240     */
3241     if (isset($valF['etat']) === true
3242     && $valF['etat'] !== null
3243     && $valF['etat'] !== '') {
3244     // Instanciation de l'état appliqué sur le dossier par l'instruction
3245     $inst_etat = $this->f->get_inst__om_dbform(array(
3246     "obj" => "etat",
3247     "idx" => $valF['etat'],
3248     ));
3249     //
3250     $update_version_clos = null;
3251     // En cas d'instruction qui clôture le dossier
3252     if ($inst_etat->getVal('statut') === 'cloture') {
3253     $update_version_clos = $inst_di->update_version_clos('up');
3254     }
3255     // En cas d'instruction qui rouvre le dossier
3256     if ($inst_current_etat->getVal('statut') === 'cloture'
3257     && $inst_etat->getVal('statut') !== 'cloture') {
3258     //
3259     $update_version_clos = $inst_di->update_version_clos('down');
3260     //
3261     $params = array(
3262     'di_reopened' => true,
3263     );
3264     }
3265     //
3266     if ($update_version_clos === false) {
3267     $this->f->addToLog(sprintf(
3268     "%s() : ERREUR - %s %s",
3269     __METHOD__,
3270     sprintf(
3271     __("Impossible de mettre à jour la version de clôture du dossier d'instruction %s."),
3272     $inst_di->getVal($inst_di->clePrimaire)
3273     ),
3274     sprintf(
3275     __("L'instruction tente d'appliquer l'état %s."),
3276     $inst_etat->getVal($inst_etat->clePrimaire)
3277     )
3278     ));
3279     $this->addToMessage(sprintf(
3280     "%s %s",
3281     __("Erreur lors de la mise à jour de la version de clôture du dossier d'instruction."),
3282     __("Veuillez contacter votre administrateur.")
3283     ));
3284     return false;
3285     }
3286     }
3287    
3288     /**
3289 softime 10808 * Notification automatique
3290     */
3291     // Notification automatique à l'ajout de l'instruction si la notification
3292     // automatique est choisie et qu'il n'y a pas de lettretype associée à l'événement
3293     if ($inst_evenement->getVal('notification') === 'notification_automatique' &&
3294     ($inst_evenement->getVal('lettretype') === null ||
3295     $inst_evenement->getVal('lettretype') === '')) {
3296 softime 13137 // Message à afficher dans les logs pour indiquer quelle notification a échouée
3297 softime 13528 $msgLog = sprintf(
3298     '%s %s : %d',
3299     __('Erreur lors de la notification automatique du(des) pétitionnaire(s).'),
3300     __('Instruction notifiée'),
3301     $id
3302     );
3303 softime 13137
3304 softime 10808 // Récupération de la liste des demandeurs à notifier et de la catégorie
3305     $categorie = $this->f->get_param_option_notification($collectivite_di);
3306 softime 14064 $isPortal = $categorie === PORTAL;
3307 softime 10869 $demandeursANotifie = $this->get_demandeurs_notifiable(
3308     $this->valF['dossier'],
3309     $isPortal
3310     );
3311 softime 10808
3312     // Création d'une notification et d'une tâche pour chaque demandeur à notifier
3313 softime 12124 $demandeurPrincipalNotifie = false;
3314 softime 10808 foreach ($demandeursANotifie as $demandeur) {
3315 softime 12124 // Identifie si le demandeur principal a été notifié ou pas
3316     // et récupère ses informations
3317     if ($demandeur['petitionnaire_principal'] == 't') {
3318     $demandeurPrincipalNotifie = true;
3319     // Si le demandeur principal est notifiable mais qu'il y a des erreurs dans
3320     // son paramétrage, on effectue pas le traitement et on passe à l'itération
3321     // suivante. On le considère également comme non notifié pour gérer l'envoie
3322     // des messages d'erreurs
3323     // Si la demande a été déposée via le portail alors le paramétrage n'a pas
3324     // d'impact sur la notification
3325     $erreursParam = $this->get_info_notification_fail($val['dossier']);
3326     if (! $this->dossier_depose_sur_portail($val['dossier']) && $erreursParam != array()) {
3327     $demandeurPrincipalNotifie = false;
3328     continue;
3329     }
3330     }
3331 softime 10808 // Ajout de la notif et récupération de son id
3332     $idNotif = $this->ajouter_notification(
3333     $this->valF[$this->clePrimaire],
3334     $this->f->get_connected_user_login_name(),
3335 softime 10968 $demandeur,
3336     $collectivite_di,
3337 softime 12433 array(),
3338 softime 10968 true
3339 softime 10808 );
3340     if ($idNotif === false) {
3341 softime 13528 $this->addToLog(
3342     sprintf('%s() : %s', __METHOD__, $msgLog),
3343     DEBUG_MODE
3344     );
3345 softime 10808 return false;
3346     }
3347     // Création de la tache en lui donnant l'id de la notification
3348     $notification_by_task = $this->notification_by_task(
3349     $idNotif,
3350     $this->valF['dossier'],
3351     $categorie
3352     );
3353     if ($notification_by_task === false) {
3354 softime 13528 $this->addToLog(
3355     sprintf('%s() : %s', __METHOD__, $msgLog),
3356     DEBUG_MODE
3357     );
3358 softime 10808 $this->addToMessage(
3359     __("Erreur lors de la génération de la notification au(x) pétitionnaire(s).")
3360     );
3361     return false;
3362     }
3363     }
3364 softime 12847 // Pour la notification par mail ou la notification via portal si le dossier a
3365     // été déposés via portal, si le demandeur principal n'est pas notifiable,
3366     // on créé une nouvelle notification en erreur avec en commentaire la raison pour
3367     // laquelle le demandeur principal n'a pas pu être notifié
3368     $depotPortal = $this->dossier_depose_sur_portail();
3369     if (! $demandeurPrincipalNotifie && ($isPortal === false || $depotPortal === true)) {
3370 softime 13137 // Précision dans les logs que le pétitionnaire principal n'est pas notifiable.
3371     // ' ' permet de mettre un espace entre les 2 msg de log.
3372 softime 13528 $msgLog .= sprintf(' %s', __('Le pétitionnaire principale n\'est pas notifiable.'));
3373 softime 12124 // Analyse pour savoir pourquoi le demandeur principal n'est pas notifiable
3374     $erreursParam = $this->get_info_notification_fail($val['dossier']);
3375     $demandeurPrincipal = $this->get_info_petitionnaire_principal_dossier($val['dossier']);
3376     // Ajout de la notif et récupération de son id
3377     $idNotif = $this->ajouter_notification(
3378     $this->valF[$this->clePrimaire],
3379     $this->f->get_connected_user_login_name(),
3380     $demandeurPrincipal,
3381     $collectivite_di,
3382 softime 12433 array(),
3383 softime 12124 true,
3384     'Echec',
3385     implode(' ', $erreursParam)
3386     );
3387     if ($idNotif === false) {
3388 softime 13528 $this->addToLog(
3389     sprintf('%s() : %s', __METHOD__, $msgLog),
3390     DEBUG_MODE
3391     );
3392 softime 12124 $this->addToMessage(
3393     __('Erreur : la création de la notification a échouée.').
3394     __("Veuillez contacter votre administrateur.")
3395     );
3396     return false;
3397     }
3398     // Prépare un message d'alerte à destination de l'instructeur pour l'informer
3399     // de l'échec de la notification
3400     $dossier_message = $this->get_inst_dossier_message(0);
3401     $dossier_message_val = array(
3402     'dossier' => $val['dossier'],
3403     'type' => _('erreur expedition'),
3404     'emetteur' => $this->f->get_connected_user_login_name().' (automatique)',
3405     'login' => $_SESSION['login'],
3406     'date_emission' => date('Y-m-d H:i:s'),
3407     'contenu' => _('Échec lors de la notification de l\'instruction ').
3408     $inst_evenement->getVal('libelle').
3409     '.<br>'.
3410     implode("\n", $erreursParam).
3411     '<br>'.
3412     _('Veuillez corriger ces informations avant de renvoyer la notification.')
3413     );
3414     $add = $dossier_message->add_notification_message($dossier_message_val, true);
3415     // Si une erreur se produit pendant l'ajout
3416     if ($add !== true) {
3417     $this->addToLog(__METHOD__."(): Le message d'alerte concernant l'echec de l'envoi de la notification n'a pas pu être envoyé.", DEBUG_MODE);
3418     return false;
3419     }
3420     }
3421 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.")));
3422     }
3423    
3424 softime 12654 // Notification automatique en cas de dépôt de dossier dématérialisé
3425     // Vérifie si l'option de notification est active et si il s'agit bien d'une
3426     // instruction de récépissé
3427     if (
3428     $this->f->is_option_notification_depot_demat_enabled($collectivite_di)
3429     && $this->is_instruction_recepisse()
3430     ) {
3431 softime 13137 // Message à afficher dans les logs pour indiquer quelle notification a échouée
3432 softime 13528 $msgLog = sprintf(
3433     __('Erreur lors de la notification de dépôt du dossier dématérialisé : %s.'),
3434     $val['dossier']
3435     );
3436 softime 12654 // Récupère l'instance de la demande
3437     $demande = $inst_di->get_inst_demande();
3438 softime 13137 // Vérifie que le dossier a été déposé via platau ou portal
3439 softime 12654 if (
3440 softime 13137 ($demande->getVal('source_depot') == PLATAU ||
3441     $demande->getVal('source_depot') == PORTAL)
3442 softime 12654 ) {
3443 softime 13137 // Récupère la liste des mails fournis en paramètre. Si aucun adresse n'a été récupéré
3444     // l'envoi de la notification n'est pas effectué et un message d'erreur est affiché.
3445     $listeEmails = $this->f->get_param_courriel_de_notification_commune($collectivite_di);
3446     if (empty($listeEmails)) {
3447     $this->addToLog(
3448 softime 13528 sprintf(
3449     '%s(): %s %s',
3450     __METHOD__,
3451     $msgLog,
3452     __('Aucun courriel paramétré.')
3453     ),
3454 softime 13137 DEBUG_MODE
3455 softime 12654 );
3456 softime 13137 } else {
3457     foreach ($listeEmails as $email) {
3458     // Ajout de la notif et récupération de son id
3459     $destinataire = array(
3460     'destinataire' => $email,
3461     'courriel' => $email
3462 softime 12654 );
3463 softime 13137 $idNotif = $this->ajouter_notification(
3464     $this->valF[$this->clePrimaire],
3465     $this->f->get_connected_user_login_name(),
3466     $destinataire,
3467     $collectivite_di,
3468     array(),
3469     true
3470     );
3471     if ($idNotif === false) {
3472 softime 13528 $this->addToLog(
3473     sprintf('%s(): %s', __METHOD__, $msgLog),
3474     DEBUG_MODE
3475     );
3476 softime 13137 return false;
3477     }
3478     // Création de la tache en lui donnant l'id de la notification
3479     $notification_by_task = $this->notification_by_task(
3480     $idNotif,
3481     $this->valF['dossier'],
3482     'mail',
3483     'notification_depot_demat'
3484     );
3485     if ($notification_by_task === false) {
3486     $this->addToMessage(
3487     __("Erreur lors de la génération de la notification de dépot de dossier par voie dématérialisée.")
3488     );
3489 softime 13528 $this->addToLog(
3490     sprintf('%s(): %s', __METHOD__, $msgLog),
3491     DEBUG_MODE
3492     );
3493 softime 13137 return false;
3494     }
3495 softime 12654 }
3496     }
3497     }
3498     }
3499    
3500 softime 10808 /**
3501 softime 7996 * Mise à jour de la date de dernière modification du dossier
3502     */
3503     $inst_di->update_last_modification_date();
3504    
3505     /**
3506 softime 8640 * Mise à jour des données du DA.
3507     */
3508     $inst_da = $inst_di->get_inst_dossier_autorisation();
3509 softime 9245 $params['di_id'] = $this->valF['dossier'];
3510 softime 8640 if ($inst_da->majDossierAutorisation($params) === false) {
3511     $this->addToMessage(_("Erreur lors de la mise a jour des donnees du dossier d'autorisation. Contactez votre administrateur."));
3512     $this->correct = false;
3513     return false;
3514     }
3515    
3516     /**
3517 fmichon 4708 * Historisation de la vie du DI.
3518     */
3519     //
3520 nmeucci 3963 return $this->add_log_to_dossier($id, array_merge($val, $this->valF));
3521 nmeucci 3876 }
3522 mbroquet 3730
3523 softime 12124 /**
3524     * Cette méthode vérifie si toutes les conditions de l'envoi de la notification
3525     * sont remplies.
3526     * Les conditions vérifiées sont les suivantes :
3527 softime 14064 * - L'option de notification *option_notification* doit être définie
3528 softime 12124 * - Le petitionnaire principal doit accepter les notifications
3529     * - Le pétitionnaire principal doit avoir une adresse mail renseignée
3530     * - Le pétitionnaire principal doit avoir une adresse mail correcte
3531     * Pour chaque vérification effectué un message d'erreur est ajouté si la
3532     * condition n'est pas remplie.
3533     * Renvoie le message d'erreur en sortie.
3534     *
3535     * @param string identifiant du dossier sur lequel les notifications ont échouée
3536     * @return string
3537     */
3538     protected function get_info_notification_fail($dossier = null) {
3539     // Utilise l'identifiant du dossier passé en paramètre et si aucun dossier n'a été récupéré
3540     // utilise celui associé à l'instruction
3541     if ($dossier == null) {
3542     $dossier = $this->getVal('dossier');
3543     }
3544     // Tableau contenant la liste des messages d'erreur
3545     $errorMessage = array();
3546 softime 14064 // Récupère l'option de notification
3547     $collectivite_di = $this->get_dossier_instruction_om_collectivite($dossier);
3548     $option_notification = $this->f->get_param_option_notification($collectivite_di);
3549     if ($option_notification !== PORTAL && $option_notification !== 'mail') {
3550     $errorMessage[] = __("L'option de notification option_notification doit obligatoirement être définie.");
3551     }
3552 softime 12124 // Récupère les informations du demandeurs principal
3553     $infoPetitionnaire = $this->get_info_petitionnaire_principal_dossier($dossier);
3554     // Vérifie si le pétitionnaire principal à bien la case "accepte les notification" cochée
3555     if (isset($infoPetitionnaire['notification']) && $infoPetitionnaire['notification'] != 't') {
3556     $errorMessage[] = __('Le pétitionnaire principal n\'accepte pas les notifications.');
3557     }
3558     // Vérifie si l'adresse mail du pétitionnaire principale est renseignée
3559     if (isset($infoPetitionnaire['courriel']) && ! empty($infoPetitionnaire['courriel'])) {
3560     // Vérifie si le format de l'adresse mail est pas correct et, si ce n'est pas le cas, informe l'utilisateur
3561     // qu'il doit le corriger avant de pouvoir ajouter l'nstruction
3562     if (! $this->f->checkValidEmailAddress($infoPetitionnaire['courriel'])) {
3563     $errorMessage[] = __('Le courriel du pétitionnaire principal n\'est pas correct : ').
3564     $infoPetitionnaire['courriel'].
3565     '.';
3566     }
3567     } else {
3568     // Si le courriel du pétitionnaire principal
3569     $errorMessage[] = __('Le courriel du pétitionnaire principal n\'est pas renseigné.');
3570     }
3571 softime 11585
3572 softime 12124 return $errorMessage;
3573     }
3574    
3575     /**
3576     * Méthode servant à vérifier si un dossier a été déposé sur
3577     * le portail citoyen ou pas.
3578     * La verification se fait via une requête sql dans laquelle
3579     * on va chercher un dossier ayant pour id l'identifiant de
3580     * dossier associé à l'instruction et pour lequel la demande
3581     * associée la plus ancienne est une demande de création de
3582     * dossier via portail
3583     *
3584     * @param string identifiant du dossier. Si non renseigné c'est le dossier
3585     * associé à l'instruction qui est utilisé
3586     * @return boolean|void true : dossier déposé via portail, false : dossier
3587     * non déposé via portail et null : erreur de base de données.
3588     */
3589     protected function dossier_depose_sur_portail($dossier = null) {
3590     if (empty($dossier)) {
3591     $dossier = $this->getVal('dossier');
3592     }
3593 softime 13137 $qres = $this->f->get_one_result_from_db_query(
3594     sprintf(
3595     'SELECT
3596     dossier
3597     FROM
3598     %1$sdossier
3599     -- Récuperation de la première demande associée au dossier
3600     LEFT JOIN (
3601     SELECT
3602     demande,
3603     dossier_instruction,
3604     source_depot
3605     FROM
3606     %1$sdemande
3607     WHERE
3608     dossier_instruction = \'%2$s\'
3609     ORDER BY
3610     demande ASC
3611     LIMIT 1
3612 softime 14064 ) AS demande
3613     ON dossier.dossier = demande.dossier_instruction
3614 softime 13137 WHERE
3615     dossier.dossier = \'%2$s\'
3616     AND demande.source_depot = \'portal\'',
3617     DB_PREFIXE,
3618     $this->f->db->escapeSimple($dossier)
3619     ),
3620     array(
3621     "origin" => __METHOD__,
3622     "force_return" => true,
3623     )
3624 softime 12124 );
3625 softime 13137 if ($qres["code"] !== "OK") {
3626 softime 12124 $this->addToMessage(__('Erreur : La vérification du mode de dépôt du dossier à échoué'));
3627     return;
3628     }
3629     // Si on a un résultat c'est que le dossier a été déposé via le portail
3630 softime 13137 return ! empty($qres["result"]);
3631 softime 12124 }
3632    
3633 softime 11585 public function is_service_notifiable() {
3634     $evenement = $this->get_inst_evenement($this->getVal('evenement'));
3635    
3636     // Si l'instruction a une édition non finalisé quel que soit
3637     // le type de notification, il n'est pas notifiable
3638     if ($this->has_an_edition() === true) {
3639     if ($this->is_unfinalizable_without_bypass() === false) {
3640     return false;
3641     }
3642     }
3643     // Vérifie si la notification des tiers est active pour l'évènement
3644     return $this->get_boolean_from_pgsql_value($evenement->getVal('notification_service'));
3645     }
3646    
3647     public function is_tiers_notifiable() {
3648     $evenement = $this->get_inst_evenement($this->getVal('evenement'));
3649    
3650     // Si l'instruction a une édition non finalisé quel que soit
3651     // le type de notification, il n'est pas notifiable
3652     if ($this->has_an_edition() === true) {
3653     if ($this->is_unfinalizable_without_bypass() === false) {
3654     return false;
3655     }
3656     }
3657     // Vérifie si la notification des tiers est active pour l'évènement
3658 softime 13137 return ! empty($evenement->getVal('notification_tiers'));
3659 softime 11585 }
3660    
3661 softime 12124 /**
3662     * Méthode permettant de savoir si une instruction peut
3663     * être notifiée manuellement selon les différents types
3664     * de notification.
3665     *
3666     * Si l'instruction a une édition non finalisée alors elle n'est pas
3667     * manuellement notifiable.
3668     * Si l'instruction est associé à un événement de notification pour
3669     * lequel un retour signature est recquis, elle n'est notifiable que
3670     * si la date de retour de signature est remplie.
3671     * Par défaut si le type de notification n'est pas connu alors l'instruction
3672     * n'est pas notifiable.
3673     * Pour tous les autres cas l'instruction est manuellement notifiable.
3674     *
3675     * @return boolean true : notifiable | false : non notifiable
3676     */
3677 softime 10808 public function is_notifiable_by_task_manual() {
3678     $ev = $this->get_inst_evenement($this->getVal('evenement'));
3679    
3680     // Si l'instruction a une édition non finalisé quel que soit
3681     // le type de notification, il n'est pas notifiable
3682     if ($this->has_an_edition() === true) {
3683     if ($this->is_unfinalizable_without_bypass() === false) {
3684     return false;
3685     }
3686     }
3687    
3688     // Gestion des différents cas selon la valeur du champs notification
3689 softime 12124 if ($ev->getVal('notification') == 'notification_manuelle' ||
3690     $ev->getVal('notification') == 'notification_manuelle_annexe' ||
3691     $ev->getVal('notification') == 'notification_automatique'
3692     ) {
3693     return true;
3694     } elseif (($ev->getVal('notification') == 'notification_auto_signature_requise' ||
3695     $ev->getVal('notification') == 'notification_manuelle_signature_requise' ||
3696     $ev->getVal('notification') == 'notification_manuelle_annexe_signature_requise') &&
3697     $this->getVal('date_retour_signature') != null &&
3698     $this->getVal('date_retour_signature') != ''
3699     ) {
3700     return true ;
3701 softime 10808 }
3702 softime 12124 return false;
3703 softime 10808 }
3704    
3705 softime 8989 /**
3706 softime 10808 * Crée une instance et une tache de notification pour le demandeur
3707     * principal.
3708     *
3709     * @return boolean true si le traitement à réussi
3710     */
3711     protected function notifier_demandeur_principal() {
3712     $this->begin_treatment(__METHOD__);
3713     $message = '';
3714     // Récupération des informations concernant le demandeur
3715     $dossier = $this->getVal('dossier');
3716 softime 10968 $collectivite_di = $this->get_dossier_instruction_om_collectivite($dossier);
3717 softime 10808 $demandeur = $this->get_demandeurs_notifiable(
3718     $dossier,
3719     true
3720     );
3721     if ($demandeur !== array()) {
3722 softime 10869 $destinataire = array_values($demandeur);
3723 softime 10808 // Ajout de la notif et récupération de son id
3724     $idNotification = $this->ajouter_notification(
3725     $this->getVal($this->clePrimaire),
3726     $this->f->get_connected_user_login_name(),
3727 softime 10968 $destinataire[0],
3728     $collectivite_di,
3729 softime 12433 array(),
3730 softime 10968 true
3731 softime 10808 );
3732     if ($idNotification === false) {
3733     return $this->end_treatment(__METHOD__, false);
3734     }
3735     // Création de la tâche en lui donnant l'id de la notification
3736     $notification_by_task = $this->notification_by_task($idNotification, $dossier);
3737     if ($notification_by_task === false) {
3738     $this->addToMessage(
3739     __("Erreur lors de la génération de la notification au(x) pétitionnaire(s).")
3740     );
3741     return $this->end_treatment(__METHOD__, false);
3742     }
3743     $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.")));
3744     return $this->end_treatment(__METHOD__, true);
3745     }
3746     $this->addToMessage( __("Le demandeur principal n'est pas notifiable."));
3747 softime 12124 return $this->end_treatment(__METHOD__, false);
3748 softime 10808 }
3749    
3750     public function notification_by_task($object_id, $dossier, $category = null, $type = null) {
3751     // Si le type n'est pas correctement spécifié, alors il est calculé
3752 softime 11585 if ($type !== 'notification_recepisse'
3753     && $type !== 'notification_instruction'
3754     && $type !== 'notification_decision'
3755     && $type !== 'notification_service_consulte'
3756 softime 12654 && $type !== 'notification_tiers_consulte'
3757     && $type !== 'notification_depot_demat'
3758     && $type !== 'notification_commune') {
3759 softime 10808 //
3760     $type = 'notification_instruction';
3761     // Vérifie si l'instruction est un récépissé
3762 softime 12654 if ($this->is_instruction_recepisse()) {
3763     $type = 'notification_recepisse';
3764    
3765 softime 10808 }
3766     // Vérifie si l'instruction est une décision
3767     if ($type !== 'notification_recepisse') {
3768     $avis_decision = $this->getVal('avis_decision') !== null ? $this->getVal('avis_decision') : $this->valF['avis_decision'];
3769     if ($avis_decision !== null && $avis_decision !== '') {
3770     $type = 'notification_decision';
3771     }
3772     }
3773     }
3774 softime 14064 // Préparation des valeurs de la tâche
3775 softime 10808 $task_val = array(
3776     'type' => $type,
3777     'object_id' => $object_id,
3778     'dossier' => $dossier,
3779     'category' => $category,
3780     );
3781 softime 14064 // Préparation de la tache de notification
3782     $inst_task = $this->f->get_inst__om_dbform(array(
3783     "obj" => "task",
3784     "idx" => 0,
3785     ));
3786 softime 10808
3787     $add_task = $inst_task->add_task(array('val' => $task_val));
3788     if ($add_task === false) {
3789 softime 13528 $this->addToLog(
3790     sprintf(
3791     '%s(): %s %s : %s',
3792     __METHOD__,
3793     __('Echec de l\'ajout de la tâche de notification.'),
3794     __('Paramétrage de la tâche'),
3795     var_export($task_val, true)
3796     ),
3797     DEBUG_MODE
3798     );
3799 softime 10808 return false;
3800     }
3801    
3802     return true;
3803     }
3804    
3805 softime 10968 /**
3806 softime 12654 * Cette méthode permet de savoir si l'instruction est une instruction
3807     * de recepisse (instruction lié à l'ajout du dossier).
3808     *
3809     * Pour cela, on récupère la liste des actions qui ont menées à la création
3810     * de l'instruction. Si une de ces actions est lié à un objet "demande" on
3811     * en deduis que c'est l'ajout d'une demande qui a déclenché la création de
3812     * l'instruction et donc qu'il s'agit d'un recepisse.
3813     *
3814     * @return boolean
3815     */
3816     protected function is_instruction_recepisse() {
3817     // Récupère la liste des actions qui ont mené à la création de
3818     // l'instruction
3819     $trace = debug_backtrace();
3820     // Parcours la liste des actions et si une de ces actions est lié
3821     // à la classe demande on cosidère que l'instruction est un recepisse
3822     foreach ($trace as $key => $value) {
3823     if (isset($trace[$key]['class']) === true
3824     && empty($trace[$key]['class']) === false) {
3825     if (strtolower($trace[$key]['class']) === 'demande') {
3826     return true;
3827     }
3828     }
3829     }
3830     return false;
3831     }
3832    
3833     /**
3834 softime 10968 * A partir des informations passée en argument ajoute un nouvel élément
3835     * dans la table instruction_notification.
3836     * Avant l'ajout vérifie en utilisant l'id de la collectivité passée en
3837     * paramètre si le paramétrage attendus est ok.
3838     * Ajoute également un nouvel élement dans instruction_notification_document
3839     * si l'instruction possède une lettretype.
3840     * Si un identifiant d'une instruction annexe est donnée ajoute un deuxième
3841     * élement dans la table instruction_notification_document qui correspondra
3842     * à l'annexe de la notification.
3843     *
3844     * @param integer identifiant de l'instruction notifiée
3845     * @param string information concernant l'emetteur
3846     * @param array tableau contenant 2 entrées
3847     * - destinatire : nom, prenom ou raison sociale, dénomination et courriel
3848     * - courriel : adresse mail de la personne à notifier
3849     * @param integer identifiant de la collectivité permettant de récupèrer les
3850     * paramètres à valider
3851     * @param boolean indique si la notification est automatique ou manuelle
3852     * @param integer identifiant d'une instruction dont l'édition sera annexé
3853     * à la notification
3854     *
3855     * @return integer|boolean identifiant de la notification créée si le traitement
3856     * a réussie, false sinon.
3857     */
3858 softime 10869 protected function ajouter_notification(
3859     $idInstruction,
3860     $emetteur,
3861     $destinataire,
3862 softime 10968 $collectiviteId,
3863 softime 12433 $annexes = array(),
3864 softime 10968 $demandeAuto = false,
3865 softime 12124 $statut = 'en cours d\'envoi',
3866 softime 12433 $commentaire = 'Notification en cours de traitement'
3867 softime 10869 ) {
3868 softime 10968 // Vérification que les paramètres nécessaires à l'envoi de la notification existe avant
3869     // de créer la notification
3870     if (! $this->is_parametrage_notification_correct($collectiviteId)) {
3871 softime 13137 $msgErreur = __("Erreur de paramétrage. L'url d'accès au(x) document(s) notifié(s) n'est pas paramétrée.");
3872     $this->addToMessage($msgErreur);
3873 softime 13528 $this->addToLog(
3874     sprintf('%s() : %s', __METHOD__, $msgErreur),
3875     DEBUG_MODE
3876     );
3877 softime 10968 return false;
3878     }
3879 softime 10808 // Préparation de la notification
3880     $inst_notif = $this->f->get_inst__om_dbform(array(
3881     "obj" => "instruction_notification",
3882     "idx" => "]",
3883     ));
3884     $notif_val = array(
3885     'instruction_notification' => null,
3886     'instruction' => $idInstruction,
3887     'automatique' => $demandeAuto,
3888     'emetteur' => $emetteur,
3889     'date_envoi' => null,
3890 softime 10869 'destinataire' => $destinataire['destinataire'],
3891     'courriel' => $destinataire['courriel'],
3892 softime 10808 'date_premier_acces' => null,
3893 softime 12124 'statut' => $statut,
3894     'commentaire' => $commentaire
3895 softime 10808 );
3896    
3897     // Création de la notification
3898     $add_notif = $inst_notif->ajouter($notif_val);
3899     if ($add_notif === false) {
3900 softime 10968 $this->addToMessage(__("Erreur lors de la génération de la notification au(x) pétitionnaire(s)."));
3901 softime 13528 $this->addToLog(
3902     sprintf(
3903     '%s() : %s %s : %s',
3904     __METHOD__,
3905     __("Echec de l'ajout de la notification en base de données."),
3906     __('Paramétrage de la notification'),
3907     var_export($notif_val, true)
3908     ),
3909     DEBUG_MODE
3910     );
3911 softime 10808 return false;
3912     }
3913    
3914 softime 10869 // Si il y a une lettretype finalisé stockage de la clé d'accès au documents
3915     if ($this->evenement_has_an_edition($this->getVal('evenement')) === true) {
3916 softime 12433 $add_notif_doc = $this->ajouter_notification_document(
3917     $inst_notif->getVal($inst_notif->clePrimaire),
3918 softime 10869 $this->getVal($this->clePrimaire),
3919 softime 12433 'instruction'
3920 softime 10808 );
3921     if ($add_notif_doc === false) {
3922 softime 10968 $this->addToMessage(__("Erreur lors de la génération de la notification du document."));
3923 softime 10808 return false;
3924     }
3925 softime 10869 }
3926     // Si une annexe a été choisie stockage de la clé d'accès à l'annexe
3927 softime 12433 if (! empty($annexes) && is_array($annexes)) {
3928     $add_notif_annexe = $this->ajouter_notification_document_multiple(
3929 softime 10869 $inst_notif->getVal($inst_notif->clePrimaire),
3930 softime 12433 $annexes
3931 softime 10869 );
3932     if ($add_notif_annexe === false) {
3933 softime 10968 $this->addToMessage(__("Erreur lors de la génération de la notification de l'annexe."));
3934 softime 10869 return false;
3935     }
3936     }
3937 softime 10808
3938     // Renvoie l'id de la nouvelle instance de instruction_notification
3939     return $inst_notif->getVal($inst_notif->clePrimaire);
3940     }
3941    
3942     /**
3943 softime 11585 * Pour chaque élément du tableau passé en paramètre ajoute une nouvelle
3944     * instance dans la table instruction_notification_document lié a la
3945     * notification dont l'id est passé en paramètre.
3946     *
3947     * @param array tableau contenant les informations nécessaires pour créer les annexes
3948     *
3949     * @return integer|boolean identifiant de la notification créée si le traitement
3950     * a réussie, false sinon.
3951     */
3952     protected function ajouter_notification_document_multiple($idNotification, $listeDocument) {
3953 softime 12433 foreach ($listeDocument as $paramDoc) {
3954     if (! $this->ajouter_notification_document($idNotification, $paramDoc['id'], $paramDoc['tableDocument'], $paramDoc['isAnnexe'])) {
3955 softime 11585 $this->addToMessage(__("Erreur lors de la génération des documents à notifier."));
3956     return false;
3957     }
3958     }
3959     return true;
3960     }
3961    
3962     /**
3963     * Ajoute un élément dans la table instruction_notification_document en utilisant
3964     * les éléments fourni en paramètre
3965     *
3966     * @param integer $idNotification : id de la notification à laquelle on associe le document
3967     * @param integer $idDocument : id de l'objet auquel est rattaché le document
3968     * @param string $tableDocument : nom de la table a laquelle est rattaché le document
3969     * @param boolean $isAnnexe : indique si le document est une annexe ou pas
3970     *
3971     * @return boolean indique si le traitement a réussi
3972     */
3973     protected function ajouter_notification_document($idNotification, $idDocument, $tableDocument, $isAnnexe = false) {
3974     $inst_notif_doc = $this->f->get_inst__om_dbform(array(
3975     "obj" => "instruction_notification_document",
3976     "idx" => "]",
3977     ));
3978     // l'attribut instruction doit obligatoirement être renseigné
3979     // pour éviter toutes confusion avec d'autres instruction l'id
3980     // 0 est donné au document n'appartenant pas aux instructions
3981     $notif_doc_val = array(
3982     'instruction_notification_document' => null,
3983     'instruction_notification' => $idNotification,
3984     'instruction' => $tableDocument == 'instruction' ? $idDocument : 0,
3985     'document_type' => $tableDocument,
3986     'document_id' => $idDocument,
3987     'cle' => $this->getCleAccesDocument(),
3988     'annexe' => $isAnnexe
3989     );
3990    
3991     $add_notif_doc = $inst_notif_doc->ajouter($notif_doc_val);
3992     if ($add_notif_doc === false) {
3993 softime 13528 $this->addToLog(
3994     sprintf(
3995     '%s() : %s %s : %s',
3996     __METHOD__,
3997     __('Echec de l\'ajout du paramétrage du document notifié en base de données.'),
3998     __('Paramétrage du document'),
3999     var_export($notif_doc_val, true)
4000     ),
4001     DEBUG_MODE
4002     );
4003 softime 11585 return false;
4004     }
4005     return true;
4006     }
4007    
4008     /**
4009 softime 10968 * Vérifie si le paramétrage de la notification des demandeurs est correct.
4010     *
4011     * @param integer identifiant de la collectivité
4012     * @return boolean
4013     */
4014     protected function is_parametrage_notification_correct($collectiviteId) {
4015     $categorie = $this->f->get_param_option_notification($collectiviteId);
4016     $urlAccesNotif = $this->f->get_parametre_notification_url_acces($collectiviteId);
4017 softime 14064 if ($categorie === 'mail' && $urlAccesNotif === null) {
4018 softime 10968 return false;
4019     }
4020     return true;
4021     }
4022    
4023     /**
4024 softime 8989 * TRIGGER - triggermodifierapres.
4025     *
4026     * @return boolean
4027     */
4028     function triggermodifierapres($id, &$dnu1 = null, $val = array(), $dnu2 = null) {
4029     $this->addToLog(__METHOD__."(): start", EXTRA_VERBOSE_MODE);
4030 softime 10808 $collectivite_di = $this->get_dossier_instruction_om_collectivite($val['dossier']);
4031     $message = '';
4032 mbroquet 3730
4033 softime 13137 // Définit si le dossier d'instruction doit être mis à jour
4034     $update_dossier = true;
4035     // Les actions de mise à jour des dates ne doivent pas appliquer
4036     // l'action de l'événement et donc ne pas mettre à jour le dossier
4037     if ($this->getParameter("maj") == 125
4038     || $this->getParameter("maj") == 170
4039     || $this->getParameter("maj") == 175) {
4040     $update_dossier = false;
4041     }
4042    
4043     // Traitement en cas de mise à jour du dossier
4044     if ($update_dossier === true) {
4045     /**
4046     * L'objectif ici est d'effectuer les recalculs de date dans le dossier
4047     * si la date de l'evenement est modifiee
4048     */
4049     // Initialisation
4050     $valF = array();
4051     $valF_dt = array();
4052     // Initialisation du type d'événement
4053     $type_evmt = "";
4054     // Récupération de l'action correspondante à l'événement
4055 softime 14064 $evenement = $this->f->get_inst__om_dbform(array(
4056     "obj" => "evenement",
4057     "idx" => $this->valF['evenement']
4058     ));
4059 softime 13137
4060     // Récupération des paramètres de l'action
4061 softime 14064 $sql = sprintf(
4062     'SELECT
4063     *
4064     FROM
4065     %1$saction
4066     WHERE
4067     action = \'%2$s\'',
4068     DB_PREFIXE,
4069     $this->f->db->escapeSimple($evenement->getVal('action'))
4070     );
4071 softime 13137 $res = $this->f->db->query($sql);
4072     $this->addToLog(__METHOD__."(): db->query(\"".$sql."\");", VERBOSE_MODE);
4073     $this->f->isDatabaseError($res);
4074     while ($row=& $res->fetchRow(DB_FETCHMODE_ASSOC)){
4075     // application des regles sur le courrier + delai
4076     if(preg_match("/date_evenement/",$row['regle_date_limite'])){
4077     $valF['date_limite']= $this->regle($row['regle_date_limite'], 'regle_date_limite');
4078     }
4079     if(preg_match("/date_evenement/",$row['regle_date_complet'])){
4080     $valF['date_complet']= $this->regle($row['regle_date_complet'], 'regle_date_complet');
4081     }
4082     if(preg_match("/date_evenement/",$row['regle_date_dernier_depot'])){
4083     $valF['date_dernier_depot']= $this->regle($row['regle_date_dernier_depot'], 'regle_date_dernier_depot');
4084     }
4085     if(preg_match("/date_evenement/",$row['regle_date_notification_delai'])){
4086     $valF['date_notification_delai']= $this->regle($row['regle_date_notification_delai'], 'regle_date_notification_delai');
4087     }
4088     if(preg_match("/date_evenement/",$row['regle_date_decision'])){
4089     $valF['date_decision']= $this->regle($row['regle_date_decision'], 'regle_date_decision');
4090     }
4091     if(preg_match("/date_evenement/",$row['regle_date_rejet'])){
4092     $valF['date_rejet']= $this->regle($row['regle_date_rejet'], 'regle_date_rejet');
4093     }
4094     if(preg_match("/date_evenement/",$row['regle_date_validite'])){
4095     $valF['date_validite']= $this->regle($row['regle_date_validite'], 'regle_date_validite');
4096     }
4097     if(preg_match("/date_evenement/",$row['regle_date_chantier'])){
4098     $valF['date_chantier']= $this->regle($row['regle_date_chantier'], 'regle_date_chantier');
4099     }
4100     if(preg_match("/date_evenement/",$row['regle_date_achevement'])){
4101     $valF['date_achevement']= $this->regle($row['regle_date_achevement'], 'regle_date_achevement');
4102     }
4103     if(preg_match("/date_evenement/",$row['regle_date_conformite'])){
4104     $valF['date_conformite']= $this->regle($row['regle_date_conformite'], 'regle_date_conformite');
4105     }
4106     if(preg_match("/date_evenement/",$row['regle_date_cloture_instruction'])){
4107     $valF['date_cloture_instruction']= $this->regle($row['regle_date_cloture_instruction'], 'regle_date_cloture_instruction');
4108     }
4109     if(preg_match("/date_evenement/",$row['regle_date_premiere_visite'])){
4110     $valF['date_premiere_visite']= $this->regle($row['regle_date_premiere_visite'], 'regle_date_premiere_visite');
4111     }
4112     if(preg_match("/date_evenement/",$row['regle_date_derniere_visite'])){
4113     $valF['date_derniere_visite']= $this->regle($row['regle_date_derniere_visite'], 'regle_date_derniere_visite');
4114     }
4115     if(preg_match("/date_evenement/",$row['regle_date_contradictoire'])){
4116     $valF['date_contradictoire']= $this->regle($row['regle_date_contradictoire'], 'regle_date_contradictoire');
4117     }
4118     if(preg_match("/date_evenement/",$row['regle_date_retour_contradictoire'])){
4119     $valF['date_retour_contradictoire']= $this->regle($row['regle_date_retour_contradictoire'], 'regle_date_retour_contradictoire');
4120     }
4121     if(preg_match("/date_evenement/",$row['regle_date_ait'])){
4122     $valF['date_ait']= $this->regle($row['regle_date_ait'], 'regle_date_ait');
4123     }
4124     if(preg_match("/date_evenement/",$row['regle_date_transmission_parquet'])){
4125     $valF['date_transmission_parquet']= $this->regle($row['regle_date_transmission_parquet'], 'regle_date_transmission_parquet');
4126     }
4127     if ($row['regle_donnees_techniques1'] !== '') {
4128     $valF_dt[$row['cible_regle_donnees_techniques1']] = $this->regle($row['regle_donnees_techniques1'], 'regle_donnees_techniques1');
4129     }
4130     if ($row['regle_donnees_techniques2'] !== '') {
4131     $valF_dt[$row['cible_regle_donnees_techniques2']] = $this->regle($row['regle_donnees_techniques2'], 'regle_donnees_techniques2');
4132     }
4133     if ($row['regle_donnees_techniques3'] !== '') {
4134     $valF_dt[$row['cible_regle_donnees_techniques3']] = $this->regle($row['regle_donnees_techniques3'], 'regle_donnees_techniques3');
4135     }
4136     if ($row['regle_donnees_techniques4'] !== '') {
4137     $valF_dt[$row['cible_regle_donnees_techniques4']] = $this->regle($row['regle_donnees_techniques4'], 'regle_donnees_techniques4');
4138     }
4139     if ($row['regle_donnees_techniques5'] !== '') {
4140     $valF_dt[$row['cible_regle_donnees_techniques5']] = $this->regle($row['regle_donnees_techniques5'], 'regle_donnees_techniques5');
4141     }
4142     if ($row['regle_dossier_instruction_type'] !== '') {
4143     $valF['dossier_instruction_type'] = $this->regle($row['regle_dossier_instruction_type'], 'regle_dossier_instruction_type');
4144     }
4145 mbroquet 3730 }
4146 softime 13137 // Si des valeurs de données techniques ont été calculées alors on met à jour l'enregistrement
4147     if (count($valF_dt) > 0) {
4148     $dt_id = $this->getDonneesTechniques();
4149     // On met à jour le dossier
4150     $cle = " donnees_techniques='".$dt_id."'";
4151     $res1 = $this->f->db->autoExecute(DB_PREFIXE.'donnees_techniques', $valF_dt, DB_AUTOQUERY_UPDATE, $cle);
4152     $this->addToLog(
4153     __METHOD__."(): db->autoexecute(\"".DB_PREFIXE."donnees_techniques\", ".print_r($valF_dt, true).", DB_AUTOQUERY_UPDATE, \"".$cle."\");",
4154     VERBOSE_MODE
4155     );
4156     $this->f->isDatabaseError($res1);
4157     // Affichage d'informations à l'utilisateur
4158     $this->addToMessage(_('enregistrement')." ".$this->valF['dossier']." "._('table')." dossier [".$this->f->db->affectedRows()." "._('enregistrement')." "._('mis_a_jour')."]");
4159 mbroquet 3730 }
4160 softime 13137 // Si des valeurs ont été calculées alors on met à jour l'enregistrement
4161     if (count($valF) > 0) {
4162     $inst_dossier = $this->f->get_inst__om_dbform(array(
4163     "obj" => "dossier",
4164     "idx" => $this->valF['dossier'],
4165     ));
4166     $valF['instruction'] = $id;
4167     $valF['crud'] = 'update';
4168     $update_by_instruction = $inst_dossier->update_by_instruction($valF);
4169     if ($update_by_instruction === false) {
4170     $this->cleanMessage();
4171     $this->addToMessage(sprintf('%s %s', __("Une erreur s'est produite lors de la mise à jour du dossier d'instruction."), __("Veuillez contacter votre administrateur.")));
4172     return false;
4173     }
4174     // Affichage d'informations à l'utilisateur
4175     $this->addToMessage(_('enregistrement')." ".$this->valF['dossier']." "._('table')." dossier [".$this->f->db->affectedRows()." "._('enregistrement')." "._('mis_a_jour')."]");
4176 mbroquet 3730 }
4177     }
4178    
4179 softime 14064 // Par défaut les instructions à ajouter suite à la saisie d'une date
4180     // de retour signature ou de notification, utilisent l'action 0
4181     // Si la création d'événement d'instruction suivant est déclenchée par
4182     // une notification suite au traitement d'une tâche (démat') alors l'ajout
4183     // de la nouvelle instruction se fait avec l'action 176
4184     // Cela permet de ne pas contrôler la restriction lors de l'ajout de la
4185     // nouvelle instruction, depuis la méthode verifier()
4186     $code_action_add = 0;
4187     if ($this->getParameter("maj") == 175) {
4188     $code_action_add = 176;
4189     }
4190 mbroquet 3730 $restriction = $this->get_restriction($val['evenement']);
4191     $this->restriction_valid = $this->restrictionIsValid($restriction);
4192    
4193     if($restriction == "" || $this->restriction_valid ){
4194     // Récupération de tous les paramètres de l'événement sélectionné
4195     $sql = "SELECT * FROM ".DB_PREFIXE."evenement
4196     WHERE evenement=".$this->valF['evenement'];
4197 softime 8989 $res = $this->f->db->query($sql);
4198     $this->addToLog(__METHOD__."(): db->query(\"".$sql."\");", VERBOSE_MODE);
4199 softime 12847 $this->f->isDatabaseError($res);
4200 nmeucci 3965 $current_id = $this->getVal($this->clePrimaire);
4201 mbroquet 3730 while ($row=& $res->fetchRow(DB_FETCHMODE_ASSOC)) {
4202     // Si la date de retour signature est éditée on vérifie si il existe un événement automatique
4203     if ($this->getVal('date_retour_signature') == "" AND
4204     $this->valF['date_retour_signature'] != "" AND
4205     $row['evenement_retour_signature'] != "") {
4206 softime 7996 $new_instruction = $this->f->get_inst__om_dbform(array(
4207     "obj" => "instruction",
4208     "idx" => "]",
4209     ));
4210 mbroquet 3730 // Création d'un tableau avec la liste des champs de l'instruction
4211     foreach($new_instruction->champs as $champ) {
4212     $valNewInstr[$champ] = "";
4213     }
4214     // Définition des valeurs de la nouvelle instruction
4215     $valNewInstr["evenement"] = $row['evenement_retour_signature'];
4216     $valNewInstr["destinataire"] = $this->valF['destinataire'];
4217     $valNewInstr["dossier"] = $this->valF['dossier'];
4218     $valNewInstr["date_evenement"] = $this->f->formatDate($this->valF['date_retour_signature']);
4219     $valNewInstr["date_envoi_signature"] = $this->f->formatDate($this->valF['date_envoi_signature']);
4220     $valNewInstr["date_retour_signature"] = $this->f->formatDate($this->valF['date_retour_signature']);
4221     $valNewInstr["date_envoi_rar"] = $this->f->formatDate($this->valF['date_envoi_rar']);
4222     $valNewInstr["date_retour_rar"] = $this->f->formatDate($this->valF['date_retour_rar']);
4223     $valNewInstr["date_envoi_controle_legalite"] = $this->f->formatDate($this->valF['date_envoi_controle_legalite']);
4224     $valNewInstr["date_retour_controle_legalite"] = $this->f->formatDate($this->valF['date_retour_controle_legalite']);
4225 softime 14064 $new_instruction->setParameter("maj", $code_action_add);
4226     $new_instruction->class_actions[$code_action_add]["identifier"] =
4227 softime 13528 sprintf(
4228     __("Ajout suite au retour signature de l'instruction %s"),
4229     $current_id
4230     );
4231 softime 8989 $retour = $new_instruction->ajouter($valNewInstr);
4232 mbroquet 3730
4233     //Si une erreur s'est produite et qu'il s'agit d'un problème
4234     //de restriction
4235     if ($retour == false && !$new_instruction->restriction_valid){
4236     $error_message = $this->get_restriction_error_message($restriction);
4237     $this->f->displayMessage("error", $error_message);
4238 softime 8989 $this->addToLog(__METHOD__."(): evenement retour ".
4239 mbroquet 3730 "instruction ".$this->valF[$this->clePrimaire]." : ".
4240     $new_instruction->msg);
4241     }
4242     //Si une erreur s'est produite après le test de la restriction
4243     elseif ($retour == false && $new_instruction->restriction_valid){
4244     $this->correct = false ;
4245     $this->msg .= $new_instruction->msg;
4246     return false;
4247     }
4248     }
4249     // Si la date de retour AR est éditée on vérifie si il existe un événement automatique
4250     if ($this->getVal('date_retour_rar') == "" AND
4251     $this->valF['date_retour_rar'] != "") {
4252    
4253     if($row['evenement_retour_ar'] != "") {
4254 softime 7996 $new_instruction = $this->f->get_inst__om_dbform(array(
4255     "obj" => "instruction",
4256     "idx" => "]",
4257     ));
4258 mbroquet 3730 // Création d'un tableau avec la liste des champs de l'instruction
4259     foreach($new_instruction->champs as $champ) {
4260     $valNewInstr[$champ] = "";
4261     }
4262     // Définition des valeurs de la nouvelle instruction
4263     $valNewInstr["evenement"] = $row['evenement_retour_ar'];
4264     $valNewInstr["destinataire"] = $this->valF['destinataire'];
4265     $valNewInstr["dossier"] = $this->valF['dossier'];
4266     $valNewInstr["date_evenement"] = $this->f->formatDate($this->valF['date_retour_rar']);
4267     $valNewInstr["date_envoi_signature"] = $this->f->formatDate($this->valF['date_envoi_signature']);
4268     $valNewInstr["date_retour_signature"] = $this->f->formatDate($this->valF['date_retour_signature']);
4269     $valNewInstr["date_envoi_rar"] = $this->f->formatDate($this->valF['date_envoi_rar']);
4270     $valNewInstr["date_retour_rar"] = $this->f->formatDate($this->valF['date_retour_rar']);
4271     $valNewInstr["date_envoi_controle_legalite"] = $this->f->formatDate($this->valF['date_envoi_controle_legalite']);
4272     $valNewInstr["date_retour_controle_legalite"] = $this->f->formatDate($this->valF['date_retour_controle_legalite']);
4273 softime 14064 $new_instruction->setParameter("maj", $code_action_add);
4274     $new_instruction->class_actions[$code_action_add]["identifier"] =
4275 softime 13137 sprintf(__("Ajout suite à la notification de l'instruction %s"), $current_id);
4276 softime 8989 $retour = $new_instruction->ajouter($valNewInstr);
4277 mbroquet 3730
4278     //Si une erreur s'est produite et qu'il s'agit d'un problème
4279     //de restriction
4280     if ($retour == false && !$new_instruction->restriction_valid) {
4281     $error_message = $this->get_restriction_error_message($restriction);
4282     $this->f->displayMessage("error", $error_message);
4283     $this->addToLog(
4284 softime 8989 __METHOD__."(): evenement retour instruction ".
4285 mbroquet 3730 $this->valF[$this->clePrimaire]." : ".
4286     $new_instruction->msg
4287     );
4288     }
4289     //Si une erreur s'est produite après le test de la restriction
4290     elseif ($retour == false && $new_instruction->restriction_valid){
4291     $this->correct = false ;
4292     $this->msg .= $new_instruction->msg;
4293     return false;
4294     }
4295     }
4296     }
4297     }
4298     }
4299    
4300 softime 13137 // Traitement en cas de mise à jour du dossier
4301     if ($update_dossier === true) {
4302     /**
4303     * Mise à jour de la date de dernière modification du dossier
4304     * d'instruction
4305     */
4306     $inst_di = $this->get_inst_dossier($this->getVal('dossier'));
4307     $inst_di->update_last_modification_date();
4308 softime 8640
4309 softime 13137 // Mise à jour des données du dossier d'autorisation
4310     $da = $this->f->get_inst__om_dbform(array(
4311     "obj" => "dossier_autorisation",
4312     "idx" => $this->getNumDemandeAutorFromDossier($this->valF['dossier']),
4313     ));
4314     $params = array(
4315     'di_id' => $this->getVal('dossier'),
4316     );
4317     if($da->majDossierAutorisation($params) === false) {
4318     $this->addToMessage(_("Erreur lors de la mise a jour des donnees du dossier d'autorisation. Contactez votre administrateur."));
4319     $this->correct = false;
4320     return false;
4321     }
4322 mbroquet 3730 }
4323 softime 7996
4324 softime 10573 // mise à jour des métadonnées issues des dates de suivi
4325     $dateRetourSignatureModified = ($this->valF['date_retour_signature'] != $this->getVal('date_retour_signature'));
4326     $dateRetourRARModified = ($this->valF['date_retour_rar'] != $this->getVal('date_retour_rar'));
4327     if ($dateRetourSignatureModified || $dateRetourRARModified) {
4328    
4329     // Calculs des nouvelles métadonnées
4330     $metadata = $this->getMetadata("om_fichier_instruction");
4331    
4332     // On vérifie si l'instruction à finaliser a un événement de type arrete
4333 softime 14064 // TODO : A voir pour remplacer par une instanciation de l'événement.
4334     // Voir également si l'événement ne dois pas être instancié en début de
4335     // méthode pour pouvoir être réutilisé.
4336     $qres = $this->f->get_one_result_from_db_query(
4337     sprintf(
4338     'SELECT
4339     type
4340     FROM
4341     %1$sevenement
4342     WHERE
4343     evenement = \'%2$d\'',
4344     DB_PREFIXE,
4345     intval($this->getVal("evenement"))
4346     ),
4347     array(
4348     "origin" => __METHOD__,
4349     "force_return" => true,
4350     )
4351     );
4352    
4353     if ($qres["code"] !== "OK") {
4354 softime 10573 $this->correct = false;
4355     $this->addToMessage(__("Erreur de traitement de fichier."));
4356 softime 14064 $this->addToLog(__METHOD__."() erreur BDD: ".var_export($qres['message'], true), DEBUG_MODE);
4357 softime 10573 return false;
4358     }
4359    
4360     // Si l'événement est de type arrete, on ajoute les métadonnées spécifiques
4361 softime 14064 if ($qres['result'] == 'arrete'){
4362 softime 10573 $metadata = array_merge($metadata, $this->getMetadata("arrete"));
4363     }
4364    
4365     // Filtre pour conserver uniquement les métadonnées liées aux dates
4366     $metadataToKeep = array(
4367     "statutAutorisation",
4368     "dateEvenementDocument",
4369     'date_cloture_metier',
4370     "NotificationArrete",
4371     "dateNotificationArrete",
4372     "controleLegalite",
4373     "dateSignature",
4374     "nomSignataire",
4375     "qualiteSignataire",
4376     "dateControleLegalite",
4377     );
4378     $metadata = array_filter(
4379     $metadata,
4380     function($key) use ($metadataToKeep) { return in_array($key, $metadataToKeep); },
4381     ARRAY_FILTER_USE_KEY
4382     );
4383    
4384     // Mise à jour des métadonnées du document en GED
4385     $docUid = $this->getVal("om_fichier_instruction");
4386     $operationOrUID = $this->f->storage->update_metadata($docUid, $metadata);
4387     if ($operationOrUID == 'OP_FAILURE') {
4388     $this->correct = false;
4389     $this->addToMessage(__("Erreur de traitement de fichier."));
4390     $this->addToLog(__METHOD__."() failed to update metadata: ".var_export($operationOrUID, true), DEBUG_MODE);
4391     return false;
4392     }
4393    
4394     // mise à jour de l'UID du document en BDD
4395     else {
4396     $valF = array('om_fichier_instruction' => $operationOrUID);
4397     $res = $this->f->db->autoExecute(DB_PREFIXE.$this->table, $valF, DB_AUTOQUERY_UPDATE, $this->getCle($id));
4398     $this->addToLog(__METHOD__.'() : db->autoExecute("'.DB_PREFIXE.$this->table.'", '.print_r($valF, true).', DB_AUTOQUERY_UPDATE, "'.$this->getCle($id).'")', VERBOSE_MODE);
4399     if ($this->f->isDatabaseError($res, true) === true) {
4400     $this->correct = false;
4401     $this->addToMessage(__("Erreur de traitement de fichier."));
4402     $this->addToLog(__METHOD__."() erreur BDD: ".var_export($res->getMessage(), true), DEBUG_MODE);
4403     return false;
4404     }
4405     $this->addToMessage(__("La mise a jour du document s'est effectuee avec succes."));
4406     }
4407     }
4408    
4409 softime 13137 // Déclenchement des notifications automatique après finalisation et
4410     // retour de signature
4411 softime 10808 if ($dateRetourSignatureModified === true
4412     && $this->valF['date_retour_signature'] !== ''
4413     && $this->valF['date_retour_signature'] !== null) {
4414 softime 13137
4415     // Message à afficher dans les logs pour indiquer quelle notification a échouée
4416 softime 13528 $msgLog = sprintf(
4417     '%s %s : %d',
4418     __('Erreur lors de la notification automatique du(des) pétitionnaire(s) après retour signature.'),
4419     __('Instruction notifiée'),
4420     $id
4421     );
4422 softime 13137
4423     // Récupération de l'instance de l'événement pour accéder au paramètrage
4424     // des notifications
4425 softime 10808 $ev = $this->get_inst_evenement($this->valF['evenement']);
4426 softime 13137 // Si la notification automatique des tiers consulté est active
4427     // déclenche le traitement de notification.
4428     // Ce traitement va envoyer des courriels de notification à tous les tiers concernés
4429     $typeNotifTiers = $ev->getVal('notification_tiers');
4430     $inst_di = $this->get_inst_dossier($this->getVal('dossier'));
4431     if ($typeNotifTiers === 'notification_automatique') {
4432     if ($this->traitement_notification_automatique_tiers_consulte($ev, $inst_di) === false) {
4433     $this->addToMessage(__('Le traitement de la notification automatique de tiers à échoué.'));
4434     $this->correct = false;
4435     }
4436     }
4437    
4438 softime 10808 if ($ev->getVal('notification') === 'notification_auto_signature_requise') {
4439     // Récupération de la liste des demandeurs à notifier et de la catégorie
4440     $categorie = $this->f->get_param_option_notification($collectivite_di);
4441 softime 14064 $isPortal = $categorie === PORTAL;
4442 softime 10869 $demandeursANotifie = $this->get_demandeurs_notifiable(
4443     $this->valF['dossier'],
4444     $isPortal
4445     );
4446 softime 10808
4447     // Création d'une notification et d'une tâche pour chaque demandeur à notifier
4448 softime 12124 $demandeurPrincipalNotifie = false;
4449 softime 10808 foreach ($demandeursANotifie as $demandeur) {
4450 softime 12124 // Identifie si le demandeur principal a été notifié ou pas
4451     // et récupère ses informations
4452     if ($demandeur['petitionnaire_principal'] == 't') {
4453     $demandeurPrincipalNotifie = true;
4454     // Si le demandeur principal est notifiable mais qu'il y a des erreurs dans
4455     // son paramétrage, on effectue pas le traitement et on passe à l'itération
4456     // suivante. On le considère également comme non notifié pour gérer l'envoie
4457     // des messages d'erreurs
4458     // Si la demande a été déposée via le portail alors le paramétrage n'a pas
4459     // d'impact sur la notification
4460     $erreursParam = $this->get_info_notification_fail();
4461     if (! $this->dossier_depose_sur_portail() && $erreursParam != array()) {
4462     $demandeurPrincipalNotifie = false;
4463     continue;
4464     }
4465     }
4466 softime 10808 // Ajout de la notif et récupération de son id
4467     $idNotif = $this->ajouter_notification(
4468     $this->valF[$this->clePrimaire],
4469     $this->f->get_connected_user_login_name(),
4470 softime 10968 $demandeur,
4471     $collectivite_di,
4472 softime 12433 array(),
4473 softime 10968 true
4474 softime 10808 );
4475     if ($idNotif === false) {
4476 softime 13528 $this->addToLog(
4477     sprintf('%s() : %s',__METHOD__, $msgLog),
4478     DEBUG_MODE
4479     );
4480 softime 10808 return false;
4481     }
4482     // Création de la tache en lui donnant l'id de la notification
4483     $notification_by_task = $this->notification_by_task(
4484     $idNotif,
4485     $this->valF['dossier'],
4486     $categorie
4487     );
4488     if ($notification_by_task === false) {
4489 softime 13528 $this->addToLog(
4490     sprintf('%s() : %s',__METHOD__, $msgLog),
4491     DEBUG_MODE
4492     );
4493 softime 10808 $this->addToMessage(
4494     __("Erreur lors de la génération de la notification au(x) pétitionnaire(s).")
4495     );
4496     return false;
4497     }
4498     }
4499 softime 12847 // Pour la notification par mail ou la notification via portal si le dossier a
4500     // été déposés via portal, si le demandeur principal n'est pas notifiable,
4501     // on créé une nouvelle notification en erreur avec en commentaire la raison pour
4502     // laquelle le demandeur principal n'a pas pu être notifié
4503     $depotPortal = $this->dossier_depose_sur_portail();
4504     if (! $demandeurPrincipalNotifie && ($isPortal === false || $depotPortal === true)) {
4505 softime 13137 // Précise dans les logs que le pétitionnaire principal n'a pas été notifié
4506 softime 13528 $msgLog .= sprintf(' %s', __('Le pétitionnaire principale n\'est pas notifiable.'));
4507 softime 12124 // Analyse pour savoir pourquoi le demandeur principal n'est pas notifiable
4508     $erreursParam = $this->get_info_notification_fail();
4509     $demandeurPrincipal = $this->get_info_petitionnaire_principal_dossier($this->getVal('dossier'));
4510     // Ajout de la notif et récupération de son id
4511     $idNotif = $this->ajouter_notification(
4512     $this->valF[$this->clePrimaire],
4513     $this->f->get_connected_user_login_name(),
4514     $demandeurPrincipal,
4515     $collectivite_di,
4516 softime 12433 array(),
4517 softime 12124 true,
4518     'Echec',
4519     implode(' ', $erreursParam)
4520     );
4521     if ($idNotif === false) {
4522 softime 13528 $this->addToLog(
4523     sprintf('%s() : %s', __METHOD__, $msgLog),
4524     DEBUG_MODE
4525     );
4526 softime 12124 $this->addToMessage(
4527     __('Erreur : la création de la notification a échouée.').
4528     __("Veuillez contacter votre administrateur.")
4529     );
4530     return false;
4531     }
4532     // Prépare un message d'alerte à destination de l'instructeur pour l'informer
4533     // de l'échec de la notification
4534     $dossier_message = $this->get_inst_dossier_message(0);
4535     $dossier_message_val = array(
4536     'dossier' => $this->getVal('dossier'),
4537     'type' => _('erreur expedition'),
4538     'emetteur' => $this->f->get_connected_user_login_name(),
4539     'login' => $_SESSION['login'],
4540     'date_emission' => date('Y-m-d H:i:s'),
4541     'contenu' => _('Échec lors de la notification de l\'instruction ').
4542     $ev->getVal('libelle').
4543     '.<br>'.
4544     implode("\n", $erreursParam).
4545     '<br>'.
4546     _('Veuillez corriger ces informations avant de renvoyer la notification.')
4547     );
4548     $add = $dossier_message->add_notification_message($dossier_message_val, true);
4549     // Si une erreur se produit pendant l'ajout
4550     if ($add !== true) {
4551 softime 13528 $this->addToLog(
4552     sprintf(
4553     '%s() : %s',
4554     __METHOD__,
4555     __("Le message d'alerte concernant l'echec de l'envoi de la notification n'a pas pu être envoyé.")
4556     ),
4557     DEBUG_MODE
4558     );
4559 softime 12124 return false;
4560     }
4561     }
4562 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.")));
4563     }
4564     }
4565    
4566 nmeucci 3933 return $this->add_log_to_dossier($id, $val);
4567 fmichon 4708 }
4568 mbroquet 3730
4569 softime 8989 /**
4570     * TRIGGER - triggersupprimer.
4571     *
4572     * @return boolean
4573     */
4574     function triggersupprimer($id, &$dnu1 = null, $val = array(), $dnu2 = null) {
4575     $this->addToLog(__METHOD__."(): start", EXTRA_VERBOSE_MODE);
4576 mbroquet 3730 /**
4577     * L'objectif ici est de repositionner les valeurs récupérées en
4578     * archive dans le dossier d'instruction avant de supprimer l'événement
4579 softime 10573 * d'instruction si les valeurs du dossier sont différentes
4580 mbroquet 3730 */
4581 softime 10573 $valF = array();
4582     $inst_di = $this->get_inst_dossier($this->getVal('dossier'));
4583     foreach ($inst_di->champs as $key => $champ) {
4584     // Si le champ du DI à une archive dans l'instruction
4585     if (isset($val[sprintf('archive_%s', $champ)]) === true) {
4586     // Si la valeur entre le champ du DI et son archive dans instruction
4587     // est différente
4588     if ($inst_di->getVal($champ) !== $val[sprintf('archive_%s', $champ)]) {
4589     $val[sprintf('archive_%s', $champ)] === '' ? $valF[$champ] = null : $valF[$champ] = $val[sprintf('archive_%s', $champ)];
4590     }
4591     }
4592 softime 5024 }
4593 softime 10573 // Spécificité du champ avis_decision dont le champ archive est nommé
4594     // différemment
4595     if ($inst_di->getVal('avis_decision') !== $val['archive_avis']) {
4596     $val['archive_avis'] === '' ? $valF['avis_decision'] = null : $valF['avis_decision'] = $val['archive_avis'];
4597 softime 5024 }
4598 softime 10573 // Spécificité de la date d'affichage dont la valeur n'ai jamais modifiée
4599     // par l'archive
4600     unset($valF['date_affichage']);
4601 softime 6565
4602 softime 9245 /**
4603     * Mise à jour de la version de clôture *version_clos* du dossier si et
4604     * seulement si l'instruction met à jour l'état du dossier.
4605     */
4606 softime 10573 if (isset($valF['etat']) === true
4607     && $valF['etat'] !== null
4608 softime 9245 && $valF['etat'] !== '') {
4609 softime 10573 // Récupère l'état actuel du dossier d'instruction
4610     $inst_current_etat = $this->f->get_inst__om_dbform(array(
4611     "obj" => "etat",
4612     "idx" => $inst_di->get_id_etat(),
4613     ));
4614 softime 9245 // Instanciation de l'état archivé appliqué sur le dossier
4615     $inst_etat = $this->f->get_inst__om_dbform(array(
4616     "obj" => "etat",
4617     "idx" => $valF['etat'],
4618     ));
4619     //
4620     $update_version_clos = null;
4621     // En cas de clôture du dossier par l'état archivé
4622     if ($inst_etat->getVal('statut') === 'cloture') {
4623     $update_version_clos = $inst_di->update_version_clos('up');
4624     }
4625     // En cas de réouverture du dossier par l'état archivé
4626     if ($inst_current_etat->getVal('statut') === 'cloture'
4627     && $inst_etat->getVal('statut') !== 'cloture') {
4628     //
4629     $update_version_clos = $inst_di->update_version_clos('down');
4630     //
4631     $this->set_att_di_reopened(true);
4632     }
4633     //
4634     if ($update_version_clos === false) {
4635     $this->f->addToLog(sprintf(
4636     "%s() : ERREUR - %s %s",
4637     __METHOD__,
4638     sprintf(
4639     __("Impossible de mettre à jour la version de clôture du dossier d'instruction %s."),
4640     $inst_di->getVal($inst_di->clePrimaire)
4641     ),
4642     sprintf(
4643     __("L'instruction tente d'appliquer l'état %s."),
4644     $inst_etat->getVal($inst_etat->clePrimaire)
4645     )
4646     ));
4647     $this->addToMessage(sprintf(
4648     "%s %s",
4649     __("Erreur lors de la mise à jour de la version de clôture du dossier d'instruction."),
4650     __("Veuillez contacter votre administrateur.")
4651     ));
4652     return false;
4653     }
4654     }
4655 softime 10808 // On supprime toutes les notications liées à l'instruction
4656 softime 12654 $notifASupprimer = $this->get_instruction_notification(
4657     $this->getVal($this->clePrimaire),
4658     array(
4659     'notification_recepisse',
4660     'notification_instruction',
4661     'notification_decision',
4662     'notification_service_consulte',
4663     'notification_tiers_consulte',
4664 softime 13137 'notification_depot_demat',
4665     'notification_commune'
4666 softime 12654 ),
4667     true
4668     );
4669    
4670 softime 10808 foreach ($notifASupprimer as $idNotif) {
4671     $inst_notif = $this->f->get_inst__om_dbform(array(
4672     "obj" => "instruction_notification",
4673     "idx" => $idNotif,
4674     ));
4675     $val_notif = array();
4676     foreach ($inst_notif->champs as $champ) {
4677     $val_notif[$champ] = $inst_notif->getVal($champ);
4678     }
4679     // La suppression des notifications entrainera la suppression des tâches qui y sont
4680     // liées
4681     $supprNotif = $inst_notif->supprimer($val_notif);
4682     if ($supprNotif == false) {
4683     $this->addToMessage(sprintf(
4684     "%s %s",
4685     __("Erreur lors de la suppression des notifications de l'instruction."),
4686     __("Veuillez contacter votre administrateur.")
4687     ));
4688     return false;
4689     }
4690     }
4691 softime 9245
4692 softime 10573 // On met à jour le dossier
4693     $valF['instruction'] = $id;
4694 softime 10968 $valF['crud'] = 'delete';
4695 softime 10573 $update_by_instruction = $inst_di->update_by_instruction($valF);
4696     if ($update_by_instruction === false) {
4697     $this->cleanMessage();
4698     $this->addToMessage(sprintf('%s %s', __("Une erreur s'est produite lors de la mise à jour du dossier d'instruction."), __("Veuillez contacter votre administrateur.")));
4699     return false;
4700     }
4701    
4702 softime 5024 // Affichage d'informations à l'utilisateur
4703 softime 8989 $this->addToMessage(_("Suppression de l'instruction")." [".$this->f->db->affectedRows()." "._('enregistrement')." "._('mis_a_jour')."]");
4704 softime 5024
4705     // Mise à jour de la demande si un récépissé d'instruction correspond à l'instruction à supprimer
4706 mbroquet 3730 }
4707    
4708 softime 8989 /**
4709     * TRIGGER - triggersupprimerapres.
4710     *
4711     * @return boolean
4712     */
4713     function triggersupprimerapres($id, &$dnu1 = null, $val = array(), $dnu2 = null) {
4714     $this->addToLog(__METHOD__."(): start", EXTRA_VERBOSE_MODE);
4715 softime 8640 /**
4716     * Mise à jour de la date de dernière modification du dossier
4717     * d'instruction
4718     */
4719     $inst_di = $this->get_inst_dossier($this->getVal('dossier'));
4720     $inst_di->update_last_modification_date();
4721    
4722     /**
4723     * Mise à jour des données du dossier d'autorisation
4724     */
4725 softime 7996 $da = $this->f->get_inst__om_dbform(array(
4726     "obj" => "dossier_autorisation",
4727     "idx" => $this->getNumDemandeAutorFromDossier($val["dossier"]),
4728     ));
4729 softime 8640 $params = array(
4730     'di_id' => $this->getVal('dossier'),
4731 softime 9245 'di_reopened' => $this->get_att_di_reopened(),
4732 softime 8640 );
4733     if($da->majDossierAutorisation($params) === false) {
4734 mbroquet 3730 $this->addToMessage(_("Erreur lors de la mise a jour des donnees du dossier d'autorisation. Contactez votre administrateur."));
4735     $this->correct = false;
4736     return false;
4737     }
4738 softime 7996
4739 softime 10573 /**
4740     * Gestion des tâches pour la dématérialisation
4741     */
4742     $inst_task_empty = $this->f->get_inst__om_dbform(array(
4743     "obj" => "task",
4744     "idx" => 0,
4745     ));
4746     foreach ($inst_di->task_types as $task_type) {
4747     $task_exists = $inst_task_empty->task_exists($task_type, $id);
4748     if ($task_exists !== false) {
4749     $inst_task = $this->f->get_inst__om_dbform(array(
4750     "obj" => "task",
4751     "idx" => $task_exists,
4752     ));
4753     if ($inst_task->getVal('state') === $inst_task::STATUS_NEW || $inst_task->getVal('state') === $inst_task::STATUS_DRAFT) {
4754     $task_val = array(
4755     'state' => $inst_task::STATUS_CANCELED,
4756     );
4757     $update_task = $inst_task->update_task(array('val' => $task_val));
4758     if ($update_task === false) {
4759     $this->addToMessage(sprintf('%s %s',
4760     sprintf(__("Une erreur s'est produite lors de la modification de la tâche %."), $inst_task->getVal($inst_task->clePrimaire)),
4761     __("Veuillez contacter votre administrateur.")
4762     ));
4763     $this->correct = false;
4764     return false;
4765     }
4766     }
4767     }
4768     }
4769    
4770 softime 7996 //
4771 softime 8640 $val['evenement'] = $this->getVal('evenement');
4772 nmeucci 3933 return $this->add_log_to_dossier($id, $val);
4773 mbroquet 3730 }
4774    
4775     /**
4776 softime 9245 * Permet de mettre la valeur passée en paramètre dans l'attribut de classe
4777     * "di_reopened".
4778     *
4779     * @param boolean $val
4780     */
4781     function set_att_di_reopened($val) {
4782     $this->di_reopened = $val;
4783     }
4784    
4785     /**
4786     * Permet de récupérer la valeur de l'attribut de classe "di_reopened".
4787     *
4788     * @return boolean
4789     */
4790     function get_att_di_reopened() {
4791     return $this->di_reopened;
4792     }
4793    
4794     /**
4795 mbroquet 3730 * Permet de composer un message d'erreur sur restriction non valide en
4796     * fonction du contexte.
4797     *
4798     * @param string $restriction formule de la restriction
4799     *
4800     * @return string message d'erreur
4801     */
4802     function get_restriction_error_message($restriction) {
4803     // Affichage du message si la restriction s'applique
4804     // Contexte du suivi des dates (message simple)
4805     $message_restrict = _("Probleme de dates :");
4806     // Split restriction
4807     $champs_restrict = preg_split(
4808     '/(\W+)/',
4809     $restriction,
4810     null,
4811     PREG_SPLIT_NO_EMPTY|PREG_SPLIT_DELIM_CAPTURE
4812     );
4813     $formated_restrict = "";
4814     // Ajout des chaînes à traduire
4815     foreach ($champs_restrict as $value) {
4816     $formated_restrict .= _($value)." ";
4817     }
4818     $formated_restrict = substr($formated_restrict, 0, -1);
4819     // Message d'erreur dans le contexte du suivi des dates
4820     if($this->getParameter("maj") == 170) {
4821     $message_restrict .= " "._("contactez l'instructeur du dossier");
4822     $message_restrict .= "<br/>(".$formated_restrict.")";
4823     } else {
4824     // Affichage du message si la restriction s'applique
4825     // Contexte instruction
4826     $message_restrict .= "<br/>".$formated_restrict;
4827     }
4828    
4829     return $message_restrict;
4830     }
4831    
4832     /**
4833 softime 12124 * Surcharge de la méthode verifier() de la classe om_dbform pour y ajouter
4834     * les vérifications suivantes :
4835     * - Si l'instruction à un événement associé et que cet événement à des restrictions :
4836     * 1. vérifie si la restriction est valide, si ce n'est pas le cas récupère et affiche
4837     * le message d'erreur associé à la restriction
4838     * 2. vérifie si les restrictions sont respectées. Si ce n'est pas le cas bloque l'ajout
4839     * et / ou la modification et affiche un message d'erreur
4840     * -
4841     * -
4842     * -
4843     * -
4844     * -
4845     * -
4846     *
4847     * @param array val : tableau contenant les valeurs issues du formulaire.
4848     * @param - dnu1 : Paramètre déprécié et non utilisé.
4849     * @param - dnu2 : Paramètre déprécié et non utilisé.
4850     *
4851 softime 8989 * @return void
4852 mbroquet 3730 */
4853 softime 8989 function verifier($val = array(), &$dnu1 = null, $dnu2 = null) {
4854     parent::verifier($val);
4855     //
4856 mbroquet 3730 if ( isset($val['evenement']) && is_numeric($val['evenement'])){
4857     $restriction = $this->get_restriction($val['evenement']);
4858    
4859     //Test qu'une restriction est présente
4860     if ($restriction != "" ){
4861    
4862 softime 14064 // Vérifie le contexte de la modification et test si la restriction est valide.
4863     // Si l'instruction est modifiée par une tache le dossier n'est pas impacté.
4864     // Il n'est donc pas nécessaire de vérifier les restrictions.
4865 mbroquet 3730 $this->restriction_valid = $this->restrictionIsValid($restriction);
4866 softime 14064 if ($this->getParameter("maj") != 176
4867     && !$this->restriction_valid) {
4868 mbroquet 3730
4869     // Affichage du message si la restriction s'applique
4870     $this->addToMessage(
4871     $this->get_restriction_error_message($restriction)
4872     );
4873     $this->correct=false;
4874     return false;
4875     }
4876    
4877     // Liste des opérateurs possible
4878 nmeucci 3873 $operateurs = array(">=", "<=", "+", "-", "&&", "||", "==", "!=");
4879 mbroquet 3730 // Supprime tous les espaces de la chaîne de caractère
4880     $restriction = str_replace(' ', '', $restriction);
4881    
4882     // Met des espace avant et après les opérateurs puis transforme la
4883     // chaine en un tableau
4884     $tabRestriction = str_replace($operateurs, " ", $restriction);
4885     // Tableau des champ
4886     $tabRestriction = explode(" ", $tabRestriction);
4887     // Supprime les numériques du tableau
4888     foreach ($tabRestriction as $key => $value) {
4889     if (is_numeric($value)) {
4890     unset($tabRestriction[$key]);
4891     }
4892     }
4893    
4894     // Vérifie les champs utilisés pour la restriction
4895     $check_field_exist = $this->f->check_field_exist($tabRestriction, 'instruction');
4896     if ($check_field_exist !== true) {
4897    
4898     // Liste des champs en erreur
4899     $string_error_fields = implode(", ", $check_field_exist);
4900    
4901     // Message d'erreur
4902     $error_message = _("Le champ %s n'est pas utilisable pour le champ %s");
4903     if (count($check_field_exist) > 1) {
4904     $error_message = _("Les champs %s ne sont pas utilisable pour le champ %s");
4905     }
4906    
4907     // Affiche l'erreur
4908     $this->correct=false;
4909     $this->addToMessage(sprintf($error_message, $string_error_fields, _("restriction")));
4910     $this->addToMessage(_("Veuillez contacter votre administrateur."));
4911     }
4912     }
4913    
4914     }
4915     if(!$this->updateDate("date_envoi_signature")) {
4916     return false;
4917     }
4918     if(!$this->updateDate("date_retour_signature")) {
4919     return false;
4920     }
4921     if(!$this->updateDate("date_envoi_rar")) {
4922     return false;
4923     }
4924     if(!$this->updateDate("date_retour_rar")) {
4925     return false;
4926     }
4927     if(!$this->updateDate("date_envoi_controle_legalite")) {
4928     return false;
4929     }
4930     if(!$this->updateDate("date_retour_controle_legalite")) {
4931     return false;
4932     }
4933    
4934     }
4935 softime 12124
4936     /**
4937     * Récupère et stocket dans un tableau toutes les infos du pétitionnaire
4938     * principal du dossier auquel appartiens l'instruction.
4939     * Renvoie un tableau contenant les informations du pétitionnaire principal.
4940     *
4941     * Si l'identifiant de l'instruction n'a pas pu etre récupéré renvoie false
4942     * et affiche un message dans les logs.
4943     * En cas d'erreur de base de donnée renvoie false et affiche un message d'erreur.
4944     *
4945     * @param string identifiant du dossier
4946     * @return array|boolean
4947     */
4948     protected function get_info_petitionnaire_principal_dossier($dossier = null) {
4949     // Si l'identifiant de l'instruction n'a pas été fournit on récupère celui de
4950     // l'objet courant
4951     if (empty($dossier)) {
4952     $dossier = $this->getVal('dossier');
4953     // Si la récupération de l'identifiant de l'instruction a échoué la méthode renvoie
4954     // false et on affiche un message d'erreur dans les logs
4955     if (empty($dossier)) {
4956     $this->addToLog(__METHOD__.' : L\'identifiant du dossier n\'a pas pu être récupéré');
4957     return false;
4958     }
4959     }
4960    
4961     // Requête sql servant à récupérer toutes les informations relatives au demandeurs
4962     // principal
4963 softime 13137 $qres = $this->f->get_all_results_from_db_query(
4964     sprintf(
4965     'SELECT
4966     -- Récupère toutes les informations du demandeur principal
4967     demandeur.*,
4968     CASE
4969     WHEN demandeur.qualite=\'particulier\'
4970     THEN TRIM(CONCAT(demandeur.particulier_nom, \' \', demandeur.particulier_prenom, \' \', demandeur.courriel))
4971     ELSE
4972     TRIM(CONCAT(demandeur.personne_morale_raison_sociale, \' \', demandeur.personne_morale_denomination, \' \', demandeur.courriel))
4973     END AS destinataire
4974     FROM
4975     %1$sdossier
4976     LEFT JOIN %1$slien_dossier_demandeur
4977     ON lien_dossier_demandeur.dossier = dossier.dossier
4978     LEFT JOIN %1$sdemandeur
4979     ON demandeur.demandeur = lien_dossier_demandeur.demandeur
4980     WHERE
4981     dossier.dossier = \'%2$s\'
4982     AND lien_dossier_demandeur.petitionnaire_principal IS TRUE',
4983     DB_PREFIXE,
4984     $this->f->db->escapeSimple($dossier)
4985     ),
4986     array(
4987     "origin" => __METHOD__,
4988     )
4989 softime 12124 );
4990 softime 13137 if (is_array($qres["result"]) === true
4991     && array_key_exists(0, $qres["result"]) === true) {
4992     //
4993     return $qres["result"][0];
4994 softime 12124 }
4995 softime 13137 return null;
4996 softime 12124 }
4997    
4998    
4999 mbroquet 3730
5000     /**
5001     * Finalisation des documents.
5002     * @param string $champ champ du fichier à finaliser
5003     * @param booleen $status permet de définir si on finalise ou définalise
5004     * @param string $sousform permet de savoir si se trouve dans un sousformulaire (passé au javascript)
5005     */
5006     function manage_finalizing($mode = null, $val = array()) {
5007 softime 5024 //
5008     $this->begin_treatment(__METHOD__);
5009 mbroquet 3730
5010 softime 5024 //
5011     $id_inst = $this->getVal($this->clePrimaire);
5012 mbroquet 3730
5013 softime 5024 //
5014     $admin_msg_error = _("Veuillez contacter votre administrateur.");
5015     $file_msg_error = _("Erreur de traitement de fichier.")
5016     ." ".$admin_msg_error;
5017     $bdd_msg_error = _("Erreur de base de données.")
5018     ." ".$admin_msg_error;
5019 softime 5169 $log_msg_error = "Finalisation non enregistrée - id instruction = %s - uid fichier = %s";
5020 mbroquet 3730
5021     // Si on finalise le document
5022     if ($mode == "finalize"){
5023 softime 5024 //
5024     $etat = _('finalisation');
5025 mbroquet 3730
5026     // Récupère la collectivite du dossier d'instruction
5027     $dossier_instruction_om_collectivite = $this->get_dossier_instruction_om_collectivite();
5028    
5029     //
5030     $collectivite = $this->f->getCollectivite($dossier_instruction_om_collectivite);
5031 softime 8593
5032     //
5033     $params = array(
5034     "specific" => array(),
5035     );
5036     // Si la rédaction libre est activée sur l'instruction
5037     if ($this->getVal("flag_edition_integrale") == 't') {
5038     $params["specific"]["corps"] = array(
5039     "mode" => "set",
5040     "value" => $this->getVal("corps_om_htmletatex"),
5041     );
5042     $params["specific"]["titre"] = array(
5043     "mode" => "set",
5044     "value" => $this->getVal("titre_om_htmletat"),
5045     );
5046     }
5047 mbroquet 3730 // Génération du PDF
5048 softime 8593 $result = $this->compute_pdf_output('lettretype', $this->getVal('lettretype'), $collectivite, null, $params);
5049 mbroquet 3730 $pdf_output = $result['pdf_output'];
5050 softime 10573
5051 mbroquet 3730 //Métadonnées du document
5052     $metadata = array(
5053 softime 5024 'filename' => 'instruction_'.$id_inst.'.pdf',
5054 mbroquet 3730 'mimetype' => 'application/pdf',
5055     'size' => strlen($pdf_output)
5056     );
5057    
5058     // Récupération des métadonnées calculées après validation
5059     $spe_metadata = $this->getMetadata("om_fichier_instruction");
5060    
5061     //On vérifie si l'instruction à finaliser a un événement de type arrete
5062 softime 14064 // TODO : A voir pour remplacer par une instanciation de l'événement.
5063     // Voir également si l'événement ne dois pas être instancié en début de
5064     // méthode pour pouvoir être réutilisé.
5065     $qres = $this->f->get_one_result_from_db_query(
5066     sprintf(
5067     'SELECT
5068     type
5069     FROM
5070     %1$sevenement
5071     WHERE
5072     evenement = \'%2$d\'',
5073     DB_PREFIXE,
5074     intval($this->getVal("evenement"))
5075     ),
5076     array(
5077     "origin" => __METHOD__,
5078     "force_return" => true,
5079     )
5080     );
5081    
5082     if ($qres["code"] !== "OK") {
5083 softime 5024 $this->correct = false;
5084     $this->addToMessage($bdd_msg_error);
5085     return $this->end_treatment(__METHOD__, false);
5086 mbroquet 3730 }
5087    
5088     //Initialisation de la variable
5089     $arrete_metadata = array();
5090     // Si l'événement est de type arrete, on ajoute les métadonnées spécifiques
5091 softime 14064 if ($qres['result'] === 'arrete'){
5092 mbroquet 3730 $arrete_metadata = $this->getMetadata("arrete");
5093     }
5094    
5095     $metadata = array_merge($metadata, $spe_metadata, $arrete_metadata);
5096    
5097 softime 10573 /*
5098     // transforme le tableau de métadonnées en objet
5099     $mdf = new MetadataFactory();
5100     $md = $mdf->build('Instruction', $metadata);
5101     */
5102    
5103 softime 5024 // Si le document a déjà été finalisé on le met à jour
5104     // en conservant son UID
5105 mbroquet 3730 if ($this->getVal("om_fichier_instruction") != ''){
5106     $uid = $this->f->storage->update(
5107     $this->getVal("om_fichier_instruction"), $pdf_output, $metadata);
5108     }
5109 softime 5024 // Sinon on crée un nouveau document et dont on récupère l'UID
5110 mbroquet 3730 else {
5111 softime 10573 $uid = $this->f->storage->create($pdf_output, $metadata, "from_content", $this->table.".om_fichier_instruction");
5112 mbroquet 3730 }
5113     }
5114    
5115 softime 5024 // Si on définalise le document
5116 mbroquet 3730 if ($mode == "unfinalize") {
5117 softime 5024 //
5118     $etat = _('définalisation');
5119 mbroquet 3730 // Récupération de l'uid du document finalisé
5120     $uid = $this->getVal("om_fichier_instruction");
5121     }
5122 softime 5024
5123     // Si on définalise l'UID doit être défini
5124     // Si on finalise la création/modification du fichier doit avoir réussi
5125 mbroquet 3730 if ($uid == '' || $uid == 'OP_FAILURE' ) {
5126 softime 5024 $this->correct = false;
5127     $this->addToMessage($file_msg_error);
5128 softime 8989 $this->addToLog(sprintf($log_msg_error, $id_inst, $uid), DEBUG_MODE);
5129 softime 5024 return $this->end_treatment(__METHOD__, false);
5130 mbroquet 3730 }
5131    
5132     //
5133     foreach ($this->champs as $key => $champ) {
5134     //
5135     $val[$champ] = $this->val[$key];
5136     }
5137    
5138     //
5139 softime 6565 $val['date_evenement'] = $this->dateDBToForm($val['date_evenement']);
5140     $val['archive_date_complet'] = $this->dateDBToForm($val['archive_date_complet']);
5141     $val['archive_date_rejet'] = $this->dateDBToForm($val['archive_date_rejet']);
5142     $val['archive_date_limite'] = $this->dateDBToForm($val['archive_date_limite']);
5143     $val['archive_date_notification_delai'] = $this->dateDBToForm($val['archive_date_notification_delai']);
5144     $val['archive_date_decision'] = $this->dateDBToForm($val['archive_date_decision']);
5145     $val['archive_date_validite'] = $this->dateDBToForm($val['archive_date_validite']);
5146     $val['archive_date_achevement'] = $this->dateDBToForm($val['archive_date_achevement']);
5147     $val['archive_date_chantier'] = $this->dateDBToForm($val['archive_date_chantier']);
5148     $val['archive_date_conformite'] = $this->dateDBToForm($val['archive_date_conformite']);
5149     $val['archive_date_dernier_depot'] = $this->dateDBToForm($val['archive_date_dernier_depot']);
5150     $val['archive_date_limite_incompletude'] = $this->dateDBToForm($val['archive_date_limite_incompletude']);
5151     $val['date_finalisation_courrier'] = $this->dateDBToForm($val['date_finalisation_courrier']);
5152     $val['date_envoi_signature'] = $this->dateDBToForm($val['date_envoi_signature']);
5153     $val['date_retour_signature'] = $this->dateDBToForm($val['date_retour_signature']);
5154     $val['date_envoi_rar'] = $this->dateDBToForm($val['date_envoi_rar']);
5155     $val['date_retour_rar'] = $this->dateDBToForm($val['date_retour_rar']);
5156     $val['date_envoi_controle_legalite'] = $this->dateDBToForm($val['date_envoi_controle_legalite']);
5157     $val['date_retour_controle_legalite'] = $this->dateDBToForm($val['date_retour_controle_legalite']);
5158     $val['archive_date_cloture_instruction'] = $this->dateDBToForm($val['archive_date_cloture_instruction']);
5159     $val['archive_date_premiere_visite'] = $this->dateDBToForm($val['archive_date_premiere_visite']);
5160     $val['archive_date_derniere_visite'] = $this->dateDBToForm($val['archive_date_derniere_visite']);
5161     $val['archive_date_contradictoire'] = $this->dateDBToForm($val['archive_date_contradictoire']);
5162     $val['archive_date_retour_contradictoire'] = $this->dateDBToForm($val['archive_date_retour_contradictoire']);
5163     $val['archive_date_ait'] = $this->dateDBToForm($val['archive_date_ait']);
5164     $val['archive_date_transmission_parquet'] = $this->dateDBToForm($val['archive_date_transmission_parquet']);
5165 softime 8989 $val['archive_date_affichage'] = $this->dateDBToForm($val['archive_date_affichage']);
5166 mbroquet 3730 $this->setvalF($val);
5167    
5168     // Verification de la validite des donnees
5169 softime 8989 $this->verifier($this->val);
5170 mbroquet 3730 // Si les verifications precedentes sont correctes, on procede a
5171     // la modification, sinon on ne fait rien et on retourne une erreur
5172 softime 5024 if ($this->correct === true) {
5173 mbroquet 3730 //
5174     $valF = array(
5175     "om_fichier_instruction" => $uid,
5176     "date_finalisation_courrier" => date('Y-m-d')
5177     );
5178     //
5179     if($mode=="finalize") {
5180     // état finalisé vrai
5181 softime 5024 $valF["om_final_instruction"] = true;
5182 mbroquet 3730 // ajout log utilisateur
5183     $login = $_SESSION['login'];
5184     $nom = "";
5185     $this->f->getUserInfos();
5186     if (isset($this->f->om_utilisateur["nom"])
5187     && !empty($this->f->om_utilisateur["nom"])) {
5188     $nom = $this->f->om_utilisateur["nom"];
5189     }
5190     $valF["om_final_instruction_utilisateur"] = $_SESSION['login'];
5191     if ($nom != "") {
5192     $valF["om_final_instruction_utilisateur"] .= " (".$nom.")";
5193     }
5194     } else {
5195     // état finalisé faux
5196 softime 5024 $valF["om_final_instruction"] = false;
5197 mbroquet 3730 // suppression log utilisateur
5198     $valF["om_final_instruction_utilisateur"] = '';
5199     }
5200    
5201     // Execution de la requête de modification des donnees de l'attribut
5202     // valF de l'objet dans l'attribut table de l'objet
5203 softime 8989 $res = $this->f->db->autoExecute(DB_PREFIXE.$this->table, $valF,
5204 softime 5024 DB_AUTOQUERY_UPDATE, $this->getCle($id_inst));
5205     $this->addToLog(__METHOD__."() : db->autoExecute(\"".DB_PREFIXE.$this->table."\", ".print_r($valF, true).", DB_AUTOQUERY_UPDATE, \"".$this->getCle($id_inst)."\")", VERBOSE_MODE);
5206     //
5207     if ($this->f->isDatabaseError($res, true) === true) {
5208     $this->correct = false;
5209     $this->addToMessage($bdd_msg_error);
5210     return $this->end_treatment(__METHOD__, false);
5211     }
5212 mbroquet 3730
5213 softime 5024 //
5214     $this->addToMessage(sprintf(_("La %s du document s'est effectuee avec succes."), $etat));
5215     //
5216     if ($this->add_log_to_dossier($id_inst, $val) === false) {
5217     return $this->end_treatment(__METHOD__, false);
5218     }
5219     //
5220     return $this->end_treatment(__METHOD__, true);
5221 mbroquet 3730 }
5222 softime 5024 // L'appel de verifier() a déjà positionné correct à false
5223     // et défini un message d'erreur.
5224 softime 8989 $this->addToLog(sprintf($log_msg_error, $id_inst, $uid), DEBUG_MODE);
5225 softime 5024 return $this->end_treatment(__METHOD__, false);
5226 mbroquet 3730 }
5227    
5228     /**
5229     * Récupération du numéro de dossier d'instruction à ajouter aux métadonnées
5230     * @return string numéro de dossier d'instruction
5231     */
5232 softime 10573 protected function getDossier($champ = null) {
5233 mbroquet 3730 if(empty($this->specificMetadata)) {
5234     $this->getSpecificMetadata();
5235     }
5236     return $this->specificMetadata->dossier;
5237     }
5238     /**
5239     * Récupération la version du dossier d'instruction à ajouter aux métadonnées
5240     * @return int Version
5241     */
5242     protected function getDossierVersion() {
5243     if(empty($this->specificMetadata)) {
5244     $this->getSpecificMetadata();
5245     }
5246     return $this->specificMetadata->version;
5247     }
5248     /**
5249     * Récupération du numéro de dossier d'autorisation à ajouter aux métadonnées
5250     * @return string numéro de dossier d'autorisation
5251     */
5252     protected function getNumDemandeAutor() {
5253     if(empty($this->specificMetadata)) {
5254     $this->getSpecificMetadata();
5255     }
5256     return $this->specificMetadata->dossier_autorisation;
5257     }
5258     /**
5259     * Récupération de la date de demande initiale du dossier à ajouter aux métadonnées
5260     * @return date de la demande initiale
5261     */
5262     protected function getAnneemoisDemandeAutor() {
5263     if(empty($this->specificMetadata)) {
5264     $this->getSpecificMetadata();
5265     }
5266     return $this->specificMetadata->date_demande_initiale;
5267     }
5268     /**
5269     * Récupération du type de dossier d'instruction à ajouter aux métadonnées
5270     * @return string type du dossier d'instruction
5271     */
5272     protected function getTypeInstruction() {
5273     if(empty($this->specificMetadata)) {
5274     $this->getSpecificMetadata();
5275     }
5276     return $this->specificMetadata->dossier_instruction_type;
5277     }
5278     /**
5279     * Récupération du statut du dossier d'autorisation à ajouter aux métadonnées
5280     * @return string avis
5281     */
5282     protected function getStatutAutorisation() {
5283     if(empty($this->specificMetadata)) {
5284     $this->getSpecificMetadata();
5285     }
5286     return $this->specificMetadata->statut;
5287     }
5288     /**
5289     * Récupération du type de dossier d'autorisation à ajouter aux métadonnées
5290     * @return string type du dossier d'autorisation
5291     */
5292     protected function getTypeAutorisation() {
5293     if(empty($this->specificMetadata)) {
5294     $this->getSpecificMetadata();
5295     }
5296     return $this->specificMetadata->dossier_autorisation_type;
5297     }
5298     /**
5299     * Récupération de la date d'ajout de document à ajouter aux métadonnées
5300     * @return date de l'évènement
5301     */
5302     protected function getDateEvenementDocument() {
5303     return date("Y-m-d");
5304     }
5305     /**
5306     * Récupération du groupe d'instruction à ajouter aux métadonnées
5307     * @return string Groupe d'instruction
5308     */
5309     protected function getGroupeInstruction() {
5310     if(empty($this->specificMetadata)) {
5311     $this->getSpecificMetadata();
5312     }
5313     return $this->specificMetadata->groupe_instruction;
5314     }
5315     /**
5316     * Récupération du libellé du type du document à ajouter aux métadonnées
5317     * @return string Groupe d'instruction
5318     */
5319     protected function getTitle() {
5320    
5321     // Récupère le champ événement
5322     if (isset($this->valF["evenement"]) AND $this->valF["evenement"] != "") {
5323     $evenement = $this->valF["evenement"];
5324     } else {
5325     $evenement = $this->getVal("evenement");
5326     }
5327    
5328     // Requête sql
5329 softime 14064 $evenement = $this->f->get_inst__om_dbform(array(
5330     "obj" => "evenement",
5331     "idx" => $evenement
5332     ));
5333    
5334 mbroquet 3730 // Retourne le libelle de l'événement
5335 softime 14064 return $evenement->getVal('libelle');
5336 mbroquet 3730 }
5337    
5338 softime 6272
5339 mbroquet 3730 /**
5340 softime 6272 * Récupération du champ ERP du dossier d'instruction.
5341     *
5342     * @return boolean
5343     */
5344     public function get_concerne_erp() {
5345     //
5346     if(empty($this->specificMetadata)) {
5347     $this->getSpecificMetadata();
5348     }
5349     //
5350     return $this->specificMetadata->erp;
5351     }
5352    
5353    
5354     /**
5355 mbroquet 3730 * Cette méthode permet de stocker en attribut toutes les métadonnées
5356     * nécessaire à l'ajout d'un document.
5357     */
5358     public function getSpecificMetadata() {
5359     if (isset($this->valF["dossier"]) AND $this->valF["dossier"] != "") {
5360     $dossier = $this->valF["dossier"];
5361     } else {
5362     $dossier = $this->getVal("dossier");
5363     }
5364     //Requête pour récupérer les informations essentiels sur le dossier d'instruction
5365     $sql = "SELECT dossier.dossier as dossier,
5366     dossier_autorisation.dossier_autorisation as dossier_autorisation,
5367     to_char(dossier.date_demande, 'YYYY/MM') as date_demande_initiale,
5368     dossier_instruction_type.code as dossier_instruction_type,
5369     etat_dossier_autorisation.libelle as statut,
5370     dossier_autorisation_type.code as dossier_autorisation_type,
5371 softime 6272 groupe.code as groupe_instruction,
5372     CASE WHEN dossier.erp IS TRUE
5373     THEN 'true'
5374     ELSE 'false'
5375     END as erp
5376 mbroquet 3730 FROM ".DB_PREFIXE."dossier
5377     LEFT JOIN ".DB_PREFIXE."dossier_instruction_type
5378     ON dossier.dossier_instruction_type = dossier_instruction_type.dossier_instruction_type
5379     LEFT JOIN ".DB_PREFIXE."dossier_autorisation
5380     ON dossier.dossier_autorisation = dossier_autorisation.dossier_autorisation
5381     LEFT JOIN ".DB_PREFIXE."etat_dossier_autorisation
5382     ON dossier_autorisation.etat_dossier_autorisation = etat_dossier_autorisation.etat_dossier_autorisation
5383     LEFT JOIN ".DB_PREFIXE."dossier_autorisation_type_detaille
5384     ON dossier_autorisation.dossier_autorisation_type_detaille = dossier_autorisation_type_detaille.dossier_autorisation_type_detaille
5385     LEFT JOIN ".DB_PREFIXE."dossier_autorisation_type
5386     ON dossier_autorisation_type_detaille.dossier_autorisation_type = dossier_autorisation_type.dossier_autorisation_type
5387     LEFT JOIN ".DB_PREFIXE."groupe
5388     ON dossier_autorisation_type.groupe = groupe.groupe
5389     WHERE dossier.dossier = '".$dossier."'";
5390 softime 8989 $res = $this->f->db->query($sql);
5391 softime 12847 $this->addToLog(__METHOD__."(): db->query(\"".$sql."\");", VERBOSE_MODE);
5392     $this->f->isDatabaseError($res);
5393 mbroquet 3730 //Le résultat est récupéré dans un objet
5394     $row =& $res->fetchRow(DB_FETCHMODE_OBJECT);
5395    
5396     //Si il y a un résultat
5397     if ($row !== null) {
5398    
5399 fmichon 3892 // Instrance de la classe dossier
5400     $inst_dossier = $this->get_inst_dossier($dossier);
5401    
5402     // Insère l'attribut version à l'objet
5403 softime 14064 $row->version = $inst_dossier->get_di_numero_suffixe();
5404 fmichon 3892
5405 mbroquet 3730 //Alors on créé l'objet dossier_instruction
5406     $this->specificMetadata = $row;
5407    
5408     }
5409     }
5410    
5411     /**
5412     * Retourne le statut du dossier d'instruction
5413     * @param string $idx Identifiant du dossier d'instruction
5414     * @return string Le statut du dossier d'instruction
5415     */
5416     function getStatutAutorisationDossier($idx){
5417    
5418     $statut = '';
5419    
5420     //Si l'identifiant du dossier d'instruction fourni est correct
5421     if ( $idx != '' ){
5422    
5423     //On récupère le statut de l'état du dossier à partir de l'identifiant du
5424     //dossier
5425 softime 14064 $qres = $this->f->get_one_result_from_db_query(
5426     sprintf(
5427     'SELECT
5428     etat.statut
5429     FROM
5430     %1$sdossier
5431     LEFT JOIN
5432     %1$setat
5433     ON
5434     dossier.etat = etat.etat
5435     WHERE
5436     dossier = \'%2$s\'',
5437     DB_PREFIXE,
5438     $this->f->db->escapeSimple($idx)
5439     ),
5440     array(
5441     "origin" => __METHOD__,
5442     )
5443     );
5444 mbroquet 3730 }
5445 softime 14064
5446     return $qres['result'];
5447 mbroquet 3730 }
5448    
5449     /**
5450     * Récupère les données du dossier
5451     * @return array
5452     */
5453     function get_dossier_actual() {
5454    
5455     // Initialisation de la valeur de retour
5456     $return = array();
5457    
5458     // Récupération de toutes les valeurs du dossier d'instruction en cours
5459     $sql = "SELECT * FROM ".DB_PREFIXE."dossier
5460     WHERE dossier='".$this->valF['dossier']."'";
5461 softime 8989 $res = $this->f->db->query($sql);
5462 softime 12847 $this->addToLog(__METHOD__."(): db->query(\"".$sql."\");", VERBOSE_MODE);
5463 mbroquet 3730 $this->f->isDatabaseError($res);
5464    
5465     //
5466     while ($row=& $res->fetchRow(DB_FETCHMODE_ASSOC)) {
5467    
5468     // Récupération de la valeur actuelle du délai, de l'accord tacite,
5469     // de l'état et de l'avis du dossier d'instruction
5470 softime 6565 $return['archive_delai'] = $row['delai'];
5471     $return['archive_accord_tacite'] = $row['accord_tacite'];
5472     $return['archive_etat'] = $row['etat'];
5473     $return['archive_avis'] = $row['avis_decision'];
5474     // Récupération de la valeur actuelle des dates du dossier
5475 mbroquet 3730 // d'instruction
5476 softime 6565 $return['archive_date_complet'] = $row['date_complet'];
5477     $return['archive_date_dernier_depot'] = $row['date_dernier_depot'];
5478     $return['archive_date_rejet'] = $row['date_rejet'];
5479     $return['archive_date_limite'] = $row['date_limite'];
5480     $return['archive_date_notification_delai'] = $row['date_notification_delai'];
5481     $return['archive_date_decision'] = $row['date_decision'];
5482     $return['archive_date_validite'] = $row['date_validite'];
5483     $return['archive_date_achevement'] = $row['date_achevement'];
5484     $return['archive_date_chantier'] = $row['date_chantier'];
5485     $return['archive_date_conformite'] = $row['date_conformite'];
5486     $return['archive_incompletude'] = $row['incompletude'];
5487     $return['archive_incomplet_notifie'] = $row['incomplet_notifie'];
5488     $return['archive_evenement_suivant_tacite'] = $row['evenement_suivant_tacite'];
5489     $return['archive_evenement_suivant_tacite_incompletude'] = $row['evenement_suivant_tacite_incompletude'];
5490     $return['archive_etat_pendant_incompletude'] = $row['etat_pendant_incompletude'];
5491     $return['archive_date_limite_incompletude'] = $row['date_limite_incompletude'];
5492     $return['archive_delai_incompletude'] = $row['delai_incompletude'];
5493     $return['archive_autorite_competente'] = $row['autorite_competente'];
5494 softime 8593 $return['archive_dossier_instruction_type'] = $row['dossier_instruction_type'];
5495 softime 6565 $return['duree_validite'] = $row['duree_validite'];
5496     $return['date_depot'] = $row['date_depot'];
5497 softime 10573 $return['date_depot_mairie'] = $row['date_depot_mairie'];
5498 softime 6565 $return['archive_date_cloture_instruction'] = $row['date_cloture_instruction'];
5499     $return['archive_date_premiere_visite'] = $row['date_premiere_visite'];
5500     $return['archive_date_derniere_visite'] = $row['date_derniere_visite'];
5501     $return['archive_date_contradictoire'] = $row['date_contradictoire'];
5502     $return['archive_date_retour_contradictoire'] = $row['date_retour_contradictoire'];
5503     $return['archive_date_ait'] = $row['date_ait'];
5504     $return['archive_date_transmission_parquet'] = $row['date_transmission_parquet'];
5505 softime 8989 $return['archive_date_affichage'] = $row['date_affichage'];
5506 softime 10573 $return['archive_pec_metier'] = $row['pec_metier'];
5507     $return['archive_a_qualifier'] = $row['a_qualifier'];
5508 mbroquet 3730 }
5509    
5510     // Retour de la fonction
5511     return $return;
5512    
5513     }
5514    
5515     /**
5516     * Permet de vérifier qu'un événement est verrouillable
5517     * @param integer $idx Identifiant de l'instruction
5518     * @return boolean
5519     */
5520     function checkEvenementNonVerrouillable($idx) {
5521     // Si la condition n'est pas vide
5522     if ($idx != "") {
5523    
5524     // Requête SQL
5525 softime 14064 $qres = $this->f->get_one_result_from_db_query(
5526     sprintf(
5527     'SELECT
5528     evenement.non_verrouillable
5529     FROM
5530     %1$sevenement
5531     LEFT JOIN %1$sinstruction
5532     ON instruction.evenement = evenement.evenement
5533     WHERE
5534     instruction.instruction = \'%2$s\'',
5535     DB_PREFIXE,
5536     intval($idx)
5537     ),
5538     array(
5539     "origin" => __METHOD__,
5540     )
5541     );
5542 mbroquet 3730 }
5543    
5544 softime 14064 // Si on a un résultat et que ce résultat indique que l'événement n'est
5545     // pas vérrouillable renvoie true, sinon renvoie false
5546     return isset($qres) && isset($qres['result']) && $qres['result'] == 't';
5547 mbroquet 3730 }
5548    
5549     /**
5550     * Mise à jour des champs archive_*
5551     * @param mixed $row La ligne de données
5552     */
5553     public function updateArchiveData($row){
5554    
5555     // Récupération de la valeur actuelle du délai, de l'accord tacite,
5556     // de l'état et de l'avis du dossier d'instruction
5557     $this->valF['archive_delai']=$row['delai'];
5558     $this->valF['archive_accord_tacite']=$row['accord_tacite'];
5559     $this->valF['archive_etat']=$row['etat'];
5560     $this->valF['archive_avis']=$row['avis_decision'];
5561     // Récupération de la valeur actuelle des 9 dates du dossier
5562     // d'instruction
5563     if ($row['date_complet'] != '') {
5564     $this->valF['archive_date_complet']=$row['date_complet'];
5565     }
5566     if ($row['date_dernier_depot'] != '') {
5567     $this->valF['archive_date_dernier_depot']=$row['date_dernier_depot'];
5568     }
5569 softime 6565 if ($row['date_rejet'] != '') {
5570 mbroquet 3730 $this->valF['archive_date_rejet']= $row['date_rejet'];
5571     }
5572 softime 6565 if ($row['date_limite'] != '') {
5573 mbroquet 3730 $this->valF['archive_date_limite']= $row['date_limite'];
5574     }
5575 softime 6565 if ($row['date_notification_delai'] != '') {
5576 mbroquet 3730 $this->valF['archive_date_notification_delai']= $row['date_notification_delai'];
5577     }
5578 softime 6565 if ($row['date_decision'] != '') {
5579 mbroquet 3730 $this->valF['archive_date_decision']= $row['date_decision'];
5580     }
5581 softime 6565 if ($row['date_validite'] != '') {
5582 mbroquet 3730 $this->valF['archive_date_validite']= $row['date_validite'];
5583     }
5584 softime 6565 if ($row['date_achevement'] != '') {
5585 mbroquet 3730 $this->valF['archive_date_achevement']= $row['date_achevement'];
5586     }
5587 softime 6565 if ($row['date_chantier'] != '') {
5588 mbroquet 3730 $this->valF['archive_date_chantier']= $row['date_chantier'];
5589     }
5590 softime 6565 if ($row['date_conformite'] != '') {
5591 mbroquet 3730 $this->valF['archive_date_conformite']= $row['date_conformite'];
5592     }
5593 softime 6565 if ($row['incompletude'] != '') {
5594 mbroquet 3730 $this->valF['archive_incompletude']= $row['incompletude'];
5595     }
5596 softime 6565 if ($row['incomplet_notifie'] != '') {
5597 mbroquet 3730 $this->valF['archive_incomplet_notifie']= $row['incomplet_notifie'];
5598     }
5599 softime 6565 if ($row['evenement_suivant_tacite'] != '') {
5600 mbroquet 3730 $this->valF['archive_evenement_suivant_tacite']= $row['evenement_suivant_tacite'];
5601     }
5602 softime 6565 if ($row['evenement_suivant_tacite_incompletude'] != '') {
5603 mbroquet 3730 $this->valF['archive_evenement_suivant_tacite_incompletude']= $row['evenement_suivant_tacite_incompletude'];
5604     }
5605 softime 6565 if ($row['etat_pendant_incompletude'] != '') {
5606 mbroquet 3730 $this->valF['archive_etat_pendant_incompletude']= $row['etat_pendant_incompletude'];
5607     }
5608 softime 6565 if ($row['date_limite_incompletude'] != '') {
5609 mbroquet 3730 $this->valF['archive_date_limite_incompletude']= $row['date_limite_incompletude'];
5610     }
5611 softime 6565 if ($row['delai_incompletude'] != '') {
5612 mbroquet 3730 $this->valF['archive_delai_incompletude']= $row['delai_incompletude'];
5613     }
5614 softime 6565 if ($row['autorite_competente'] != '') {
5615 mbroquet 3730 $this->valF['archive_autorite_competente']= $row['autorite_competente'];
5616     }
5617 softime 6565 if ($row['duree_validite'] != '') {
5618 mbroquet 3730 $this->valF['duree_validite']= $row['duree_validite'];
5619     }
5620 softime 6565 if ($row['date_depot'] != '') {
5621 nmeucci 3873 $this->valF['date_depot']= $row['date_depot'];
5622     }
5623 softime 10573 if ($row['date_depot_mairie'] != '') {
5624     $this->valF['date_depot_mairie']= $row['date_depot_mairie'];
5625     }
5626 softime 6565 // Dates concernant les dossiers contentieux
5627     if ($row['date_cloture_instruction'] != '') {
5628     $this->valF['archive_date_cloture_instruction']= $row['date_cloture_instruction'];
5629     }
5630     if ($row['date_premiere_visite'] != '') {
5631     $this->valF['archive_date_premiere_visite']= $row['date_premiere_visite'];
5632     }
5633     if ($row['date_derniere_visite'] != '') {
5634     $this->valF['archive_date_derniere_visite']= $row['date_derniere_visite'];
5635     }
5636     if ($row['date_contradictoire'] != '') {
5637     $this->valF['archive_date_contradictoire']= $row['date_contradictoire'];
5638     }
5639     if ($row['date_retour_contradictoire'] != '') {
5640     $this->valF['archive_date_retour_contradictoire']= $row['date_retour_contradictoire'];
5641     }
5642     if ($row['date_ait'] != '') {
5643     $this->valF['archive_date_ait']= $row['date_ait'];
5644     }
5645     if ($row['date_transmission_parquet'] != '') {
5646     $this->valF['archive_date_transmission_parquet']= $row['date_transmission_parquet'];
5647     }
5648 softime 8989 //
5649 softime 8593 if ($row['dossier_instruction_type'] != '') {
5650     $this->valF['archive_dossier_instruction_type']= $row['dossier_instruction_type'];
5651     }
5652 softime 8989 if ($row['date_affichage'] != '') {
5653     $this->valF['archive_date_affichage']= $row['date_affichage'];
5654     }
5655 softime 10573 if (isset($row['pec_metier']) === true && $row['pec_metier'] != '') {
5656     $this->valF['archive_pec_metier']= $row['pec_metier'];
5657     }
5658     if (isset($row['a_qualifier']) === true && $row['a_qualifier'] != '') {
5659     $this->valF['archive_a_qualifier']= $row['a_qualifier'];
5660     }
5661 mbroquet 3730 }
5662    
5663     // {{{
5664     // Méthodes de récupération des métadonnées arrêté
5665     /**
5666     * @return string Retourne le numéro d'arrêté
5667     */
5668     function getNumArrete() {
5669     return $this->getVal("numero_arrete");
5670     }
5671     /**
5672     * @return chaîne vide
5673     */
5674     function getReglementaireArrete() {
5675     return 'true';
5676     }
5677     /**
5678     * @return boolean de notification au pétitionnaire
5679     */
5680     function getNotificationArrete() {
5681     return 'true';
5682     }
5683     /**
5684     * @return date de notification au pétitionnaire
5685     */
5686     function getDateNotificationArrete() {
5687     if (empty($this->metadonneesArrete)) {
5688     $this->getArreteMetadata();
5689     }
5690     return $this->metadonneesArrete["datenotification"];
5691     }
5692     /**
5693     * @return boolean check si le document est passé au contrôle de légalité
5694     */
5695     function getControleLegalite() {
5696     return 'true';
5697     }
5698     /**
5699     * @return date de signature de l'arrêté
5700     */
5701     function getDateSignature() {
5702     if (empty($this->metadonneesArrete)) {
5703     $this->getArreteMetadata();
5704     }
5705     return $this->metadonneesArrete["datesignaturearrete"];
5706     }
5707     /**
5708     * @return string nom du signataire
5709     */
5710     function getNomSignataire() {
5711     if (empty($this->metadonneesArrete)) {
5712     $this->getArreteMetadata();
5713     }
5714     return $this->metadonneesArrete["nomsignataire"];
5715     }
5716     /**
5717     * @return string qualité du signataire
5718     */
5719     function getQualiteSignataire() {
5720     if (empty($this->metadonneesArrete)) {
5721     $this->getArreteMetadata();
5722     }
5723     return $this->metadonneesArrete["qualitesignataire"];
5724     }
5725     /**
5726     * @return string numéro du terrain
5727     */
5728     function getAp_numRue() {
5729     if (empty($this->metadonneesArrete)) {
5730     $this->getArreteMetadata();
5731     }
5732     return $this->metadonneesArrete["ap_numrue"];
5733     }
5734     /**
5735     * @return string nom de la rue du terrain
5736     */
5737     function getAp_nomDeLaVoie() {
5738     if (empty($this->metadonneesArrete)) {
5739     $this->getArreteMetadata();
5740     }
5741     return $this->metadonneesArrete["ap_nomdelavoie"];
5742     }
5743     /**
5744     * @return string code postal du terrain
5745     */
5746     function getAp_codePostal() {
5747     if (empty($this->metadonneesArrete)) {
5748     $this->getArreteMetadata();
5749     }
5750     return $this->metadonneesArrete["ap_codepostal"];
5751     }
5752     /**
5753     * @return string ville du terrain
5754     */
5755     function getAp_ville() {
5756     if (empty($this->metadonneesArrete)) {
5757     $this->getArreteMetadata();
5758     }
5759     return $this->metadonneesArrete["ap_ville"];
5760     }
5761     /**
5762     * @return string activité
5763     */
5764     function getActivite() {
5765     return "Droit du sol";
5766     }
5767     /**
5768     * @return string date du retour de controle légalité
5769     */
5770     function getDateControleLegalite() {
5771     if (empty($this->metadonneesArrete)) {
5772     $this->getArreteMetadata();
5773     }
5774     return $this->metadonneesArrete["datecontrolelegalite"];
5775     }
5776    
5777     // Fin des méthodes de récupération des métadonnées
5778     // }}}
5779    
5780     /**
5781     * Méthode de récupération des métadonnées arrêtés dans la base de données,
5782     * les données sont stockés dans l'attribut $this->metadonneesArrete
5783     */
5784     function getArreteMetadata() {
5785    
5786     //Récupération de la dernière instruction dont l'événement est de type 'arrete'
5787     $this->metadonneesArrete = array("nomsignataire"=>"", "qualitesignataire"=>"",
5788     "decisionarrete"=>"", "datenotification"=>"", "datesignaturearrete"=>"",
5789     "datecontrolelegalite"=>"", "ap_numrue"=>"", "ap_nomdelavoie"=>"",
5790     "ap_codepostal"=>"", "ap_ville"=>"");
5791    
5792 softime 10573 $sqlArrete = "SELECT
5793     signataire_arrete.prenom || ' ' ||signataire_arrete.nom as \"nomsignataire\",
5794 mbroquet 3730 signataire_arrete.qualite as \"qualitesignataire\",
5795     instruction.etat as \"decisionarrete\",
5796     instruction.date_retour_rar as \"datenotification\",
5797     instruction.date_retour_signature as \"datesignaturearrete\",
5798     instruction.date_retour_controle_legalite as \"datecontrolelegalite\",
5799     dossier.terrain_adresse_voie_numero as \"ap_numrue\",
5800     dossier.terrain_adresse_voie as \"ap_nomdelavoie\",
5801     dossier.terrain_adresse_code_postal as \"ap_codepostal\",
5802     dossier.terrain_adresse_localite as \"ap_ville\"
5803     FROM ".DB_PREFIXE."instruction
5804     LEFT JOIN ".DB_PREFIXE."signataire_arrete ON
5805     instruction.signataire_arrete = signataire_arrete.signataire_arrete
5806     LEFT JOIN ".DB_PREFIXE."dossier ON
5807     instruction.dossier = dossier.dossier
5808     LEFT JOIN ".DB_PREFIXE."donnees_techniques ON
5809     donnees_techniques.dossier_instruction = dossier.dossier
5810     WHERE instruction.instruction = ".$this->getVal("instruction");
5811 softime 8989 $resArrete = $this->f->db->query($sqlArrete);
5812 softime 12847 $this->addToLog(__METHOD__."(): db->query(\"".$sqlArrete."\");", VERBOSE_MODE);
5813     $this->f->isDatabaseError($resArrete);
5814 mbroquet 3730 $this->metadonneesArrete = $resArrete->fetchRow(DB_FETCHMODE_ASSOC);
5815     }
5816    
5817     /**
5818     * CONDITION - has_an_edition.
5819     *
5820     * Condition pour afficher le bouton de visualisation de l'édition.
5821     *
5822     * @return boolean
5823     */
5824     function has_an_edition() {
5825     // Récupère la valeur du champ lettretype
5826     $lettretype = $this->getVal("lettretype");
5827     // Si le champ est vide
5828 softime 7521 if ($lettretype !== '' && $lettretype !== null) {
5829 mbroquet 3730 //
5830 softime 7521 return true;
5831 mbroquet 3730 }
5832    
5833     //
5834 softime 7521 return false;
5835 mbroquet 3730 }
5836    
5837     /**
5838 softime 10573 * CONDITION - is_modifiable.
5839     *
5840     * Controle si l'évenement est modifiable.
5841     *
5842     * @return boolean
5843     */
5844     function is_evenement_modifiable() {
5845     $evenement = $this->get_inst_evenement($this->getVal('evenement'));
5846     return ! $this->get_boolean_from_pgsql_value($evenement->getVal('non_modifiable'));
5847     }
5848    
5849     /**
5850 mbroquet 3730 * CONDITION - is_editable.
5851     *
5852     * Condition pour la modification.
5853     *
5854     * @return boolean
5855     */
5856     function is_editable() {
5857 softime 10573
5858     // XXX
5859     // 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é)
5860     // Si cette tâche identifiée est DONE alors la suppression/modification de cette intruction est impossible
5861    
5862 mbroquet 3730 // Contrôle si l'utilisateur possède un bypass
5863 softime 7996 $bypass = $this->f->isAccredited($this->get_absolute_class_name()."_modifier_bypass");
5864 mbroquet 3730 //
5865     if ($bypass == true) {
5866     //
5867     return true;
5868     }
5869 softime 6565
5870 mbroquet 3730 // Si l'utilisateur est un instructeur, que le dossier est cloturé et
5871     // que l'événement n'est pas identifié comme non verrouillable
5872     if ($this->f->isUserInstructeur()
5873     && $this->getStatutAutorisationDossier($this->getParameter("idxformulaire")) == "cloture"
5874     && $this->checkEvenementNonVerrouillable($this->getVal("instruction")) === false) {
5875     //
5876     return false;
5877     }
5878    
5879 softime 6565 // Si l'utilisateur est un intructeur qui correspond à la division du
5880     // dossier
5881     if ($this->is_instructeur_from_division_dossier() === true) {
5882     //
5883     return true;
5884     }
5885    
5886     // Si l'utilisateur est instructeur de la commune du dossier et que
5887     // l'instruction est créée par un instructeur de la commune
5888     if ($this->is_instructeur_from_collectivite_dossier() === true and
5889     $this->getVal('created_by_commune') === 't') {
5890     return true;
5891     }
5892    
5893 mbroquet 3730 //
5894 softime 6565 return false;
5895 mbroquet 3730 }
5896    
5897     /**
5898 softime 10573 * Vérifie si l'événement est supprimable ou pas.
5899     *
5900     * @return boolean
5901     */
5902     function is_evenement_supprimable() {
5903     // Controle si l'évenement est supprimable
5904     $evenement = $this->get_inst_evenement($this->getVal('evenement'));
5905     return ! $this->get_boolean_from_pgsql_value($evenement->getVal('non_supprimable'));
5906     }
5907    
5908     /**
5909 mbroquet 3730 * CONDITION - is_deletable.
5910     *
5911 softime 6864 * Condition pour la suppression.
5912 mbroquet 3730 *
5913     * @return boolean
5914     */
5915     function is_deletable() {
5916 softime 10573
5917     // XXX
5918     // 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é)
5919     // Si cette tâche identifiée est DONE alors la suppression/modification de cette intruction est impossible
5920    
5921 softime 6864 // Contrôle si l'utilisateur possède un bypass intégral
5922 softime 7996 $bypass = $this->f->isAccredited($this->get_absolute_class_name()."_supprimer_bypass");
5923 mbroquet 3730 //
5924     if ($bypass == true) {
5925    
5926     //
5927     return true;
5928     }
5929    
5930     // Si l'utilisateur est un intructeur qui ne correspond pas à la
5931 softime 6864 // division du dossier et si l'utilisateur n'a pas la permission bypass
5932     // de la division
5933     if ($this->is_instructeur_from_division_dossier() === false
5934 softime 7996 && $this->f->isAccredited($this->get_absolute_class_name()."_supprimer_bypass_division") === false) {
5935 mbroquet 3730
5936     //
5937     return false;
5938     }
5939 softime 5024
5940     // l'événement est-il le dernier ?
5941     $dernier_evenement = false;
5942     // instanciation dossier
5943 softime 7996 $dossier = $this->f->get_inst__om_dbform(array(
5944     "obj" => "dossier",
5945     "idx" => $this->getVal('dossier'),
5946     ));
5947 softime 5024 // récupération dernier événement
5948     $id_dernier_evenement = $dossier->get_dernier_evenement();
5949     if ($id_dernier_evenement == $this->getVal($this->clePrimaire)) {
5950     $dernier_evenement = true;
5951     }
5952 mbroquet 3730
5953 softime 5024 // Si dossier cloturé ou si pas dernier événement
5954     // ou de type retour ou si une date est renseignée
5955     // ET utilisateur non administrateur
5956     if ($this->getStatutAutorisationDossier($this->getVal('dossier')) == 'cloture'
5957     || $dernier_evenement == false
5958     || $this->is_evenement_retour($this->getVal("evenement")) == true
5959     || $this->getVal('date_envoi_signature') != ''
5960     || $this->getVal('date_retour_signature') != ''
5961     || $this->getVal('date_envoi_rar') != ''
5962     || $this->getVal('date_retour_rar') != ''
5963     || $this->getVal('date_envoi_controle_legalite') != ''
5964     || $this->getVal('date_retour_controle_legalite') != '') {
5965     // pas le droit de supprimer
5966     return false;;
5967     }
5968    
5969 mbroquet 3730 //
5970     return true;
5971     }
5972 softime 6565
5973    
5974 mbroquet 3730 /**
5975 softime 6565 * Vérifie que l'utilisateur est instructeur et qu'il est de la division du
5976     * dossier.
5977     *
5978     * @return, boolean true/false
5979     */
5980     function is_instructeur_from_collectivite_dossier() {
5981     if ($this->f->isUserInstructeur() === true and
5982     $this->f->om_utilisateur["om_collectivite"] == $this->get_dossier_instruction_om_collectivite()) {
5983     return true;
5984     }
5985     return false;
5986     }
5987    
5988     /**
5989 mbroquet 3730 * CONDITION - is_addable.
5990     *
5991     * Condition pour afficher les boutons modifier et supprimer.
5992     *
5993     * @return boolean
5994     */
5995     function is_addable() {
5996     // Contrôle si l'utilisateur possède un bypass
5997 softime 7996 $bypass = $this->f->isAccredited($this->get_absolute_class_name()."_ajouter_bypass");
5998 mbroquet 3730 //
5999     if ($bypass == true) {
6000    
6001     //
6002     return true;
6003     }
6004 softime 6565 // Si l'utilisateur est un intructeur qui correspond à la
6005     // division du dossier ou qu'il peut changer la décision
6006     if ($this->is_instructeur_from_division_dossier() === true or
6007     $this->isInstrCanChangeDecision($this->getParameter('idxformulaire')) === true) {
6008 mbroquet 3730 //
6009 softime 6565 return true;
6010 mbroquet 3730 }
6011    
6012     //
6013 softime 6565 return false;
6014 mbroquet 3730 }
6015    
6016     /**
6017     * CONDITION - is_finalizable.
6018     *
6019     * Condition pour afficher le bouton.
6020     *
6021     * @return boolean
6022     */
6023     function is_finalizable() {
6024     // Contrôle si l'utilisateur possède un bypass
6025 softime 7996 $bypass = $this->f->isAccredited($this->get_absolute_class_name()."_finaliser_bypass");
6026 mbroquet 3730 //
6027     if ($bypass == true) {
6028     //
6029     return true;
6030     }
6031 softime 6565
6032 mbroquet 3730 // Si l'utilisateur est un instructeur, que le dossier est cloturé et
6033     // que l'événement n'est pas identifié comme non verrouillable
6034     if ($this->f->isUserInstructeur()
6035     && $this->getStatutAutorisationDossier($this->getParameter("idxformulaire")) == "cloture"
6036     && $this->checkEvenementNonVerrouillable($this->getVal("instruction")) === false) {
6037     //
6038     return false;
6039     }
6040 softime 6565
6041     // Si l'utilisateur est un intructeur qui correspond à la division du
6042     // dossier
6043     if ($this->is_instructeur_from_division_dossier() === true) {
6044     //
6045     return true;
6046     }
6047 mbroquet 3730
6048 softime 6565 // Si l'utilisateur est instructeur de la commune du dossier et que
6049     // l'instruction est créée par un instructeur de la commune
6050     if ($this->is_instructeur_from_collectivite_dossier() === true and
6051     $this->getVal('created_by_commune') === 't') {
6052     return true;
6053     }
6054    
6055 mbroquet 3730 //
6056 softime 6565 return false;
6057 mbroquet 3730 }
6058    
6059     /**
6060     * CONDITION - is_finalize_without_bypass.
6061     *
6062     * Condition pour afficher le bouton sans le bypass.
6063     *
6064     * @return boolean [description]
6065     */
6066     function is_finalizable_without_bypass() {
6067     // Récupère la valeur du champ finalisé
6068     $om_final_instruction = $this->getVal('om_final_instruction');
6069    
6070     // Si le rapport n'est pas finalisé
6071     if (empty($om_final_instruction)
6072     || $om_final_instruction == 'f') {
6073     //
6074     return true;
6075     }
6076    
6077     //
6078     return false;
6079     }
6080    
6081     /**
6082     * CONDITION - is_unfinalizable.
6083     *
6084     * Condition pour afficher le bouton.
6085     *
6086     * @return boolean
6087     */
6088     function is_unfinalizable(){
6089     // Contrôle si l'utilisateur possède un bypass
6090 softime 7996 $bypass = $this->f->isAccredited($this->get_absolute_class_name()."_definaliser_bypass");
6091 mbroquet 3730 //
6092     if ($bypass == true) {
6093     //
6094     return true;
6095     }
6096 softime 6565
6097     // Si l'utilisateur est un instructeur, que le dossier est cloturé et
6098     // que l'événement n'est pas identifié comme non verrouillable
6099 mbroquet 3730 if ($this->f->isUserInstructeur()
6100 softime 6565 && $this->getStatutAutorisationDossier($this->getParameter("idxformulaire")) == "cloture"
6101     && $this->checkEvenementNonVerrouillable($this->getVal("instruction")) === false) {
6102 mbroquet 3730 //
6103     return false;
6104     }
6105    
6106 softime 6565 // Si l'utilisateur est un intructeur qui correspond à la division du
6107     // dossier
6108     if ($this->is_instructeur_from_division_dossier() === true) {
6109     //
6110     return true;
6111 mbroquet 3730 }
6112    
6113 softime 6565 // Si l'utilisateur est instructeur de la commune du dossier et que
6114     // l'instruction est créée par un instructeur de la commune
6115     if ($this->is_instructeur_from_collectivite_dossier() === true and
6116     $this->getVal('created_by_commune') === 't') {
6117     return true;
6118 mbroquet 3730 }
6119    
6120     //
6121 softime 6565 return false;
6122 mbroquet 3730 }
6123    
6124     /**
6125     * CONDITION - is_unfinalizable_without_bypass.
6126     *
6127     * Condition pour afficher le bouton sans le bypass.
6128     *
6129     * @return boolean
6130     */
6131     function is_unfinalizable_without_bypass() {
6132     // Récupère la valeur du champ finalisé
6133     $om_final_instruction = $this->getVal('om_final_instruction');
6134    
6135     // Si l'instruction est finalisée
6136     if ($om_final_instruction == 't') {
6137     //
6138     return true;
6139     }
6140    
6141     //
6142     return false;
6143     }
6144    
6145 softime 5169
6146 mbroquet 3730 /**
6147 softime 6565 * Permet de définir si un instructeur commune peut editer une instruction
6148     *
6149     * @return boolean true si il peut
6150     */
6151     function isInstrCanChangeDecision($idx) {
6152    
6153     if ($this->f->isAccredited(array("instruction", "instruction_changer_decision"), "OR") !== true or
6154     $this->f->isUserInstructeur() !== true) {
6155     return false;
6156     }
6157    
6158    
6159    
6160     // Sinon on vérifie l'éligibilité du dossier au changement de décision
6161 softime 11876 // /!\ Requête lié à celles du widget indiquant les dossiers éligible au changement
6162     // de décision :
6163     // * dossier_instruction.class.php : view_widget_dossiers_evenement_retour_finalise()
6164     // * dossier_instruction.inc.php : si le paramètre filtre_decision = true
6165     $sql = sprintf(
6166     'SELECT
6167 softime 6565 dossier.dossier
6168     FROM
6169 softime 11876 %1$sdossier
6170     JOIN %1$setat
6171     ON dossier.etat = etat.etat AND etat.statut = \'encours\'
6172     JOIN %1$slien_dossier_demandeur
6173     ON dossier.dossier = lien_dossier_demandeur.dossier AND lien_dossier_demandeur.petitionnaire_principal IS TRUE
6174     JOIN %1$sdossier_instruction_type
6175     ON dossier.dossier_instruction_type=dossier_instruction_type.dossier_instruction_type
6176     JOIN %1$sinstruction
6177     -- Recherche de la dernière instruction qui ne soit pas liée à un événement retour
6178     ON instruction.instruction = (
6179     SELECT instruction
6180     FROM %1$sinstruction
6181     JOIN %1$sevenement ON instruction.evenement=evenement.evenement
6182     AND evenement.retour IS FALSE
6183     WHERE instruction.dossier = dossier.dossier
6184     ORDER BY date_evenement DESC, instruction DESC
6185     LIMIT 1
6186     )
6187     -- On ne garde que les dossiers pour lesquels la dernière instruction est finalisée
6188     -- ou alors pour laquelle l instruction a été ajouté par la commune et est
6189     -- non signée, non notifié, etc.
6190     AND (instruction.om_final_instruction IS TRUE
6191     OR instruction.created_by_commune IS TRUE)
6192     AND instruction.date_retour_signature IS NULL
6193     AND instruction.date_envoi_rar IS NULL
6194     AND instruction.date_retour_rar IS NULL
6195     AND instruction.date_envoi_controle_legalite IS NULL
6196     AND instruction.date_retour_controle_legalite IS NULL
6197     -- On vérifie que l instruction soit un arrêté ou un changement de décision
6198     JOIN %1$sevenement
6199     ON instruction.evenement=evenement.evenement
6200     AND (evenement.type = \'arrete\'
6201     OR evenement.type = \'changement_decision\')
6202     -- Recherche les informations du pétitionnaire principal pour l affichage
6203     JOIN %1$sdemandeur
6204     ON lien_dossier_demandeur.demandeur = demandeur.demandeur
6205     -- Recherche la collectivité rattachée à l instructeur
6206     JOIN %1$sinstructeur
6207     ON dossier.instructeur=instructeur.instructeur
6208     JOIN %1$sdivision
6209     ON instructeur.division=division.division
6210     JOIN %1$sdirection
6211     ON division.direction=direction.direction
6212     JOIN %1$som_collectivite
6213     ON direction.om_collectivite=om_collectivite.om_collectivite
6214 softime 6565 WHERE
6215 softime 11876 -- Vérification que la décision a été prise par l agglo
6216     om_collectivite.niveau = \'2\'
6217     AND dossier.dossier = \'%2$s\'
6218     ',
6219     DB_PREFIXE,
6220 softime 14064 $this->f->db->escapeSimple($idx)
6221 softime 11876 );
6222 softime 6565
6223    
6224     // Si collectivité de l'utilisateur niveau mono alors filtre sur celle-ci
6225     if ($this->f->isCollectiviteMono($_SESSION['collectivite']) === true) {
6226 softime 11876 $sql .= sprintf(
6227 softime 14064 ' AND dossier.om_collectivite = %1$d',
6228     intval($_SESSION['collectivite'])
6229 softime 11876 );
6230 softime 6565 }
6231 softime 14064 $qres = $this->f->get_one_result_from_db_query(
6232     $sql,
6233     array(
6234     "origin" => __METHOD__,
6235     )
6236     );
6237    
6238     return $qres['result'] !== null;
6239 softime 6565 }
6240    
6241    
6242     /**
6243 softime 5169 * CONDITION - can_monitoring_dates.
6244     *
6245     * Condition pour afficher le bouton de suivi des dates.
6246     *
6247     * @return boolean
6248     */
6249     public function can_monitoring_dates() {
6250     // Récupère la valeur du champ finalisé
6251     $om_final_instruction = $this->getVal('om_final_instruction');
6252    
6253     // Si l'instruction n'est pas finalisée
6254     if ($om_final_instruction !== 't') {
6255     //
6256     return false;
6257     }
6258    
6259     // Contrôle si l'utilisateur possède un bypass
6260 softime 7996 $bypass = $this->f->isAccredited($this->get_absolute_class_name()."_modification_dates_bypass");
6261 softime 5169 if ($bypass === true) {
6262     return true;
6263     }
6264    
6265 softime 8989 // Permission de modifier le suivi des dates sur un dossier cloturé pour
6266     // un utilisateur lié à un instructeur
6267     $perm_moni_dates_d_closed = $this->f->isAccredited($this->get_absolute_class_name()."_modification_dates_cloture");
6268    
6269     // On vérifie en premier lieu que le DI n'est pas clôturé et que
6270     // l'utilisateur ne possède pas la permission de modifier le suivi des
6271     // dates sur un dossier clôturé
6272 softime 5169 $inst_dossier = $this->get_inst_dossier();
6273 softime 8989 if ($inst_dossier->getStatut() === 'cloture'
6274     && $perm_moni_dates_d_closed === false) {
6275 softime 5169 //
6276     return false;
6277     }
6278     // On récupère ses infos
6279     $coll_di = $inst_dossier->getVal('om_collectivite');
6280     $div_di = $this->getDivisionFromDossier();
6281     // et celles de son éventuel instructeur
6282     $instr_di = $inst_dossier->getVal('instructeur');
6283    
6284 softime 6565 // Il faut disposer d'une entrée instructeur
6285     if ($this->f->isUserInstructeur() === false) {
6286     return false;
6287     }
6288    
6289 softime 5169 // Par défaut on prétend que l'instructeur n'est pas multi
6290     $instr_di_coll_multi = false;
6291     // Si un instructeur est affecté au dossier
6292     if ($instr_di !== '' && $instr_di !== null) {
6293     // Vérifie si l'instructeur est de la collectivité de niveau 2
6294 softime 5295 $instr_di_coll = $this->get_instructeur_om_collectivite($instr_di);
6295 softime 5169 if ($this->f->isCollectiviteMono($instr_di_coll) === false) {
6296     //
6297     $instr_di_coll_multi = true;
6298     }
6299     }
6300    
6301 softime 6565 // Il faut qu'il instruise le dossier ou soit de la même division
6302     if ($this->f->om_utilisateur['instructeur'] === $instr_di
6303     || $this->f->om_utilisateur['division'] === $div_di) {
6304 softime 5169 //
6305     return true;
6306     }
6307    
6308 softime 6565 // On donne également le droit s'il est de la même collectivité que
6309     // le dossier ET si l'instruction est déléguée à la communauté
6310     if ($this->f->isCollectiviteMono($this->f->om_utilisateur['om_collectivite']) === true
6311     && $this->f->om_utilisateur['om_collectivite'] === $coll_di
6312     && $instr_di_coll_multi === true) {
6313 softime 5169 //
6314     return true;
6315     }
6316    
6317 softime 6565 // Si l'instructeur ne rentre pas dans les deux cas précédents
6318 softime 5169 return false;
6319     }
6320    
6321    
6322     /**
6323 softime 12847 * CONDITION - is_finalized.
6324     *
6325     * Condition pour vérifier si une instruction est finalisée.
6326     *
6327     * @return boolean
6328     */
6329     public function is_finalized() {
6330    
6331     return $this->getVal('om_final_instruction') === "t";
6332     }
6333    
6334     /**
6335     * CONDITION - is_not_date_retour_signature_set.
6336     *
6337     * Condition pour vérifier si une date de retour signature n'est pas définie.
6338     *
6339     * @return boolean
6340     */
6341     public function is_not_date_retour_signature_set() {
6342    
6343     return $this->getVal('date_retour_signature') == null;
6344    
6345     }
6346    
6347    
6348     /**
6349 mbroquet 3730 * TREATMENT - finalize.
6350     *
6351     * Permet de finaliser un enregistrement.
6352     *
6353     * @param array $val valeurs soumises par le formulaire
6354     *
6355     * @return boolean
6356     */
6357     function finalize($val = array()) {
6358    
6359     // Cette méthode permet d'exécuter une routine en début des méthodes
6360     // dites de TREATMENT.
6361     $this->begin_treatment(__METHOD__);
6362 softime 10808 $message = '';
6363 softime 11585 $ev = $this->get_inst_evenement($this->getVal('evenement'));
6364 mbroquet 3730
6365 softime 11585 // Controle du signataire
6366     if (! $this->controle_signataire($ev)) {
6367     $this->addToMessage(__("Le document ne peut pas être finalisé car aucun signataire n'a été sélectionné."));
6368     // Termine le traitement
6369     return $this->end_treatment(__METHOD__, false);
6370     }
6371    
6372 mbroquet 3730 // Traitement de la finalisation
6373     $ret = $this->manage_finalizing("finalize", $val);
6374    
6375     // Si le traitement retourne une erreur
6376     if ($ret !== true) {
6377    
6378     // Termine le traitement
6379 softime 5024 return $this->end_treatment(__METHOD__, false);
6380 mbroquet 3730 }
6381    
6382 softime 10808 // Envoi des notifications aux demandeurs si la notification est automatique
6383     // et que la signature n'est pas requise
6384     if ($ev->getVal('notification') === 'notification_automatique') {
6385 softime 13137 // Préparation du message de log en cas d'erreur de notification
6386 softime 13528 $msgLog = sprintf(
6387     '%s %s : %d',
6388     __('Erreur lors de la notification automatique du(des) pétitionnaire(s) suite à la finalisation de l\'instruction.'),
6389     __('Instruction notifiée'),
6390     $this->getVal($this->clePrimaire)
6391     );
6392 softime 10808 // Récupération de la catégorie et envoie des notifications au(x) demandeur(s)
6393     $collectivite_di = $this->get_dossier_instruction_om_collectivite($this->getVal('dossier'));
6394     // Récupération de la liste des demandeurs à notifier et de la catégorie
6395     $categorie = $this->f->get_param_option_notification($collectivite_di);
6396 softime 14064 $isPortal = $categorie === PORTAL;
6397 softime 10869 $demandeursANotifie = $this->get_demandeurs_notifiable(
6398     $this->getVal('dossier'),
6399     $isPortal
6400     );
6401 softime 10808
6402     // Création d'une notification et d'une tâche pour chaque demandeur à notifier
6403 softime 12124 $demandeurPrincipalNotifie = false;
6404 softime 10813 if (count($demandeursANotifie) > 0) {
6405     foreach ($demandeursANotifie as $demandeur) {
6406 softime 12124 // Identifie si le demandeur principal a été notifié ou pas
6407     // et récupère ses informations
6408     if ($demandeur['petitionnaire_principal'] == 't') {
6409     $demandeurPrincipalNotifie = true;
6410     // Si le demandeur principal est notifiable mais qu'il y a des erreurs dans
6411     // son paramétrage, on effectue pas le traitement et on passe à l'itération
6412     // suivante. On le considère également comme non notifié pour gérer l'envoie
6413     // des messages d'erreurs
6414     // Si la demande a été déposée via le portail alors le paramétrage n'a pas
6415     // d'impact sur la notification
6416     $erreursParam = $this->get_info_notification_fail();
6417     if (! $this->dossier_depose_sur_portail() && $erreursParam != array()) {
6418     $demandeurPrincipalNotifie = false;
6419     continue;
6420     }
6421     }
6422 softime 10813 // Ajout de la notif et récupération de son id
6423     $idNotif = $this->ajouter_notification(
6424     $this->getVal($this->clePrimaire),
6425     $this->f->get_connected_user_login_name(),
6426 softime 10968 $demandeur,
6427     $collectivite_di,
6428 softime 12433 array(),
6429 softime 10968 true
6430 softime 10808 );
6431 softime 10813 if ($idNotif === false) {
6432     // Termine le traitement
6433 softime 13528 $this->addToLog(
6434     sprintf('%s() : %s', __METHOD__, $msgLog),
6435     DEBUG_MODE
6436     );
6437 softime 10813 return $this->end_treatment(__METHOD__, false);
6438     }
6439     $notification_by_task = $this->notification_by_task(
6440     $idNotif,
6441     $this->getVal('dossier'),
6442     $categorie
6443 softime 10808 );
6444 softime 10813 if ($notification_by_task === false) {
6445 softime 13528 $this->addToLog(
6446     sprintf('%s() : %s', __METHOD__, $msgLog),
6447     DEBUG_MODE
6448     );
6449 softime 10813 $this->addToMessage(
6450     __("Erreur lors de la génération de la notification au(x) pétitionnaire(s).")
6451     );
6452     // Termine le traitement
6453     return $this->end_treatment(__METHOD__, false);
6454     }
6455 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.")));
6456 softime 10808 }
6457     }
6458 softime 12847 // Pour la notification par mail ou la notification via portal si le dossier a
6459     // été déposés via portal, si le demandeur principal n'est pas notifiable,
6460     // on créé une nouvelle notification en erreur avec en commentaire la raison pour
6461     // laquelle le demandeur principal n'a pas pu être notifié
6462     $depotPortal = $this->dossier_depose_sur_portail();
6463     if (! $demandeurPrincipalNotifie && ($isPortal === false || $depotPortal === true)) {
6464 softime 13137 // Préparation des logs pour indiquer que le pétitionnaire principale n'est pas notifiable
6465 softime 13528 $msgLog .= sprintf(' %s', __('Le pétitionnaire principale n\'est pas notifiable.'));
6466 softime 12124 // Analyse pour savoir pourquoi le demandeur principal n'est pas notifiable
6467     $erreursParam = $this->get_info_notification_fail();
6468     $demandeurPrincipal = $this->get_info_petitionnaire_principal_dossier($this->getVal('dossier'));
6469     // Ajout de la notif et récupération de son id
6470     $idNotif = $this->ajouter_notification(
6471     $this->valF[$this->clePrimaire],
6472     $this->f->get_connected_user_login_name(),
6473     $demandeurPrincipal,
6474     $collectivite_di,
6475 softime 12433 array(),
6476 softime 12124 true,
6477     'Echec',
6478     implode(' ', $erreursParam)
6479     );
6480     if ($idNotif === false) {
6481     $this->addToMessage(
6482     __('Erreur : la création de la notification a échouée.').
6483     __("Veuillez contacter votre administrateur.")
6484     );
6485 softime 13528 $this->addToLog(
6486     sprintf('%s() : %s', __METHOD__, $msgLog),
6487     DEBUG_MODE
6488     );
6489 softime 12124 return false;
6490     }
6491     // Prépare un message d'alerte à destination de l'instructeur pour l'informer
6492     // de l'échec de la notification
6493     $dossier_message = $this->get_inst_dossier_message(0);
6494     $dossier_message_val = array(
6495     'dossier' => $this->getVal('dossier'),
6496     'type' => _('erreur expedition'),
6497     'emetteur' => $this->f->get_connected_user_login_name(),
6498     'login' => $_SESSION['login'],
6499     'date_emission' => date('Y-m-d H:i:s'),
6500     'contenu' => _('Échec lors de la notification de l\'instruction ').
6501     $ev->getVal('libelle').
6502     '.<br>'.
6503     implode("\n", $erreursParam).
6504     '<br>'.
6505     _('Veuillez corriger ces informations avant de renvoyer la notification.')
6506     );
6507     $add = $dossier_message->add_notification_message($dossier_message_val, true);
6508     // Si une erreur se produit pendant l'ajout
6509     if ($add !== true) {
6510     $this->addToLog(__METHOD__."(): Le message d'alerte concernant l'echec de l'envoi de la notification n'a pas pu être envoyé.", DEBUG_MODE);
6511     return false;
6512     }
6513     }
6514 softime 10808 }
6515    
6516 mbroquet 3730 // Termine le traitement
6517     return $this->end_treatment(__METHOD__, true);
6518     }
6519    
6520     /**
6521 softime 12124 * Récupère l'instance de dossier message.
6522     *
6523     * @param string $dossier_message Identifiant du message.
6524     *
6525     * @return object
6526     */
6527     private function get_inst_dossier_message($dossier_message = null) {
6528     //
6529     return $this->get_inst_common("dossier_message", $dossier_message);
6530     }
6531    
6532     /**
6533 softime 11585 * Vérifie si le signataire est obligatoire pour finaliser
6534     * le document apartir du paramétrage de l'événement.
6535     * Si c'est le cas, vérifie si il y a bien un signataire
6536     * renseigné.
6537     * Si c'est le cas renvoie true, sinon renvoie false.
6538     *
6539     * @param evenement évenement de l'instruction permettant de
6540     * récupérer le paramétrage
6541     * @return boolean
6542     */
6543     protected function controle_signataire($evenement) {
6544     // Vérifie si le signataire est obligatoire et si c'est le cas
6545     // vérifie si il y a bien un signataire pour le document
6546     if ($evenement->is_signataire_obligatoire() &&
6547     ($this->getVal('signataire_arrete') === null ||
6548     $this->getVal('signataire_arrete') === '')) {
6549     return false;
6550     }
6551     return true;
6552     }
6553    
6554     /**
6555 mbroquet 3730 * TREATMENT - unfinalize.
6556     *
6557     * Permet de définaliser un enregistrement.
6558     *
6559     * @param array $val valeurs soumises par le formulaire
6560     *
6561     * @return boolean
6562     */
6563     function unfinalize($val = array()) {
6564    
6565     // Cette méthode permet d'exécuter une routine en début des méthodes
6566     // dites de TREATMENT.
6567     $this->begin_treatment(__METHOD__);
6568    
6569     // Traitement de la finalisation
6570     $ret = $this->manage_finalizing("unfinalize", $val);
6571    
6572     // Si le traitement retourne une erreur
6573     if ($ret !== true) {
6574    
6575     // Termine le traitement
6576 softime 5024 return $this->end_treatment(__METHOD__, false);
6577 mbroquet 3730 }
6578    
6579     // Termine le traitement
6580     return $this->end_treatment(__METHOD__, true);
6581     }
6582    
6583     /**
6584     * VIEW - view_edition
6585     *
6586     * Edite l'édition de l'instruction ou affiche celle contenue dans le stockage.
6587     *
6588     * @return null Si l'action est incorrecte
6589     */
6590     function view_edition() {
6591    
6592     // Si l'instruction est finalisée
6593     if($this->getVal("om_final_instruction") == 't'
6594     && $this->getVal("om_final_instruction") != null) {
6595    
6596     // Ouvre le document
6597 softime 7996 $lien = '../app/index.php?module=form&snippet=file&obj='.$this->table.'&'.
6598 mbroquet 3730 'champ=om_fichier_instruction&id='.$this->getVal($this->clePrimaire);
6599     //
6600     header("Location: ".$lien);
6601     } else {
6602    
6603     // Récupère la collectivite du dossier d'instruction
6604     $dossier_instruction_om_collectivite = $this->get_dossier_instruction_om_collectivite();
6605    
6606     //
6607     $collectivite = $this->f->getCollectivite($dossier_instruction_om_collectivite);
6608    
6609     // Paramètre du PDF
6610     $params = array(
6611     "watermark" => true,
6612     "specific" => array(
6613     "mode" => "previsualisation",
6614     ),
6615     );
6616 softime 8593 // Si la rédaction libre est activée sur l'instruction
6617     if ($this->getVal("flag_edition_integrale") == 't') {
6618     $params["specific"]["corps"] = array(
6619     "mode" => "set",
6620     "value" => $this->getVal("corps_om_htmletatex"),
6621     );
6622     $params["specific"]["titre"] = array(
6623     "mode" => "set",
6624     "value" => $this->getVal("titre_om_htmletat"),
6625     );
6626     }
6627 mbroquet 3730
6628     // Génération du PDF
6629     $result = $this->compute_pdf_output('lettretype', $this->getVal("lettretype"), $collectivite, null, $params);
6630     // Affichage du PDF
6631     $this->expose_pdf_output(
6632     $result['pdf_output'],
6633     $result['filename']
6634     );
6635     }
6636     }
6637    
6638     /**
6639     * Récupère la collectivité du dossier d'instruction.
6640     *
6641 softime 7685 * @param string $dossier_instruction_id Identifiant du DI.
6642     *
6643 mbroquet 3730 * @return integer
6644     */
6645 softime 7685 function get_dossier_instruction_om_collectivite($dossier_instruction_id = null) {
6646 mbroquet 3730
6647 softime 7685 // Si l'identifiant n'est pas renseigné
6648     if ($dossier_instruction_id === null) {
6649 softime 8593 // Récupère la valeur
6650     if ($this->getVal('dossier') !== null && $this->getVal('dossier') !== '') {
6651     $dossier_instruction_id = $this->getVal('dossier');
6652     } elseif ($this->getParameter('idxformulaire') !== null
6653     && $this->getParameter('idxformulaire') !== '') {
6654     //
6655     $dossier_instruction_id = $this->getParameter('idxformulaire');
6656     } elseif ($this->f->get_submitted_get_value('idxformulaire') !== null
6657     && $this->f->get_submitted_get_value('idxformulaire') !== '') {
6658     //
6659     $dossier_instruction_id = $this->f->get_submitted_get_value('idxformulaire');
6660     }
6661 softime 7685 }
6662    
6663 mbroquet 3730 //
6664 softime 7996 $dossier_instruction = $this->f->get_inst__om_dbform(array(
6665     "obj" => "dossier_instruction",
6666     "idx" => $dossier_instruction_id,
6667     ));
6668 mbroquet 3730
6669     //
6670     return $dossier_instruction->getVal('om_collectivite');
6671     }
6672    
6673     /**
6674     * VIEW - view_bible
6675     *
6676     * Affiche la bible manuelle.
6677     *
6678     * @return void
6679     */
6680     function view_bible() {
6681     // Vérification de l'accessibilité sur l'élément
6682     $this->checkAccessibility();
6683    
6684     /**
6685     * Affichage de la structure HTML
6686     */
6687     //
6688 softime 8989 if ($this->f->isAjaxRequest()) {
6689 mbroquet 3730 //
6690     header("Content-type: text/html; charset=".HTTPCHARSET."");
6691     } else {
6692     //
6693 softime 8989 $this->f->setFlag("htmlonly");
6694     $this->f->display();
6695 mbroquet 3730 }
6696     //
6697 softime 8989 $this->f->displayStartContent();
6698 mbroquet 3730 //
6699 softime 8989 $this->f->setTitle(_("Liste des éléments de la bible en lien avec un evenement"));
6700     $this->f->displayTitle();
6701 mbroquet 3730
6702     /**
6703     *
6704     */
6705     //
6706 softime 8989 ($this->f->get_submitted_get_value("ev") ? $evenement = $this->f->get_submitted_get_value("ev") : $evenement = "");
6707 mbroquet 3730 $evenement = intval($evenement);
6708     //
6709 softime 8989 ($this->f->get_submitted_get_value("idx") ? $idx = $this->f->get_submitted_get_value("idx") : $idx = "");
6710 softime 5169 // Récupération du code du type de DA
6711     $code_da_type = '';
6712     if (preg_match('/[A-Za-z]{2,3}/', $idx, $matches) !== false) {
6713     $code_da_type = $matches[0];
6714     }
6715 mbroquet 3730 //
6716 softime 8989 ($this->f->get_submitted_get_value("complement") ? $complement = $this->f->get_submitted_get_value("complement") : $complement = "1");
6717 mbroquet 3730
6718     // Récupération de la collectivité du dossier
6719 softime 7996 $dossier = $this->f->get_inst__om_dbform(array(
6720     "obj" => "dossier",
6721     "idx" => $idx,
6722     ));
6723 mbroquet 3730
6724     /**
6725     *
6726     */
6727     //
6728     $sql = "SELECT *, bible.libelle as bible_lib
6729     FROM ".DB_PREFIXE."bible
6730     LEFT OUTER JOIN ".DB_PREFIXE."dossier_autorisation_type
6731     ON bible.dossier_autorisation_type=dossier_autorisation_type.dossier_autorisation_type
6732     LEFT JOIN ".DB_PREFIXE."om_collectivite
6733     ON bible.om_collectivite = om_collectivite.om_collectivite
6734 softime 7366 WHERE (evenement=".$evenement." OR evenement IS NULL)
6735 softime 8989 AND (complement=".$complement." OR complement IS NULL)
6736 mbroquet 3730 AND (bible.dossier_autorisation_type IS NULL
6737 softime 5169 OR dossier_autorisation_type.code ='".$code_da_type."')
6738 mbroquet 3730 AND (om_collectivite.niveau = '2'
6739     OR bible.om_collectivite = ".$dossier->getVal("om_collectivite").")
6740     ORDER BY bible_lib ASC";
6741 softime 8989 $res = $this->f->db->query($sql);
6742     $this->f->addToLog(__METHOD__.": db->query(\"".$sql."\");", VERBOSE_MODE);
6743     $this->f->isDatabaseError($res);
6744 mbroquet 3730 //
6745     echo "<form method=\"post\" name=\"f3\" action=\"#\">\n";
6746     //
6747     if ($res->numrows() > 0) {
6748     //
6749     echo "\t<table id='tab-bible' width='100%'>\n";
6750     //
6751     echo "\t\t<tr class=\"ui-tabs-nav ui-accordion ui-state-default tab-title\">";
6752     echo "<th>"._("Choisir")."</th>";
6753     echo "<th>"._("Libelle")."</th>";
6754     echo "</tr>\n";
6755     //
6756     $i = 0;
6757     //
6758     while ($row=& $res->fetchRow(DB_FETCHMODE_ASSOC)) {
6759     //
6760     echo "\t\t<tr";
6761     echo " class=\"".($i % 2 == 0 ? "odd" : "even")."\"";
6762     echo ">";
6763     //
6764     echo "<td class=\"center\"><input type=\"checkbox\" name=\"choix[]\" value=\"".$i."\" id=\"checkbox".$i."\" /></td>";
6765     // XXX utilisation de l'attribut titre pour afficher une infobulle
6766     echo "<td><span class=\"content\" title=\"".htmlentities($row['contenu'])."\" id=\"content".$i."\">".$row['bible_lib']."</span></td>";
6767     //
6768     echo "</tr>\n";
6769     //
6770     $i++;
6771     }
6772     echo "\t</table>\n";
6773     //
6774     echo "<div class=\"formControls\">\n";
6775 softime 8989 $this->f->layout->display_form_button(array(
6776 mbroquet 3730 "value" => _("Valider"),
6777     "onclick" => "bible_return('f2', 'complement".($complement == "1" ? "" : $complement)."_om_html'); return false;",
6778     ));
6779 softime 8989 $this->f->displayLinkJsCloseWindow();
6780 mbroquet 3730 echo "</div>\n";
6781    
6782     } else {
6783     //
6784     $message_class = "error";
6785     $message = _("Aucun element dans la bible pour l'evenement")." : ".$evenement;
6786 softime 8989 $this->f->displayMessage($message_class, $message);
6787 mbroquet 3730 //
6788     echo "<div class=\"formControls\">\n";
6789 softime 8989 $this->f->displayLinkJsCloseWindow();
6790 mbroquet 3730 echo "</div>\n";
6791     }
6792     //
6793     echo "</form>\n";
6794    
6795     /**
6796     * Affichage de la structure HTML
6797     */
6798     //
6799 softime 8989 $this->f->displayEndContent();
6800 mbroquet 3730 }
6801    
6802     /**
6803 softime 5169 * VIEW - view_bible_auto
6804 mbroquet 3730 *
6805 softime 5169 * Renvoie les valeurs de la bible à placer dans les compléments de l'instruction.
6806 mbroquet 3730 *
6807     * @return void
6808     */
6809     function view_bible_auto() {
6810     // Vérification de l'accessibilité sur l'élément
6811     $this->checkAccessibility();
6812     //
6813 softime 8989 $this->f->disableLog();
6814 mbroquet 3730
6815     $formatDate="AAAA-MM-JJ";
6816    
6817     // Récupération des paramètres
6818 softime 8989 $idx = $this->f->get_submitted_get_value('idx');
6819     $evenement = $this->f->get_submitted_get_value('ev');
6820 mbroquet 3730
6821     // Initialisation de la variable de retour
6822     $retour['complement_om_html'] = '';
6823     $retour['complement2_om_html'] = '';
6824     $retour['complement3_om_html'] = '';
6825     $retour['complement4_om_html'] = '';
6826 softime 14064
6827 mbroquet 3730 // Vérification d'une consultation liée à l'événement
6828 softime 14064 $instEvenement = $this->f->get_inst__om_dbform(array(
6829     "obj" => "evenement",
6830     "idx" => $evenement,
6831     ));
6832    
6833 mbroquet 3730 // Si consultation liée, récupération du retour d'avis
6834 softime 14064 if($instEvenement->getVal('consultation') == 'Oui'){
6835 softime 11876 $sql = sprintf(
6836     '(SELECT
6837     date_retour,
6838     avis_consultation.libelle as avis_consultation,
6839     COALESCE(service.libelle, tiers_consulte.libelle) as service
6840     FROM
6841     %1$sconsultation
6842     LEFT JOIN %1$stiers_consulte ON consultation.tiers_consulte = tiers_consulte.tiers_consulte
6843     LEFT JOIN %1$sservice ON consultation.service = service.service
6844     LEFT JOIN %1$savis_consultation ON consultation.avis_consultation = avis_consultation.avis_consultation
6845     WHERE
6846     dossier = \'%2$s\'
6847     AND consultation.visible)',
6848     DB_PREFIXE,
6849     $this->f->db->escapeSimple($idx)
6850     );
6851 softime 8989 $res = $this->f->db->query($sql);
6852     $this->f->isDatabaseError($res);
6853 mbroquet 3730 // Récupération des consultations
6854     while ($row=& $res->fetchRow(DB_FETCHMODE_ASSOC)){
6855     $correct=false;
6856     // date retour
6857     if ($row['date_retour']<>""){
6858     if ($formatDate=="AAAA-MM-JJ"){
6859     $date = explode("-", $row['date_retour']);
6860     // controle de date
6861     if (count($date) == 3 and
6862     checkdate($date[1], $date[2], $date[0])) {
6863     $date_retour_f= $date[2]."/".$date[1]."/".$date[0];
6864     $correct=true;
6865     }else{
6866     $msg= $msg."<br>La date ".$row['date_retour']." n'est pas une date.";
6867     $correct=false;
6868     }
6869     }
6870     }
6871     //
6872     $temp="Vu l'avis ".$row['avis_consultation']." du service ".$row['service'];
6873     if($correct == true){
6874     $temp=$temp." du ".$date_retour_f;
6875     }
6876     // Concaténation des retours d'avis de consultation
6877 softime 7067 $retour['complement_om_html'] .= $temp . "<br/><br/>";
6878 mbroquet 3730 } // while
6879    
6880     } // consultation
6881     // Récupération des bibles automatiques pour le champ complement_om_html
6882 softime 8989 $retour['complement_om_html'] .= $this->getBible($evenement, $idx, '1');
6883 mbroquet 3730 // Récupération des bibles automatiques pour le champ complement2_om_html
6884 softime 8989 $retour['complement2_om_html'] .= $this->getBible($evenement, $idx, '2');
6885 mbroquet 3730 // Récupération des bibles automatiques pour le champ complement3_om_html
6886 softime 8989 $retour['complement3_om_html'] .= $this->getBible($evenement, $idx, '3');
6887 mbroquet 3730 // Récupération des bibles automatiques pour le champ complement4_om_html
6888 softime 8989 $retour['complement4_om_html'] .= $this->getBible($evenement, $idx, '4');
6889 mbroquet 3730
6890    
6891    
6892     echo json_encode($retour);
6893     }
6894    
6895     /**
6896 softime 7521 * VIEW - view_pdf_temp
6897     *
6898     * @return void
6899     */
6900     function view_pdf_temp() {
6901     $this->checkAccessibility();
6902 softime 8593 // Utilisation de $_POST pour ne pas que les textes soient altérés.
6903 softime 7521 $this->f->set_submitted_value();
6904 softime 8593 $merge_fields = array();
6905     //
6906     if (array_key_exists('c1', $_POST) === true) {
6907 softime 11876 $merge_fields['[complement_instruction]'] = $_POST['c1'];
6908     $merge_fields['[complement1_instruction]'] = $_POST['c1'];
6909 softime 8593 }
6910     if (array_key_exists('c2', $_POST) === true) {
6911 softime 11876 $merge_fields['[complement2_instruction]'] = $_POST['c2'];
6912 softime 8593 }
6913     if (array_key_exists('c3', $_POST) === true) {
6914 softime 11876 $merge_fields['[complement3_instruction]'] = $_POST['c3'];
6915 softime 8593 }
6916     if (array_key_exists('c4', $_POST) === true) {
6917 softime 11876 $merge_fields['[complement4_instruction]'] = $_POST['c4'];
6918 softime 8593 }
6919 softime 7521 $params = array(
6920     "watermark" => true,
6921     "specific" => array(
6922     "merge_fields" => $merge_fields,
6923     ),
6924     );
6925 softime 8593 //
6926     if (array_key_exists('corps', $_POST) === true) {
6927     $params["specific"]["corps"] = array(
6928     "mode" => "set",
6929 softime 11876 "value" => $_POST['corps'],
6930 softime 8593 );
6931     }
6932     if (array_key_exists('titre', $_POST) === true) {
6933     $params["specific"]["titre"] = array(
6934     "mode" => "set",
6935 softime 11876 "value" => $_POST['titre'],
6936 softime 8593 );
6937     }
6938 softime 7521 $dossier_instruction_om_collectivite = $this->get_dossier_instruction_om_collectivite();
6939     $collectivite = $this->f->getCollectivite($dossier_instruction_om_collectivite);
6940     $result = $this->compute_pdf_output('lettretype', $this->getVal('lettretype'), $collectivite, null, $params);
6941     $retour = array(
6942     'base' => base64_encode($result['pdf_output']),
6943     );
6944     echo json_encode($retour);
6945     }
6946    
6947     /**
6948     * Dans le contexte de prévisualisation des éditions, génère le rendu du
6949     * PDF sans prise en compte de la valeur des compléments et le retourne en
6950     * base 64.
6951     *
6952     * @return string Rendu PDF converti en base 64.
6953     */
6954     function init_pdf_temp() {
6955     $params = array(
6956     "watermark" => true,
6957     );
6958 softime 8593 // Si la rédaction libre est activée sur l'instruction
6959     if ($this->getVal("flag_edition_integrale") == 't') {
6960     $params["specific"]["corps"] = array(
6961     "mode" => "set",
6962     "value" => $this->getVal("corps_om_htmletatex"),
6963     );
6964     $params["specific"]["titre"] = array(
6965     "mode" => "set",
6966     "value" => $this->getVal("titre_om_htmletat"),
6967     );
6968     }
6969 softime 7521 $dossier_instruction_om_collectivite = $this->get_dossier_instruction_om_collectivite();
6970     $collectivite = $this->f->getCollectivite($dossier_instruction_om_collectivite);
6971     $result = $this->compute_pdf_output('lettretype', $this->getVal('lettretype'), $collectivite, null, $params);
6972    
6973     return base64_encode($result['pdf_output']);
6974     }
6975    
6976     /**
6977 mbroquet 3730 * Récupération des éléments de bible.
6978     *
6979     * @param integer $event id de l'événement
6980     * @param string $idx id du dossier
6981     * @param integer $compnb numéro du champ complement
6982     *
6983     * @return string Chaîne de texte à insérer dans le champ complement
6984     */
6985 softime 8989 function getBible($event, $idx, $compnb) {
6986 mbroquet 3730 // Récupération de la collectivité du dossier
6987 softime 7996 $dossier = $this->f->get_inst__om_dbform(array(
6988     "obj" => "dossier",
6989     "idx" => $idx,
6990     ));
6991 softime 5169 // Récupération du code du type de DA
6992     $code_da_type = '';
6993     if (preg_match('/[A-Za-z]{2,3}/', $idx, $matches) !== false) {
6994     $code_da_type = $matches[0];
6995     }
6996 mbroquet 3730 //
6997     $sql = "SELECT * FROM ".DB_PREFIXE."bible
6998     LEFT OUTER JOIN ".DB_PREFIXE."dossier_autorisation_type
6999     ON bible.dossier_autorisation_type=
7000     dossier_autorisation_type.dossier_autorisation_type
7001     LEFT JOIN
7002     ".DB_PREFIXE."om_collectivite
7003     ON bible.om_collectivite = om_collectivite.om_collectivite
7004 softime 7366 WHERE (evenement =".$event." or evenement IS NULL) and
7005 softime 8989 (complement=".$compnb." OR complement IS NULL) and
7006 mbroquet 3730 automatique='Oui' and
7007 softime 5169 (dossier_autorisation_type.code ='".$code_da_type."' or
7008 mbroquet 3730 bible.dossier_autorisation_type IS NULL) and
7009     (om_collectivite.niveau = '2' OR bible.om_collectivite = ".$dossier->getVal("om_collectivite").")";
7010    
7011 softime 8989 $res = $this->f->db->query($sql);
7012     $this->f->isDatabaseError($res);
7013 mbroquet 3730 $temp = "";
7014     while ($row=& $res->fetchRow(DB_FETCHMODE_ASSOC)){
7015     // Remplacement des retours à la ligne par des br
7016     $temp .= preg_replace(
7017     '#(\\\r|\\\r\\\n|\\\n)#', '<br/>', $row['contenu']
7018     );
7019 softime 7521 // Ajout d'un saut de ligne entre chaque bible.
7020     $temp .= '<br/>';
7021 mbroquet 3730 } // fin while
7022     return $temp;
7023     }
7024    
7025     /**
7026     * VIEW - view_suivi_bordereaux.
7027     *
7028 nmeucci 4317 * Formulaire de choix du bordereau de suivi, permettant de générer les 4 bordereaux.
7029     * Si l'utilisateur est d'une collectivité de niveau 2 il a le choix de la
7030     * collectivité des dossiers affichés.
7031 mbroquet 3730 *
7032     * @return void
7033     */
7034     function view_suivi_bordereaux() {
7035     // Vérification de l'accessibilité sur l'élément
7036     $this->checkAccessibility();
7037    
7038     /**
7039     * Validation du formulaire
7040     */
7041     // Si le formulaire a été validé
7042 softime 8989 if ($this->f->get_submitted_post_value("validation") !== null) {
7043 mbroquet 3730 // Si un bordereau à été sélectionné
7044 softime 8989 if ($this->f->get_submitted_post_value("bordereau") !== null && $this->f->get_submitted_post_value("bordereau") == "" ) {
7045 mbroquet 3730 // Si aucun bordereau n'a été sélectionné
7046     $message_class = "error";
7047     $message = _("Veuillez selectionner un bordereau.");
7048     }
7049     // Sinon si les dates ne sont pas valide
7050 softime 8989 elseif (($this->f->get_submitted_post_value("date_bordereau_debut") !== null
7051     && $this->f->get_submitted_post_value("date_bordereau_debut") == "")
7052     || ($this->f->get_submitted_post_value("date_bordereau_fin") !== null
7053     && $this->f->get_submitted_post_value("date_bordereau_fin") == "")) {
7054 mbroquet 3730 // Si aucune date n'a été saisie
7055     $message_class = "error";
7056     $message = _("Veuillez saisir une date valide.");
7057     }
7058 softime 7366 // Sinon si les dates ne sont pas valides
7059 softime 8989 elseif ($this->f->get_submitted_post_value("bordereau") === "bordereau_avis_maire_prefet"
7060     && $this->f->getParameter("id_evenement_bordereau_avis_maire_prefet") == null) {
7061 softime 7366 // Si aucune date n'a été saisie
7062     $message_class = "error";
7063     $message = _("Erreur de parametrage. Contactez votre administrateur.");
7064     }
7065 mbroquet 3730 // Affiche le message de validation
7066     else {
7067     // On récupère le libellé du bordereau pour l'afficher à l'utilisateur
7068 softime 14064 $etat = $this->f->get_inst__om_dbform(array(
7069     "obj" => "om_etat",
7070     "idx" => $this->f->get_submitted_post_value("bordereau")
7071     ));
7072     $qres = $this->f->get_one_result_from_db_query(
7073     sprintf(
7074     'SELECT
7075     om_etat.libelle
7076     FROM
7077     %som_etat
7078     WHERE
7079     om_etat.id = \'%s\'',
7080     DB_PREFIXE,
7081     $this->f->db->escapeSimple($this->f->get_submitted_post_value("bordereau"))
7082     ),
7083     array(
7084     "origin" => __METHOD__,
7085     )
7086     );
7087    
7088 mbroquet 3730 //
7089     $message_class = "valid";
7090     $message = _("Cliquez sur le lien ci-dessous pour telecharger votre bordereau");
7091     $message .= " : <br/><br/>";
7092     $message .= "<a class='om-prev-icon pdf-16'";
7093     $message .= " title=\""._("Bordereau")."\"";
7094 softime 7996 $message .= "href='".OM_ROUTE_FORM."&obj=instruction";
7095 nmeucci 4317 $message .= "&action=220";
7096     $message .= "&idx=0";
7097 softime 8989 $message .= "&type_bordereau=".$this->f->get_submitted_post_value("bordereau");
7098     $message .= "&date_bordereau_debut=".$this->f->get_submitted_post_value("date_bordereau_debut");
7099     $message .= "&date_bordereau_fin=".$this->f->get_submitted_post_value("date_bordereau_fin");
7100 mbroquet 3730 // Si l'utilisateur est MULTI alors on ajoute le paramètre collectivite
7101 softime 8989 if ($this->f->get_submitted_post_value("om_collectivite") !== null) {
7102     $message .= "&collectivite=".$this->f->get_submitted_post_value("om_collectivite");
7103 mbroquet 3730 }
7104     $message .= "'"." target='_blank'>";
7105 softime 14064 $message .= $qres['result']." "._("du")." ".$this->f->get_submitted_post_value("date_bordereau_debut")
7106 softime 8989 ." "._("au")." ".$this->f->get_submitted_post_value("date_bordereau_fin");
7107 mbroquet 3730 $message .= "</a>";
7108     }
7109     }
7110    
7111     /**
7112     * Affichage des messages et du formulaire
7113     */
7114     // Affichage du message de validation ou d'erreur
7115     if (isset($message) && isset($message_class) && $message != "") {
7116 softime 8989 $this->f->displayMessage($message_class, $message);
7117 mbroquet 3730 }
7118     // Ouverture du formulaire
7119     printf("\t<form");
7120     printf(" method=\"post\"");
7121     printf(" id=\"suivi_bordereaux_form\"");
7122     printf(" action=\"\"");
7123     printf(">\n");
7124     // Paramétrage des champs du formulaire
7125     $champs = array("date_bordereau_debut", "date_bordereau_fin", "bordereau");
7126 softime 8989 // Si l'utilisateur est d'une collectivité de niveau 2 on affiche un select
7127 mbroquet 3730 // collectivité dans le formulaire
7128 softime 8989 if ($_SESSION["niveau"] == 2) {
7129 mbroquet 3730 array_push($champs, "om_collectivite");
7130     }
7131     // Création d'un nouvel objet de type formulaire
7132 softime 7996 $form = $this->f->get_inst__om_formulaire(array(
7133     "validation" => 0,
7134     "maj" => 0,
7135     "champs" => $champs,
7136     ));
7137 mbroquet 3730 // Paramétrage du champ date_bordereau_debut
7138     $form->setLib("date_bordereau_debut", _("date_bordereau_debut"));
7139     $form->setType("date_bordereau_debut", "date");
7140     $form->setTaille("date_bordereau_debut", 12);
7141     $form->setMax("date_bordereau_debut", 12);
7142     $form->setRequired("date_bordereau_debut");
7143     $form->setOnchange("date_bordereau_debut", "fdate(this)");
7144     $form->setVal("date_bordereau_debut", date("d/m/Y"));
7145     // Paramétrage du champ date_bordereau_fin
7146     $form->setLib("date_bordereau_fin", _("date_bordereau_fin"));
7147     $form->setType("date_bordereau_fin", "date");
7148     $form->setTaille("date_bordereau_fin", 12);
7149     $form->setMax("date_bordereau_fin", 12);
7150     $form->setRequired("date_bordereau_fin");
7151     $form->setOnchange("date_bordereau_fin", "fdate(this)");
7152     $form->setVal("date_bordereau_fin", date("d/m/Y"));
7153     // Paramétrage du champ bordereau
7154     $form->setLib("bordereau", _("bordereau"));
7155     $form->setType("bordereau", "select");
7156     $form->setRequired("bordereau");
7157     // Valeurs des champs
7158 softime 8989 if ($this->f->get_submitted_post_value("validation") !== null) {
7159     $form->setVal("date_bordereau_debut", $this->f->get_submitted_post_value("date_bordereau_debut"));
7160     $form->setVal("date_bordereau_fin", $this->f->get_submitted_post_value("date_bordereau_fin"));
7161     $form->setVal("bordereau", $this->f->get_submitted_post_value("bordereau"));
7162     $form->setVal("om_collectivite", $this->f->get_submitted_post_value("om_collectivite"));
7163 mbroquet 3730 }
7164     // Données du select - On récupère ici la liste de tous les états disponibles
7165     // dans la table om_etat qui ont un id qui commence par la cahine de caractères
7166     // 'bordereau_'
7167     $sql = "SELECT om_etat.id, om_etat.libelle
7168     FROM ".DB_PREFIXE."om_etat
7169     WHERE om_etat.id LIKE 'bordereau_%'
7170     ORDER BY om_etat.id";
7171 softime 8989 $res = $this->f->db->query($sql);
7172     $this->f->addToLog(__METHOD__.": db->query(\"".$sql."\")", VERBOSE_MODE);
7173     $this->f->isDatabaseError($res);
7174 mbroquet 3730 // Données du select
7175     $contenu = array(
7176     0 => array("", ),
7177     1 => array(_("choisir bordereau")),
7178     );
7179     while ($row =& $res->fetchRow(DB_FETCHMODE_ASSOC)) {
7180     $contenu[0][] = $row['id'];
7181     $contenu[1][] = $row['libelle'];
7182     }
7183     $form->setSelect("bordereau", $contenu);
7184 softime 8989 //
7185     if ($_SESSION["niveau"] == 2) {
7186     $form->setLib("om_collectivite", _("collectivite"));
7187     $form->setType("om_collectivite", "select");
7188 mbroquet 3730
7189 softime 8989 // Données du select - On récupère ici la liste de tous toutes les collectivités
7190     // de niveau 1
7191     $sql = "SELECT om_collectivite, libelle
7192     FROM ".DB_PREFIXE."om_collectivite
7193     WHERE niveau = '1' ORDER BY libelle";
7194     $res = $this->f->db->query($sql);
7195     $this->f->addToLog(__METHOD__.": db->query(\"".$sql."\")", VERBOSE_MODE);
7196     $this->f->isDatabaseError($res);
7197     // La valeur par défaut du select est Toutes
7198     $list_collectivites = array(
7199     0 => array("", ),
7200     1 => array(_("toutes"))
7201     );
7202 mbroquet 3730
7203 softime 8989 $id_colls = "";
7204     // On stocke dans $id_colls l'id de toutes les collectivités de niveau 1 séparées
7205     // par des virgules, pour un traitement plus facile dans la requête de sous-état
7206     while ($row =& $res->fetchRow(DB_FETCHMODE_ASSOC)) {
7207     if ($id_colls != "") {
7208     $id_colls .= ",";
7209     }
7210     $id_colls .= $row['om_collectivite'];
7211     $list_collectivites[0][] = $row['om_collectivite'];
7212     $list_collectivites[1][] = $row['libelle'];
7213 mbroquet 3730 }
7214 softime 8989 // On affecte la liste d'identifiants à l'option Toutes
7215     $list_collectivites[0][0] = $id_colls ;
7216     $form->setSelect("om_collectivite", $list_collectivites);
7217 mbroquet 3730 }
7218     // Affichage du formulaire
7219     $form->entete();
7220     $form->afficher($champs, 0, false, false);
7221     $form->enpied();
7222     // Affichage du bouton
7223     printf("\t<div class=\"formControls\">\n");
7224 softime 8989 $this->f->layout->display_form_button(array("value" => _("Valider"), "name" => "validation"));
7225 mbroquet 3730 printf("\t</div>\n");
7226     // Fermeture du formulaire
7227     printf("\t</form>\n");
7228     }
7229    
7230 nmeucci 4317
7231     /**
7232     * VIEW - view_generate_suivi_bordereaux.
7233     *
7234     * Génère et affiche les bordereaux de suivi.
7235     *
7236     * @return [void]
7237     */
7238     function view_generate_suivi_bordereaux() {
7239     // Vérification de l'accessibilité sur l'élément
7240     $this->checkAccessibility();
7241     // Récupération du type de bordereau
7242     $bordereau = $this->f->get_submitted_get_value('type_bordereau');
7243     // Génération du PDF
7244     $result = $this->compute_pdf_output('etat', $bordereau, null, $this->getVal($this->clePrimaire));
7245     // Affichage du PDF
7246     $this->expose_pdf_output(
7247     $result['pdf_output'],
7248     $result['filename']
7249     );
7250     }
7251    
7252    
7253 mbroquet 3730 /**
7254     * VIEW - view_suivi_envoi_lettre_rar.
7255     *
7256 softime 8989 * Vue pour imprimer les AR.
7257 mbroquet 3730 *
7258     * @return void
7259     */
7260     function view_suivi_envoi_lettre_rar() {
7261     // Vérification de l'accessibilité sur l'élément
7262     $this->checkAccessibility();
7263    
7264     //
7265 softime 8989 if ($this->f->get_submitted_post_value("date") !== null) {
7266     $date = $this->f->get_submitted_post_value("date");
7267 mbroquet 3730 } else {
7268     $date = "";
7269     }
7270     //
7271 softime 8989 if ($this->f->get_submitted_post_value("liste_code_barres_instruction") !== null) {
7272     $liste_code_barres_instruction = $this->f->get_submitted_post_value("liste_code_barres_instruction");
7273 mbroquet 3730 } else {
7274     $liste_code_barres_instruction = "";
7275     }
7276    
7277     // Compteur du nombre de page générées
7278     $nbLettres = 0;
7279     // Liste d'id des instructions
7280     $id4Gen = array();
7281     //
7282     $error = "";
7283    
7284 softime 5504 // Initialisation du tableau qui va contenir les DI pour lister les liens
7285     $dossierTab = array();
7286     // On vérifie que l'utilisateur ait les droits pour afficher des consultations
7287     $isAccredited = $this->f->isAccredited(array("dossier_instruction","dossier_instruction_consulter"), "OR");
7288     $hasHidden = true;
7289     // S'il ne peut pas les consulter il aura des dossiers caché
7290     if ($isAccredited === true) {
7291     $hasHidden = false;
7292     }
7293    
7294 mbroquet 3730 /**
7295     * Validation du formulaire
7296     */
7297     // Si le formulaire a été validé
7298 softime 8989 if ($this->f->get_submitted_post_value('validation') !== null) {
7299 mbroquet 3730 //
7300     if (empty($date) || empty($liste_code_barres_instruction)) {
7301     //
7302     $message_class = "error";
7303     $message = _("Tous les champs doivent etre remplis.");
7304     } else {
7305     // Création d'un tableau d'instruction
7306 softime 8989 $liste = explode("\r\n", $this->f->get_submitted_post_value("liste_code_barres_instruction"));
7307 mbroquet 3730 //
7308     foreach ($liste as $code_barres) {
7309     // On enlève les éventuels espaces saisis
7310     $code_barres = trim($code_barres);
7311     // Vérification de l'existence de l'instruction
7312     if ($code_barres != "") {
7313     // Si la valeur transmise est numérique
7314     if (is_numeric($code_barres)) {
7315     //
7316 softime 6565 $sql = "SELECT count(*)
7317     FROM ".DB_PREFIXE."instruction
7318     INNER JOIN ".DB_PREFIXE."dossier
7319     ON dossier.dossier=instruction.dossier
7320     INNER JOIN ".DB_PREFIXE."dossier_instruction_type
7321     ON dossier.dossier_instruction_type = dossier_instruction_type.dossier_instruction_type
7322     INNER JOIN ".DB_PREFIXE."dossier_autorisation_type_detaille
7323     ON dossier_instruction_type.dossier_autorisation_type_detaille = dossier_autorisation_type_detaille.dossier_autorisation_type_detaille
7324     INNER JOIN ".DB_PREFIXE."dossier_autorisation_type
7325     ON dossier_autorisation_type_detaille.dossier_autorisation_type = dossier_autorisation_type.dossier_autorisation_type
7326     INNER JOIN ".DB_PREFIXE."groupe
7327     ON dossier_autorisation_type.groupe = groupe.groupe
7328     WHERE code_barres='".$this->f->db->escapesimple($code_barres)."'";
7329 softime 7067
7330     // Ajout d'un filtre sur les groupes auxquels l'utilisateur a accès
7331     $group_clause = array();
7332     foreach ($_SESSION["groupe"] as $key => $value) {
7333     $group_clause[$key] = "(groupe.code = '".$key."'";
7334     if($value["confidentiel"] !== true) {
7335     $group_clause[$key] .= " AND dossier_autorisation_type.confidentiel IS NOT TRUE";
7336     }
7337     $group_clause[$key] .= ")";
7338     }
7339     $conditions = implode(" OR ", $group_clause);
7340     $sql .= " AND (" . $conditions . ")";
7341    
7342 softime 14064 $qres = $this->f->get_one_result_from_db_query(
7343     $sql,
7344     array(
7345     "origin" => __METHOD__,
7346     )
7347     );
7348    
7349     if ($qres['result'] == "1") {
7350 mbroquet 3730 // Récupération de la date d'envoi de l'instruction bippé
7351     $sql = "SELECT to_char(date_envoi_rar,'DD/MM/YYYY') as date_envoi_rar, instruction FROM ".DB_PREFIXE."instruction WHERE code_barres='".$code_barres."'";
7352 softime 8989 $res = $this->f->db->query($sql);
7353     $this->f->addToLog(__METHOD__.": db->query(\"".$sql."\")", VERBOSE_MODE);
7354     $this->f->isDatabaseError($res);
7355 mbroquet 3730 $row =& $res->fetchRow(DB_FETCHMODE_ASSOC);
7356     // Si pas de date ou correspond à la date du formulaire on
7357     // effectue le traitement
7358     if ($row["date_envoi_rar"] == "" || $row["date_envoi_rar"] == $date) {
7359 softime 7996 $instr = $this->f->get_inst__om_dbform(array(
7360     "obj" => "instruction",
7361     "idx" => $row['instruction'],
7362     ));
7363 mbroquet 3730 $valF = array();
7364     foreach($instr->champs as $id => $champ) {
7365     $valF[$champ] = $instr->val[$id];
7366     }
7367 softime 5504
7368     # Si on peut consulter les dossiers et que le dossier n'existe pas déjà dans la liste
7369     if ($isAccredited === true
7370     && array_key_exists($instr->getVal("dossier"), $dossierTab) === false) {
7371 softime 7996 $dossier = $this->f->get_inst__om_dbform(array(
7372     "obj" => "dossier",
7373     "idx" => $instr->getVal("dossier"),
7374     ));
7375 softime 5504 if ($dossier->is_user_from_allowed_collectivite()){
7376     $dossierTab[$instr->getVal("dossier")] = $dossier;
7377     } else {
7378     $hasHidden = true;
7379     }
7380     }
7381    
7382 mbroquet 3730 $valF['date_evenement']=
7383     $instr->dateDBToForm($valF['date_evenement']);
7384     $valF['archive_date_complet']=
7385     $instr->dateDBToForm($valF['archive_date_complet']);
7386     $valF['archive_date_rejet']=
7387     $instr->dateDBToForm($valF['archive_date_rejet']);
7388     $valF['archive_date_limite']=
7389     $instr->dateDBToForm($valF['archive_date_limite']);
7390     $valF['archive_date_notification_delai']=
7391     $instr->dateDBToForm($valF['archive_date_notification_delai']);
7392     $valF['archive_date_decision']=
7393     $instr->dateDBToForm($valF['archive_date_decision']);
7394     $valF['archive_date_validite']=
7395     $instr->dateDBToForm($valF['archive_date_validite']);
7396     $valF['archive_date_achevement']=
7397     $instr->dateDBToForm($valF['archive_date_achevement']);
7398     $valF['archive_date_chantier']=
7399     $instr->dateDBToForm($valF['archive_date_chantier']);
7400     $valF['archive_date_conformite']=
7401     $instr->dateDBToForm($valF['archive_date_conformite']);
7402     $valF['archive_date_dernier_depot']=
7403     $instr->dateDBToForm($valF['archive_date_dernier_depot']);
7404     $valF['archive_date_limite_incompletude']=
7405     $instr->dateDBToForm($valF['archive_date_limite_incompletude']);
7406     $valF['date_finalisation_courrier']=
7407     $instr->dateDBToForm($valF['date_finalisation_courrier']);
7408     $valF['date_envoi_signature']=
7409     $instr->dateDBToForm($valF['date_envoi_signature']);
7410     $valF['date_retour_signature']=
7411     $instr->dateDBToForm($valF['date_retour_signature']);
7412     $valF['date_envoi_rar']=
7413     $instr->dateDBToForm($valF['date_envoi_rar']);
7414     $valF['date_retour_rar']=
7415     $instr->dateDBToForm($valF['date_retour_rar']);
7416     $valF['date_envoi_controle_legalite']=
7417     $instr->dateDBToForm($valF['date_envoi_controle_legalite']);
7418     $valF['date_retour_controle_legalite']=
7419     $instr->dateDBToForm($valF['date_retour_controle_legalite']);
7420     $valF['date_envoi_rar'] = $date;
7421    
7422     // Vérification de la finalisation du document
7423     // correspondant au code barres
7424     if($instr->getVal("om_final_instruction") === 't') {
7425     $instr->setParameter('maj', 1);
7426 nmeucci 3971 $instr->class_actions[1]["identifier"] =
7427     "envoi lettre RAR (depuis le menu suivi des pièces)";
7428 softime 8989 if ($instr->modifier($valF) == true) {
7429 mbroquet 3730 $id4Gen[] = $code_barres;
7430     $nbLettres ++;
7431     } else {
7432     //
7433     if ($error != "") {
7434     $error .= "<br/>";
7435     }
7436     $error .= sprintf(_("Une erreur s'est produite lors de la modification de l'instruction %s."),
7437     $code_barres);
7438     $error .= " ";
7439     $error .= _("Veuillez contacter votre administrateur.");
7440     }
7441     } else {
7442     //
7443     if ($error != "") {
7444     $error .= "<br/>";
7445     }
7446     $error .= sprintf(_("Le document correspondant au
7447     code barres %s n'est pas finalise,
7448     le bordereau ne sera pas genere."),
7449     $code_barres);
7450     }
7451    
7452     } else {
7453     //
7454     if ($error != "") {
7455     $error .= "<br/>";
7456     }
7457     $error .= _("Une lettre correspondante a l'instruction ayant pour code barres")." ".$code_barres." "._("a deja ete envoyee, le bordereau ne sera pas genere.");
7458     }
7459     } else {
7460     //
7461     if ($error != "") {
7462     $error .= "<br/>";
7463     }
7464     $error .= _("Le numero")." ".$code_barres." "._("ne correspond a aucun code barres d'instruction.");
7465     }
7466     } else {
7467     //
7468     if ($error != "") {
7469     $error .= "<br/>";
7470     }
7471     $error .= _("Le code barres d'instruction")." ".$code_barres." "._("n'est pas valide.");
7472     }
7473     }
7474     }
7475     }
7476     }
7477    
7478     /**
7479     * Affichage des messages et du formulaire
7480     */
7481     // Affichage du message de validation ou d'erreur
7482     if (isset($message) && isset($message_class) && $message != "") {
7483 softime 8989 $this->f->displayMessage($message_class, $message);
7484 mbroquet 3730 }
7485     // Affichage du message d'erreur
7486     if(!empty($error)) {
7487 softime 8989 $this->f->displayMessage("error", $error);
7488 mbroquet 3730 }
7489     // Affichage du message de validation de la saisie
7490     if ($nbLettres > 0) {
7491     //
7492 softime 5504 echo "\n<div class=\"message ui-widget ui-corner-all ui-state-highlight ui-state-valid\" >";
7493     echo "\n<p>";
7494     echo "\n<span class=\"ui-icon ui-icon-info\"></span>";
7495     echo "\n<span class=\"text\">";
7496     echo _("Cliquez sur le lien ci-dessous pour telecharger votre document");
7497     echo " : \n<br/><br/>";
7498     echo "\n<a class='om-prev-icon pdf-16'";
7499 softime 8989 echo "\n title=\""._("imprimer les AR")."\"";
7500 softime 7996 echo "\n href=\"".OM_ROUTE_FORM."&obj=instruction&action=180&idx=0&liste=".implode(",",$id4Gen)."\"";
7501 softime 5504 echo "\n target='_blank'>";
7502 softime 8989 echo _("Telecharger le document pour")." ".$nbLettres." "._("AR");
7503 softime 5504 echo "\n</a>";
7504     echo "\n</span>";
7505     echo "\n</p>";
7506     echo "\n<br/>\n";
7507     if ($isAccredited === true) {
7508     echo '<fieldset id="fieldset-form-rar-lien_di" class="cadre ui-corner-all startClosed" style="background-color: inherite;">';
7509     echo "\n<legend class=\"ui-corner-all ui-widget-content ui-state-active\" style=\"background-color: transparent; color: inherit;\">\n";
7510     echo _('Dossiers concernés par ce traitement');
7511     echo "\n</legend>";
7512     echo "\n<div class=\"fieldsetContent\" style=\"display: none;background-color: inherite\">";
7513    
7514     if ($hasHidden === true) {
7515     echo "\n<br/>";
7516     echo "\n<p>";
7517     echo "\n<span class='text'>";
7518     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.");
7519     echo "</span>";
7520     echo "\n</p>";
7521     echo "\n<br/>";
7522     }
7523     foreach ($dossierTab as $dossier) {
7524 softime 7067
7525     $inst_da = $this->get_inst_common("dossier_autorisation", $dossier->getVal('dossier_autorisation'));
7526     $inst_datd = $this->get_inst_common("dossier_autorisation_type_detaille", $inst_da->getVal('dossier_autorisation_type_detaille'));
7527     $code_datd = $inst_datd->getVal('code');
7528    
7529     $obj = "dossier_instruction";
7530     if ($code_datd === 'REC' OR $code_datd === 'REG') {
7531     $obj = "dossier_contentieux_tous_recours";
7532     }
7533     if ($code_datd === 'IN') {
7534     $obj = "dossier_contentieux_toutes_infractions";
7535     }
7536    
7537 softime 5504 echo "\n<div class=\"bloc group\">";
7538     echo "\n<div class=\"field field-type-text\">";
7539    
7540     echo "\n<p>";
7541     echo "\n<span class='text'>";
7542     echo "\n<a class=\"om-icon om-icon-16 consult-16\" title=\"" . _('Consulter') . "\"";
7543 softime 7996 echo "\n href=\"".OM_ROUTE_FORM."&obj=dossier_instruction&action=3&idx=";
7544 softime 5504 echo $dossier->getVal("dossier");
7545     echo "\">";
7546     echo "\n</a>";
7547    
7548     echo "\n<a title=\""._("Consulter")."\" style=\"vertical-align:middle;\"";
7549 softime 7996 echo " href=\"".OM_ROUTE_FORM."&obj=";
7550 softime 7067 echo $obj;
7551     echo "&action=3&idx=";
7552 softime 5504 echo $dossier->getVal("dossier");
7553     echo "\">";
7554     echo $dossier->getVal("dossier_libelle");
7555     echo "\n</a>";
7556     echo "\n</span>";
7557     echo "\n</p>";
7558    
7559     echo "\n</div>";
7560     echo "\n</div>";
7561     }
7562     echo "\n</div>";
7563     echo "\n</fieldset>";
7564     }
7565     echo "\n</div>";
7566     echo "\n</div>";
7567 mbroquet 3730 }
7568     // Ouverture du formulaire
7569     echo "\t<form";
7570     echo " method=\"post\"";
7571     echo " id=\"suivi_envoi_lettre_rar_form\"";
7572     echo " action=\"\"";
7573     echo ">\n";
7574     // Paramétrage des champs du formulaire
7575     $champs = array("date", "liste_code_barres_instruction");
7576     // Création d'un nouvel objet de type formulaire
7577 softime 7996 $form = $this->f->get_inst__om_formulaire(array(
7578     "validation" => 0,
7579     "maj" => 0,
7580     "champs" => $champs,
7581     ));
7582 mbroquet 3730 // Paramétrage du champ date du formulaire
7583     $form->setLib("date", _("Date")."* :");
7584     $form->setType("date", "date");
7585     $form->setOnchange("date", "fdate(this)");
7586     $form->setVal("date", ($date == "" ? date("d/m/Y") : $date));
7587     $form->setTaille("date", 10);
7588     $form->setMax("date", 10);
7589     // Paramétrage du champ liste_code_barres_instruction du formulaire
7590     $form->setLib("liste_code_barres_instruction", _("Liste des codes barres d'instructions scannes")."* :");
7591     $form->setType("liste_code_barres_instruction", "textarea");
7592     $form->setVal("liste_code_barres_instruction", $liste_code_barres_instruction);
7593     $form->setTaille("liste_code_barres_instruction", 20);
7594     $form->setMax("liste_code_barres_instruction", 20);
7595     // Affichage du formulaire
7596     $form->entete();
7597     $form->afficher($champs, 0, false, false);
7598     $form->enpied();
7599     // Affichage du bouton
7600     echo "\t<div class=\"formControls\">\n";
7601 softime 8989 $this->f->layout->display_form_button(array("value" => _("Valider"), "name" => "validation"));
7602 mbroquet 3730 echo "\t</div>\n";
7603     // Fermeture du formulaire
7604     echo "\t</form>\n";
7605     }
7606    
7607     /**
7608     * VIEW - view_suivi_mise_a_jour_des_dates.
7609     *
7610     * Vu pour mettre à jour les dates de suivi de l'instruction.
7611     *
7612     * @return void
7613     */
7614     function view_suivi_mise_a_jour_des_dates() {
7615     // Vérification de l'accessibilité sur l'élément
7616     $this->checkAccessibility();
7617    
7618     // Récupération des valeur passées en POST ou GET
7619 softime 8989 if($this->f->get_submitted_post_value("type_mise_a_jour") !== null) {
7620     $type_mise_a_jour = $this->f->get_submitted_post_value("type_mise_a_jour");
7621     } elseif($this->f->get_submitted_get_value('type_mise_a_jour') !== null) {
7622     $type_mise_a_jour = $this->f->get_submitted_get_value('type_mise_a_jour');
7623 mbroquet 3730 } else {
7624     $type_mise_a_jour = "";
7625     }
7626 softime 8989 if($this->f->get_submitted_post_value('date') !== null) {
7627     $date = $this->f->get_submitted_post_value('date');
7628     } elseif($this->f->get_submitted_get_value('date') !== null) {
7629     $date = $this->f->get_submitted_get_value('date');
7630 mbroquet 3730 } else {
7631     $date = "";
7632     }
7633 softime 8989 if($this->f->get_submitted_post_value('code_barres') !== null) {
7634     $code_barres = $this->f->get_submitted_post_value('code_barres');
7635     } elseif($this->f->get_submitted_get_value('code_barres') !== null) {
7636     $code_barres = $this->f->get_submitted_get_value('code_barres');
7637 mbroquet 3730 } else {
7638     $code_barres = "";
7639     }
7640     // Booléen permettant de définir si un enregistrement à eu lieu
7641     $correct = false;
7642     // Booléen permettant de définir si les dates peuvent êtres enregistrées
7643     $date_error = false;
7644     // Champs date à mettre à jour
7645     $liste_champs=array();
7646    
7647     // Si le formulaire a été validé
7648 softime 8989 if ($this->f->get_submitted_post_value('validation') !== null) {
7649 mbroquet 3730 if(!empty($type_mise_a_jour) and !empty($date) and !empty($code_barres)) {
7650    
7651 softime 6565 // Vérification de l'existence de l'instruction
7652     $sql = "SELECT instruction
7653     FROM ".DB_PREFIXE."instruction
7654     INNER JOIN ".DB_PREFIXE."dossier
7655     ON dossier.dossier=instruction.dossier
7656     INNER JOIN ".DB_PREFIXE."dossier_instruction_type
7657     ON dossier.dossier_instruction_type = dossier_instruction_type.dossier_instruction_type
7658     INNER JOIN ".DB_PREFIXE."dossier_autorisation_type_detaille
7659     ON dossier_instruction_type.dossier_autorisation_type_detaille = dossier_autorisation_type_detaille.dossier_autorisation_type_detaille
7660     INNER JOIN ".DB_PREFIXE."dossier_autorisation_type
7661     ON dossier_autorisation_type_detaille.dossier_autorisation_type = dossier_autorisation_type.dossier_autorisation_type
7662     INNER JOIN ".DB_PREFIXE."groupe
7663     ON dossier_autorisation_type.groupe = groupe.groupe
7664     WHERE code_barres='".$this->f->db->escapesimple($code_barres)."'";
7665 softime 7067
7666     // Ajout d'un filtre sur les groupes auxquels l'utilisateur a accès
7667     $group_clause = array();
7668     foreach ($_SESSION["groupe"] as $key => $value) {
7669     $group_clause[$key] = "(groupe.code = '".$key."'";
7670     if($value["confidentiel"] !== true) {
7671     $group_clause[$key] .= " AND dossier_autorisation_type.confidentiel IS NOT TRUE";
7672     }
7673     $group_clause[$key] .= ")";
7674     }
7675     $conditions = implode(" OR ", $group_clause);
7676     $sql .= " AND (" . $conditions . ")";
7677    
7678    
7679 softime 8989 $res = $this->f->db->query($sql);
7680     $this->f->addToLog(__METHOD__.": db->query(\"".$sql."\")", VERBOSE_MODE);
7681     $this->f->isDatabaseError($res);
7682 mbroquet 3730
7683     if($res->numrows() == 1) {
7684     $liste_champs = explode(";", $type_mise_a_jour);
7685 softime 11418 $row =& $res->fetchRow(DB_FETCHMODE_ASSOC);
7686     $instr = $this->f->get_inst__om_dbform(array(
7687     "obj" => "instruction",
7688     "idx" => $row['instruction'],
7689     ));
7690 mbroquet 3730 // Mise à jour des dates après l'écran de verification
7691 softime 8989 if($this->f->get_submitted_post_value('is_valid') !== null and $this->f->get_submitted_post_value('is_valid') == "true") {
7692 mbroquet 3730 $valF = array();
7693     foreach($instr->champs as $id => $champ) {
7694     $valF[$champ] = $instr->val[$id];
7695     }
7696 softime 6565 $valF['date_evenement'] = $instr->dateDBToForm($valF['date_evenement']);
7697     $valF['archive_date_complet'] = $instr->dateDBToForm($valF['archive_date_complet']);
7698     $valF['archive_date_rejet'] = $instr->dateDBToForm($valF['archive_date_rejet']);
7699     $valF['archive_date_limite'] = $instr->dateDBToForm($valF['archive_date_limite']);
7700     $valF['archive_date_notification_delai'] = $instr->dateDBToForm($valF['archive_date_notification_delai']);
7701     $valF['archive_date_decision'] = $instr->dateDBToForm($valF['archive_date_decision']);
7702     $valF['archive_date_validite'] = $instr->dateDBToForm($valF['archive_date_validite']);
7703     $valF['archive_date_achevement'] = $instr->dateDBToForm($valF['archive_date_achevement']);
7704     $valF['archive_date_chantier'] = $instr->dateDBToForm($valF['archive_date_chantier']);
7705     $valF['archive_date_conformite'] = $instr->dateDBToForm($valF['archive_date_conformite']);
7706     $valF['archive_date_dernier_depot'] = $instr->dateDBToForm($valF['archive_date_dernier_depot']);
7707     $valF['archive_date_limite_incompletude'] = $instr->dateDBToForm($valF['archive_date_limite_incompletude']);
7708     $valF['date_finalisation_courrier'] = $instr->dateDBToForm($valF['date_finalisation_courrier']);
7709     $valF['date_envoi_signature'] = $instr->dateDBToForm($valF['date_envoi_signature']);
7710     $valF['date_retour_signature'] = $instr->dateDBToForm($valF['date_retour_signature']);
7711     $valF['date_envoi_rar'] = $instr->dateDBToForm($valF['date_envoi_rar']);
7712     $valF['date_retour_rar'] = $instr->dateDBToForm($valF['date_retour_rar']);
7713     $valF['date_envoi_controle_legalite'] = $instr->dateDBToForm($valF['date_envoi_controle_legalite']);
7714     $valF['date_retour_controle_legalite'] = $instr->dateDBToForm($valF['date_retour_controle_legalite']);
7715     $valF['archive_date_cloture_instruction'] = $instr->dateDBToForm($valF['archive_date_cloture_instruction']);
7716     $valF['archive_date_premiere_visite'] = $instr->dateDBToForm($valF['archive_date_premiere_visite']);
7717     $valF['archive_date_derniere_visite'] = $instr->dateDBToForm($valF['archive_date_derniere_visite']);
7718     $valF['archive_date_contradictoire'] = $instr->dateDBToForm($valF['archive_date_contradictoire']);
7719     $valF['archive_date_retour_contradictoire'] = $instr->dateDBToForm($valF['archive_date_retour_contradictoire']);
7720     $valF['archive_date_ait'] = $instr->dateDBToForm($valF['archive_date_ait']);
7721     $valF['archive_date_transmission_parquet'] = $instr->dateDBToForm($valF['archive_date_transmission_parquet']);
7722 mbroquet 3730
7723     foreach(explode(";", $type_mise_a_jour) as $maj_date) {
7724     $valF[$maj_date]=$date;
7725     }
7726    
7727     // Vérification de la finalisation du document
7728     // correspondant au code barres
7729     if($valF["om_final_instruction"] === 't' or
7730     $valF["lettretype"] == '') {
7731     $code_barres = "";
7732    
7733     //Désactivation de l'autocommit
7734 softime 8989 $this->f->db->autoCommit(false);
7735 mbroquet 3730
7736     //On modifie les valeurs de l'instruction
7737     $instr->setParameter('maj', 170);
7738 nmeucci 3965 $instr->class_actions[170]["identifier"] =
7739 nmeucci 3972 "mise à jour des dates (depuis le menu suivi des pièces)";
7740 softime 8989 $retour = $instr->modifier($valF);
7741 mbroquet 3730
7742     //Si une erreur s'est produite, on défait les modifications
7743     //qui ont été faites
7744     if (!$retour){
7745     $instr->undoValidation();
7746     }
7747     //Sinon, on valide en base de données les modifications
7748     else {
7749 softime 8989 $this->f->db->commit();
7750 mbroquet 3730 }
7751    
7752     // Variable correct retourné depuis la classe instruction
7753     $correct = $instr->correct;
7754    
7755     // Si la modification sur l'instruction a échoué
7756     if ($correct === false) {
7757    
7758     // Message d'erreur de la classe instruction
7759     $error = $instr->msg;
7760     }
7761    
7762     } else {
7763     // Indique que le traitement est en erreur
7764     $correct = false;
7765     // Message d'erreur
7766     $error = sprintf(_("Le document n'est pas finalise."),
7767     "<span class='bold'>".$code_barres."</span>");
7768     }
7769     } else {
7770     // Récupération des infos du dossier
7771     $sqlInfo = "SELECT dossier.dossier_libelle,
7772     evenement.libelle as evenement,
7773     autorite_competente.code as autorite_competente_code,
7774     autorite_competente.libelle as autorite_competente,
7775     evenement.type as evenement_type,
7776     to_char(date_envoi_signature,'DD/MM/YYYY') as date_envoi_signature,
7777     to_char(date_retour_signature,'DD/MM/YYYY') as date_retour_signature,
7778     to_char(date_envoi_controle_legalite,'DD/MM/YYYY') as date_envoi_controle_legalite,
7779     to_char(date_retour_controle_legalite,'DD/MM/YYYY') as date_retour_controle_legalite,
7780     to_char(date_envoi_rar,'DD/MM/YYYY') as date_envoi_rar,
7781     to_char(date_retour_rar,'DD/MM/YYYY') as date_retour_rar
7782     FROM ".DB_PREFIXE."instruction
7783     INNER JOIN ".DB_PREFIXE."dossier ON
7784     dossier.dossier=instruction.dossier
7785     LEFT JOIN ".DB_PREFIXE."autorite_competente ON
7786     dossier.autorite_competente=autorite_competente.autorite_competente
7787     INNER JOIN ".DB_PREFIXE."evenement ON
7788     instruction.evenement=evenement.evenement
7789     WHERE code_barres='".$code_barres."'";
7790 softime 8989 $resInfo = $this->f->db->query($sqlInfo);
7791     $this->f->isDatabaseError($resInfo);
7792 mbroquet 3730 $infos = $resInfo->fetchRow(DB_FETCHMODE_ASSOC);
7793    
7794     // Vérification de la non modification des dates de suivi
7795     foreach(explode(";", $type_mise_a_jour) as $champ) {
7796 softime 11418 if ($champ === 'date_envoi_controle_legalite') {
7797     if ($instr->is_sent_to_cl() === true) {
7798     $error = __("Les dates de suivis ne peuvent etre modifiees");
7799     $date_error = true;
7800     break;
7801     }
7802     }
7803 mbroquet 3730 if($infos[$champ] != "" AND $infos[$champ] != $date) {
7804     $error = _("Les dates de suivis ne peuvent etre modifiees");
7805     $date_error = true;
7806 softime 11418 break;
7807 mbroquet 3730 }
7808     }
7809     }
7810     } else {
7811     $error = _("Le numero saisi ne correspond a aucun code barres d'instruction.");
7812     }
7813    
7814     } else {
7815     $error = _("Tous les champs doivent etre remplis.");
7816     }
7817     }
7818    
7819     /**
7820     * Affichage des messages et du formulaire
7821     */
7822     // Affichage du message de validation ou d'erreur
7823     if (isset($message) && isset($message_class) && $message != "") {
7824 softime 8989 $this->f->displayMessage($message_class, $message);
7825 mbroquet 3730 }
7826     // Affichage du message d'erreur
7827     if(!empty($error)) {
7828 softime 8989 $this->f->displayMessage("error", $error);
7829 mbroquet 3730 }
7830    
7831     // Affichage du message de validation de la saisie
7832     if($correct === true) {
7833 softime 8989 $this->f->displayMessage("ok", _("Saisie enregistree"));
7834 mbroquet 3730 }
7835     // Ouverture du formulaire
7836     echo "\t<form";
7837     echo " method=\"post\"";
7838     echo " id=\"suivi_mise_a_jour_des_dates_form\"";
7839     echo " action=\"\"";
7840     echo ">\n";
7841     // Paramétrage des champs du formulaire
7842     if(isset($infos)) {
7843     $champs = array("type_mise_a_jour", "date", "code_barres", "dossier_libelle", "evenement"
7844     , "autorite_competente", "date_envoi_signature",
7845     "date_retour_signature", "date_envoi_controle_legalite",
7846     "date_retour_controle_legalite", "date_envoi_rar",
7847     "date_retour_rar", "is_valid");
7848     } else {
7849     $champs = array("type_mise_a_jour", "date", "code_barres");
7850     }
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 des champs du formulaire
7858     // Parametrage du champ type_mise_a_jour
7859     $form->setLib("type_mise_a_jour", _("Date a mettre a jour")."* :");
7860     if(isset($infos)) {
7861     $form->setType("type_mise_a_jour", "selecthiddenstatic");
7862    
7863     } else {
7864     $form->setType("type_mise_a_jour", "select");
7865    
7866     }
7867     $form->setVal("type_mise_a_jour", $type_mise_a_jour);
7868     $contenu = array();
7869    
7870     $contenu[0][0] = "date_envoi_signature";
7871     $contenu[1][0] = _("date d'envoi pour signature Mairie/Prefet");
7872    
7873     $contenu[0][1] = "date_retour_signature";
7874     $contenu[1][1] = _("date de retour de signature Mairie/Prefet");
7875    
7876     $contenu[0][2] = "date_retour_signature;date_envoi_controle_legalite";
7877     $contenu[1][2] = _("date de retour de signature + Envoi controle legalite");
7878    
7879     $contenu[0][3] = "date_envoi_controle_legalite";
7880     $contenu[1][3] = _("date d'envoi au controle de legalite");
7881    
7882     $contenu[0][4] = "date_retour_controle_legalite";
7883     $contenu[1][4] = _("date de retour de controle de legalite");
7884    
7885     $contenu[0][5] = "date_retour_rar";
7886 softime 8989 $contenu[1][5] = __("date de notification du correspondant");
7887 mbroquet 3730
7888     $form->setSelect("type_mise_a_jour", $contenu);
7889    
7890     // Parametrage du champ date
7891     $form->setLib("date", _("Date")."* :");
7892     if(isset($infos)) {
7893     $form->setType("date", "hiddenstaticdate");
7894    
7895     } else {
7896     $form->setType("date", "date");
7897     }
7898     $form->setVal("date", $date);
7899     $form->setTaille("date", 10);
7900     $form->setMax("date", 10);
7901    
7902     // Parametrage du champ code_barres
7903     $form->setLib("code_barres", _("Code barres d'instruction")."* :");
7904     if(isset($infos)) {
7905     $form->setType("code_barres", "hiddenstatic");
7906     } else {
7907     $form->setType("code_barres", "text");
7908     }
7909     $form->setVal("code_barres", $code_barres);
7910     $form->setTaille("code_barres", 20);
7911     $form->setMax("code_barres", 20);
7912    
7913     // Ajout des infos du dossier correspondantes à l'instruction séléctionnée
7914     if(isset($infos)) {
7915    
7916     // Tous les champs sont défini par defaut à static
7917     foreach ($infos as $key => $value) {
7918     $form->setType($key, "static");
7919     if(in_array($key, $liste_champs)) {
7920     $form->setVal($key, $date);
7921     } else {
7922     $form->setVal($key, $value);
7923     }
7924     }
7925    
7926     // Les champs dont on viens de définir la valeur sont en gras
7927     foreach ($liste_champs as $value) {
7928     $form->setBloc($value,'DF',"",'bold');
7929     }
7930    
7931     // Parametrage du champ dossier
7932     $form->setLib("dossier_libelle", _("dossier_libelle")." :");
7933     $form->setType("dossier_libelle", "static");
7934     $form->setVal("dossier_libelle", $infos['dossier_libelle']);
7935    
7936     // Parametrage du champ evenement
7937     $form->setLib("evenement", _("evenement")." :");
7938     $form->setType("evenement", "static");
7939     $form->setVal("evenement", $infos['evenement']);
7940    
7941     // Parametrage du champ autorite_competente
7942     $form->setLib("autorite_competente", _("Autorite competente")." :");
7943     $form->setType("autorite_competente", "static");
7944     $form->setVal("autorite_competente", $infos['autorite_competente']);
7945    
7946 softime 8989 // Parametrage des libellés d'envoi avec AR
7947     $form->setLib("date_envoi_rar", __("date_envoi_ar")." :");
7948     $form->setLib("date_retour_rar", __("date_notification")." :");
7949 mbroquet 3730
7950     $form->setLib("date_envoi_signature", _("date_envoi_signature")." :");
7951     $form->setLib("date_retour_signature", _("date_retour_signature")." :");
7952     $form->setLib("date_envoi_controle_legalite", _("date_envoi_controle_legalite")." :");
7953     $form->setLib("date_retour_controle_legalite", _("date_retour_controle_legalite")." :");
7954     // Configuration des libellé en fonction de l'autorité compétente
7955     if($infos['autorite_competente_code'] == 'ETAT') {
7956     $form->setType("date_envoi_controle_legalite", "hiddendate");
7957     $form->setType("date_retour_controle_legalite", "hiddendate");
7958     }
7959    
7960     // Ajout d'un champ hidden permettant de savoir que le formulaire précédant est celui de vérification
7961     $form->setLib("is_valid", _("Valide")." :");
7962     $form->setType("is_valid", "hidden");
7963     $form->setVal("is_valid", 'true');
7964    
7965     $form->setFieldset('dossier_libelle','D',_('Synthese'));
7966     $form->setFieldset('is_valid','F');
7967    
7968     }
7969    
7970    
7971     // Création du fieldset regroupant les champs permettant la mise à jour des date
7972     $form->setFieldset('type_mise_a_jour','D',_('Mise a jour'));
7973     $form->setFieldset('code_barres','F');
7974     // Affichage du formulaire
7975     $form->entete();
7976     $form->afficher($champs, 0, false, false);
7977     $form->enpied();
7978     // Affichage du bouton
7979     echo "\t<div class=\"formControls\">\n";
7980     //
7981     if(!$date_error) {
7982 softime 8989 $this->f->layout->display_form_button(array("value" => _("Valider"), "name" => "validation"));
7983 mbroquet 3730 }
7984     // Si pas sur l'écran de validation
7985     if(isset($infos)) {
7986 softime 7996 echo "<a class=\"retour\" href=\"".OM_ROUTE_FORM."&obj=instruction_suivi_mise_a_jour_des_dates&action=170&idx=0";
7987 mbroquet 3730 echo "&amp;type_mise_a_jour=".$type_mise_a_jour."&amp;date=".$date."&amp;code_barres=".$code_barres;
7988     echo "\">Retour</a>";
7989     }
7990     echo "\t</div>\n";
7991     // Fermeture du formulaire
7992     echo "\t</form>\n";
7993     }
7994    
7995     /**
7996     * [view_pdf_lettre_rar description]
7997     *
7998     * @return [type] [description]
7999     */
8000     function view_pdf_lettre_rar() {
8001     // Vérification de l'accessibilité sur l'élément
8002     $this->checkAccessibility();
8003 softime 8989 //
8004     $this->f->disableLog();
8005 mbroquet 3730
8006 softime 8989 if($this->f->get_submitted_get_value('liste') != null) {
8007     $listeCodeBarres = explode(',',$this->f->get_submitted_get_value('liste'));
8008 mbroquet 3730
8009     // Classe permettant la mise en page de l'édition pdf
8010     require_once "../obj/pdf_lettre_rar.class.php";
8011     $pdf_lettre_rar = new pdf_lettre_rar('P', 'mm', 'A4');
8012     // Initialisation de la mise en page
8013 softime 8989 $pdf_lettre_rar->init($this->f);
8014 mbroquet 3730
8015     foreach ($listeCodeBarres as $code_barres) {
8016    
8017 softime 7067 // On récupère le dossier
8018 softime 14064 $qres = $this->f->get_one_result_from_db_query(
8019     sprintf(
8020     'SELECT
8021     dossier
8022     FROM
8023     %1$sinstruction
8024     WHERE
8025     code_barres = \'%2$s\'',
8026     DB_PREFIXE,
8027     $this->f->db->escapeSimple($code_barres)
8028     ),
8029     array(
8030     "origin" => __METHOD__,
8031     )
8032     );
8033    
8034 softime 7996 $inst_dossier = $this->f->get_inst__om_dbform(array(
8035     "obj" => "dossier",
8036 softime 14064 "idx" => $qres['result'],
8037 softime 7996 ));
8038 softime 7067
8039     // En fonction du type de dossier, on récupère un demandeur différent dans les requêtes
8040     $groupe = $inst_dossier->get_type_affichage_formulaire();
8041     switch ($groupe) {
8042     case 'CTX IN':
8043     $sql_demandeur = "(lien_dossier_demandeur.petitionnaire_principal IS TRUE AND demandeur.type_demandeur='plaignant')";
8044     break;
8045     case 'CTX RE':
8046     $sql_demandeur = "(lien_dossier_demandeur.petitionnaire_principal IS TRUE AND demandeur.type_demandeur='requerant')";
8047     break;
8048     case 'ADS':
8049     case 'DPC':
8050 softime 10573 case 'CONSULTATION ENTRANTE':
8051 softime 7067 default:
8052     $sql_demandeur = "((lien_dossier_demandeur.petitionnaire_principal IS TRUE AND demandeur.type_demandeur='petitionnaire') OR demandeur.type_demandeur='delegataire')";
8053     break;
8054     }
8055    
8056 mbroquet 3730 // Test si l'evenement est de type arrete et si un délégataire a été nommé
8057     $sql = "SELECT
8058     dossier.dossier_libelle,
8059     evenement.type,
8060 softime 3834 count(lien_dossier_demandeur) as nbdemandeur,
8061     CASE
8062     WHEN division.libelle IS NOT NULL AND phase.code IS NOT NULL
8063     THEN CONCAT(phase.code, ' - ', division.libelle)
8064     ELSE
8065     phase.code
8066     END AS code_phase
8067 mbroquet 3730 FROM ".DB_PREFIXE."instruction
8068     LEFT JOIN ".DB_PREFIXE."dossier
8069     ON instruction.dossier = dossier.dossier
8070 softime 3834 LEFT JOIN ".DB_PREFIXE."division
8071     ON dossier.division = division.division
8072 mbroquet 3730 INNER JOIN ".DB_PREFIXE."evenement ON
8073 softime 3834 instruction.evenement=evenement.evenement
8074     LEFT JOIN ".DB_PREFIXE."phase
8075     ON evenement.phase = phase.phase
8076 mbroquet 3730 inner JOIN ".DB_PREFIXE."lien_dossier_demandeur ON
8077     instruction.dossier=lien_dossier_demandeur.dossier
8078     inner join ".DB_PREFIXE."demandeur on
8079     demandeur.demandeur=lien_dossier_demandeur.demandeur
8080     WHERE code_barres='".$code_barres."'
8081 softime 7067 AND " . $sql_demandeur . "
8082 softime 3834 GROUP BY dossier.dossier_libelle, evenement.type, phase.code, division.libelle";
8083 mbroquet 3730
8084 softime 8989 $res = $this->f->db->query($sql);
8085     $this->f->addToLog(__METHOD__.": db->query(\"".$sql."\")", VERBOSE_MODE);
8086     $this->f->isDatabaseError($res);
8087 mbroquet 3730 $testDemandeur = $res->fetchrow(DB_FETCHMODE_ASSOC);
8088    
8089    
8090     // Recuperation de l'adresse de destination
8091     $sqlAdresse = "SELECT
8092     CASE WHEN demandeur.qualite='particulier'
8093     THEN TRIM(CONCAT_WS(' ', pc.libelle, demandeur.particulier_nom, demandeur.particulier_prenom))
8094     ELSE TRIM(demandeur.personne_morale_denomination)
8095     END as ligne1,
8096     CASE WHEN demandeur.qualite='personne_morale'
8097     THEN TRIM(demandeur.personne_morale_raison_sociale)
8098     ELSE ''
8099     END as ligne1_1,
8100     CASE WHEN demandeur.qualite='personne_morale' AND (demandeur.personne_morale_nom IS NOT NULL OR demandeur.personne_morale_prenom IS NOT NULL)
8101     THEN TRIM(CONCAT_WS(' ', 'rep. par', demandeur.personne_morale_nom, demandeur.personne_morale_prenom))
8102     ELSE ''
8103     END as ligne1_2,
8104     trim(concat(demandeur.numero,' ',demandeur.voie)) as ligne2,
8105     CASE demandeur.complement
8106     WHEN null THEN ''
8107     ELSE trim(demandeur.complement)
8108     END as ligne3,
8109     CASE demandeur.lieu_dit
8110     WHEN null THEN ''
8111     ELSE trim(demandeur.lieu_dit)
8112     END as ligne4,
8113     CONCAT_WS(' ', demandeur.code_postal, demandeur.localite,
8114     (CASE WHEN demandeur.bp IS NOT NULL
8115     THEN CONCAT_WS(' ', 'BP', demandeur.bp)
8116     ELSE ''
8117     END),
8118     (CASE WHEN demandeur.cedex IS NOT NULL
8119     THEN CONCAT_WS(' ', 'CEDEX', demandeur.cedex)
8120     ELSE ''
8121     END))
8122     as ligne5,
8123     code_barres as code_barres
8124     FROM ".DB_PREFIXE."instruction
8125     INNER JOIN ".DB_PREFIXE."dossier ON dossier.dossier = instruction.dossier
8126     INNER JOIN ".DB_PREFIXE."lien_dossier_demandeur ON dossier.dossier = lien_dossier_demandeur.dossier
8127     INNER JOIN ".DB_PREFIXE."demandeur ON lien_dossier_demandeur.demandeur = demandeur.demandeur
8128     LEFT OUTER JOIN ".DB_PREFIXE."civilite as pc ON demandeur.particulier_civilite = pc.civilite OR demandeur.personne_morale_civilite = pc.civilite
8129     WHERE instruction.code_barres ='".$code_barres."'";
8130    
8131     // Envoi pour delegataire ou petitionnaire principal selon le type d'evenement
8132     if($testDemandeur['type'] != 'arrete' AND $testDemandeur['nbdemandeur'] > 1) {
8133     $sqlAdresse .= " AND demandeur.type_demandeur='delegataire'";
8134     } else {
8135 softime 7996 $sqlAdresse .= " AND demandeur.type_demandeur='petitionnaire' AND lien_dossier_demandeur.petitionnaire_principal IS TRUE";
8136 mbroquet 3730 }
8137    
8138 softime 8989 $resAdresse = $this->f->db->query($sqlAdresse);
8139 mbroquet 3730 $adresse_dest = $resAdresse->fetchrow(DB_FETCHMODE_ASSOC);
8140 softime 8989 $this->f->addToLog(__METHOD__.": db->query(\"".$sqlAdresse."\")", VERBOSE_MODE);
8141     $this->f->isDatabaseError($resAdresse);
8142 mbroquet 3730
8143     // Création adresse destinataire sans ligne vide
8144     $adresse_destinataire = array();
8145     if (!empty($adresse_dest['ligne1'])) {
8146     $adresse_destinataire[] = $adresse_dest['ligne1'];
8147     }
8148     if (!empty($adresse_dest['ligne1_1'])) {
8149     $adresse_destinataire[] = $adresse_dest['ligne1_1'];
8150     }
8151     if (!empty($adresse_dest['ligne1_2'])) {
8152     $adresse_destinataire[] = $adresse_dest['ligne1_2'];
8153     }
8154     $adresse_destinataire[] = $adresse_dest['ligne2'];
8155     if (!empty($adresse_dest['ligne3'])) {
8156     $adresse_destinataire[] = $adresse_dest['ligne3'];
8157     }
8158     if (!empty($adresse_dest['ligne4'])) {
8159     $adresse_destinataire[] = $adresse_dest['ligne4'];
8160     }
8161     $adresse_destinataire[] = $adresse_dest['ligne5'];
8162    
8163     // Création du champ specifique
8164     $specifique_content = array();
8165     $specifique_content[] = $adresse_dest['ligne1'];
8166     $specifique_content[] = $adresse_dest['ligne1_1'];
8167     $specifique_content[] = $adresse_dest['ligne1_2'];
8168     $specifique_content[] = $testDemandeur['dossier_libelle'];
8169     $specifique_content[] = "|||||".$adresse_dest['code_barres']."|||||";
8170     unset($adresse_dest['code_barres']);
8171     // Ajout d'une page aux pdf
8172 softime 3834 $pdf_lettre_rar->addLetter($adresse_destinataire, $specifique_content, $testDemandeur['code_phase']);
8173 mbroquet 3730
8174     }
8175     $pdf_output = $pdf_lettre_rar->output("lettre_rar".date("dmYHis").".pdf","S");
8176 softime 7685 $om_edition = $this->f->get_inst__om_edition();
8177 mbroquet 3730 $om_edition->expose_pdf_output($pdf_output, "lettre_rar".date("dmYHis").".pdf");
8178     }
8179     }
8180    
8181     /**
8182     * VIEW - view_bordereau_envoi_maire.
8183     *
8184     * Formulaire demandant :
8185     * - le code-barres de l'événement d'instruction
8186     * - la date d'envoi du courrier pour signature par le maire
8187     *
8188     * Lors de la validation :
8189     * => met à jour cette date dans l'événement d'instruction
8190     * => crée un lien permettant de générer en PDF le bordereau
8191     *
8192     * @return void
8193     */
8194     function view_bordereau_envoi_maire() {
8195     // Vérification de l'accessibilité sur l'élément
8196     $this->checkAccessibility();
8197    
8198     // Récupération des valeur passées en POST ou GET
8199     $code_barres = "";
8200     if($this->f->get_submitted_post_value('code_barres') !== null) {
8201     $code_barres = $this->f->get_submitted_post_value('code_barres');
8202     } elseif($this->f->get_submitted_get_value('code_barres')!==null) {
8203     $code_barres = $this->f->get_submitted_get_value('code_barres');
8204     }
8205     $date = "";
8206     if($this->f->get_submitted_post_value('date') !== null) {
8207     $date = $this->f->get_submitted_post_value('date');
8208     } elseif($this->f->get_submitted_get_value('date') !== null) {
8209     $date = $this->f->get_submitted_get_value('date');
8210     }
8211     $validation = 0;
8212     if($this->f->get_submitted_post_value('validation') !== null) {
8213     $validation = $this->f->get_submitted_post_value('validation');
8214     } elseif($this->f->get_submitted_get_value('validation') !== null) {
8215     $validation = $this->f->get_submitted_get_value('validation');
8216     }
8217    
8218     // Si le formulaire a été validé
8219     if ($this->f->get_submitted_post_value('validation') !== null) {
8220     // Tous les champs doivent obligatoirement être remplis
8221     if (!empty($date) && !empty($code_barres)) {
8222     $date_en = $this->dateDB($date);
8223     // Si date valide
8224     if ($date_en != "") {
8225     $id_instruction = $this->get_instruction_by_barcode($code_barres);
8226     // Si un événement d'instruction a été trouvé pour ce code-barres
8227     if ($id_instruction !== null) {
8228     $ret = $this->update_date_envoi_signature($id_instruction, $date_en);
8229     // Si mise à jour réussie de la date d'envoi du courrier
8230     // pour signature par l'autorité compétente
8231     if($ret === true) {
8232     // Message de validation avec lien PDF
8233     $message_class = "valid";
8234     $message = '&bullet; '._("Veuillez cliquer sur le lien ci-dessous pour telecharger votre bordereau");
8235     $message .= " : <br/><br/>";
8236     $message .= "<a class='om-prev-icon pdf-16'";
8237     $message .= " id=\"generer_bordereau_envoi_maire\"";
8238     $message .= " title=\""._("Bordereau")."\"";
8239 softime 7996 $message .= " href='".OM_ROUTE_FORM."&obj=instruction";
8240 mbroquet 3730 $message .= "&action=200";
8241     $message .= "&idx=".$id_instruction."'";
8242     $message .= " target='_blank'>";
8243     $message .= _("Bordereau d'envoi au maire");
8244     $message .= "</a><br/><br/>";
8245     $message .= '&bullet; '._("Rappel des informations saisies")." :<br/><br/>";
8246     $message .= _("Code du courrier")." : ".$code_barres."<br/>";
8247     $message .= _("Date d'envoi du courrier pour signature par le maire")." : ".$date;
8248    
8249     } else {
8250     // Message d'erreur
8251     $message_class = "error";
8252     $message = sprintf(_("Erreur lors de la mise a jour de l'evenement d'instruction correspondant au code barres %s."),
8253     $code_barres);
8254     }
8255     }
8256     else {
8257     $message_class = "error";
8258     $message = _("Le numero saisi ne correspond a aucun code-barres d'evenement d'instruction.");
8259     }
8260     }
8261     else {
8262     $message_class = "error";
8263     $message = _("La date est invalide.");
8264     }
8265     } else {
8266     $message_class = "error";
8267     $message = _("Tous les champs doivent etre remplis.");
8268     }
8269     }
8270    
8271     /**
8272     * Affichage des messages et du formulaire
8273     */
8274    
8275     // Affichage du message de validation ou d'erreur
8276     if (isset($message) && isset($message_class) && $message != "") {
8277     $this->f->displayMessage($message_class, $message);
8278     }
8279    
8280     // Ouverture du formulaire
8281     $datasubmit = $this->getDataSubmit();
8282     echo "\n<!-- ########## START DBFORM ########## -->\n";
8283     echo "<form";
8284     echo " id=\"bordereau_envoi_maire\"";
8285     echo " method=\"post\"";
8286     echo " name=\"f1\"";
8287     echo " action=\"";
8288     echo $datasubmit;
8289     echo "\"";
8290     echo ">\n";
8291    
8292     // Paramétrage des champs du formulaire
8293     $champs = array("code_barres","date");
8294    
8295     // Création d'un nouvel objet de type formulaire
8296 softime 7996 $form = $this->f->get_inst__om_formulaire(array(
8297     "validation" => 0,
8298     "maj" => 0,
8299     "champs" => $champs,
8300     ));
8301 mbroquet 3730
8302     $template_required_label = '%s *';
8303     // Parametrage du champ code_barres
8304     $form->setLib("code_barres", sprintf($template_required_label,_("Code du courrier")));
8305     $form->setType("code_barres", "text");
8306     $form->setVal("code_barres", $code_barres);
8307     $form->setTaille("code_barres", 20);
8308     $form->setMax("code_barres", 20);
8309     // Parametrage du champ date
8310     $form->setLib("date", sprintf($template_required_label,_("Date d'envoi du courrier pour signature par le maire")));
8311     $form->setType("date", "date") ;
8312     if (empty($date)) {
8313     $date = date('d/m/Y');
8314     }
8315     $form->setVal("date", $date);
8316     $form->setTaille("date", 10);
8317     $form->setMax("date", 10);
8318    
8319     // Création du bloc regroupant les champs
8320     $form->setBloc('code_barres','D');
8321     $form->setBloc('date','F');
8322     // Affichage du formulaire
8323     $form->entete();
8324     $form->afficher($champs, 0, false, false);
8325     $form->enpied();
8326     // Affichage du bouton
8327     printf("\t<div class=\"formControls\">\n");
8328     //
8329     $this->f->layout->display_form_button(array("value" => _("Valider"), "name" => "validation"));
8330     printf("\t</div>\n");
8331     // Fermeture du formulaire
8332     printf("\t</form>\n");
8333     }
8334    
8335     /**
8336     * VIEW - view_bordereau_envoi_maire.
8337     *
8338     * PDF de bordereau d'envoi au maire pour l'événement d'instruction instancié
8339     *
8340     * @return [void]
8341     */
8342     function view_generate_bordereau_envoi_maire() {
8343     // Vérification de l'accessibilité sur l'élément
8344     $this->checkAccessibility();
8345     // Récupération de la collectivité du dossier d'instruction
8346     $collectivite_di = $this->get_dossier_instruction_om_collectivite();
8347     // Récupération de ses paramètres
8348     $collectivite = $this->f->getCollectivite($collectivite_di);
8349     // Génération du PDF
8350     $result = $this->compute_pdf_output('etat', 'communaute_bordereau_envoi_maire', $collectivite, $this->getVal(($this->clePrimaire)));
8351     // Affichage du PDF
8352     $this->expose_pdf_output(
8353     $result['pdf_output'],
8354     $result['filename']
8355     );
8356     }
8357    
8358     /**
8359 softime 10808 * VIEW - view_rapport_instruction.
8360     *
8361     * Ouvre le sous-formulaire en ajaxIt dans un overlay.
8362     * Cette action est bindée pour utiliser la fonction popUpIt.
8363     *
8364     * @return void
8365     */
8366     function view_overlay_notification_manuelle() {
8367    
8368     // Vérification de l'accessibilité sur l'élément
8369     $this->checkAccessibility();
8370    
8371     printf(
8372     '<script type="text/javascript" >
8373     overlayIt(\'%1$s\',\'%2$s&objsf=%1$s&idxformulaire=%4$s&retourformulaire=dossier_instruction&obj=%1$s&action=411&idx=%3$s\', 1);
8374     </script>',
8375     'instruction_notification_manuelle',
8376     OM_ROUTE_SOUSFORM,
8377     $this->getVal($this->clePrimaire),
8378     $this->getVal('dossier')
8379     );
8380     }
8381    
8382     /**
8383 softime 11585 * VIEW - view_overlay_notification_service_consulte.
8384     *
8385     * Ouvre le sous-formulaire de notification des services consulte
8386     * en ajaxIt dans un overlay.
8387     * Cette action est bindée pour utiliser la fonction popUpIt.
8388     *
8389     * @return void
8390     */
8391     function view_overlay_notification_service_consulte() {
8392    
8393     // Vérification de l'accessibilité sur l'élément
8394     $this->checkAccessibility();
8395    
8396     printf(
8397     '<script type="text/javascript" >
8398     overlayIt(\'%1$s\',\'%2$s&objsf=%1$s&idxformulaire=%4$s&retourformulaire=dossier_instruction&obj=%1$s&action=420&idx=%3$s\', 1);
8399     </script>',
8400     'instruction_notification_manuelle',
8401     OM_ROUTE_SOUSFORM,
8402     $this->getVal($this->clePrimaire),
8403     $this->getVal('dossier')
8404     );
8405     }
8406    
8407     /**
8408     * VIEW - overlay_notification_tiers_consulte.
8409     *
8410     * Ouvre le sous-formulaire de notification des tiers consulte
8411     * en ajaxIt dans un overlay.
8412     * Cette action est bindée pour utiliser la fonction popUpIt.
8413     *
8414     * @return void
8415     */
8416     function view_overlay_notification_tiers_consulte() {
8417    
8418     // Vérification de l'accessibilité sur l'élément
8419     $this->checkAccessibility();
8420    
8421     printf(
8422     '<script type="text/javascript" >
8423     overlayIt(\'%1$s\',\'%2$s&objsf=%1$s&idxformulaire=%4$s&retourformulaire=dossier_instruction&obj=%1$s&action=430&idx=%3$s\', 1);
8424     </script>',
8425     'instruction_notification_manuelle',
8426     OM_ROUTE_SOUSFORM,
8427     $this->getVal($this->clePrimaire),
8428     $this->getVal('dossier')
8429     );
8430     }
8431 softime 12847
8432 softime 11585 /**
8433 softime 12847 * VIEW - view_modale_selection_document_signe
8434     *
8435     * Ouvre le sous-formulaire de notification des services consulte
8436     * en ajaxIt dans un overlay.
8437     * Cette action est bindée pour utiliser la fonction popUpIt.
8438     *
8439     * @return void
8440     */
8441     function view_modale_selection_document_signe() {
8442    
8443     // Vérification de l'accessibilité sur l'élément
8444     $this->checkAccessibility();
8445    
8446     printf(
8447     '<script type="text/javascript" >
8448     overlayIt(\'%1$s\',\'%2$s&objsf=%1$s&idxformulaire=%4$s&retourformulaire=dossier_instruction&obj=%1$s&action=115&idx=%3$s\', 1);
8449     </script>',
8450     'instruction_modale',
8451     OM_ROUTE_SOUSFORM,
8452     $this->getVal($this->clePrimaire),
8453     $this->getVal('dossier')
8454     );
8455     }
8456    
8457     /**
8458 softime 6565 * Retourne l'événement d'instruction dont on donne le code-barres, avec un filtre
8459     * pour exclure les dossiers du groupe contentieux.
8460 mbroquet 3730 *
8461     * @param [string] $barcode numéro du code-barres
8462     * @return [mixed] ID de son instruction ou null si aucun code
8463     */
8464     function get_instruction_by_barcode($barcode) {
8465     // Begin
8466     $this->begin_treatment(__METHOD__);
8467 softime 14064
8468 mbroquet 3730 // Vérification de l'existence de l'événement d'instruction
8469 softime 6565 // pour le code-barres donné, en excluant les dossiers liés au groupe CTX
8470 softime 14064 $qres = $this->f->get_one_result_from_db_query(
8471     sprintf(
8472     'SELECT
8473     instruction
8474     FROM
8475     %1$sinstruction
8476     INNER JOIN %1$sdossier
8477 softime 6565 ON dossier.dossier=instruction.dossier
8478 softime 14064 INNER JOIN %1$sdossier_instruction_type
8479 softime 6565 ON dossier.dossier_instruction_type = dossier_instruction_type.dossier_instruction_type
8480 softime 14064 INNER JOIN %1$sdossier_autorisation_type_detaille
8481 softime 6565 ON dossier_instruction_type.dossier_autorisation_type_detaille = dossier_autorisation_type_detaille.dossier_autorisation_type_detaille
8482 softime 14064 INNER JOIN %1$sdossier_autorisation_type
8483 softime 6565 ON dossier_autorisation_type_detaille.dossier_autorisation_type = dossier_autorisation_type.dossier_autorisation_type
8484 softime 14064 INNER JOIN %1$sgroupe
8485 softime 6565 ON dossier_autorisation_type.groupe = groupe.groupe
8486 softime 14064 AND groupe.code != \'CTX\'
8487     WHERE
8488     code_barres = \'%2$s\'',
8489     DB_PREFIXE,
8490     $this->f->db->escapeSimple($barcode)
8491     ),
8492     array(
8493     "origin" => __METHOD__,
8494     )
8495     );
8496    
8497 mbroquet 3730 // Retourne résultat
8498 softime 14064 return $this->end_treatment(__METHOD__, $qres['result']);
8499 mbroquet 3730 }
8500    
8501     /**
8502     * Met à jour le champ date d'envoi signature
8503     * avec la date fournie et pour l'instruction donnée
8504     *
8505     * @param [string] $id ID de l'événement d'instruction
8506     * @param [string] $date date au format EN
8507     * @return [boolean] true si mise à jour avec succès
8508     */
8509     function update_date_envoi_signature($id, $date) {
8510     // Préparation du tableau
8511     $valF = array();
8512     $valF['date_envoi_signature'] = $date;
8513     // Begin
8514     $this->begin_treatment(__METHOD__);
8515     // Requête
8516 softime 12847 $res = $this->f->db->autoexecute(
8517 mbroquet 3730 DB_PREFIXE.$this->table,
8518     $valF,
8519     DB_AUTOQUERY_UPDATE,
8520     $this->getCle($id)
8521     );
8522 softime 12847 $this->addToLog(
8523     __METHOD__."(): db->autoexecute(\"".DB_PREFIXE.'.'.$this->table."\", ".print_r($valF, true).", DB_AUTOQUERY_UPDATE, \"".$this->getCle($id)."\");",
8524     VERBOSE_MODE
8525     );
8526     if ($this->f->isDatabaseError($res, true) !== false) {
8527 mbroquet 3730 $this->end_treatment(__METHOD__, false);
8528     }
8529     //
8530     return $this->end_treatment(__METHOD__, true);
8531     }
8532    
8533     /**
8534     * Méthode permettant de définir des valeurs à envoyer en base après
8535     * validation du formulaire d'ajout.
8536     * @param array $val tableau des valeurs retournées par le formulaire
8537     */
8538 softime 6929 function setValFAjout($val = array()) {
8539 mbroquet 3730 // Mise à jour du flag created_by_commune lors d'un changement de décision
8540     // par un utilisateur de commune sur un dossier instruit par la comcom
8541 softime 6565 if ($this->isInstrCanChangeDecision($this->valF["dossier"])) {
8542 mbroquet 3730 $this->valF['created_by_commune'] = true;
8543     }
8544 softime 8593
8545     //
8546     if ($this->evenement_has_an_edition($this->valF['evenement']) === false) {
8547     if (isset($this->valF['flag_edition_integrale']) === true) {
8548     unset($this->valF['flag_edition_integrale']);
8549     }
8550     if (isset($this->valF['signataire_arrete']) === true) {
8551     unset($this->valF['signataire_arrete']);
8552     }
8553     }
8554 mbroquet 3730 }
8555 nmeucci 3876
8556 fmichon 3892
8557 fmichon 4708 /**
8558     * Récupère l'instance d'un événement de workflow.
8559     *
8560     * @param mixed $evenement Identifiant de l'événement.
8561     *
8562     * @return object
8563     */
8564     function get_inst_evenement($evenement = null) {
8565     //
8566     return $this->get_inst_common("evenement", $evenement);
8567     }
8568 softime 3976
8569 fmichon 3892 /**
8570 softime 3976 * Logue l'action de l'instruction dans son DI.
8571 nmeucci 3933 *
8572 softime 3976 * @param string $id Clé primaire de l'instruction.
8573     * @param array $val Valeurs de l'instruction.
8574     *
8575     * @return bool Vrai si traitement effectué avec succès
8576 nmeucci 3876 */
8577 softime 3976 private function add_log_to_dossier($id, array $val) {
8578 nmeucci 3933 $maj = $this->getParameter("maj");
8579 nmeucci 3943 // Action = Trace par défaut
8580     $action = $this->get_backtrace();
8581     // Action = Identifant de l'action si contexte connu
8582     if (empty($maj) === false
8583     || (empty($maj) === true && $maj === 0)) {
8584     $action = $this->get_action_param($maj, 'identifier');
8585 nmeucci 3965 if ($action === 'modifier_suivi') {
8586     $action = "modifier (via l'action suivi des dates)";
8587     }
8588 nmeucci 4108 if ($action === 'notifier_commune'
8589     && isset($val['mails_destinataires']) === true) {
8590     $action = "notification de la commune (courriels : ";
8591     $action .= $val['mails_destinataires'].")";
8592     }
8593 nmeucci 3943 }
8594 nmeucci 3876 // Création du log
8595     $log = array(
8596     'date' => date('Y-m-d H:i:s'),
8597     'user' => $_SESSION['login'],
8598     'action' => $action,
8599     'values' => array(
8600     'date_evenement' => $this->dateDB($val['date_evenement']),
8601     'date_retour_rar' => $this->dateDB($val['date_retour_rar']),
8602     'date_retour_signature' => $this->dateDB($val['date_retour_signature']),
8603     'evenement' => $val['evenement'],
8604     'action' => $val['action'],
8605 nmeucci 3963 'instruction' => $id,
8606 nmeucci 3876 'etat' => $val['etat'],
8607     ),
8608     );
8609     // Ajout du log
8610 softime 3976 $di = $this->get_inst_dossier($val['dossier']);
8611 nmeucci 3876 $ret = $di->add_log_instructions($log);
8612     if ($ret === false) {
8613     $this->correct = false;
8614     $this->msg = '';
8615     $this->addToMessage($di->msg);
8616     }
8617     return $ret;
8618     }
8619 nmeucci 3943
8620 softime 3976
8621 nmeucci 3943 /**
8622 softime 3976 * Retourne le contexte de déboguage formaté en HTML.
8623 nmeucci 3943 *
8624 softime 3976 * @return string Une ligne par trace
8625 nmeucci 3943 */
8626     private function get_backtrace() {
8627     $trace = debug_backtrace();
8628 nmeucci 3957 $backtrace = '';
8629     $i = 1;
8630 nmeucci 3943 foreach ($trace as $key => $value) {
8631 nmeucci 3957 $func = $trace[$key]['function'];
8632     // On ne s'autolog pas
8633     if ($func === 'get_backtrace'
8634     || $func === 'add_log_to_dossier') {
8635     continue;
8636     }
8637     $backtrace .= $i.') ';
8638     // Si dans une classe
8639     if (isset($trace[$key]['class']) === true
8640     && empty($trace[$key]['class']) === false) {
8641 nmeucci 3963 $backtrace .= $trace[$key]['class'].'->'.$func;
8642 nmeucci 3957 }
8643     // Si procédural
8644     else {
8645     $file = $trace[$key]['file'];
8646 nmeucci 3963 $line = $trace[$key]['line'];
8647 softime 3976 $truncated_file = $this->f->get_relative_path($file);
8648 nmeucci 3963 if ($truncated_file !== false) {
8649     $file = $truncated_file;
8650     }
8651     $backtrace .= $func.' IN<br/>&nbsp;&nbsp;&nbsp;&nbsp; '.$file.':'.$line;
8652 nmeucci 3957 }
8653     $backtrace .= '<br/>';
8654     $i++;
8655 nmeucci 3943 }
8656 nmeucci 3957 return $backtrace;
8657 nmeucci 3943 }
8658 nmeucci 3963
8659 nmeucci 4108 /**
8660     * CONDITION - is_notifiable.
8661     *
8662     * Condition pour afficher l'action notifier_commune.
8663     *
8664     * @return boolean
8665     */
8666     public function is_notifiable() {
8667     // L'instruction doit être finalisée, ce qui revient à dire
8668     // définalisable sans bypass
8669     if ($this->is_unfinalizable_without_bypass() === false) {
8670     return false;
8671     }
8672     // La collectivité de l'utilisateur doit être de niveau multi
8673     if ($this->f->has_collectivite_multi() === false) {
8674     return false;
8675     }
8676     // Le paramètre multi de l'objet du courriel doit exister
8677     if ($this->f->getParameter('param_courriel_de_notification_commune_objet_depuis_instruction') === NULL) {
8678     return false;
8679     }
8680     // Le paramètre multi du modèle du courriel doit exister
8681     if ($this->f->getParameter('param_courriel_de_notification_commune_modele_depuis_instruction') === NULL) {
8682     return false;
8683     }
8684     // A ce stade toutes les conditions sont satisfaites
8685     return true;
8686     }
8687 nmeucci 3963
8688 nmeucci 4108 /**
8689     * TREATMENT - notifier_commune.
8690     *
8691     * Notifie aux communes et par courriel la finalisation d'une instruction.
8692     *
8693     * @return boolean
8694     */
8695     public function notifier_commune() {
8696     // Cette méthode permet d'exécuter une routine en début des méthodes
8697     // dites de TREATMENT.
8698     $this->begin_treatment(__METHOD__);
8699 softime 12654 $message = __('Erreur de paramétrage :');
8700     $erreurParametrage = false;
8701     // Récupération du paramétrage de la collectivité du dossier
8702 nmeucci 4108 $id_di = $this->getVal('dossier');
8703     $di = $this->get_inst_dossier($id_di);
8704     $collectivite_di = $di->getVal('om_collectivite');
8705 softime 12654 // Récupération de l'url permettant d'accèder à l'instruction et au dossier
8706     $urlAcces = $this->f->get_parametre_notification_url_acces($collectivite_di);
8707     if (empty($urlAcces) && empty(PATH_BASE_URL)) {
8708     $erreurParametrage = true;
8709     $message .= '<br>'.__("* l'url de notification n'est pas correctement paramétré");
8710 nmeucci 4108 }
8711 softime 12654
8712     // Récupération de la liste des mails
8713     $adresses = $this->f->get_param_courriel_de_notification_commune($collectivite_di);
8714     if (empty($adresses)) {
8715     $erreurParametrage = true;
8716     $message .= '<br>'.__("* aucun courriel valide de destinataire de la commune");
8717 nmeucci 4108 }
8718 softime 12654
8719     // Vérification du paramétrage des mails
8720     $paramMail = $this->f->get_notification_commune_parametre_courriel_type($collectivite_di);
8721     if (empty($paramMail) || empty($paramMail['parametre_courriel_type_message'])) {
8722     $erreurParametrage = true;
8723     $message .= '<br>'.__("* le modèle du courriel envoyé aux communes est vide");
8724 nmeucci 4108 }
8725 softime 12654 if (empty($paramMail) || empty($paramMail['parametre_courriel_type_titre'])) {
8726     $erreurParametrage = true;
8727     $message .= '<br>'.__("* l'objet du courriel envoyé aux communes est vide");
8728 nmeucci 4108 }
8729 softime 12654
8730     // Si il y a des erreurs de paramétrage on ne déclenche pas la notification et
8731     // un message a destination de l'utilisateur est affiché
8732     if ($erreurParametrage) {
8733     $message .= '<br>'.__("Veuillez contacter votre administrateur.");
8734     $this->addToMessage($message);
8735 nmeucci 4108 return $this->end_treatment(__METHOD__, false);
8736     }
8737 softime 12654
8738     // Création d'un notification et de sa tâche associé pour chaque mail
8739     foreach ($adresses as $adresse) {
8740     // Ajout de la notif et récupération de son id
8741     $destinataire = array(
8742     'destinataire' => $adresse,
8743     'courriel' => $adresse
8744     );
8745     $idNotif = $this->ajouter_notification(
8746     $this->getVal($this->clePrimaire),
8747     $this->f->get_connected_user_login_name(),
8748     $destinataire,
8749     $collectivite_di
8750     );
8751     if ($idNotif === false) {
8752     $this->addToMessage(__("Veuillez contacter votre administrateur."));
8753     return $this->end_treatment(__METHOD__, false);
8754 nmeucci 4108 }
8755 softime 12654 // Création de la tache en lui donnant l'id de la notification
8756     $notification_by_task = $this->notification_by_task(
8757     $idNotif,
8758     $this->getVal('dossier'),
8759     'mail',
8760     'notification_commune'
8761     );
8762     if ($notification_by_task === false) {
8763     $this->addToMessage(__("Erreur lors de la préparation de la notification des communes."));
8764     $this->addToMessage(__("Veuillez contacter votre administrateur."));
8765     return $this->end_treatment(__METHOD__, false);
8766     }
8767 nmeucci 4108 }
8768 softime 12654 $this->addToMessage(__('La commune a été notifiée.'));
8769 nmeucci 4108 return $this->end_treatment(__METHOD__, true);
8770     }
8771    
8772     /**
8773 softime 5169 * Récupère l'instance de l'instructeur
8774     *
8775     * @param integer $instructeur Identifiant de l'instructeur.
8776     *
8777     * @return object
8778     */
8779     protected function get_inst_instructeur($instructeur) {
8780     //
8781     return $this->get_inst_common("instructeur", $instructeur);
8782     }
8783    
8784    
8785     /**
8786     * Récupère l'instance de l'utilisateur
8787     *
8788     * @param integer $om_utilisateur Identifiant de l'utilisateur.
8789     *
8790     * @return object
8791     */
8792     protected function get_inst_om_utilisateur($om_utilisateur) {
8793     //
8794     return $this->get_inst_common("om_utilisateur", $om_utilisateur);
8795     }
8796    
8797    
8798 softime 6565 /**
8799 softime 5295 * Récupère l'instance de la division.
8800     *
8801     * @param integer $division Identifiant de la division.
8802     *
8803     * @return object
8804     */
8805     protected function get_inst_division($division) {
8806     //
8807     return $this->get_inst_common("division", $division);
8808     }
8809    
8810    
8811     /**
8812     * Récupère l'instance de la direction.
8813     *
8814     * @param integer $direction Identifiant de la direction.
8815     *
8816     * @return object
8817     */
8818     protected function get_inst_direction($direction) {
8819     //
8820     return $this->get_inst_common("direction", $direction);
8821     }
8822    
8823    
8824     /**
8825     * Récupère la collectivité d'un instructeur en passant par sa division puis
8826     * par sa direction.
8827     *
8828     * @param integer $instructeur Identifiant de l'instructeur.
8829     *
8830     * @return integer
8831     */
8832     protected function get_instructeur_om_collectivite($instructeur) {
8833     // Chemin vers la collectivité d'un instructeur
8834     $inst_instr = $this->get_inst_instructeur($instructeur);
8835     $inst_division = $this->get_inst_division($inst_instr->getVal('division'));
8836     $inst_direction = $this->get_inst_direction($inst_division->getVal('direction'));
8837    
8838     // Collectivité
8839     $om_collectivite = $inst_direction->getVal('om_collectivite');
8840    
8841     //
8842     return $om_collectivite;
8843     }
8844    
8845 softime 6565 /*
8846     * CONDITION - can_user_access_dossier_contexte_ajout
8847     *
8848     * Vérifie que l'utilisateur a bien accès au dossier d'instruction passé dans le
8849     * formulaire d'ajout.
8850     * Cette méthode vérifie que l'utilisateur est lié au groupe du dossier, et si le
8851     * dossier est confidentiel qu'il a accès aux confidentiels de ce groupe.
8852     *
8853     */
8854     function can_user_access_dossier_contexte_ajout() {
8855 softime 5295
8856 softime 6565 ($this->f->get_submitted_get_value('idxformulaire') !== null ? $id_dossier =
8857     $this->f->get_submitted_get_value('idxformulaire') : $id_dossier = "");
8858     //
8859     if ($id_dossier !== "") {
8860 softime 7996 $dossier = $this->f->get_inst__om_dbform(array(
8861     "obj" => "dossier_instruction",
8862     "idx" => $id_dossier,
8863     ));
8864 softime 6565 //
8865     return $dossier->can_user_access_dossier();
8866     }
8867     return false;
8868     }
8869    
8870     /*
8871     * CONDITION - can_user_access_dossier
8872     *
8873     * Vérifie que l'utilisateur a bien accès au dossier lié à l'instruction instanciée.
8874     * Cette méthode vérifie que l'utilisateur est lié au groupe du dossier, et si le
8875     * dossier est confidentiel qu'il a accès aux confidentiels de ce groupe.
8876     *
8877     */
8878     function can_user_access_dossier_contexte_modification() {
8879    
8880     $id_dossier = $this->getVal('dossier');
8881     //
8882     if ($id_dossier !== "" && $id_dossier !== null) {
8883 softime 7996 $dossier = $this->f->get_inst__om_dbform(array(
8884     "obj" => "dossier_instruction",
8885     "idx" => $id_dossier,
8886     ));
8887 softime 6565 //
8888     return $dossier->can_user_access_dossier();
8889     }
8890     return false;
8891     }
8892    
8893 softime 8593 /**
8894 softime 10713 * TREATMENT - envoyer_a_signature_sans_relecture
8895     *
8896     * Permet d'envoyer le document de l'instruction au parapheur pour signature sans relecture
8897     *
8898     * @return boolean true si l'envoi a été effectué avec succès false sinon
8899     */
8900     function envoyer_a_signature_sans_relecture() {
8901     return $this->envoyer_a_signature();
8902     }
8903    
8904     /**
8905     * TREATMENT - envoyer_a_signature_avec_relecture
8906     *
8907     * Permet d'envoyer le document de l'instruction au parapheur pour signature avec relecture
8908     *
8909     * @return boolean true si l'envoi a été effectué avec succès false sinon
8910     */
8911     function envoyer_a_signature_avec_relecture() {
8912 softime 10808 $is_forced_view_files = true;
8913     return $this->envoyer_a_signature($is_forced_view_files);
8914 softime 10713 }
8915    
8916     /**
8917 softime 10573 * TREATMENT - envoyer_a_signature
8918     *
8919     * Permet d'envoyer le document de l'instruction au parapheur pour signature
8920 softime 10713 *
8921     * @param boolean $is_forced_view_files Indique si il y a une relecture (true) ou non (false)
8922 softime 10573 *
8923     * @return boolean true si l'envoi a été effectué avec succès false sinon
8924     */
8925 softime 10713 function envoyer_a_signature($is_forced_view_files = false) {
8926 softime 10573 $this->begin_treatment(__METHOD__);
8927     $this->correct = true;
8928    
8929     // Instanciation de l'objet signataire_arrete
8930     $inst_signataire_arrete = $this->f->get_inst__om_dbform(array(
8931     'obj' => 'signataire_arrete',
8932     'idx' => $this->getVal('signataire_arrete'),
8933     ));
8934    
8935     // Instanciation de l'objet dossier
8936     $inst_dossier = $this->f->get_inst__om_dbform(array(
8937     'obj' => 'dossier',
8938     'idx' => $this->getVal('dossier'),
8939     ));
8940    
8941     // Récupération du document à signer
8942     $file = $this->f->storage->get($this->getVal('om_fichier_instruction'));
8943     if ($file === OP_FAILURE) {
8944     $this->correct = false;
8945     $this->addToMessage(__("Une erreur est survenue lors de la récupération du contenu du document de l'instruction."));
8946     // Termine le traitement
8947     return $this->end_treatment(__METHOD__, false);
8948     }
8949    
8950     // Initialisation des paramètre à passer pour l'envoi en signature
8951 softime 10808 $data = array(
8952 softime 10573 "om_utilisateur_email" => $this->f->om_utilisateur['email'],
8953     "om_utilisateur_nom" => $this->f->om_utilisateur['nom'],
8954     "signataire_arrete_email" => $inst_signataire_arrete->getVal('email'),
8955     "signataire_arrete_nom" => $inst_signataire_arrete->getVal('nom'),
8956     "signataire_arrete_prenom" => $inst_signataire_arrete->getVal('prenom'),
8957 softime 11876 // Permet d'envoyer en signature l'instruction le jour de la date limite
8958 softime 14064 "date_limite_instruction" => $this->compute_date_limite(1) != null ? $this->compute_date_limite(1) : null,
8959 softime 10573 "dossier" => $this->getVal('dossier'),
8960 softime 10713 "is_forced_view_files" => $is_forced_view_files,
8961     'commentaire_signature' => $is_forced_view_files === true ? __('relecture demandee.') : null
8962 softime 10573 );
8963    
8964 softime 10808 // Initialisation des métadonnées
8965     $metadonnee_dossier = $file['metadata'];
8966 softime 11228 // récupération de l'extension du fichier
8967     $extension = substr($metadonnee_dossier['filename'], strrpos($metadonnee_dossier['filename'], '.'));
8968     // Modification du libellé du document transmis au parapheur
8969     // pour le mettre sous la forme : instruction_xxx_libelle_lettretype.extension
8970     $metadonnee_dossier['filename'] = $this->getDocumentLibelle().$extension;
8971     $metadonnee_dossier['titre_document'] = $this->getDocumentTitre();
8972 softime 10808
8973     $metadonnee_dossier['url_di'] = sprintf(
8974     '%sapp/index.php?module=form&direct_link=true&obj=dossier_instruction&action=3&direct_field=dossier&direct_form=instruction&direct_action=3&direct_idx=%s',
8975 softime 11418 $this->f->get_param_base_path_metadata_url_di() !== null ? $this->f->get_param_base_path_metadata_url_di() : PATH_BASE_URL,
8976 softime 10808 $this->getVal($this->clePrimaire)
8977     );
8978    
8979     $optional_data = null;
8980     // Si il y a des paramètres supplémentaire spécifié dans le signataire alors on les récupère
8981     if ($inst_signataire_arrete->getVal('parametre_parapheur') !== null && $inst_signataire_arrete->getVal('parametre_parapheur') !== '') {
8982     $optional_data = json_decode($inst_signataire_arrete->getVal('parametre_parapheur'), true);
8983     if (json_last_error() !== JSON_ERROR_NONE) {
8984     $this->correct = false;
8985     $this->addToMessage(__("Les paramètres supplémentaires envoyés au parapheur ne sont pas au bon format."));
8986     $this->addToLog(__METHOD__."(): ".
8987     __("Erreur lors du décodage du format json des paramètres supplémentaires envoyé au parapheur.
8988     Tableau : ").var_export($inst_signataire_arrete->getVal('parametre_parapheur'), true)
8989     );
8990     // Termine le traitement
8991     return $this->end_treatment(__METHOD__, false);
8992     }
8993     }
8994    
8995 softime 10573 //Instanciation de la classe electronicsignature
8996     $inst_es = $this->get_electronicsignature_instance();
8997     if ($inst_es === false) {
8998     $this->correct = false;
8999     return $this->end_treatment(__METHOD__, false);
9000     }
9001    
9002     // Appel de la méthode de l'abstracteur send_for_signature()
9003     // Cette méthode doit retourner un tableau de valeur
9004     try {
9005 softime 10808 $result = $inst_es->send_for_signature($data, $file['file_content'], $metadonnee_dossier, $optional_data);
9006 softime 10573 } catch (electronicsignature_exception $e) {
9007     $this->handle_electronicsignature_exception($e);
9008     return $this->end_treatment(__METHOD__, false);
9009     }
9010    
9011     // Après avoir reçu le résultat du parapheur, il faut mettre à jour les champs
9012     $valF = array();
9013    
9014     // Pour appeler la fonction modifier il faut traiter tous les champs de l'objet
9015     foreach($this->champs as $identifiant => $champ) {
9016     $valF[$champ] = $this->val[$identifiant];
9017     }
9018     // On fait ensuite nos modifications spécifiques
9019     $valF['id_parapheur_signature'] = $result['id_parapheur_signature'];
9020     $valF['statut_signature'] = $result['statut'];
9021     $valF['commentaire_signature'] = isset($result['commentaire_signature']) == true ? $result['commentaire_signature'] : null;
9022     $valF['date_envoi_signature'] = date("Y-m-d", strtotime($result['date_envoi_signature']));
9023     $valF['historique_signature'] = $this->get_updated_historique_signature($result);
9024    
9025     $ret = $this->modifier($valF);
9026    
9027     if ($ret === false) {
9028     $this->correct = false;
9029     $this->addToMessage(__("Une erreur est survenue lors de la mise à jour des champs."));
9030     // Termine le traitement
9031     return $this->end_treatment(__METHOD__, false);
9032     }
9033    
9034     // Message
9035     $this->addToMessage(__("Le document a été envoyé pour signature dans le parapheur."));
9036     if (array_key_exists('signature_page_url', $result) === true) {
9037     $this->addToMessage(sprintf(
9038 softime 11228 '<br> > <a href="%1$s" title="%2$s" target="_blank">%2$s</a>',
9039     $result['signature_page_url'],
9040     __("Signez directement le document")
9041 softime 10573 ));
9042     }
9043    
9044     // Tout s'est bien passé, on termine le traitement
9045     return $this->end_treatment(__METHOD__, true);
9046     }
9047    
9048     /**
9049 softime 11876 * Permet de récupérer la bonne date limite en fonction de si l'instruction
9050     * est en incomplet notifié ou non.
9051     * On peut ajouter des jours à cette date grâce au paramètre "delay".
9052     * Cette fonction est utilisée dans un cas spécifique où on veut envoyer
9053     * l'instruction en signature le jour de la date limite.
9054     *
9055     * @param int $delay Le nombre de jour à ajouter à la date limite.
9056     *
9057     * @return string $date_limite la date limite calculé ou false
9058     */
9059     private function compute_date_limite($delay) {
9060     // Instanciation de l'objet dossier
9061     $inst_dossier = $this->f->get_inst__om_dbform(array(
9062     'obj' => 'dossier',
9063     'idx' => $this->getVal('dossier'),
9064     ));
9065    
9066     $date_to_compute = null;
9067     if ($inst_dossier->getVal('incomplet_notifie') === 't') {
9068     $date_to_compute = $inst_dossier->getVal('date_limite_incompletude');
9069     } else {
9070     $date_to_compute = $inst_dossier->getVal('date_limite');
9071     }
9072 softime 14064 if ($date_to_compute != null) {
9073     return date("Y-m-d", strtotime($date_to_compute."+ $delay days"));
9074     }
9075 softime 11876
9076 softime 14064 return null;
9077 softime 11876 }
9078    
9079     /**
9080 softime 10573 * Permet de récupérer la traduction de la valeur de statut_signature
9081     *
9082     * @return string la valeur de statut_signature traduite | false
9083     */
9084     function get_trad_for_statut($value_to_trad){
9085     $statut_signature_tab = array(
9086     'waiting' => __('en préparation'),
9087     'in_progress' => __('en cours de signature'),
9088     'canceled' => __('signature annulée'),
9089 softime 10808 'expired' => __('délai de signature expiré'),
9090 softime 10573 'finished' => __('signé')
9091     );
9092     if (array_key_exists($value_to_trad, $statut_signature_tab) === true) {
9093     return $statut_signature_tab[$value_to_trad];
9094     }
9095    
9096     return false;
9097     }
9098    
9099     /**
9100     * Permet de mettre à jour le tableau json sotcké dans le champ historique_signature
9101     *
9102     * @return string (json) la valeur de historique_signature mis à jour | false
9103     */
9104     function get_updated_historique_signature($historique_signature_values) {
9105    
9106     $historique_signature_value_tab = $this->get_historique_signature_decoded();
9107    
9108     if ($historique_signature_value_tab === false) {
9109     $this->addToLog(__METHOD__."(): erreur historique signature", DEBUG_MODE);
9110     return false;
9111     }
9112    
9113     $last_val_historique_signature = array();
9114    
9115     // Si la tableau récupéré n'est pas vide alors
9116     // on récupère la dernière ligne du tableau
9117     if (empty($historique_signature_value_tab) === false) {
9118     $last_val_historique_signature = end($historique_signature_value_tab);
9119     }
9120    
9121     $format_date = '';
9122     $format_date_hour = '';
9123     $date_converted=array();
9124    
9125     $date_to_convert = array(
9126     'date_envoi_signature' => $historique_signature_values['date_envoi_signature'],
9127 softime 11876 'date_limite_instruction' => $this->compute_date_limite(0),
9128 softime 10573 'date_retour_signature' => $historique_signature_values['date_retour_signature']
9129     );
9130    
9131     // Conversion des dates en fonction de leur format
9132     foreach ($date_to_convert as $key => $value) {
9133     $date_converted[$key] = null;
9134     if ($value != null) {
9135     $format_date = 'd/m/Y';
9136     $format_date_hour = 'd/m/Y H:i:s';
9137     $date_converted[$key] = empty(date_parse($value)['hour']) === false ? date($format_date_hour, strtotime($value)) : date($format_date, strtotime($value));
9138     }
9139     }
9140    
9141     // Ce tableau permet de lister les colonnes de historique_signature et de les rendre traduisibles.
9142     // Il faut en effet mettre les gettext avec l'intitulé explicite au moins
9143     // une fois afin qu'il puisse être reconnu par le logiciel de traduction.
9144     $tab_for_columns_trad = array(
9145     __('entry_date'),
9146     __('id_parapheur_signature'),
9147     __('emetteur'),
9148     __('signataire'),
9149     __('date_envoi'),
9150     __('date_limite'),
9151     __('date_retour'),
9152     __('statut_signature'),
9153     __('commentaire_signature')
9154     );
9155    
9156     array_push($historique_signature_value_tab, array(
9157     'entry_date' => date('d/m/Y H:i:s'),
9158     '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'],
9159     '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'],
9160     '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'],
9161     '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'],
9162     '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'],
9163     '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'],
9164     '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']),
9165     'commentaire_signature' => isset($historique_signature_values['commentaire_signature']) === false || $historique_signature_values['commentaire_signature'] == null ? null : $historique_signature_values['commentaire_signature'],
9166     ));
9167    
9168     return json_encode($historique_signature_value_tab, JSON_HEX_APOS);
9169     }
9170 softime 11876
9171     /**
9172     * TREATMENT - annuler_envoi_en_signature
9173     *
9174     * Permet d'annuler l'envoi du document de l'instruction au parapheur pour signature
9175     *
9176     * @return boolean true si l'annulation a été effectué avec succès false sinon
9177     */
9178     function annuler_envoi_en_signature() {
9179     $this->begin_treatment(__METHOD__);
9180     $this->correct = true;
9181 softime 10573
9182 softime 11876 //Instanciation de la classe electronicsignature
9183     $inst_es = $this->get_electronicsignature_instance();
9184     if ($inst_es === false) {
9185     $this->correct = false;
9186     return $this->end_treatment(__METHOD__, false);
9187     }
9188 softime 10573
9189 softime 11876 $data = array();
9190     if (! empty($this->getVal('id_parapheur_signature'))) {
9191     $data['id_parapheur_signature'] = $this->getVal('id_parapheur_signature');
9192     } else {
9193     $this->correct = false;
9194     $this->addToMessage(__("Il n'y a pas d'identifiant de parapheur."));
9195     return $this->end_treatment(__METHOD__, false);
9196     }
9197    
9198     // Appel de la méthode de l'abstracteur cancel_send_for_signature()
9199     // Cette méthode doit retourner un tableau de valeur
9200     try {
9201     $result = $inst_es->cancel_send_for_signature($data);
9202     } catch (electronicsignature_exception $e) {
9203     $this->handle_electronicsignature_exception($e);
9204     return $this->end_treatment(__METHOD__, false);
9205     }
9206    
9207     // Après avoir reçu le résultat du parapheur, il faut mettre à jour les champs
9208     $valF = array();
9209    
9210     // Pour appeler la fonction modifier il faut traiter tous les champs de l'objet
9211     foreach($this->champs as $identifiant => $champ) {
9212     $valF[$champ] = $this->val[$identifiant];
9213     }
9214     // On fait ensuite nos modifications spécifiques
9215     $valF['id_parapheur_signature'] = null;
9216     $valF['statut_signature'] = $result['statut'];
9217     $valF['commentaire_signature'] = isset($result['commentaire_signature']) == true ? $result['commentaire_signature'] : null;
9218     $valF['date_envoi_signature'] = null;
9219     $valF['historique_signature'] = $this->get_updated_historique_signature($result);
9220    
9221     $ret = $this->modifier($valF);
9222    
9223     if ($ret === false) {
9224     $this->correct = false;
9225     $this->addToMessage(__("Une erreur est survenue lors de la mise à jour des champs."));
9226     // Termine le traitement
9227     return $this->end_treatment(__METHOD__, false);
9228     }
9229    
9230     // Message
9231     $this->addToMessage(__("L'annulation a été effectuée avec succès."));
9232    
9233     // Tout s'est bien passé, on termine le traitement
9234     return $this->end_treatment(__METHOD__, true);
9235     }
9236    
9237    
9238 softime 10573 /**
9239     * Récupère le contenu du champ historique_signature et le converti en tableau
9240     *
9241     * @return array sinon false en cas d'erreur
9242     */
9243     protected function get_historique_signature_decoded() {
9244 softime 11876 $val = str_replace("'", '"', $this->getVal('historique_signature'));
9245     if ($val === '' || $val == 'false') {
9246 softime 10573 $val = json_encode(array());
9247     }
9248     if($this->isJson($val) === false) {
9249     return false;
9250     }
9251     return json_decode($val, true);
9252     }
9253    
9254 softime 10808 /**
9255     * Récupère les informations à afficher dans le tableau de suivi à l'aide
9256     * d'une requête sql. Stocke ces informations dans un tableau.
9257 softime 12433 * Converti le tableau au format json et renvoi le json obtenu.
9258 softime 10808 *
9259 softime 12433 * Pour identifier quel suivi est affiché (notification des demandeurs, des services ou
9260     * de tiers) ce sont les tâches liées aux notifications qui sont utilisés.
9261     * La clause where de la requête est construite à partir du tableau contenant les types
9262     * de tâches fourni en paramètre.
9263     * Il est également possible d'afficher les notifications n'étant pas lié à des tâches.
9264     *
9265     * Si le suivi concerne la notification des demandeurs via le portail citoyen,
9266     * la date de premier accès ne sera pas affichée.
9267     *
9268     * @param array liste des tâches permettant d'identifier quelles notification afficher
9269     * @param boolean permet d'afficher les notifications non liées à des tâches
9270 softime 10808 * @return json
9271     */
9272 softime 12124 protected function get_json_suivi_notification($typeTache, $nonLieTache = false) {
9273 softime 11585 $whereTypeTache = '';
9274 softime 12124 $sqlTaskNull = '';
9275 softime 12654
9276     // Liste des champs à afficher. Permet également la traduction des noms de colonnes.
9277     $listeChampsTrad = array(
9278     __('emetteur'),
9279     __('date_envoi'),
9280     __('destinataire'),
9281     __('date_premier_acces'),
9282     __('instruction'),
9283     __('annexes'),
9284     __('statut'),
9285     __('commentaire')
9286     );
9287     $listeChamps = array(
9288     'emetteur',
9289     'date_envoi',
9290     'destinataire',
9291     'date_premier_acces',
9292     'instruction',
9293     'annexes',
9294     'statut',
9295     'commentaire'
9296     );
9297    
9298 softime 12124 // Défini si on veux que la requête récupère également les notifications qui n'ont pas
9299     // de tâches associées. C'est le cas pour les notifications de demandeurs lorsque la
9300     // notification du demandeur principal n'a pas pu être envoyée à cause d'un mauvais
9301     // paramétrage
9302     if(is_bool($nonLieTache) && $nonLieTache === true) {
9303     $sqlTaskNull = 'OR task.type is null';
9304     }
9305     // Prépare la clause where pour ne récupérer que les notifications liées à certain type de tâches
9306     // Permet de différencier les notifications des demandeurs de celle des services et de celles des
9307     // tiers consulté
9308 softime 12433 if (is_array($typeTache) && $typeTache != array()) {
9309 softime 11585 if (is_array($typeTache)) {
9310     $whereTypeTache = sprintf(
9311 softime 12124 'AND (task.type IN (%1$s) %2$s)',
9312     "'".implode("', '", $typeTache)."'",
9313     $sqlTaskNull
9314 softime 11585 );
9315     }
9316 softime 12433 // La date de premier accès n'a pas besoin d'être renseigné pour
9317     // les notifications des demandeurs via le portail citoyen.
9318     // Les notifications des demandeurs sont liés à 3 types de tâches
9319     // notification_recepisse, notification_instruction, notification_decision
9320     // Si le suivi de la notification concerne un de ces types de tâches on
9321     // considère que c'est une notification de demandeurs.
9322     // Dans ce cas on vérifie si cette notification est paramétrée pour passer
9323     // via le portail. Par défaut si rien n'est paramétré on considère que la
9324     // notification est faite via le portail
9325     if ((in_array('notification_recepisse', $typeTache) ||
9326     in_array('notification_instruction', $typeTache) ||
9327     in_array('notification_decision', $typeTache))) {
9328     $dossier = $this->getVal('dossier');
9329     $collectivite_di = $this->get_dossier_instruction_om_collectivite($dossier);
9330     $modeNotification = $this->f->get_param_option_notification($collectivite_di);
9331 softime 14064 if ($modeNotification === PORTAL) {
9332 softime 12654 $listeChamps = array(
9333     'emetteur',
9334     'date_envoi',
9335     'destinataire',
9336     'instruction',
9337     'annexes',
9338     'statut',
9339     'commentaire'
9340     );
9341 softime 12433 }
9342     }
9343 softime 12654 // Il n'y a pas d'annexe pour la notification des communes donc pas besoin
9344     // de les afficher dans le suivi
9345     if (in_array('notification_depot_demat', $typeTache)) {
9346     $listeChamps = array(
9347     'emetteur',
9348     'date_envoi',
9349     'destinataire',
9350     'instruction',
9351     'statut',
9352     'commentaire'
9353     );
9354     }
9355 softime 11585 }
9356 softime 12433
9357 softime 10808 $valSuivi = array();
9358     // Récupération des infos nécessaires à l'affichage du tableau
9359     $sql = sprintf(
9360 softime 11585 'SELECT DISTINCT
9361 softime 10869 instruction_notification.instruction_notification,
9362 softime 12124 -- Affiche la mention automatique avec le nom de l emetteur si la notification a été envoyé automatiquement
9363 softime 10869 CASE WHEN instruction_notification.automatique = TRUE
9364     THEN TRIM(CONCAT(instruction_notification.emetteur, \' \', \'(automatique)\'))
9365     ELSE instruction_notification.emetteur
9366     END as emetteur,
9367 softime 10808 date_envoi,
9368     instruction_notification.destinataire,
9369 softime 10869 instruction_notification.date_premier_acces,
9370 softime 10808 evenement.libelle as instruction,
9371 softime 10869 instruction_notification.statut,
9372     instruction_notification.commentaire,
9373 softime 12433 annexes.instruction_annexe as annexes
9374 softime 10808 FROM
9375     %1$sinstruction_notification
9376     LEFT JOIN %1$sinstruction
9377     ON instruction.instruction = instruction_notification.instruction
9378     LEFT JOIN %1$sevenement
9379     ON instruction.evenement = evenement.evenement
9380 softime 10869 LEFT JOIN %1$sinstruction_notification_document
9381     ON instruction_notification.instruction_notification = instruction_notification_document.instruction_notification
9382     AND instruction_notification_document.annexe = true
9383 softime 12124 -- Récupère les tâches liées au notification pour pouvoir par la suite identifier le type de notification
9384 softime 11585 LEFT JOIN %1$stask
9385     ON instruction_notification.instruction_notification::CHARACTER VARYING = task.object_id
9386 softime 12124 -- Récupération de la liste des annexes sous la forme d une liste
9387 softime 11585 LEFT JOIN (
9388     SELECT
9389     instruction_notification,
9390 softime 12124 -- Récupère la liste des annexes de la notification
9391 softime 12433 -- sous la forme d un json pour récupérer toutes les informatiosn nécessaire
9392     -- à l affichage du lien vers les annexes
9393     CONCAT(
9394     \'[\',
9395     STRING_AGG(
9396     -- Affiche le nom du fichier selon le type de document/pièce
9397     CASE
9398     WHEN instruction_notification_document.document_type = \'instruction\'
9399     THEN CONCAT(
9400     \'{
9401     "obj" : "instruction",
9402     "champs" : "om_fichier_instruction",
9403     "label" : "\', evenement.libelle, \'",
9404     "id" : "\', instruction.instruction,\'"
9405     }\'
9406     )
9407     WHEN instruction_notification_document.document_type = \'consultation\'
9408     THEN CONCAT(
9409     \'{
9410     "obj" : "consultation",
9411     "champs" : "fichier",
9412     "label" : "Avis - \', service.libelle, \'",
9413     "id" : "\', consultation.consultation,\'"
9414     }\'
9415     )
9416     ELSE
9417     CONCAT(
9418     \'{
9419     "obj" : "document_numerise",
9420     "champs" : "uid",
9421     "label" : "\', document_numerise.nom_fichier, \' - \', document_numerise_type.libelle, \'",
9422     "id" : "\', document_numerise.document_numerise,\'"
9423     }\'
9424     )
9425     END,
9426     \', \'),
9427     \']\'
9428 softime 11585 ) AS instruction_annexe
9429     FROM
9430     %1$sinstruction_notification_document
9431     LEFT JOIN %1$sinstruction
9432     ON instruction_notification_document.instruction = instruction.instruction
9433     LEFT JOIN %1$sevenement
9434     ON instruction.evenement = evenement.evenement
9435     LEFT JOIN %1$sconsultation
9436     ON instruction_notification_document.document_id = consultation.consultation
9437     LEFT JOIN %1$sservice
9438     ON consultation.service = service.service
9439 softime 12433 LEFT JOIN %1$sdocument_numerise
9440     ON instruction_notification_document.document_id = document_numerise.document_numerise
9441     LEFT JOIN %1$sdocument_numerise_type
9442     ON document_numerise.document_numerise_type = document_numerise_type.document_numerise_type
9443 softime 11585 WHERE
9444     instruction_notification_document.annexe = \'t\'
9445     GROUP BY
9446     instruction_notification
9447     ) AS annexes
9448     ON
9449     annexes.instruction_notification = instruction_notification.instruction_notification
9450 softime 10808 WHERE
9451 softime 10869 instruction.instruction = %2$s
9452 softime 11585 %3$s
9453 softime 10869 ORDER BY
9454     date_envoi ASC, instruction_notification.destinataire ASC',
9455 softime 10808 DB_PREFIXE,
9456 softime 11585 $this->getVal('instruction'),
9457     $whereTypeTache
9458 softime 10808 );
9459     $res = $this->f->db->query($sql);
9460     $this->f->addToLog(__METHOD__."(): db->query(\"".$sql."\")", VERBOSE_MODE);
9461     $this->f->isDatabaseError($res);
9462 softime 12433 // Préparation du lien de téléchargement des annexes
9463     $htmlList =
9464     '<style>
9465     #content .gridjs-td a.lien_annexe {
9466     text-decoration : underline dotted 1px;
9467     }
9468     #content a.lien_annexe:hover {
9469     text-decoration : underline solid 1px;
9470     color : #46aede;
9471     }
9472     ol {padding-left : 10px;}
9473     </style>
9474     <ol>%1$s</ol>';
9475     $lienTelechargement =
9476     '<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">
9477     Annexe
9478     </a>';
9479 softime 10808 // Stockage des infos de chaque notification dans un tableau
9480     while( $row =& $res->fetchrow(DB_FETCHMODE_ASSOC) ) {
9481     $valNotif = array();
9482     foreach($listeChamps as $champ) {
9483     $valNotif[$champ] = $row[$champ];
9484 softime 10815 if (($champ === 'date_envoi'
9485     || $champ === 'date_premier_acces')
9486     && $row[$champ] !== null
9487     && $row[$champ] !== '') {
9488 softime 10814 //
9489     $valNotif[$champ] = date('d/m/Y H:i:s', strtotime($row[$champ]));
9490 softime 12433 } else if ($champ === 'annexes') {
9491     $listeAnnexe = '';
9492     $infoAnnexes = json_decode($row[$champ], true);
9493     if (! empty($infoAnnexes) && json_last_error() === JSON_ERROR_NONE) {
9494     // A partir des infos récupérées prépare le code html du lien vers chacune
9495     // des annexes et ajoute un élément de liste par annexe
9496     foreach($infoAnnexes as $annexe) {
9497     $listeAnnexe .= sprintf(
9498     '<li>%s</li>',
9499     sprintf($lienTelechargement,
9500     $annexe['obj'],
9501     $annexe['champs'],
9502     $annexe['id'],
9503     $annexe['label']
9504     )
9505     );
9506     }
9507     // Construction de la liste des annexes
9508     $valNotif[$champ] = sprintf(
9509     $htmlList,
9510     $listeAnnexe
9511     );
9512     }
9513 softime 10814 }
9514 softime 10808 }
9515     array_push($valSuivi, $valNotif);
9516     }
9517    
9518     // Passage du tableau au format json
9519     return json_encode($valSuivi, JSON_HEX_APOS);
9520     }
9521    
9522 softime 10573 /**
9523     * Traitement des erreurs retournées par l'abstracteur electronicsignature.
9524     *
9525     * @param electronicsignature_exception $exception Exception retournée par l'abstracteur.
9526     *
9527     * @return void
9528     */
9529     public function handle_electronicsignature_exception(electronicsignature_exception $exception) {
9530     $this->f->displayMessage('error', $exception->getMessage());
9531     }
9532    
9533    
9534     /**
9535     * Retourne une instance du connecteur electronicsignature, et la créer si elle n'existe pas.
9536     *
9537     * @param boolean $with_handle_error Flag pour afficher ou non le message d'erreur à l'utilisateur.
9538     * @return electronicsignature Instance de l'abstracteur.
9539     */
9540     public function get_electronicsignature_instance($with_handle_error = true) {
9541     if(isset($this->electronicsignature_instance)) {
9542     return $this->electronicsignature_instance;
9543     }
9544     // Instanciation du connecteur electronicsignature
9545     try {
9546     require_once "electronicsignature.class.php";
9547     $collectivites = array("collectivite_idx" => $this->get_dossier_instruction_om_collectivite(), "collectivite_multi_idx" => $this->f->get_idx_collectivite_multi());
9548     $this->electronicsignature_instance = new electronicsignature($collectivites);
9549     } catch (electronicsignature_exception $e) {
9550     if ($with_handle_error === true) {
9551     $this->handle_electronicsignature_exception($e);
9552     }
9553     return false;
9554     }
9555     return $this->electronicsignature_instance;
9556     }
9557    
9558     /**
9559 softime 11418 * TREATMENT - envoyer_au_controle_de_legalite
9560     *
9561     * Ajoute la tâche envoi_CL.
9562     * C'est le traitement de la tâche qui mettra à jour la date d'envoi au contrôle de légalité.
9563     *
9564     * @return [type] [description]
9565     */
9566     function envoyer_au_controle_de_legalite() {
9567     $this->begin_treatment(__METHOD__);
9568     $this->correct = true;
9569    
9570     //
9571     if ($this->can_be_sended_to_cl() === true) {
9572     // Création de la task 'envoi_CL'
9573     $inst_task = $this->f->get_inst__om_dbform(array(
9574     "obj" => "task",
9575     "idx" => 0,
9576     ));
9577     $task_val = array(
9578     'type' => 'envoi_CL',
9579     'object_id' => $this->getVal('instruction'),
9580     'dossier' => $this->getVal('dossier'),
9581     );
9582     // Change l'état de la tâche de notification en fonction de l'état de
9583     // transmission du dossier d'instruction
9584     $inst_di = $this->get_inst_dossier($this->getVal('dossier'));
9585     if ($this->f->is_option_mode_service_consulte_enabled() === false
9586     && ($inst_di->getVal('etat_transmission_platau') == 'non_transmissible'
9587     || $inst_di->getVal('etat_transmission_platau') == 'transmis_mais_non_transmissible')) {
9588     //
9589     $task_val['state'] = $inst_task::STATUS_DRAFT;
9590     }
9591     $add_task = $inst_task->add_task(array('val' => $task_val));
9592     if ($add_task === false) {
9593     $this->addToMessage(sprintf('%s %s',
9594     __("Une erreur s'est produite lors de la création tâche."),
9595     __("Veuillez contacter votre administrateur.")
9596     ));
9597     $this->correct = false;
9598     return $this->end_treatment(__METHOD__, false);
9599     }
9600     // Mise à jour du champs 'envoye_cl_platau'
9601     $instr_val = array(
9602     'envoye_cl_platau' => 't',
9603     );
9604     $res = $this->f->db->autoExecute(
9605     DB_PREFIXE.$this->table,
9606     $instr_val,
9607     DB_AUTOQUERY_UPDATE,
9608     $this->getCle($this->getVal($this->clePrimaire))
9609     );
9610 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);
9611 softime 11418 if ($this->f->isDatabaseError($res, true) === true) {
9612     $this->addToMessage(sprintf('%s %s',
9613     __("Une erreur s'est produite lors de la mise à jour de l'instruction."),
9614     __("Veuillez contacter votre administrateur.")
9615     ));
9616     $this->correct = false;
9617     return $this->end_treatment(__METHOD__, false);
9618     }
9619     // Message de validation à l'utilisateur
9620     $this->addToMessage(__('Votre demande de transfert au contrôle de légalité à bien été prise en compte.'));
9621     $this->addToMessage(__("La date d'envoi au contrôle de légalité sera mise à jour ultérieurement."));
9622     }
9623     //
9624     return $this->end_treatment(__METHOD__, true);
9625     }
9626    
9627    
9628     /**
9629 softime 8593 * Retourne le lien de retour (VIEW formulaire et VIEW sousformulaire).
9630     *
9631     * @param string $view Appel dans le contexte de la vue 'formulaire' ou de
9632     * la vue 'sousformulaire'.
9633     *
9634     * @return string
9635     */
9636     function get_back_link($view = "formulaire") {
9637     //
9638     $href = parent::get_back_link($view);
9639     //
9640     $crud = $this->get_action_crud();
9641 mbroquet 3730
9642 softime 8593 // Redirection vers le formulaire de modification à la validation du
9643     // formulaire d'ajout si l'événement associé possède une lettre type
9644     if (($crud === 'create'
9645     || ($crud === null
9646     && $this->getParameter('maj') == 0))
9647     && $this->correct == true
9648     && $this->evenement_has_an_edition($this->valF['evenement']) === true) {
9649 softime 7996
9650 softime 8593 // On instancie l'instruction
9651     $inst_instruction = $this->f->get_inst__om_dbform(array(
9652     "obj" => "instruction",
9653     "idx" => $this->valF[$this->clePrimaire],
9654     ));
9655    
9656     // Si l'instruction n'est pas finalisée automatiquement
9657     if ($inst_instruction->getVal('om_final_instruction') !== 't') {
9658     $href = str_replace("&action=3", "&action=1", $href);
9659     //
9660     if (strpos($href, "&retour=tab") !== false) {
9661     $href = str_replace("&retour=tab", "&retour= form", $href);
9662     } else {
9663     $href .= "&retour=form";
9664     }
9665     }
9666     }
9667    
9668     //
9669     return $href;
9670     }
9671    
9672 softime 10573 public function view_json_data() {
9673     $this->checkAccessibility();
9674     $this->f->disableLog();
9675     $view = $this->get_json_data();
9676     printf(json_encode($view));
9677     }
9678    
9679     public function get_json_data() {
9680     $val = array_combine($this->champs, $this->val);
9681     foreach ($val as $key => $value) {
9682     $val[$key] = strip_tags($value);
9683     }
9684     $val['tacite'] = 'f';
9685     $inst_ad = $this->f->get_inst__om_dbform(array(
9686     "obj" => "avis_decision",
9687     "idx" => $val['avis_decision'],
9688     ));
9689     if (preg_match('/[tT]acite/', $inst_ad->getVal('libelle')) === 1) {
9690     $val['tacite'] = 't';
9691     }
9692     return $val;
9693     }
9694    
9695 softime 13528 /**
9696     * Permet de récupérer l'identifiant de l'instruction sur le dossier, ayant
9697     * comme événement lié le suivant définit dans l'événement de l'instruction
9698     * instanciée.
9699     *
9700     * @param string $next_type Correspond aux trois déclenchement automatique
9701     * de création d'instruction paramétré sur un événement.
9702     * @param integer $instruction Identifiant de l'instruction à instancier.
9703     * @return mixed Identifiant de l'instruction recherchée ou false.
9704     */
9705 softime 11418 public function get_related_instructions_next($next_type = 'retour_signature', $instruction = null) {
9706     if (in_array($next_type, array('retour_signature', 'retour_ar', 'suivant_tacite', )) === false) {
9707     return false;
9708     }
9709     $result = array();
9710     $evenements = array();
9711     if ($instruction === null) {
9712     $instruction = $this->getVal($this->clePrimaire);
9713     $evenement = $this->getVal('evenement');
9714     $dossier = $this->getVal('dossier');
9715     } else {
9716     $inst = $this->f->get_inst__om_dbform(array(
9717     "obj" => "instruction",
9718     "idx" => $instruction,
9719     ));
9720     $evenement = $inst->getVal('evenement');
9721     $dossier = $inst->getVal('dossier');
9722     }
9723 softime 13528 // Récupération de l'identifiant de l'événement paramétré comme suivant
9724     // sur l'instruction instanciée
9725 softime 13137 $qres = $this->f->get_one_result_from_db_query(
9726     sprintf(
9727     'SELECT
9728     evenement_%3$s
9729     FROM
9730     %1$sevenement
9731     WHERE
9732     evenement = %2$s',
9733     DB_PREFIXE,
9734     intval($evenement),
9735     $next_type
9736     ),
9737     array(
9738     "origin" => __METHOD__,
9739     "force_return" => true,
9740     )
9741 softime 11418 );
9742 softime 13137 if ($qres["code"] !== "OK") {
9743 softime 11418 return false;
9744     }
9745 softime 13137 $ev_next = $qres["result"];
9746 softime 13528 // Récupération de l'instruction dans le dossier utilisant l'événement
9747     // suivant identifié dans la requête précédente
9748     $qres = $this->f->get_one_result_from_db_query(
9749 softime 13137 sprintf(
9750     'SELECT
9751     MAX(instruction.instruction) as instruction
9752     FROM
9753     %1$sinstruction
9754     WHERE
9755     dossier = \'%3$s\'
9756     AND evenement = %2$s',
9757     DB_PREFIXE,
9758     intval($ev_next),
9759 softime 14064 $this->f->db->escapeSimple($dossier)
9760 softime 13137 ),
9761     array(
9762     "origin" => __METHOD__,
9763     "force_return" => true,
9764     )
9765 softime 11418 );
9766 softime 13137 if ($qres["code"] !== "OK") {
9767 softime 11418 return false;
9768     }
9769 softime 13137 return $qres["result"];
9770 softime 11418 }
9771    
9772 softime 10573 public function get_related_instructions($instruction = null) {
9773     $result = array();
9774     $evenements = array();
9775     if ($instruction === null) {
9776     $instruction = $this->getVal($this->clePrimaire);
9777     $evenement = $this->getVal('evenement');
9778     $dossier = $this->getVal('dossier');
9779     } else {
9780     $inst = $this->f->get_inst__om_dbform(array(
9781     "obj" => "instruction",
9782     "idx" => $instruction,
9783     ));
9784     $evenement = $inst->getVal('evenement');
9785     $dossier = $inst->getVal('dossier');
9786     }
9787     //
9788 softime 13137 $qres = $this->f->get_one_result_from_db_query(
9789     sprintf(
9790     'SELECT
9791     evenement
9792     FROM
9793     %1$sevenement
9794     WHERE
9795     evenement_retour_ar = %2$s
9796     OR evenement_retour_signature = %2$s',
9797     DB_PREFIXE,
9798     intval($evenement)
9799     ),
9800     array(
9801     "origin" => __METHOD__,
9802     "force_return" => true,
9803     )
9804 softime 10573 );
9805 softime 13137 if ($qres["code"] !== "OK") {
9806 softime 10573 return false;
9807     }
9808 softime 13137 $ev_parent = $qres["result"];
9809 softime 10573 //
9810 softime 13137 $qres = $this->f->get_one_result_from_db_query(
9811     sprintf(
9812     'SELECT
9813     MAX(instruction.instruction) as instruction
9814     FROM
9815     %1$sinstruction
9816     WHERE
9817     dossier = \'%3$s\'
9818     AND evenement = %2$s',
9819     DB_PREFIXE,
9820     intval($ev_parent),
9821     $this->f->db->escapeSimple($dossier)
9822     ),
9823     array(
9824     "origin" => __METHOD__,
9825     "force_return" => true,
9826     )
9827 softime 10573 );
9828 softime 13137 if ($qres["code"] !== "OK") {
9829 softime 10573 return false;
9830     }
9831 softime 13137 $result[] = $qres["result"];
9832 softime 10573 //
9833 softime 13137 $qres = $this->f->get_one_result_from_db_query(
9834     sprintf(
9835     'SELECT
9836     evenement_retour_ar
9837     FROM
9838     %1$sevenement
9839     WHERE
9840     evenement = %2$s
9841     AND evenement_retour_ar != %3$s',
9842     DB_PREFIXE,
9843     intval($ev_parent),
9844     intval($evenement)
9845     ),
9846     array(
9847     "origin" => __METHOD__,
9848     "force_return" => true,
9849     )
9850 softime 10573 );
9851 softime 13137 if ($qres["code"] !== "OK") {
9852 softime 10573 return false;
9853     }
9854 softime 13137 $evenements[] = $qres["result"];
9855 softime 10573 //
9856 softime 13137 $qres = $this->f->get_one_result_from_db_query(
9857     sprintf(
9858     'SELECT
9859     evenement_retour_signature
9860     FROM
9861     %1$sevenement
9862     WHERE
9863     evenement = %2$s
9864     AND evenement_retour_signature != %3$s
9865     ',
9866     DB_PREFIXE,
9867     intval($ev_parent),
9868     intval($evenement)
9869     ),
9870     array(
9871     "origin" => __METHOD__,
9872     "force_return" => true,
9873     )
9874 softime 10573 );
9875 softime 13137 if ($qres["code"] !== "OK") {
9876 softime 10573 return false;
9877     }
9878 softime 13137 $evenements[] = $qres["result"];
9879 softime 10573 foreach ($evenements as $value) {
9880     if ($value !== null) {
9881 softime 13137 $qres = $this->f->get_one_result_from_db_query(
9882     sprintf(
9883     'SELECT
9884     MAX(instruction.instruction) as instruction
9885     FROM
9886     %1$sinstruction
9887     WHERE
9888     dossier = \'%3$s\'
9889     AND evenement = %2$s',
9890     DB_PREFIXE,
9891     intval($value),
9892     $this->f->db->escapeSimple($dossier)
9893     ),
9894     array(
9895     "origin" => __METHOD__,
9896     "force_return" => true,
9897     )
9898 softime 10573 );
9899 softime 13137 if ($qres["code"] !== "OK") {
9900 softime 10573 return false;
9901     }
9902 softime 13137 $result[] = $qres["result"];
9903 softime 10573 }
9904     }
9905     return $result;
9906     }
9907    
9908     protected function getDocumentType($champ = null) {
9909     $evenementId = $this->getVal('evenement');
9910     if (! empty($evenementId)) {
9911     $evenement = $this->f->findObjectById('evenement', $evenementId);
9912     if (! empty($evenement)) {
9913     return __("Instruction").':'.$evenement->getVal('libelle');
9914     }
9915     }
9916     return parent::getDocumentType();
9917     }
9918    
9919 softime 10808 /**
9920     * Récupère à l'aide d'une requête sql la liste des demandeurs
9921     * pouvant être notifié. C'est à dire les demandeurs acceptant
9922     * les notifications et pour lesquels une adresse mail existe.
9923     *
9924     * Dans le cas, d'une notification pour le portail citoyen, seul
9925     * le pétitionnaire principal doit être notifier et uniquement si
9926     * il a une adress mail et qu'il accepte les notifications.
9927     *
9928     * @param string identifiant du dossier
9929     * @param boolean true si il faut récupérer la liste des demandeurs notifiable
9930     * pour une notification de categorie portail
9931     * @return array liste des demandeurs pouvant être notifié
9932     */
9933     protected function get_demandeurs_notifiable($idDossier = null, $portail = false) {
9934     if ($idDossier === null) {
9935     $idDossier = $this->getVal('dossier');
9936     }
9937     // Ajoute une condition sur le where pour ne récupérer que le pétitionnaire principal
9938     // pour une notification depuis le portail citoyen
9939     $sqlPetitionnairePrincipal = '';
9940 softime 12124 // Gestion des champs nécessaires pour la notification d'un demandeur
9941     $condition_demandeur = "AND demandeur.notification = 't'
9942     AND demandeur.courriel IS NOT NULL";
9943 softime 10808 if ($portail === true) {
9944     $sqlPetitionnairePrincipal = 'AND lien_dossier_demandeur.petitionnaire_principal = true';
9945 softime 12124 $condition_demandeur = "AND (
9946     (notification = 't' AND courriel IS NOT NULL)
9947     OR demande.source_depot = 'portal'
9948     )";
9949 softime 10808 }
9950    
9951     $listeDemandeursNotifiable = array();
9952    
9953     // Requête de récupération des demandeurs
9954     $sql = sprintf(
9955     'SELECT
9956     demandeur.demandeur,
9957 softime 10869 CASE
9958     WHEN demandeur.qualite=\'particulier\'
9959     THEN TRIM(CONCAT(demandeur.particulier_nom, \' \', demandeur.particulier_prenom, \' \', demandeur.courriel))
9960     ELSE
9961     TRIM(CONCAT(demandeur.personne_morale_raison_sociale, \' \', demandeur.personne_morale_denomination, \' \', demandeur.courriel))
9962     END AS destinataire,
9963 softime 12124 demandeur.courriel,
9964     petitionnaire_principal
9965 softime 10808 FROM
9966     %1$sdossier
9967     INNER JOIN %1$slien_dossier_demandeur
9968     ON dossier.dossier = lien_dossier_demandeur.dossier
9969     INNER JOIN %1$sdemandeur
9970     ON lien_dossier_demandeur.demandeur = demandeur.demandeur
9971 softime 12124 -- Récupération de la plus ancienne demande associée au dossier (la demande
9972     -- de création du dossier)
9973     INNER JOIN (
9974     SELECT
9975     demande,
9976     dossier_instruction,
9977     source_depot
9978     FROM
9979     %1$sdemande
9980     WHERE
9981     dossier_instruction = \'%2$s\'
9982     ORDER BY
9983     demande ASC
9984     LIMIT 1
9985     ) as demande
9986     ON dossier.dossier = demande.dossier_instruction
9987 softime 10808 WHERE
9988 softime 12124 dossier.dossier = \'%2$s\'
9989     %3$s
9990     %4$s',
9991 softime 10808 DB_PREFIXE,
9992     $idDossier,
9993 softime 12124 $condition_demandeur,
9994 softime 10808 $sqlPetitionnairePrincipal
9995     );
9996     $res = $this->f->db->query($sql);
9997     $this->f->addToLog(__METHOD__."(): db->query(\"".$sql."\")", VERBOSE_MODE);
9998     $this->f->isDatabaseError($res);
9999     // Récupération des infos des demandeurs et stockage dans un tableau
10000     // ayant pour clé les id des demandeurs
10001     while($row = $res->fetchrow(DB_FETCHMODE_ASSOC)) {
10002 softime 10869 $listeDemandeursNotifiable[$row['demandeur']] = $row;
10003 softime 10808 }
10004    
10005     return $listeDemandeursNotifiable;
10006     }
10007    
10008     /**
10009     * Renvoie la liste des notifications liées à l'instruction
10010     *
10011     * @param integer id de l'instruction dont on cherche les notifications
10012     * @return array liste des instruction_notification liés à l'instruction
10013     */
10014 softime 12124 public function get_instruction_notification($id_instruction, $typeNotification = null, $nonLieTache = false) {
10015 softime 11585 $whereTypeTache = '';
10016 softime 12124 $sqlTaskNull = '';
10017     // Défini si on veux que la requête récupère également les notifications qui n'ont pas
10018     // de tâches associées. C'est le cas pour les notifications de demandeurs lorsque la
10019     // notification du demandeur principal n'a pas pu être envoyée à cause d'un mauvais
10020     // paramétrage
10021     if(is_bool($nonLieTache) && $nonLieTache === true) {
10022     $sqlTaskNull = 'OR task.type is null';
10023     }
10024 softime 11585 if ($typeNotification != null) {
10025     if (is_array($typeNotification)) {
10026     $whereTypeTache = sprintf(
10027 softime 12124 'AND (task.type IN (%1$s) %2$s)',
10028     "'".implode("', '", $typeNotification)."'",
10029     $sqlTaskNull
10030 softime 11585 );
10031     } else {
10032     $whereTypeTache = sprintf(
10033 softime 12124 'AND (task.type = \'%1$s\' %2$s)',
10034     $typeNotification,
10035     $sqlTaskNull
10036 softime 11585 );
10037     }
10038     }
10039 softime 10808 $listeInstrNotif = array();
10040     $sql = sprintf('
10041     SELECT
10042     instruction_notification.instruction_notification
10043     FROM
10044     %1$sinstruction_notification
10045 softime 11585 LEFT JOIN %1$stask
10046     ON instruction_notification.instruction_notification::CHARACTER VARYING = task.object_id
10047 softime 10808 WHERE
10048 softime 11585 instruction = %2$s
10049     %3$s',
10050 softime 10808 DB_PREFIXE,
10051 softime 14064 intval($id_instruction),
10052 softime 11585 $whereTypeTache
10053 softime 10808 );
10054     $res = $this->f->db->query($sql);
10055     $this->f->addToLog(__METHOD__."(): db->query(\"".$sql."\")", VERBOSE_MODE);
10056     $this->f->isDatabaseError($res);
10057     while ($row = $res->fetchrow(DB_FETCHMODE_ASSOC)) {
10058     $listeInstrNotif[] = $row['instruction_notification'];
10059     }
10060     return $listeInstrNotif;
10061     }
10062    
10063     /**
10064     * Crée une clé d'accès unique permettant à un utilisateur
10065     * anonyme de récupérer le document.
10066     *
10067     * @return string clé d'accès du document
10068     */
10069     protected function getCleAccesDocument() {
10070 softime 10869 // Initialisation d'un tableau
10071     $number_list = array();
10072    
10073     // Génération aléatoire d'un nombre sur 4 caractères, 4 fois
10074     for ($i = 0; $i < 4; $i++) {
10075     $number_list[] = str_pad(mt_rand(0, 9999), 4, 0, STR_PAD_LEFT);
10076     }
10077    
10078     // Transformation en chaîne tout en séparant les nombres par un "-"
10079     $result = implode('-', $number_list);
10080    
10081     // Vérifie si la clé existe déjà et si c'est le cas génére une nouvelle clé
10082     if ($this->getUidDocumentInstructionWithKey($result) != null) {
10083     return $this->getCleAccesDocument();
10084     }
10085    
10086     //
10087     return $result;
10088 softime 10808 }
10089    
10090     /**
10091 softime 10869 * Récupère une clé et renvoie l'uid du document liée à cette
10092     * clé. Si la clé n'existe pas renvoie null.
10093     *
10094     * @param string $cleGen clé dont on cherche l'instruction
10095     * @return integer|null
10096     */
10097     protected function getUidDocumentInstructionWithKey($cleGen) {
10098 softime 14064 $qres = $this->f->get_one_result_from_db_query(
10099     sprintf(
10100     'SELECT
10101     instruction.om_fichier_instruction
10102     FROM
10103     %1$sinstruction_notification_document
10104     LEFT JOIN %1$sinstruction
10105     ON instruction_notification_document.instruction = instruction.instruction
10106     WHERE
10107     instruction_notification_document.cle = \'%2$s\'',
10108     DB_PREFIXE,
10109     $this->f->db->escapeSimple($cleGen)
10110     ),
10111     array(
10112     "origin" => __METHOD__,
10113     )
10114 softime 10869 );
10115 softime 14064
10116     return $qres['result'];
10117 softime 10869 }
10118    
10119     /**
10120     * Récupère une clé, fait une requête pour récupérer l'id de la notification liée a cette clé.
10121     * Récupère l'instance de instruction_notification dont l'id a été récupéré et la renvoie.
10122     *
10123     * @param string $cleGen
10124     * @return instruction_notification
10125     */
10126     protected function getInstanceNotificationWithKey($key) {
10127 softime 14064 $qres = $this->f->get_one_result_from_db_query(
10128     sprintf(
10129     'SELECT
10130     instruction_notification
10131     FROM
10132     %1$sinstruction_notification_document
10133     WHERE
10134     cle = \'%2$s\'',
10135     DB_PREFIXE,
10136     $this->f->db->escapeSimple($key)
10137     ),
10138     array(
10139     "origin" => __METHOD__,
10140     )
10141 softime 10869 );
10142    
10143     // Récupération de l'instance de notification
10144     $instNotif = $this->f->get_inst__om_dbform(array(
10145     "obj" => "instruction_notification",
10146 softime 14064 "idx" => $qres['result'],
10147 softime 10869 ));
10148     return $instNotif;
10149     }
10150    
10151    
10152     /**
10153 softime 10808 * Affiche la page de téléchargement du document de la notification.
10154     *
10155     * @param boolean $content_only Affiche le contenu seulement.
10156     *
10157     * @return void
10158     */
10159 softime 10869 public function view_telecharger_document_anonym() {
10160 softime 10808 // Par défaut on considère qu'on va afficher le formulaire
10161     $idx = 0;
10162     // Flag d'erreur
10163     $error = false;
10164     // Message d'erreur
10165     $message = '';
10166    
10167 softime 10869 // Paramètres GET : récupération de la clé d'accès
10168     $cle_acces_document = $this->f->get_submitted_get_value('key');
10169 softime 10808 $cle_acces_document = $this->f->db->escapeSimple($cle_acces_document);
10170 softime 10869 // Vérification de l'existence de la clé et récupération de l'uid du fichier
10171     $uidFichier = $this->getUidDocumentInstructionWithKey($cle_acces_document);
10172     if ($uidFichier != null) {
10173     // Récupération du document
10174     $file = $this->f->storage->get($uidFichier);
10175 softime 10808
10176 softime 10869 // Headers
10177     header("Cache-Control: no-cache, must-revalidate"); // HTTP/1.1
10178     header("Expires: Sat, 26 Jul 1997 05:00:00 GMT"); // Date dans le passé
10179     header("Content-Type: ".$file['metadata']['mimetype']);
10180     header("Accept-Ranges: bytes");
10181     header("Content-Disposition: inline; filename=\"".$file['metadata']['filename']."\";" );
10182     // Affichage du document
10183     echo $file['file_content'];
10184 softime 10808
10185 softime 10869 // Récupération de la date de premier accès et maj du suivi uniquement
10186     // si la date de 1er accès n'a pas encore été remplis
10187     $inst_notif = $this->getInstanceNotificationWithKey($cle_acces_document);
10188     if ($inst_notif->getVal('date_premier_acces') == null ||
10189     $inst_notif->getVal('date_premier_acces') == '') {
10190     $notif_val = array();
10191     foreach ($inst_notif->champs as $champ) {
10192     $notif_val[$champ] = $inst_notif->getVal($champ);
10193     }
10194     $notif_val['date_premier_acces'] = date("d/m/Y H:i:s");
10195     $notif_val['statut'] = 'vu';
10196     $notif_val['commentaire'] = 'Le document a été vu';
10197     $suivi_notif = $inst_notif->modifier($notif_val);
10198 softime 10808 }
10199    
10200     } else {
10201 softime 10869 // Page vide 404
10202     printf('Ressource inexistante');
10203     header('HTTP/1.0 404 Not Found');
10204 softime 10808 }
10205     }
10206    
10207 softime 11228 /**
10208     * Récupère le titre du document envoyé au parapheur
10209     */
10210 softime 10808 protected function getDocumentTitre($champ = null) {
10211     $title = $this->getTitle();
10212     $dossier = $this->getDossier();
10213     return $dossier.' '.$title;
10214     }
10215    
10216 softime 10869 /**
10217 softime 11228 * Compose le nom du document à transmettre au parapheur.
10218     * Le nom ets composé de cette manière :
10219     * instruction_xxx_libelle_de_la_lettre_type_associee
10220     * ou xxx correspond au numéro de l'instruction
10221     */
10222     protected function getDocumentLibelle() {
10223     // Récupère le champ instruction
10224     $instruction = $this->getVal("instruction");
10225    
10226     // Requête sql servant à récupérer le titre du document
10227     // TO_CHAR() introduit un espace avant l'affichage du nombre
10228     // comme les espaces sont remplacé par des '_' dans le retour de la fonction
10229     // il n'est pas nécessaire de mettre un '_' après le mot instruction.
10230 softime 14064 $documentLibelle = $this->f->get_one_result_from_db_query(
10231     sprintf(
10232     'SELECT
10233     CONCAT(
10234     \'instruction\',
10235     TO_CHAR(instruction.instruction, \'000\'),
10236     \'_\',
10237     LOWER(om_lettretype.libelle)
10238     ) AS nom_fichier
10239     FROM
10240     %1$sinstruction
10241     LEFT JOIN %1$som_lettretype
10242     ON om_lettretype.id = instruction.lettretype
10243     WHERE
10244     instruction = %2$d',
10245     DB_PREFIXE,
10246     intval($instruction)
10247     ),
10248     array(
10249     "origin" => __METHOD__,
10250     )
10251 softime 11228 );
10252    
10253 softime 14064 $documentLibelle = $documentLibelle['result'];
10254    
10255 softime 11228 // Transforamtion des ' ' en '_', des accents en lettres sans accents et des
10256     // caractères spéciaux en '_'
10257     // La méthode normalize_string est utilisé pour gérer les accents
10258     $documentLibelle = $this->f->normalize_string($documentLibelle);
10259     // TODO : comparer cette liste et celle de la méthode normalize_string
10260     // pour éviter les doublons + vérifier qu'il n'y a pas de doublons dans cette
10261     // liste
10262     $invalid = array('Œ'=>'oe', 'œ'=>'oe', 'Ÿ'=>'y', 'ü'=>'u',
10263     '¢' => '_', 'ß' => '_', '¥' => '_', '£' => '_', '™' => '_', '©' => '_',
10264     '®' => '_', 'ª' => '_', '×' => '_', '÷' => '_', '±' => '_', '²' => '_',
10265     '³' => '_', '¼' => '_', '½' => '_', '¾' => '_', 'µ' => '_', '¿' => '_',
10266     '¶' => '_', '·' => '_', '¸' => '_', 'º' => '_', '°' => '_', '¯' => '_',
10267     '§' => '_', '…' => '_', '¤' => '_', '¦' => '_', '≠' => '_', '¬' => '_',
10268     'ˆ' => '_', '¨' => '_', '‰' => '_', '¤' => '_', '€' => '_', '$' => '_',
10269     '«' => '_', '»' => '_', '‹' => '_', '›' => '_', 'ƒ' => '_', '¥' => '_',
10270     '‘‘' => '_', '‚' => '_', '!' => '_', '¡' => '_', '¢' => '_', '£' => '_',
10271     '?' => '_', '[' => '_', ']' => '_', '´' => '_', '`' => '_', '^' => '_',
10272     '~' => '_', '˜' => '_', '#' => '_', '*' => '_', '.' => '_', ':' => '_',
10273     ';' => '_', '•' => '_', '¯' => '_', '‾' => '_', '–' => '_', '–' => '_',
10274     '—' => '_', '_' => '_', '|' => '_', '¦‌' => '_', '‡' => '_', '§' => '_',
10275     '¶' => '_', '©' => '_', '®' => '_', '™' => '_', '&' => '_', '@' => '_',
10276     '/' => '_', '\\' => '_', '◊' => '_', '♠' => '_', '♣' => '_', '♥' => '_',
10277     '♦' => '_', '←' => '_', '↑' => '_', '→' => '_', '↓' => '_', '↔' => '_',
10278     '°' => '_', 'µ' => '_', '<' => '_', '>' => '_', '≤' => '_', '≥' => '_',
10279     '=' => '_', '≈' => '_', '≠' => '_', '≡' => '_', '±' => '_', '−' => '_',
10280     '+' => '_', '×' => '_', '÷' => '_', '⁄' => '_', '%' => '_', '‰' => '_',
10281     '¼' => '_', '½' => '_', '¾' => '_', '¹' => '_', '²' => '_', '³' => '_',
10282     '' => '_', 'º' => '_', 'ª' => '_', 'ƒ' => '_', '′' => '_', '″' => '_',
10283     '∂' => '_', '∏' => '_', '∑' => '_', '√' => '_', '∞' => '_', '¬' => '_',
10284     '∩' => '_', '∫' => '_', 'α' => '_', 'Α' => '_', 'β' => '_', 'Β' => '_',
10285     'γ' => '_', 'Γ' => '_', 'δ' => '_', 'Δ' => '_', 'ε' => '_', 'Ε' => '_',
10286     'ζ' => '_', 'Ζ' => '_', 'η' => '_', 'Η' => '_', 'θ' => '_', 'Θ' => '_',
10287     'ι' => '_', 'Ι' => '_', 'κ' => '_', 'Κ' => '_', 'λ' => '_', 'Λ' => '_',
10288     'μ' => '_', 'Μ' => '_', 'ν' => '_', 'Ν' => '_', 'ξ' => '_', 'Ξ' => '_',
10289     'ο' => '_', 'Ο' => '_', 'π' => '_', 'Π' => '_', 'ρ' => '_', 'Ρ' => '_',
10290     'σ' => '_', 'ς' => '_', 'Σ' => '_', 'τ' => '_', 'Τ' => '_', 'υ' => '_',
10291     'Υ' => '_', 'φ' => '_', 'Φ' => '_', 'χ' => '_', 'Χ' => '_', 'ψ' => '_',
10292     'Ψ' => '_', 'ω' => '_', 'Ω' => '_', ',' => '_', ' ' => '_'
10293     );
10294    
10295     return str_replace(array_keys($invalid), array_values($invalid), $documentLibelle);
10296     }
10297    
10298     /**
10299 softime 10869 * Surcharge permettant de ne pas afficher le fil d'Ariane dans
10300     * l'overlay de notification des demandeurs.
10301     */
10302     function getSubFormTitle($ent) {
10303 softime 11876 $actionSansPath = array('411', '420', '430');
10304     if (in_array($this->getParameter('maj'), $actionSansPath)) {
10305 softime 10869 return '';
10306     }
10307     return parent::getSubFormTitle($ent);
10308     }
10309 softime 13137
10310     /**
10311     * Traitement de la notification automatique des tiers consulté.
10312     *
10313     * Récupère la liste des adresses mails des tiers notifiables. Pour chaque adresses
10314     * récupérées ajoute une notification et une tâche de notification par mail.
10315     * La création de la tâche de notification par mail déclenchera l'envoi du mail
10316     * et la mise à jour du suivi.
10317     *
10318     * Les tiers notifiables sont ceux :
10319     * - n’ayant pas un ID PLAT’AU correspondant à l’ID PLAT’AU du service consultant
10320     * - ayant une habilitation dont le type est listé dans les paramètres de
10321     * notification de l’événement,
10322     * - intervenant sur la commune ou le département du dossier
10323     * - ayant au moins une adresse mail valide
10324     *
10325     * @param evenement instance de l'événement associée à l'instruction
10326     * @param dossier instance du dossier de l'instruction
10327     * @return boolean indique si le traitement à réussi
10328     */
10329     protected function traitement_notification_automatique_tiers_consulte($evenement, $dossier) {
10330     // Récupération de l'identifiant plat'au du service consultant
10331     $consultationEntrante = $dossier->get_inst_consultation_entrante();
10332     // Récupération de la liste des types d'habilitations autorisées pour
10333     // cette notification
10334     $typesHabilitationsNotifiable = $evenement->get_types_habilitation_notifiable();
10335     // Récupération du département et de la commune du dossier
10336     $commune = $dossier->getVal('commune');
10337     // Le département est récupéré à partir de la commune du dossier donc si la
10338     // commune n'a pas pu être récupéré on ne récupère pas non plus le département.
10339     $idDepartement = null;
10340     if (! empty($commune)) {
10341     $departement = $dossier->get_inst_departement_dossier();
10342     $idDepartement = $departement->getVal($departement->clePrimaire);
10343     }
10344     // Récupération des courriels des tiers notifiables
10345     $tiersANotifier = $this->get_courriels_tiers_notifiable(
10346     $typesHabilitationsNotifiable,
10347     $consultationEntrante->getVal('service_consultant_id'),
10348     $commune,
10349     $idDepartement
10350     );
10351     // Traitement de chacune des listes de diffusion pour extraire les
10352     // courriels, vérifier la validité des courriels et envoyer la
10353     // notification
10354     $notificationSend = false;
10355     if (empty($tiersANotifier)) {
10356     $this->addToLog(
10357     sprintf(
10358     '%s() : %s %s : ',
10359     __METHOD__,
10360     __("La récupération des tiers à échoué."),
10361     __('Paramétrage'),
10362     var_export(
10363     array(
10364     'types_habilitations_notifiable' => $typesHabilitationsNotifiable,
10365     'service_consultant' => $consultationEntrante->getVal('service_consultant_id'),
10366     'id_commune' => $commune,
10367     'id_departement' => $idDepartement
10368     ),
10369     true
10370     )
10371     ),
10372     DEBUG_MODE
10373     );
10374     return false;
10375     }
10376     foreach($tiersANotifier as $tierANotifier) {
10377     // Découpe la liste de diffusion pour stocker les adresses mails
10378     // des tiers dans un tableau
10379     $courriels =
10380     array_filter(
10381     array_map(
10382     'trim',
10383     preg_split("/\r\n|\n|\r/", $tierANotifier['liste_diffusion'])));
10384    
10385     foreach ($courriels as $courriel) {
10386     // Pour chaque adresse mail vérifie si l'adresse est valide
10387     if (! $this->f->checkValidEmailAddress($courriel)) {
10388     continue;
10389     }
10390     $destinataire = array(
10391     'destinataire' => $tierANotifier['libelle'].' : '.$courriel,
10392     'courriel' => $courriel
10393     );
10394     // Si l'adresse est valide ajoute une nouvelle notification
10395     // et une tâche d'envoi de mails
10396     $idNotif = $this->ajouter_notification(
10397     $this->getVal($this->clePrimaire),
10398     $this->f->get_connected_user_login_name(),
10399     $destinataire,
10400     $this->get_dossier_instruction_om_collectivite(),
10401     array(),
10402     true
10403     );
10404     if ($idNotif === false) {
10405     $this->addToLog(
10406     __METHOD__.
10407     __("L'ajout de la notification a échoué."),
10408     DEBUG_MODE
10409     );
10410     return false;
10411     }
10412     // Création de la tache en lui donnant l'id de la notification
10413     $notification_by_task = $this->notification_by_task(
10414     $idNotif,
10415     $dossier->getVal('dossier'),
10416     'mail',
10417     'notification_tiers_consulte'
10418     );
10419     if ($notification_by_task === false) {
10420     $this->addToLog(
10421     __METHOD__.
10422     __("L'ajout de la tâche de notification a échoué."),
10423     DEBUG_MODE
10424     );
10425     $this->addToMessage(
10426     __("Erreur lors de la génération de la notification au(x) pétitionnaire(s).")
10427     );
10428     return false;
10429     }
10430     $notificationSend = true;
10431     }
10432     }
10433     // Si aucune notification n'a été envoyé car il n'y a pas de courriels
10434     // valide, affiche un message dans les logs pour avoir un suivi.
10435     if (! $notificationSend) {
10436     $this->addToLog(
10437     sprintf(
10438     '%s %s : %s %s : %s',
10439     __METHOD__,
10440     __("Il n'y a pas de tiers notifiable pour l'instruction"),
10441     $evenement->getVal('libelle'),
10442     __("du dossier"),
10443     $this->getVal('dossier')
10444     ),
10445     DEBUG_MODE
10446     );
10447     }
10448     return true;
10449     }
10450    
10451     /**
10452     * Récupère, à l'aide d'une requête, la liste de diffusion des tiers
10453     * respectant les conditions suvantes :
10454     * - le tiers consulté dois accepté les notifications
10455     * - la liste de diffusion ne dois pas être vide
10456     * - l'uid du tiers consulté ne dois pas être celui passé en paramètre
10457     * si pas d'uid passé en paramètre alors on ne filtre pas selon l'uid
10458     * du tiers
10459     * - le type d'habilitation des tiers dois appartenir à la liste
10460     * fournie en paramètre
10461     * - le tiers dois être associé à la commune ou au département passé
10462     * en paramètre
10463     *
10464     * @param array $typesHabilitations tableau contenant la liste des types d'habilitation
10465     * pouvant être notifiée
10466     * @param integer $idPlautau uid de l'acteur plat'au du dossier qui ne dois pas être notifié
10467     * @param integer $commune identifiant de la commune du dossier
10468     * @param integer $departement identifiant du département du dossier
10469     *
10470     * @return array listes de diffusion des tiers notifiable
10471     */
10472     protected function get_courriels_tiers_notifiable(array $typesHabilitations, $idPlatau, $commune, $departement) {
10473     // Si paramètre non renseigné alors ne renvoie rien
10474     if (empty($typesHabilitations) || empty($commune) || empty($departement)) {
10475     return false;
10476     }
10477     // Si il n'y a pas d'acteur associé au dossier alors on ne filtre pas sur l'uid de l'acteur
10478     $filtreServiceConsulteDI = '';
10479     if (! empty($idPlatau)) {
10480     $filtreServiceConsulteDI = sprintf(
10481 softime 14064 "-- Filtre les tiers ayant une ligne correspondante a l uid platau du service
10482     -- en charge du dossier
10483     AND (tiers_consulte.uid_platau_acteur !~ ('\y' || '%s' || '\y')
10484     OR tiers_consulte.uid_platau_acteur IS NULL)",
10485 softime 13137 $this->f->db->escapeSimple($idPlatau)
10486     );
10487     }
10488     $rst = $this->f->get_all_results_from_db_query(
10489     sprintf(
10490     'SELECT
10491 softime 14064 -- Tiers notifiables lié à la commune du dossier
10492 softime 13137 tiers_consulte.liste_diffusion,
10493     tiers_consulte.libelle
10494     FROM
10495     %1$shabilitation_tiers_consulte
10496     LEFT JOIN %1$stiers_consulte
10497     ON habilitation_tiers_consulte.tiers_consulte = tiers_consulte.tiers_consulte
10498     LEFT JOIN %1$slien_habilitation_tiers_consulte_commune
10499     ON habilitation_tiers_consulte.habilitation_tiers_consulte = lien_habilitation_tiers_consulte_commune.habilitation_tiers_consulte
10500 softime 14064 -- Conservation uniquement des tiers acteur de dossiers
10501     JOIN %1$slien_dossier_tiers
10502     ON tiers_consulte.tiers_consulte = lien_dossier_tiers.tiers
10503     WHERE
10504     tiers_consulte.accepte_notification_email IS TRUE
10505     AND tiers_consulte.liste_diffusion IS NOT NULL
10506     %3$s
10507     AND habilitation_tiers_consulte.type_habilitation_tiers_consulte IN (%2$s)
10508     AND lien_habilitation_tiers_consulte_commune.commune = %4$d
10509     -- Filtre sur les tiers acteur du dossier
10510     AND lien_dossier_tiers.dossier = \'%6$s\'
10511     UNION
10512     SELECT
10513     -- Tiers notifiables lié au département du dossier
10514     tiers_consulte.liste_diffusion,
10515     tiers_consulte.libelle
10516     FROM
10517     %1$shabilitation_tiers_consulte
10518     LEFT JOIN %1$stiers_consulte
10519     ON habilitation_tiers_consulte.tiers_consulte = tiers_consulte.tiers_consulte
10520 softime 13137 LEFT JOIN %1$slien_habilitation_tiers_consulte_departement
10521     ON habilitation_tiers_consulte.habilitation_tiers_consulte = lien_habilitation_tiers_consulte_departement.habilitation_tiers_consulte
10522 softime 14064 -- Conservation uniquement des tiers acteur de dossiers
10523     JOIN %1$slien_dossier_tiers
10524     ON tiers_consulte.tiers_consulte = lien_dossier_tiers.tiers
10525 softime 13137 WHERE
10526     tiers_consulte.accepte_notification_email IS TRUE
10527     AND tiers_consulte.liste_diffusion IS NOT NULL
10528     %3$s
10529     AND habilitation_tiers_consulte.type_habilitation_tiers_consulte IN (%2$s)
10530 softime 14064 AND lien_habilitation_tiers_consulte_departement.departement = %5$d
10531     -- Filtre sur les tiers acteur du dossier
10532     AND lien_dossier_tiers.dossier = \'%6$s\'',
10533 softime 13137 DB_PREFIXE,
10534     implode(', ', $typesHabilitations),
10535     $filtreServiceConsulteDI,
10536     intval($commune),
10537 softime 14064 intval($departement),
10538     $this->f->db->escapeSimple($this->getVal('dossier'))
10539 softime 13137 ),
10540     array(
10541     "origin" => __METHOD__
10542     )
10543     );
10544 softime 14064 // Faire un order by sur un union ne fonctionne pas. A la place
10545     // c'est le tableau des résultats qui est ordonné.
10546     usort($rst['result'], function($a, $b) {
10547     return strcmp($a['libelle'], $b['libelle']);
10548     });
10549 softime 13137 return $rst['result'];
10550     }
10551     }

Properties

Name Value
svn:keywords "Id"

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26