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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 15973 - (hide annotations)
Thu Oct 26 18:29:29 2023 UTC (15 months, 1 week ago) by softime
File size: 489203 byte(s)
chore(branch): fusion de la branche d'intégration 6.2.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 15973 "is_not_signed",
191 softime 6565 ),
192 mbroquet 3730 );
193    
194 softime 13137 // ACTION - 115 - Modification d'un document généré par une instruction
195 softime 12847 // Permet à un instructeur de modifier un document généré par une instruction
196     $this->class_actions[115] = array(
197     "identifier" => "modale_selection_document_signe",
198     "portlet" => array(
199     "type" => "action-self",
200     "libelle" => _("Remplacer par le document signé"),
201     "order" => 115,
202     "class" => "selection-document-signé",
203     ),
204     "view" => "view_modale_selection_document_signe",
205     "permission_suffix" => "selection_document_signe",
206     "condition" => array(
207     "is_finalized",
208     "is_not_date_retour_signature_set",
209     ),
210     );
211    
212 mbroquet 3730 // ACTION - 120 - edition
213     // Affiche l'édition
214     $this->class_actions[120] = array(
215     "identifier" => "edition",
216     "portlet" => array(
217     "type" => "action-blank",
218     "libelle" => _("Edition"),
219     "order" => 100,
220     "class" => "pdf-16",
221     ),
222     "view" => "view_edition",
223 softime 6565 "condition" => array("has_an_edition", "can_user_access_dossier_contexte_modification"),
224 mbroquet 3730 "permission_suffix" => "om_fichier_instruction_telecharger",
225     );
226    
227     // ACTION - 125 - modifier_suivi
228     // Suivi des dates
229     $this->class_actions[125] = array(
230     "identifier" => "modifier_suivi",
231     "portlet" => array(
232     "type" => "action-self",
233     "libelle" => _("Suivi des dates"),
234     "order" => 125,
235     "class" => "suivi-dates-16",
236     ),
237     "crud" => "update",
238 softime 6565 "condition" => array("can_monitoring_dates", "can_user_access_dossier_contexte_modification"),
239 mbroquet 3730 "permission_suffix" => "modification_dates",
240     );
241    
242     // ACTION - 130 - bible
243     // Affiche la bible
244     $this->class_actions[130] = array(
245     "identifier" => "bible",
246     "view" => "view_bible",
247     "permission_suffix" => "modifier",
248     );
249    
250     // ACTION - 140 - bible_auto
251     // Active la bible automatique
252     $this->class_actions[140] = array(
253     "identifier" => "bible_auto",
254     "view" => "view_bible_auto",
255     "permission_suffix" => "modifier",
256     );
257    
258     // ACTION - 150 - suivi_bordereaux
259     // Imprimer un bordereau d'envoi
260     $this->class_actions[150] = array(
261     "identifier" => "suivi_bordereaux",
262     "view" => "view_suivi_bordereaux",
263     "permission_suffix" => "consulter",
264     );
265    
266     // ACTION - 160 - suivi_envoi_lettre_rar
267     // Imprimer un bordereau d'envoi
268     $this->class_actions[160] = array(
269     "identifier" => "suivi_envoi_lettre_rar",
270     "view" => "view_suivi_envoi_lettre_rar",
271     "permission_suffix" => "consulter",
272     );
273    
274     // ACTION - 170 - suivi_mise_a_jour_des_dates
275     // Mettre à jour les dates de l'instruction
276     $this->class_actions[170] = array(
277     "identifier" => "suivi_mise_a_jour_des_dates",
278     "view" => "view_suivi_mise_a_jour_des_dates",
279     "permission_suffix" => "consulter",
280     );
281    
282 softime 13528 // ACTION - 175 - edit_by_notification_task
283 softime 13137 // Action à utiliser lors de la mise à jour des instructions par notification
284     $this->class_actions[175] = array(
285 softime 13528 "identifier" => "edit_by_notification_task",
286 softime 13137 "view" => "formulaire",
287     "permission_suffix" => "modifier",
288     "crud" => "update",
289     );
290    
291 softime 14064 // ACTION - 176 - add_by_evenement_retour_after_notification_task
292     // Action à utiliser lors de l'ajout des instructions par événement suivant
293     // suite à une notification par tâche (donc notification dématerialisée)
294     $this->class_actions[176] = array(
295     "identifier" => "add_by_evenement_retour_after_notification_task",
296     "view" => "formulaire",
297     "permission_suffix" => "ajouter",
298     "crud" => "create",
299     );
300    
301 mbroquet 3730 // ACTION - 180 - pdf_lettre_rar
302 softime 8989 // Génère PDF sur bordereaux de lettres AR
303 mbroquet 3730 $this->class_actions[180] = array(
304     "identifier" => "pdf_lettre_rar",
305     "view" => "view_pdf_lettre_rar",
306     "permission_suffix" => "consulter",
307     );
308    
309     // ACTION - 190 - bordereau_envoi_maire
310     // Formulaire pour générer le bordereau d'envoi au maire
311     // Met à jour la date d'envoi à signature du maire
312     $this->class_actions[190] = array(
313     "identifier" => "bordereau_envoi_maire",
314     "view" => "view_bordereau_envoi_maire",
315     "permission_suffix" => "bordereau_envoi_maire",
316     );
317    
318     // ACTION - 200 - generate_bordereau_envoi_maire
319     // Génère PDF bordereau d'envoi au maire
320     $this->class_actions[200] = array(
321     "identifier" => "generate_bordereau_envoi_maire",
322     "view" => "view_generate_bordereau_envoi_maire",
323     "permission_suffix" => "bordereau_envoi_maire",
324     );
325 nmeucci 4108
326     // ACTION - 210 - notifier_commune
327     // Notifie la commune par mail d'un évément d'instruction finalisé
328     $this->class_actions[210] = array(
329     "identifier" => "notifier_commune",
330     "portlet" => array(
331     "type" => "action-direct-with-confirmation",
332     "libelle" => _("Notifier la commune par courriel"),
333     "order" => 210,
334     "class" => "notifier_commune-16",
335     ),
336     "view" => "formulaire",
337     "method" => "notifier_commune",
338     "permission_suffix" => "notifier_commune",
339 softime 6565 "condition" => array("is_notifiable", "can_user_access_dossier_contexte_modification"),
340 nmeucci 4108 );
341 nmeucci 4317
342     // ACTION - 220 - generate_suivi_bordereaux
343     // GénÚre PDF bordereaux
344     $this->class_actions[220] = array(
345     "identifier" => "generate_suivi_bordereaux",
346     "view" => "view_generate_suivi_bordereaux",
347 softime 6565 "permission_suffix" => "consulter",
348     );
349 softime 7521
350     // ACTION - 777 - pdf_temp
351     // Crée un PDF temporaire et affiche son contenu en base64
352     $this->class_actions[777] = array(
353     "identifier" => "pdf_temp",
354     "view" => "view_pdf_temp",
355     "permission_suffix" => "modifier",
356     "condition" => array("can_user_access_dossier_contexte_modification"),
357     );
358 softime 8593
359     // ACTION - 701
360     $this->class_actions[701] = array(
361     "identifier" => "enable-edition-integrale",
362     "portlet" => array(
363     "type" => "action-direct-with-confirmation",
364     "libelle" => _("Rédaction libre"),
365     "order" => 50,
366     "class" => "redac-libre-16",
367     ),
368     "view" => "formulaire",
369     "method" => "enable_edition_integrale",
370     "permission_suffix" => "modifier",
371     "condition" => array(
372     "is_editable",
373     "is_finalizable_without_bypass",
374     "can_user_access_dossier_contexte_modification",
375     "is_edition_integrale_not_enabled",
376     "is_option_redaction_libre_enabled",
377     "has_an_edition",
378     ),
379     );
380     // ACTION - 702
381     $this->class_actions[702] = array(
382     "identifier" => "disable-edition-integrale",
383     "portlet" => array(
384     "type" => "action-direct-with-confirmation",
385     "libelle" => _("Rédaction par compléments"),
386     "order" => 50,
387     "class" => "redac-complement-16",
388     ),
389     "view" => "formulaire",
390     "method" => "disable_edition_integrale",
391     "permission_suffix" => "modifier",
392     "condition" => array(
393     "is_editable",
394     "is_finalizable_without_bypass",
395     "can_user_access_dossier_contexte_modification",
396     "is_edition_integrale_enabled",
397     "is_option_redaction_libre_enabled",
398     "has_an_edition",
399     ),
400     );
401     // ACTION - 300 - evenement_has_an_edition_json
402     //
403     $this->class_actions[300] = array(
404     "identifier" => "evenement_has_an_edition_json",
405     "view" => "view_evenement_has_an_edition_json",
406     "permission_suffix" => "consulter",
407     );
408 softime 10573
409     // ACTION - 301 - evenement_has_a_commentaire
410     //
411     $this->class_actions[301] = array(
412     "identifier" => "evenement_has_a_commentaire_json",
413     "view" => "view_evenement_has_a_commentaire_json",
414     "permission_suffix" => "consulter",
415     );
416    
417     // ACTION - 400 - Envoyer en signature
418     // Cet évenement permet d'envoyer le document au parapheur pour signature
419     $this->class_actions[400] = array(
420     "identifier" => "envoyer_a_signature",
421     "portlet" => array(
422     "libelle" => _("Envoyer à signature"),
423     "type" => "action-direct-with-confirmation",
424     "class" => "envoyer_a_signature-16",
425     ),
426     "view" => "formulaire",
427 softime 10713 "method" => "envoyer_a_signature_sans_relecture",
428 softime 10573 "condition" => array(
429     "can_be_signed",
430     ),
431     "permission_suffix" => "envoyer_a_signature",
432     );
433    
434 softime 10713 // ACTION - 402 - Envoyer en signature avec relecture
435     // Cet évenement permet d'envoyer le document au parapheur pour signature
436     $this->class_actions[402] = array(
437     "identifier" => "envoyer_a_signature_relecture",
438     "portlet" => array(
439     "libelle" => __("Envoyer à signature avec relecture"),
440     "type" => "action-direct-with-confirmation",
441     "class" => "envoyer_a_signature-16",
442     ),
443     "view" => "formulaire",
444     "method" => "envoyer_a_signature_avec_relecture",
445     "condition" => array(
446     "can_be_signed",
447 softime 10808 "is_parapheur_relecture_parameter_enabled"
448 softime 10713 ),
449     "permission_suffix" => "envoyer_a_signature",
450     );
451    
452 softime 11876 // ACTION - 404 - Annuler l'envoi en signature
453     // Cet évenement permet d'annuler l'envoi en signature du document au parapheur
454     $this->class_actions[404] = array(
455     "identifier" => "annuler_envoi_signature",
456     "portlet" => array(
457     "libelle" => __("Annuler l'envoi en signature"),
458     "type" => "action-direct-with-confirmation",
459     "class" => "annuler_envoi_signature-16",
460     ),
461     "view" => "formulaire",
462     "method" => "annuler_envoi_en_signature",
463     "condition" => array(
464 softime 12124 "is_sent_for_signature",
465 softime 11876 "is_parapheur_annulation_parameter_enabled"
466     ),
467     "permission_suffix" => "envoyer_a_signature",
468     );
469    
470 softime 10573 //
471     $this->class_actions[401] = array(
472     "identifier" => "preview_edition",
473     "view" => "formulaire",
474     "permission_suffix" => "tab",
475     );
476    
477 softime 10808 // ACTION - 410 - Notifier les pétitionnaires (mail ou autre)
478     $this->class_actions[410] = array(
479     "identifier" => "overlay_notification_manuelle",
480     "portlet" => array(
481     "libelle" => __("Notifier les pétitionnaires"),
482     "type" => "action-self",
483     "class" => "notifier_commune-16",
484     ),
485     "condition" => array(
486     "is_notifiable_by_task_manual",
487 softime 10869 "is_not_portail_notification_sans_annexe"
488 softime 10808 ),
489     "view" => "view_overlay_notification_manuelle",
490     "permission_suffix" => "modifier",
491     );
492    
493 softime 11585 // ACTION - 411 - Notifier les pétitionnaires (portail citoyen)
494 softime 10808 $this->class_actions[411] = array(
495     "identifier" => "notification_manuelle_portal",
496     "portlet" => array(
497     "libelle" => __("Notifier les pétitionnaires"),
498     "type" => "action-direct-with-confirmation",
499     "class" => "notifier_commune-16",
500     ),
501     "condition" => array(
502     "is_notifiable_by_task_manual",
503 softime 10869 "is_portail_notification_sans_annexe"
504 softime 10808 ),
505 softime 14542 "method" => "notifier_demandeur_principal_via_portal",
506 softime 10808 "permission_suffix" => "modifier",
507     );
508    
509 softime 11585 // ACTION - 420 - Notifier les services consultés (mail)
510     $this->class_actions[420] = array(
511     "identifier" => "overlay_notification_service_consulte",
512     "portlet" => array(
513     "libelle" => __("Notifier les services consultés"),
514     "type" => "action-self",
515     "class" => "notifier_commune-16",
516     ),
517     "condition" => array(
518     "is_service_notifiable"
519     ),
520     "view" => "view_overlay_notification_service_consulte",
521     "permission_suffix" => "tab",
522     );
523    
524     // ACTION - 430 - Notifier les tiers consultés (mail)
525     $this->class_actions[430] = array(
526     "identifier" => "overlay_notification_tiers_consulte",
527     "portlet" => array(
528     "libelle" => __("Notifier les tiers consultés"),
529     "type" => "action-self",
530     "class" => "notifier_commune-16",
531     ),
532     "condition" => array(
533     "is_tiers_notifiable"
534     ),
535     "view" => "view_overlay_notification_tiers_consulte",
536     "permission_suffix" => "tab",
537     );
538    
539 softime 10573 //
540 softime 11418 $this->class_actions[403] = array(
541     "identifier" => "envoyer_au_controle_de_legalite",
542     "portlet" => array(
543     "libelle" => __("Envoyer au contrôle de légalité"),
544     "type" => "action-direct-with-confirmation",
545     "class" => "envoyer_au_controle_de_legalite-16",
546     ),
547     "view" => "formulaire",
548     "method" => "envoyer_au_controle_de_legalite",
549     "condition" => array(
550     "can_be_sended_to_cl"
551     ),
552     "permission_suffix" => "envoyer_au_controle_de_legalite",
553     );
554    
555     //
556 softime 10573 $this->class_actions[998] = array(
557     "identifier" => "json_data",
558     "view" => "view_json_data",
559     "permission_suffix" => "consulter",
560     );
561 mbroquet 3730 }
562    
563 softime 8593 /**
564 softime 8989 * Clause select pour la requête de sélection des données de l'enregistrement.
565     *
566     * @return array
567     */
568     function get_var_sql_forminc__champs() {
569     return array(
570     "instruction",
571     "destinataire",
572     "instruction.evenement",
573 softime 10573 "instruction.commentaire",
574 softime 8989 "date_evenement",
575     "instruction.lettretype",
576     "signataire_arrete",
577     "flag_edition_integrale",
578     "om_final_instruction_utilisateur",
579     "date_finalisation_courrier",
580     "date_envoi_signature",
581 softime 15973 "date_retour_signature",
582 softime 8989 "date_envoi_rar",
583    
584     "date_retour_rar",
585 softime 15973 "date_envoi_controle_legalite",
586 softime 8989 "date_retour_controle_legalite",
587    
588     "numero_arrete",
589    
590     "complement_om_html",
591     "'' as bible_auto",
592     "'' as bible",
593     "complement2_om_html",
594     "'' as bible2",
595     "complement3_om_html",
596     "'' as bible3",
597     "complement4_om_html",
598     "'' as bible4",
599    
600     "titre_om_htmletat",
601     "corps_om_htmletatex",
602    
603     "'' as btn_preview",
604     "'' as btn_redaction",
605    
606     "'' as btn_refresh",
607     "'' as live_preview",
608    
609     "dossier",
610     "instruction.action",
611     "instruction.delai",
612     "instruction.etat",
613     "instruction.autorite_competente",
614     "instruction.accord_tacite",
615     "instruction.delai_notification",
616     "instruction.avis_decision",
617     "archive_delai",
618     "archive_accord_tacite",
619     "archive_etat",
620     "archive_avis",
621     "archive_date_complet",
622     "archive_date_rejet",
623     "archive_date_limite",
624     "archive_date_notification_delai",
625     "archive_date_decision",
626     "archive_date_validite",
627     "archive_date_achevement",
628     "archive_date_conformite",
629     "archive_date_chantier",
630     "archive_date_dernier_depot",
631     "date_depot",
632 softime 10573 "date_depot_mairie",
633 softime 8989 "complement5_om_html",
634     "'' as bible5",
635     "complement6_om_html",
636     "'' as bible6",
637     "complement7_om_html",
638     "'' as bible7",
639     "complement8_om_html",
640     "'' as bible8",
641     "complement9_om_html",
642     "'' as bible9",
643     "complement10_om_html",
644     "'' as bible10",
645     "complement11_om_html",
646     "'' as bible11",
647     "complement12_om_html",
648     "complement13_om_html",
649     "complement14_om_html",
650     "complement15_om_html",
651     "archive_incompletude",
652     "archive_incomplet_notifie",
653     "archive_evenement_suivant_tacite",
654     "archive_evenement_suivant_tacite_incompletude",
655     "archive_etat_pendant_incompletude",
656     "archive_date_limite_incompletude",
657     "archive_delai_incompletude",
658     "archive_autorite_competente",
659     "code_barres",
660     "om_fichier_instruction",
661     "om_final_instruction",
662     "om_fichier_instruction_dossier_final",
663     "document_numerise",
664     "duree_validite_parametrage",
665     "duree_validite",
666     "created_by_commune",
667     "archive_date_cloture_instruction",
668     "archive_date_premiere_visite",
669     "archive_date_derniere_visite",
670     "archive_date_contradictoire",
671     "archive_date_retour_contradictoire",
672     "archive_date_ait",
673     "archive_date_transmission_parquet",
674     "archive_dossier_instruction_type",
675     "archive_date_affichage",
676 softime 10573 "pec_metier",
677     "archive_pec_metier",
678     "archive_a_qualifier",
679     "id_parapheur_signature",
680     "statut_signature",
681     "commentaire_signature",
682     "historique_signature",
683 softime 10808 "'' as suivi_notification",
684 softime 11585 "'' as suivi_notification_service",
685     "'' as suivi_notification_tiers",
686 softime 12654 "'' as suivi_notification_commune",
687 softime 10573
688     "'' as preview_edition",
689 softime 11418 "envoye_cl_platau",
690 softime 15037 "'' as log_instruction",
691     "parapheur_lien_page_signature"
692 softime 8989 );
693     }
694    
695     /**
696 softime 8593 * CONDITION - is_edition_integrale_enabled
697     *
698     * Vérifie que la rédaction libre est activée sur l'instruction en cours.
699     *
700     * @return boolean
701     */
702     function is_edition_integrale_enabled() {
703     if ($this->getVal("flag_edition_integrale") == 't') {
704     return true;
705     }
706     return false;
707     }
708 mbroquet 3730
709     /**
710 softime 8593 * CONDITION - is_edition_integrale_not_enabled
711     *
712     * Vérifie que la rédaction libre est désactivée sur l'instruction en cours.
713     *
714     * @return boolean
715     */
716     function is_edition_integrale_not_enabled() {
717     return !$this->is_edition_integrale_enabled();
718     }
719    
720     /**
721     * CONDITION - is_option_redaction_libre_enabled
722     *
723     * Vérifie que l'option de rédaction libre est activée.
724     *
725     * @return boolean
726     */
727     function is_option_redaction_libre_enabled() {
728     $collectivite_di = $this->get_dossier_instruction_om_collectivite();
729     return $this->f->is_option_redaction_libre_enabled($collectivite_di);
730     }
731    
732     /**
733 softime 10713 * CONDITION - is_option_parapheur_relecture_enabled
734     *
735     * Vérifie que l'option de relecture lors de l'envoi en signature est activée.
736     *
737     * @return boolean
738     */
739 softime 10808 function is_parapheur_relecture_parameter_enabled() {
740     //Instanciation de la classe electronicsignature
741     $inst_es = $this->get_electronicsignature_instance();
742     if ($inst_es === false) {
743     return false;
744     }
745    
746     if ($inst_es->get_conf('is_forced_view_files') !== 'true' && $inst_es->get_conf('is_forced_view_files') !== true) {
747     return false;
748     }
749    
750     return true;
751 softime 10713 }
752    
753 softime 11876 /**
754     * CONDITION - is_parapheur_annulation_parameter_enabled
755     *
756     * Vérifie que l'option d'annulation de l'envoi en signature est activée.
757     *
758     * @return boolean
759     */
760     function is_parapheur_annulation_parameter_enabled() {
761     //Instanciation de la classe electronicsignature
762     $inst_es = $this->get_electronicsignature_instance();
763     if ($inst_es === false) {
764     return false;
765     }
766 softime 10713
767 softime 11876 if ($inst_es->get_conf('cancel_send') !== 'true' && $inst_es->get_conf('cancel_send') !== true) {
768     return false;
769     }
770    
771     return true;
772     }
773    
774    
775 softime 10713 /**
776 softime 10573 * CONDITION - is_sent_for_signature
777     *
778     * Vérifie que l'instruction a été envoyé à signature
779     *
780     * @return boolean
781     */
782     function is_sent_for_signature() {
783     // Si un parapheur a été configuré
784     // et que le champ id_parapheur_signature n'est pas vide
785     // que le status est différent de "canceled" ou "expired"
786     // alors l'évènement a été envoyé en signature
787     if ($this->has_connector_electronicsignature() === true
788     && empty($this->getVal("id_parapheur_signature")) === false
789     && ($this->getVal("statut_signature") != "canceled"
790 softime 12124 && $this->getVal("statut_signature") != "expired"
791     && $this->getVal("statut_signature") != "finished")) {
792 softime 10573 //
793     return true;
794     }
795    
796     return false;
797     }
798    
799     /**
800     * CONDITION - is_not_sent_for_signature
801     *
802     * Vérifie que l'instruction n'a pas été envoyé à signature
803     *
804     * @return boolean
805     */
806     function is_not_sent_for_signature() {
807 softime 10968 // Contrôle si l'utilisateur possède un bypass
808     $bypass = $this->f->isAccredited($this->get_absolute_class_name()."_definaliser_bypass");
809     if ($bypass == true) {
810     return true;
811     }
812    
813 softime 10573 return !$this->is_sent_for_signature();
814     }
815    
816    
817     /**
818     * CONDITION - is_signed
819     *
820     * Vérifie que l'instruction a été signé
821     *
822     * @return boolean
823     */
824     function is_signed() {
825     // Si un parapheur a été configuré
826     // et que le champ id_parapheur_signature n'est pas vide
827     // et que le statut est égal à "finished"
828     // alors le document de l'instruciton à été signé
829     if ($this->has_connector_electronicsignature() === true
830     && empty($this->getVal("id_parapheur_signature")) === false
831     && $this->getVal("statut_signature") == "finished") {
832     //
833     return true;
834     }
835    
836     return false;
837     }
838    
839 softime 15973 /**
840     * CONDITION - is_signed
841     *
842     * Vérifie que l'instruction n'a pas été signée
843     *
844     * @return boolean
845     */
846     function is_not_signed() {
847     // Contrôle si l'utilisateur possède un bypass
848     $bypass = $this->f->isAccredited($this->get_absolute_class_name()."_definaliser_apres_signature");
849     if ($bypass == true) {
850     return true;
851     }
852 softime 11876
853 softime 15973 return !$this->is_signed();
854     }
855    
856    
857 softime 12433 /**
858     * is_sent_to_cl
859     *
860     * Vérifie que l'instruction a été envoyé au contrôle de légalité
861     *
862     * @return boolean
863     */
864 softime 11418 function is_sent_to_cl() {
865 softime 12433 // Si la case à cocher de l'instruction envoye_cl_platau est à "t"
866     if ($this->getVal('envoye_cl_platau') === 't') {
867     //
868     return true;
869 softime 11418 }
870     //
871     return false;
872     }
873    
874 softime 10808 /**
875     * CONDITION - is_portail_notification
876     *
877     * Vérifie si la notification est une notification de catégorie portail
878     *
879     * @return boolean
880     */
881 softime 10869 function is_portail_notification_sans_annexe() {
882 softime 10808 $collectiviteDi = $this->get_dossier_instruction_om_collectivite();
883 softime 10869 $ev = $this->get_inst_evenement($this->getVal('evenement'));
884 softime 14064 if ($this->f->get_param_option_notification($collectiviteDi) === PORTAL
885 softime 10869 && $ev->getVal('notification') != 'notification_manuelle_annexe'
886     && $ev->getVal('notification') != 'notification_manuelle_annexe_signature_requise'
887     ) {
888 softime 10808 return true;
889     }
890     return false;
891     }
892 softime 10573
893     /**
894 softime 10808 * CONDITION - is_not_portail_notification
895     *
896     * Vérifie si la notification n'est pas une notification de catégorie portail
897     *
898     * @return boolean
899     */
900 softime 10869 function is_not_portail_notification_sans_annexe() {
901     return (! $this->is_portail_notification_sans_annexe());
902 softime 10808 }
903    
904     /**
905 softime 10573 * CONDITION - can_be_signed
906     *
907     * Vérifie que le document de l'instruction peut être envoyé au parapheur pour signature
908     *
909     * @return boolean
910     */
911     function can_be_signed() {
912     // Instanciation de l'objet signataire_arrete
913     $inst_signataire_arrete = $this->f->get_inst__om_dbform(array(
914     "obj" => "signataire_arrete",
915     "idx" => $this->getVal("signataire_arrete"),
916     ));
917     // Si un parapheur a été configuré, que le document est finalisé, que le signataire
918     // possède une adresse email, on vérifie le champ id_parapheur_signature
919     // S'il est vide l'évènement peut être envoyé en signature
920     // S'il ne l'est pas, alors on vérifie le champ statut_signature
921     // Si la valeur de ce champ est égal à "canceled" ou "expired"
922     // alors l'évènement peut être envoyé en signature
923     if ($this->has_connector_electronicsignature() === true
924     && $this->getVal("om_final_instruction") == 't'
925     && empty($inst_signataire_arrete->getVal('email')) === false) {
926     //
927     if (empty($this->getVal("id_parapheur_signature")) === true
928     || $this->getVal("statut_signature") == "canceled"
929     || $this->getVal("statut_signature") == "expired") {
930     //
931     return true;
932     }
933     }
934    
935     $this->addToLog(__METHOD__."() has_connector_electronicsignature: ".var_export($this->has_connector_electronicsignature(), true), EXTRA_VERBOSE_MODE);
936     $this->addToLog(__METHOD__."() om_final_instruction: ".var_export($this->getVal("om_final_instruction"), true), EXTRA_VERBOSE_MODE);
937     $this->addToLog(__METHOD__."() email: ".var_export($inst_signataire_arrete->getVal('email'), true), EXTRA_VERBOSE_MODE);
938     $this->addToLog(__METHOD__."() id_parapheur_signature: ".var_export($this->getVal("id_parapheur_signature"), true), EXTRA_VERBOSE_MODE);
939     $this->addToLog(__METHOD__."() statut_signature: ".var_export($this->getVal("statut_signature"), true), EXTRA_VERBOSE_MODE);
940    
941     return false;
942     }
943    
944     /**
945     * CONDITION - has_connector_electronicsignature
946     *
947     * Vérifie qu'un parapheur est paramétré
948     *
949     * @return boolean
950     */
951     function has_connector_electronicsignature() {
952     $inst_es = $this->get_electronicsignature_instance(false);
953     if ($inst_es === false) {
954     return false;
955     }
956     return true;
957     }
958    
959     /**
960     * CONDITION - can_display_parapheur
961     *
962     * Vérifie que le fieldset "Suivi Parapheur" soit affichable
963     *
964     * @return boolean
965     */
966     function can_display_parapheur() {
967     $evenement_id = $this->getVal("evenement");
968     $inst_evenement = $this->get_inst_evenement($evenement_id);
969     if ($this->has_connector_electronicsignature() === true
970     && $inst_evenement->getVal('lettretype') !== ''
971     && $inst_evenement->getVal('lettretype') !== null
972     && (empty($this->getVal("id_parapheur_signature")) === false
973     || empty($this->getVal("historique_signature")) === false)) {
974     //
975     return true;
976     }
977    
978     return false;
979     }
980    
981     /**
982 softime 10808 * CONDITION - can_display_notification
983     *
984 softime 11585 * Vérifie que le champs "Suivi notification" est affichable
985 softime 10808 *
986     * @return boolean
987     */
988 softime 11585 function can_display_notification_demandeur() {
989 softime 10808 // Le suivi des notification est affiché si l'événement est notifiable
990     // et si des notifications ont été envoyées
991     $evenement_id = $this->getVal("evenement");
992     $inst_evenement = $this->get_inst_evenement($evenement_id);
993     if ($inst_evenement->getVal('notification') != null &&
994     $inst_evenement->getVal('notification') != '') {
995     // Des notifications ont été envoyé si il existe au moins une notification
996     // liées à l'instruction
997 softime 11585 $idsNotifs = $this->get_instruction_notification(
998     $this->getVal($this->clePrimaire),
999     array(
1000     'notification_recepisse',
1001     'notification_instruction',
1002     'notification_decision',
1003 softime 12124 ),
1004     true
1005 softime 11585 );
1006 softime 10808 if (isset($idsNotifs) && $idsNotifs !== array()) {
1007     return true;
1008     }
1009     }
1010     return false;
1011     }
1012    
1013     /**
1014 softime 11585 * CONDITION - can_display_notification
1015     *
1016     * Vérifie que le champs "suivi_notification_service" est affichable
1017     *
1018     * @return boolean
1019     */
1020     function can_display_notification_service() {
1021     // Le suivi des notification est affiché si l'événement est notifiable
1022     // et si des notifications ont été envoyées
1023     $evenement_id = $this->getVal("evenement");
1024     $inst_evenement = $this->get_inst_evenement($evenement_id);
1025     if ($this->get_boolean_from_pgsql_value($inst_evenement->getVal('notification_service')) == true) {
1026     // Des notifications ont été envoyé si il existe au moins une notification
1027     // de type notification_service_consulte liées à l'instruction
1028     $idsNotifs = $this->get_instruction_notification(
1029     $this->getVal($this->clePrimaire),
1030     'notification_service_consulte'
1031     );
1032     if (isset($idsNotifs) && $idsNotifs !== array()) {
1033     return true;
1034     }
1035     }
1036     return false;
1037     }
1038    
1039    
1040     /**
1041     * CONDITION - can_display_notification_tiers
1042     *
1043     * Vérifie que le champs "suivi_notification_tiers" est affichable
1044     *
1045     * @return boolean
1046     */
1047     function can_display_notification_tiers() {
1048     // Le suivi des notification est affiché si l'événement est notifiable
1049     // et si des notifications ont été envoyées
1050     $evenement_id = $this->getVal("evenement");
1051     $inst_evenement = $this->get_inst_evenement($evenement_id);
1052 softime 13137 if (! empty($inst_evenement->getVal('notification_tiers'))) {
1053 softime 11585 // Des notifications ont été envoyé si il existe au moins une notification
1054     // de type notification_tiers_consulte liées à l'instruction
1055     $idsNotifs = $this->get_instruction_notification(
1056     $this->getVal($this->clePrimaire),
1057     'notification_tiers_consulte'
1058     );
1059     if (isset($idsNotifs) && $idsNotifs !== array()) {
1060     return true;
1061     }
1062     }
1063     return false;
1064     }
1065    
1066     /**
1067 softime 12654 * CONDITION - can_display_notification_commune
1068     *
1069     * Vérifie que le champs "suivi_notification_commune" est affichable
1070     *
1071     * @return boolean
1072     */
1073     function can_display_notification_commune() {
1074     // Le suivi des notification si il existe au moins une notification
1075     // de type notification_depot_demat liées à l'instruction
1076     $idsNotifs = $this->get_instruction_notification(
1077     $this->getVal($this->clePrimaire),
1078     array('notification_depot_demat', 'notification_commune')
1079     );
1080     if (isset($idsNotifs) && $idsNotifs !== array()) {
1081     return true;
1082     }
1083     return false;
1084     }
1085    
1086     /**
1087 softime 8593 * TREATMENT - disable_edition_integrale.
1088     *
1089     * Cette methode permet de passer la consultation en "lu"
1090     *
1091     * @return boolean true si maj effectué false sinon
1092     */
1093     function disable_edition_integrale() {
1094     // Cette méthode permet d'exécuter une routine en début des méthodes
1095     // dites de TREATMENT.
1096     $this->begin_treatment(__METHOD__);
1097     $this->correct = true;
1098     $valF = array(
1099     "flag_edition_integrale" => false,
1100     "titre_om_htmletat" => null,
1101     "corps_om_htmletatex" => null,
1102     );
1103     $res = $this->f->db->autoExecute(
1104     DB_PREFIXE.$this->table,
1105     $valF,
1106     DB_AUTOQUERY_UPDATE,
1107     $this->clePrimaire."=".$this->getVal($this->clePrimaire)
1108     );
1109     if ($this->f->isDatabaseError($res, true)) {
1110     // Appel de la methode de recuperation des erreurs
1111     $this->erreur_db($res->getDebugInfo(), $res->getMessage(), '');
1112     $this->correct = false;
1113     // Termine le traitement
1114     return $this->end_treatment(__METHOD__, false);
1115     } else {
1116     $this->addToMessage(_("Rédaction par compléments activé."));
1117     return $this->end_treatment(__METHOD__, true);
1118     }
1119    
1120     // Termine le traitement
1121     return $this->end_treatment(__METHOD__, false);
1122     }
1123    
1124     /**
1125     * TREATMENT - enable_edition_integrale.
1126     *
1127     * Cette methode permet de passer la consultation en "lu"
1128     *
1129     * @return boolean true si maj effectué false sinon
1130     */
1131     function enable_edition_integrale() {
1132     // Cette méthode permet d'exécuter une routine en début des méthodes
1133     // dites de TREATMENT.
1134     $this->begin_treatment(__METHOD__);
1135     $this->correct = true;
1136    
1137     // Récupère la collectivite du dossier d'instruction
1138     $dossier_instruction_om_collectivite = $this->get_dossier_instruction_om_collectivite();
1139     $collectivite = $this->f->getCollectivite($dossier_instruction_om_collectivite);
1140     //
1141     $params = array(
1142     "specific" => array(
1143     "corps" => array(
1144     "mode" => "get",
1145     )
1146     ),
1147     );
1148     $result = $this->compute_pdf_output('lettretype', $this->getVal('lettretype'), $collectivite, null, $params);
1149     $corps = $result['pdf_output'];
1150     //
1151     $params = array(
1152     "specific" => array(
1153     "titre" => array(
1154     "mode" => "get",
1155     )
1156     ),
1157     );
1158     $result = $this->compute_pdf_output('lettretype', $this->getVal('lettretype'), $collectivite, null, $params);
1159     $titre = $result['pdf_output'];
1160     //
1161     $valF = array(
1162     "flag_edition_integrale" => true,
1163     "titre_om_htmletat" => $titre,
1164     "corps_om_htmletatex" => $corps,
1165     );
1166     $res = $this->f->db->autoExecute(
1167     DB_PREFIXE.$this->table,
1168     $valF,
1169     DB_AUTOQUERY_UPDATE,
1170     $this->clePrimaire."=".$this->getVal($this->clePrimaire)
1171     );
1172     if ($this->f->isDatabaseError($res, true)) {
1173     // Appel de la methode de recuperation des erreurs
1174     $this->erreur_db($res->getDebugInfo(), $res->getMessage(), '');
1175     $this->correct = false;
1176     // Termine le traitement
1177     return $this->end_treatment(__METHOD__, false);
1178     } else {
1179     $this->addToMessage(_("Rédaction libre activé."));
1180     return $this->end_treatment(__METHOD__, true);
1181     }
1182    
1183     // Termine le traitement
1184     return $this->end_treatment(__METHOD__, false);
1185     }
1186    
1187     /**
1188 softime 14064 * Cette méthode instancie le dossier à partir de l'identifiant passé
1189     * en paramètre et renvoie l'identifiant du dossier d'autorisation (DA)
1190     * associé au dossier.
1191     * Si l'identifiant du dossier n'est pas fourni alors cette méthode
1192     * renverra NULL
1193     *
1194     * @param string identifiant du dossier
1195     * @return null|string null ou identifiant du DA
1196 mbroquet 3730 */
1197     function getNumDemandeAutorFromDossier($id) {
1198     if (!isset($id)) {
1199     return NULL;
1200     }
1201 softime 14064
1202     $dossier = $this->f->get_inst__om_dbform(array(
1203     'obj' => 'dossier',
1204     'idx' => $id,
1205     ));
1206    
1207     return $dossier->getVal('dossier_autorisation');
1208 mbroquet 3730 }
1209    
1210 softime 14064
1211 mbroquet 3730 function setType(&$form, $maj) {
1212 softime 8593 // Récupération du mode de l'action
1213     $crud = $this->get_action_crud($maj);
1214     // Récupère la collectivité du dossier d'instruction
1215     $collectivite_di = $this->get_dossier_instruction_om_collectivite();
1216 mbroquet 3730
1217 softime 8593 // Cache tous les champs
1218     foreach ($this->champs as $value) {
1219     $form->setType($value, 'hidden');
1220     }
1221 softime 6565
1222 softime 10573 // Les champs historique_signature et statut_signature ne sont pas saisissable dans tous les cas
1223 softime 11228 if ($this->can_display_parapheur() === true && $maj == 3) {
1224 softime 10573 $form->setType('statut_signature', 'selectstatic');
1225     $form->setType('historique_signature', 'jsontotab');
1226     if ($this->getVal('commentaire_signature') == null) {
1227     $form->setType('commentaire_signature', 'hidden');
1228     } else {
1229     $form->setType('commentaire_signature', 'hiddenstatic');
1230     }
1231     }
1232    
1233 softime 11585 // Le champ de suivi des notifications des demandeurs n'est pas affichable dans tous les cas
1234 softime 12654 if ($maj == 3 && $this->can_display_notification_demandeur() === true) {
1235 softime 10808 $form->setType('suivi_notification', 'jsontotab');
1236     }
1237 softime 11585 // Le champ de suivi des notifications des services n'est pas affichable dans tous les cas
1238 softime 12654 if ($maj == 3 && $this->can_display_notification_service() === true) {
1239 softime 11585 $form->setType('suivi_notification_service', 'jsontotab');
1240     }
1241     // Le champ de suivi des notifications des tiers n'est pas affichable dans tous les cas
1242 softime 12654 if ($maj == 3 && $this->can_display_notification_tiers() === true) {
1243 softime 11585 $form->setType('suivi_notification_tiers', 'jsontotab');
1244     }
1245 softime 12654 // Le champ de suivi des notifications des communes n'est pas affichable dans tous les cas
1246     if ($maj == 3 && $this->can_display_notification_commune() === true) {
1247     $form->setType('suivi_notification_commune', 'jsontotab');
1248     }
1249 softime 10808
1250 softime 8593 // MODE AJOUTER
1251     if ($this->getParameter('maj') == 0) {
1252 softime 10573 $form->setType('commentaire', 'textareahidden');
1253     // Si l'option est active passage du champ date en lecture seule
1254     if ($this->f->is_option_date_evenement_instruction_lecture_seule($collectivite_di) === true) {
1255     $form->setType("date_evenement", "hiddenstaticdate");
1256     } else {
1257     $form->setType("date_evenement", "date");
1258     }
1259 softime 8989 if ($this->is_in_context_of_foreign_key("evenement", $this->getParameter("retourformulaire"))) {
1260 softime 8593 $form->setType("evenement", "selecthiddenstatic");
1261     } else {
1262     $form->setType("evenement", "select");
1263     }
1264 softime 8989 if ($this->is_in_context_of_foreign_key("signataire_arrete", $this->getParameter("retourformulaire"))) {
1265 softime 8593 $form->setType("signataire_arrete", "selecthiddenstatic");
1266     } else {
1267     $form->setType("signataire_arrete", "select");
1268     }
1269     if ($this->is_option_redaction_libre_enabled() === true) {
1270     $form->setType("flag_edition_integrale", "select");
1271     }
1272 mbroquet 3730 }
1273    
1274 softime 8593 // MODE MODIFIER
1275     if ($this->getParameter('maj') == 1) {
1276 softime 10573 // Si l'option est active passage du champ date en lecture seule
1277     if ($this->f->is_option_date_evenement_instruction_lecture_seule($collectivite_di) === true) {
1278     $form->setType("date_evenement", "hiddenstaticdate");
1279     } else {
1280     $form->setType("date_evenement", "date");
1281     }
1282 softime 8593 $form->setType("evenement", "selecthiddenstatic");
1283     if ($this->has_an_edition() === true) {
1284     $form->setType('lettretype', 'hiddenstatic');
1285 softime 8989 if ($this->is_in_context_of_foreign_key("signataire_arrete", $this->getParameter("retourformulaire"))) {
1286 softime 8593 $form->setType("signataire_arrete", "selecthiddenstatic");
1287     } else {
1288     $form->setType("signataire_arrete", "select");
1289     }
1290     if ($this->getVal("flag_edition_integrale") == "t") {
1291     $form->setType("titre_om_htmletat", "htmlEtat");
1292     $form->setType("corps_om_htmletatex", "htmlEtatEx");
1293     } else {
1294     $form->setType("complement_om_html", "html");
1295     $form->setType("complement2_om_html", "html");
1296     $form->setType("complement3_om_html", "html");
1297     $form->setType("complement4_om_html", "html");
1298     $form->setType('bible_auto', 'httpclick');
1299     $form->setType('bible', 'httpclick');
1300     $form->setType('bible2', 'httpclick');
1301     $form->setType('bible3', 'httpclick');
1302     $form->setType('bible4', 'httpclick');
1303     }
1304     if ($this->f->is_option_preview_pdf_enabled($collectivite_di) === true) {
1305     //
1306     $form->setType('btn_refresh', 'httpclickbutton');
1307     $form->setType('btn_preview', 'httpclickbutton');
1308     $form->setType('btn_redaction', 'httpclickbutton');
1309 softime 11876 // /!\ le type du champs est utilisé dans un selecteur dans le jscript.js
1310     // pour identifiant le champ de prévisualisation et régler sa taille à
1311     // l'affichage du champ. En cas de modification, le selecteur doit également
1312     // être mis à jour
1313 softime 11418 $form->setType('live_preview', 'previsualiser_pdf');
1314 softime 7521 }
1315 softime 8593
1316 mbroquet 3730 // necessaire pour calcul de date en modification
1317     //$form->setType('delai', 'hiddenstatic');
1318     // les administrateurs technique et fonctionnel peuvent
1319     // modifier tous les champs de date
1320     // si l'instruction a déjà été finalisée au moins une fois
1321 softime 7996 if (($this->f->isAccredited(array($this->get_absolute_class_name(), $this->get_absolute_class_name()."modification_dates"), "OR")
1322 softime 6565 || $this->f->isAccredited(array('instruction', 'instruction_modification_dates'), "OR"))
1323 mbroquet 3730 && $this->getVal("date_finalisation_courrier") != '') {
1324 softime 8593 //
1325 mbroquet 3730 $form->setType('date_envoi_signature', 'date');
1326     $form->setType('date_retour_signature', 'date');
1327 softime 10573 if ($this->is_sent_for_signature() === true
1328     && $this->is_signed() === true) {
1329     //
1330     $form->setType("date_envoi_signature", "datereadonly");
1331     $form->setType("date_retour_signature", "datereadonly");
1332     }
1333 mbroquet 3730 $form->setType('date_envoi_rar', 'date');
1334     $form->setType('date_retour_rar', 'date');
1335     $form->setType('date_envoi_controle_legalite', 'date');
1336 softime 11418 if ($this->is_sent_to_cl() === true) {
1337 softime 12124 $form->setType("date_envoi_controle_legalite", "datedisabled");
1338 softime 11418 }
1339 mbroquet 3730 $form->setType('date_retour_controle_legalite', 'date');
1340     $form->setType('date_finalisation_courrier', 'date');
1341     }
1342     }
1343     }
1344    
1345 softime 10808 // MODE CONSULTER + SUPPRIMER + SUIVI DES DATES 125 + NOTIFICATION MANUELLE
1346 softime 8593 if ($this->getParameter('maj') == 3
1347     || $this->getParameter('maj') == 2
1348 softime 10808 || $this->getParameter('maj') == 125
1349     || $this->getParameter('maj') == 410) {
1350 softime 8593 //
1351     $form->setType("date_evenement", "datestatic");
1352     $form->setType("evenement", "selecthiddenstatic");
1353     if ($this->has_an_edition() === true) {
1354     $form->setType('lettretype', 'hiddenstatic');
1355     $form->setType("signataire_arrete", "selecthiddenstatic");
1356     if ($this->getVal("om_final_instruction") == 't') {
1357     $form->setType('om_final_instruction_utilisateur', 'textareastatic');
1358     } else {
1359     $form->setType('om_final_instruction_utilisateur', 'hidden');
1360     }
1361     }
1362 softime 10573 if ($this->evenement_has_a_commentaire($this->getVal('evenement')) === true ) {
1363     $form->setType('commentaire', 'textareastatic');
1364     }
1365 mbroquet 3730 }
1366    
1367 softime 10808 // MODE CONSULTER + SUPPRIMER + NOTIFICATION MANUELLE
1368     if ($this->getParameter('maj') == 3
1369     || $this->getParameter('maj') == 2
1370     || $this->getParameter('maj') == 410) {
1371 softime 10573 // Si il n'y a pas de lettre type (edition) associé à l'événement
1372     // les dates de suivi ne sont pas affichée
1373 softime 8593 if ($this->has_an_edition() === true) {
1374 softime 10573 $form->setType('date_envoi_signature', 'datestatic');
1375     $form->setType('date_retour_signature', 'datestatic');
1376     $form->setType('date_envoi_rar', 'datestatic');
1377     $form->setType('date_retour_rar', 'datestatic');
1378     $form->setType('date_envoi_controle_legalite', 'datestatic');
1379     $form->setType('date_retour_controle_legalite', 'datestatic');
1380     $form->setType('date_finalisation_courrier', 'datestatic');
1381 softime 8593 if ($this->getVal("flag_edition_integrale") == "t") {
1382     $form->setType("titre_om_htmletat", "htmlstatic");
1383     $form->setType("corps_om_htmletatex", "htmlstatic");
1384     } else {
1385     $form->setType("complement_om_html", "htmlstatic");
1386     $form->setType("complement2_om_html", "htmlstatic");
1387     $form->setType("complement3_om_html", "htmlstatic");
1388     $form->setType("complement4_om_html", "htmlstatic");
1389     }
1390 mbroquet 3730 }
1391     }
1392 softime 8593
1393     // MODE SUIVI DES DATES 125
1394     if ($this->getParameter('maj') == 125) {
1395     $form->setType("date_evenement", "hiddenstaticdate");
1396     $form->setType('om_final_instruction_utilisateur', 'hiddenstatic');
1397     $form->setType('date_envoi_signature', 'date');
1398     $form->setType('date_retour_signature', 'date');
1399 softime 10573 if ($this->is_sent_for_signature() === true
1400     || $this->is_signed() === true) {
1401     //
1402     $form->setType("date_envoi_signature", "datereadonly");
1403     $form->setType("date_retour_signature", "datereadonly");
1404     }
1405 softime 8593 $form->setType('date_envoi_rar', 'date');
1406     $form->setType('date_retour_rar', 'date');
1407     $form->setType('date_envoi_controle_legalite', 'date');
1408 softime 11418 if ($this->is_sent_to_cl() === true) {
1409 softime 12124 $form->setType("date_envoi_controle_legalite", "datedisabled");
1410 softime 11418 }
1411 softime 8593 $form->setType('date_retour_controle_legalite', 'date');
1412     $form->setType('date_finalisation_courrier', 'date');
1413     }
1414 softime 10573
1415     if ($maj == 401) {
1416     foreach ($this->champs as $champ) {
1417     $form->setType($champ, 'hidden');
1418     }
1419 softime 11418 $form->setType('preview_edition', 'previsualiser');
1420 softime 10573 }
1421 softime 12124
1422     // Si l'instruction a été envoyé au contrôle de légalité et que la
1423     // tâche envoi_cl lié n'a pas encore été traité il faut indiquer à
1424     // l'utilisateur que l'envoi au cl est en cours de traitement.
1425     if ($this->is_sent_to_cl() === true
1426     && empty($this->getVal('date_envoi_controle_legalite'))
1427     && $maj == 3) {
1428     $form->setType("date_envoi_controle_legalite", "hiddenstatic");
1429     }
1430 mbroquet 3730 }
1431    
1432 softime 8593 function setOnchange(&$form,$maj){
1433     parent::setOnchange($form,$maj);
1434    
1435     // MODE AJOUTER
1436     if ($this->getParameter('maj') == 0) {
1437 softime 10573 $form->setOnchange(
1438     "evenement",
1439     "manage_instruction_evenement_lettretype(this.value, '".addslashes($this->getParameter('idxformulaire'))."');
1440     manage_instruction_evenement_commentaire(this.value, '".addslashes($this->getParameter('idxformulaire'))."');"
1441     );
1442 softime 8593 }
1443     }
1444    
1445     function evenement_has_an_edition($evenement_id) {
1446     $evenement = $this->get_inst_evenement($evenement_id);
1447     $lettretype = $evenement->getVal('lettretype');
1448     if ($lettretype !== '' && $lettretype !== null) {
1449     return true;
1450     }
1451     return false;
1452     }
1453    
1454     function view_evenement_has_an_edition_json() {
1455     $json_return = array(
1456     "lettretype" => $this->evenement_has_an_edition($this->f->get_submitted_get_value('evenement_id')),
1457     "option_redaction_libre_enabled" => $this->is_option_redaction_libre_enabled(),
1458     );
1459     echo json_encode($json_return);
1460     }
1461    
1462 softime 10573 function evenement_has_a_commentaire($evenement_id) {
1463     $evenement = $this->get_inst_evenement($evenement_id);
1464     return $this->get_boolean_from_pgsql_value($evenement->getVal('commentaire'));
1465     }
1466    
1467     function view_evenement_has_a_commentaire_json() {
1468     $json_return = array(
1469     "commentaire" => $this->evenement_has_a_commentaire($this->f->get_submitted_get_value('evenement_id'))
1470     );
1471     echo json_encode($json_return);
1472     }
1473    
1474 softime 11418
1475 softime 8989 /**
1476 softime 11418 * CONDITION - can_be_sended_to_cl
1477 softime 8989 *
1478 softime 11418 * Vérifie que le contrôle de légalité est disponible
1479     *
1480     * @return boolean
1481     */
1482     function can_be_sended_to_cl() {
1483     // Si l'instruction a une édition
1484     // et que l'événement est paramétré pour envoyer le contrôle de légalité
1485     // par Plat'AU
1486     // et que la date de retour signature est renseignée
1487     // et que la date d'envoi au contrôle légalité n'est pas renseignée
1488     // et qu'il n'existe pas de task envoi_CL en cours (!= done ou canceled)
1489     if ($this->has_an_edition() === true) {
1490     $inst_di = $this->get_inst_dossier($this->getVal('dossier'));
1491     $inst_evenement = $this->get_inst_evenement($this->getVal('evenement'));
1492     if ($inst_evenement->getVal('envoi_cl_platau') === 't'
1493     && empty($this->getVal('date_retour_signature')) === false
1494     && empty($this->getVal('date_envoi_controle_legalite')) === true
1495     && $this->getVal('envoye_cl_platau') === 'f'
1496     && $this->f->is_type_dossier_platau($inst_di->getVal('dossier_autorisation')) === true
1497     && $inst_di->getVal('etat_transmission_platau') !== 'jamais_transmissible') {
1498     //
1499     return true;
1500     }
1501     }
1502     //
1503     return false;
1504     }
1505    
1506     /**
1507     *
1508 softime 8989 * @return string
1509     */
1510     function get_var_sql_forminc__sql_signataire_arrete() {
1511 softime 11585 return sprintf(
1512     "SELECT
1513     signataire_arrete.signataire_arrete,
1514     CONCAT_WS(
1515     ' - ',
1516     CONCAT_WS(' ', signataire_arrete.prenom, signataire_arrete.nom),
1517     signataire_habilitation.libelle,
1518     signataire_arrete.description
1519     )
1520     FROM
1521     %1\$ssignataire_arrete
1522     LEFT JOIN %1\$ssignataire_habilitation
1523     ON signataire_arrete.signataire_habilitation = signataire_habilitation.signataire_habilitation
1524     WHERE
1525     ((signataire_arrete.om_validite_debut IS NULL
1526     AND (signataire_arrete.om_validite_fin IS NULL
1527     OR signataire_arrete.om_validite_fin > CURRENT_DATE))
1528     OR (signataire_arrete.om_validite_debut <= CURRENT_DATE
1529     AND (signataire_arrete.om_validite_fin IS NULL
1530     OR signataire_arrete.om_validite_fin > CURRENT_DATE)))
1531     ORDER BY
1532     signataire_arrete.prenom,
1533     signataire_arrete.nom",
1534     DB_PREFIXE
1535     );
1536 softime 8989 }
1537    
1538     /**
1539     *
1540     * @return string
1541     */
1542     function get_var_sql_forminc__sql_signataire_arrete_by_id() {
1543 softime 11585 return sprintf(
1544     "SELECT
1545     signataire_arrete.signataire_arrete,
1546     CONCAT_WS(
1547     ' - ',
1548     CONCAT_WS(' ', signataire_arrete.prenom, signataire_arrete.nom),
1549     signataire_habilitation.libelle,
1550     signataire_arrete.description
1551     )
1552     FROM
1553     %1\$ssignataire_arrete
1554     LEFT JOIN %1\$ssignataire_habilitation
1555     ON signataire_arrete.signataire_habilitation = signataire_habilitation.signataire_habilitation
1556     WHERE
1557     signataire_arrete.signataire_arrete = <idx>",
1558     DB_PREFIXE
1559     );
1560 softime 8989 }
1561    
1562     /**
1563     *
1564     * @return string
1565     */
1566     function get_var_sql_forminc__sql_signataire_arrete_by_di() {
1567 softime 11585 return sprintf(
1568     "SELECT
1569     signataire_arrete.signataire_arrete,
1570     CONCAT_WS(
1571     ' - ',
1572     CONCAT_WS(' ', signataire_arrete.prenom, signataire_arrete.nom),
1573     signataire_habilitation.libelle,
1574     signataire_arrete.description
1575     )
1576     FROM
1577     %1\$ssignataire_arrete
1578     LEFT JOIN %1\$som_collectivite
1579     ON signataire_arrete.om_collectivite = om_collectivite.om_collectivite
1580     LEFT JOIN %1\$ssignataire_habilitation
1581     ON signataire_arrete.signataire_habilitation = signataire_habilitation.signataire_habilitation
1582     WHERE
1583     ((signataire_arrete.om_validite_debut IS NULL
1584     AND (signataire_arrete.om_validite_fin IS NULL
1585     OR signataire_arrete.om_validite_fin > CURRENT_DATE))
1586     OR (signataire_arrete.om_validite_debut <= CURRENT_DATE
1587     AND (signataire_arrete.om_validite_fin IS NULL
1588     OR signataire_arrete.om_validite_fin > CURRENT_DATE)))
1589     AND (om_collectivite.niveau = '2'
1590     OR signataire_arrete.om_collectivite = <collectivite_di>)
1591     ORDER BY
1592     signataire_arrete.prenom, signataire_arrete.nom",
1593     DB_PREFIXE
1594     );
1595 softime 8989 }
1596    
1597     /**
1598     *
1599     * @return string
1600     */
1601     function get_var_sql_forminc__sql_signataire_arrete_defaut() {
1602 softime 11585 return sprintf(
1603     "SELECT
1604     signataire_arrete.signataire_arrete,
1605     CONCAT_WS(
1606     ' - ',
1607     CONCAT_WS(' ', signataire_arrete.prenom, signataire_arrete.nom),
1608     signataire_habilitation.libelle,
1609     signataire_arrete.description
1610     )
1611     FROM
1612     %1\$ssignataire_arrete
1613     LEFT JOIN %1\$ssignataire_habilitation
1614     ON signataire_arrete.signataire_habilitation = signataire_habilitation.signataire_habilitation
1615     WHERE
1616     ((signataire_arrete.om_validite_debut IS NULL
1617     AND (signataire_arrete.om_validite_fin IS NULL
1618     OR signataire_arrete.om_validite_fin > CURRENT_DATE))
1619     OR (signataire_arrete.om_validite_debut <= CURRENT_DATE
1620     AND (signataire_arrete.om_validite_fin IS NULL
1621     OR signataire_arrete.om_validite_fin > CURRENT_DATE)))
1622     AND signataire_arrete.defaut IS TRUE
1623     ORDER BY
1624     signataire_arrete.prenom, signataire_arrete.nom",
1625     DB_PREFIXE
1626     );
1627 softime 8989 }
1628    
1629     /**
1630     *
1631     * @return string
1632     */
1633     function get_var_sql_forminc__sql_signataire_arrete_defaut_by_di() {
1634 softime 11585 return sprintf(
1635     "SELECT
1636     signataire_arrete.signataire_arrete,
1637     CONCAT_WS(
1638     ' - ',
1639     CONCAT_WS(' ', signataire_arrete.prenom, signataire_arrete.nom),
1640     signataire_habilitation.libelle,
1641     signataire_arrete.description
1642     )
1643     FROM
1644     %1\$ssignataire_arrete
1645     LEFT JOIN %1\$ssignataire_habilitation
1646     ON signataire_arrete.signataire_habilitation = signataire_habilitation.signataire_habilitation
1647     LEFT JOIN %1\$som_collectivite
1648     ON signataire_arrete.om_collectivite = om_collectivite.om_collectivite
1649     WHERE
1650     ((signataire_arrete.om_validite_debut IS NULL
1651     AND (signataire_arrete.om_validite_fin IS NULL
1652     OR signataire_arrete.om_validite_fin > CURRENT_DATE))
1653     OR (signataire_arrete.om_validite_debut <= CURRENT_DATE
1654     AND (signataire_arrete.om_validite_fin IS NULL
1655     OR signataire_arrete.om_validite_fin > CURRENT_DATE)))
1656     AND signataire_arrete.defaut IS TRUE
1657     AND (om_collectivite.niveau = '2'
1658     OR signataire_arrete.om_collectivite = <collectivite_di>)
1659     ORDER BY
1660     signataire_arrete.prenom,
1661     signataire_arrete.nom",
1662     DB_PREFIXE
1663     );
1664 softime 8989 }
1665    
1666     /**
1667 softime 14542 * Renvoie sous la forme d'un tableau la liste des événements pouvant être ajoutés au dossier
1668     * dont l'identifiant a été passé en paramètre dans l'url.
1669     *
1670     * @return array
1671     */
1672     function get_var_sql_forminc__sql_evenement() {
1673     // Récupération du numéro de dossier
1674     $dossier = $this->getParameter("idxformulaire");
1675     // Si changement de décision par instructeur commune
1676     $filter = '';
1677     if ($this->f->isUserInstructeur() === true
1678     && $this->getDivisionFromDossier($dossier) != $_SESSION["division"]
1679     && $this->isInstrCanChangeDecision($dossier) === true) {
1680     $filter = "AND evenement.type IN ('arrete', 'changement_decision')";
1681     }
1682     // Récupération du libellé, de l'identifiant des évènement et d'un booléen permettant
1683     // de déterminer si il s'agit d'évènements suggérés.
1684     $qres = $this->f->get_all_results_from_db_query(
1685     sprintf(
1686     'SELECT
1687     DISTINCT(evenement.evenement),
1688     evenement.libelle,
1689     -- Si l evenement est suggérés alors il sera lié à la table des événements suggérés du dossier
1690     CASE WHEN evenement_suggere_dossier.evenement IS NULL
1691     THEN FALSE
1692     ELSE TRUE
1693     END AS is_suggested
1694     FROM
1695     -- Jointures permettant de récupérer la liste des évènements compatibles avec le dossier
1696     -- selon le type de dossier et l état du dossier.
1697     %1$sevenement
1698     JOIN %1$slien_dossier_instruction_type_evenement
1699     ON evenement.evenement = lien_dossier_instruction_type_evenement.evenement
1700     JOIN %1$stransition
1701     ON evenement.evenement = transition.evenement
1702     JOIN %1$sdossier
1703     ON lien_dossier_instruction_type_evenement.dossier_instruction_type = dossier.dossier_instruction_type
1704     AND transition.etat = dossier.etat
1705     -- Jointures avec une sous requêtes servant à récupérer la liste des évènements suggérés du dossier.
1706     LEFT JOIN (
1707     SELECT
1708     lien_sig_contrainte_evenement.evenement,
1709     dossier.dossier
1710     FROM
1711     %1$slien_sig_contrainte_evenement
1712     JOIN %1$ssig_contrainte
1713     ON lien_sig_contrainte_evenement.sig_contrainte = sig_contrainte.sig_contrainte
1714     JOIN %1$slien_sig_contrainte_dossier_instruction_type
1715     ON sig_contrainte.sig_contrainte = lien_sig_contrainte_dossier_instruction_type.sig_contrainte
1716     JOIN %1$slien_sig_contrainte_om_collectivite
1717     ON sig_contrainte.sig_contrainte = lien_sig_contrainte_om_collectivite.sig_contrainte
1718     JOIN %1$scontrainte
1719     ON sig_contrainte.libelle = contrainte.libelle
1720     JOIN %1$sdossier_contrainte
1721     ON contrainte.contrainte = dossier_contrainte.contrainte
1722     JOIN %1$sdossier
1723     ON dossier_contrainte.dossier = dossier.dossier
1724     AND lien_sig_contrainte_dossier_instruction_type.dossier_instruction_type = dossier.dossier_instruction_type
1725     JOIN %1$som_collectivite
1726     ON lien_sig_contrainte_om_collectivite.om_collectivite = om_collectivite.om_collectivite
1727     AND (dossier.om_collectivite = om_collectivite.om_collectivite
1728     OR om_collectivite.niveau = \'2\')
1729     ) AS evenement_suggere_dossier
1730     ON evenement.evenement = evenement_suggere_dossier.evenement
1731     AND dossier.dossier = evenement_suggere_dossier.dossier
1732     WHERE
1733     dossier.dossier = \'%2$s\'
1734     %3$s
1735     ORDER BY
1736     is_suggested DESC,
1737     evenement.libelle',
1738     DB_PREFIXE,
1739     $this->f->db->escapeSimple($dossier),
1740     $filter
1741     ),
1742     array(
1743     "origin" => __METHOD__
1744     )
1745     );
1746     return $qres['result'];
1747     }
1748    
1749     /**
1750     * Récupère un tableau contenant des évènements de la forme :
1751     * $events = array(
1752     * 1 => array(
1753     * 'libelle' => 'evenement_libelle',
1754     * 'evenement' => 'identifiant_evenement',
1755     * 'is_suggested' => true/false -> booleen indiquant si c'est un événement suggéré
1756     * ))
1757     * Et le transforme pour pouvoir l'utiliser pour le remplissage d'un select de formulaire.
1758     *
1759     * Le format de sorti est le suivant :
1760     * $select = array(
1761     * 0 => array( -> liste des id des événements
1762     * '0' => '',
1763     * '1' => array(
1764     * '0' => array(), -> liste des id des événements suggérés
1765     * '1' => array(), -> liste des libelles des événements suggérés
1766     * ),
1767     * ...,
1768     * n => 'id_evenement_n'
1769     * ),
1770     * 1 => array(
1771     * '0' => '__('choisir')." ".__('evenement')',
1772     * '1' => '💡 Suggestions',
1773     * ...,
1774     * 'n' => 'libelle_evenement_n',
1775     * )
1776     * )
1777     *
1778     * @param array tableau des événements
1779     * @return array
1780     */
1781     protected function convert_events_array_to_select_format($events) {
1782     // Remplissage du tableau du select en incluant le groupe des instructions suggérées.
1783     $contenu = array(
1784     0 => array("",),
1785     1 => array(__('choisir')." ".__('evenement'),)
1786     );
1787    
1788     if (! empty($events)) {
1789     // S'il y a des évènements suggérés extraction de ces événements et mise en place du groupe
1790     $suggested_event_group = array_filter($events, function($a) {
1791     return $a['is_suggested'] === 't';
1792     });
1793     if (! empty($suggested_event_group)) {
1794     // Prépare les données qui permettront d'afficher le groupe des événements
1795     // suggérés.
1796     $values = array();
1797     $labels = array();
1798     foreach ($suggested_event_group as $index => $suggested_event) {
1799     $values[] = $suggested_event['evenement'];
1800     $labels[] = $suggested_event['libelle'];
1801     // Supprime les évènements suggérés de la liste des évènements
1802     unset($events[$index]);
1803     }
1804     // Remplissage du select pour le groupe
1805     $contenu[0][] = array($values, $labels);
1806     $contenu[1][] = __('💡 Suggestions');
1807     }
1808    
1809     // Remplissage du select
1810     foreach ($events as $event) {
1811     $contenu[0][] = $event['evenement'];
1812     $contenu[1][] = $event['libelle'];
1813     }
1814     }
1815     return $contenu;
1816     }
1817    
1818     /**
1819 softime 8989 * SETTER_FORM - setSelect.
1820     *
1821     * @return void
1822     */
1823     function setSelect(&$form, $maj, &$dnu1 = null, $dnu2 = null) {
1824     //parent::setSelect($form, $maj);
1825 mbroquet 3730 /**
1826     * On ne surcharge pas la méthode parent car une requête sur la table
1827     * dossier est mauvaise pour les performances, car la requête qui
1828     * concerne evenement est plus complexe que celle générée et car les
1829     * champs action, avis_decision et etat ne sont pas utilisés comme des
1830     * select
1831     */
1832     //// action
1833 softime 8989 //$this->init_select($form, $this->f->db, $maj, null, "action",
1834 mbroquet 3730 // $sql_action, $sql_action_by_id, false);
1835    
1836     //// avis_decision
1837 softime 8989 //$this->init_select($form, $this->f->db, $maj, null, "avis_decision",
1838 mbroquet 3730 // $sql_avis_decision, $sql_avis_decision_by_id, false);
1839    
1840     //// dossier
1841 softime 8989 //$this->init_select($form, $this->f->db, $maj, null, "dossier",
1842 mbroquet 3730 // $sql_dossier, $sql_dossier_by_id, false);
1843    
1844     //// etat
1845 softime 8989 //$this->init_select($form, $this->f->db, $maj, null, "etat",
1846 mbroquet 3730 // $sql_etat, $sql_etat_by_id, false);
1847    
1848     //// evenement
1849 softime 8989 //$this->init_select($form, $this->f->db, $maj, null, "evenement",
1850 mbroquet 3730 // $sql_evenement, $sql_evenement_by_id, false);
1851    
1852     // signataire_arrete
1853     // si contexte DI
1854     if ($this->getParameter("retourformulaire") == "dossier"
1855 softime 12847 || $this->f->contexte_dossier_instruction()) {
1856 mbroquet 3730 // on recupère les signataires de la multicollectivité et de celle du DI
1857 softime 7996 $di = $this->f->get_inst__om_dbform(array(
1858     "obj" => "dossier_instruction",
1859     "idx" => $this->getParameter('idxformulaire'),
1860     ));
1861 softime 8989 $sql_signataire_arrete_by_di = str_replace(
1862     '<collectivite_di>',
1863     $di->getVal("om_collectivite"),
1864     $this->get_var_sql_forminc__sql("signataire_arrete_by_di")
1865     );
1866     $this->init_select(
1867     $form,
1868     $this->f->db,
1869     $maj,
1870     null,
1871     "signataire_arrete",
1872     $sql_signataire_arrete_by_di,
1873     $this->get_var_sql_forminc__sql("signataire_arrete_by_id"),
1874     true
1875     );
1876 mbroquet 3730 } else {
1877 softime 8989 $this->init_select(
1878     $form,
1879     $this->f->db,
1880     $maj,
1881     null,
1882     "signataire_arrete",
1883     $this->get_var_sql_forminc__sql("signataire_arrete"),
1884     $this->get_var_sql_forminc__sql("signataire_arrete_by_id"),
1885     true
1886     );
1887 mbroquet 3730 }
1888    
1889     /**
1890     * Gestion du filtre sur les événements de workflow disponibles
1891     * On récupère ici en fonction de l'état du dossier d'instruction en
1892     * cours et du type du dossier d'instruction en cours la liste
1893     * événements disponibles.
1894     */
1895     if ($maj == 0) {
1896 softime 14542 $evenements = $this->get_var_sql_forminc__sql_evenement();
1897     $form->setSelect("evenement", $this->convert_events_array_to_select_format($evenements));
1898 mbroquet 3730 } else {
1899 softime 14064 // Instanciation de l'événement pour récupérer son libellé
1900     $evenement = $this->f->get_inst__om_dbform(array(
1901     "obj" => "evenement",
1902     "idx" => $this->getVal("evenement"),
1903     ));
1904    
1905 mbroquet 3730 $contenu = array(
1906     0 => array($this->getVal("evenement"),),
1907 softime 14064 1 => array($evenement->getVal('libelle'),)
1908 mbroquet 3730 );
1909     $form->setSelect("evenement", $contenu);
1910     }
1911    
1912     /**
1913     * Gesion des liens vers la bible
1914     */
1915     // lien bible_auto
1916     $contenu = array(_("automatique"));
1917     $form->setSelect("bible_auto",$contenu);
1918     // lien bible1
1919     $contenu = array(_("bible"));
1920     $form->setSelect("bible",$contenu);
1921     // lien bible2
1922     $contenu = array(_("bible"));
1923     $form->setSelect("bible2",$contenu);
1924     // lien bible3
1925     $contenu = array(_("bible"));
1926     $form->setSelect("bible3",$contenu);
1927     // lien bible4
1928     $contenu = array(_("bible"));
1929     $form->setSelect("bible4",$contenu);
1930 softime 7521
1931     if ($maj == 1) {
1932     $base64 = $this->init_pdf_temp();
1933     $form->setSelect('live_preview', array('base64'=>$base64));
1934 softime 8593 $form->setSelect("btn_refresh", array(_('Prévisualiser')));
1935     $form->setSelect("btn_preview", array(_('Prévisualiser >>')));
1936     $form->setSelect("btn_redaction", array(_('<< Rédiger')));
1937 softime 7521 }
1938 softime 8593
1939     // Selection du type de rédaction à l'ajout
1940     $content = array(
1941     0 => array('f', 't', ),
1942     1 => array(_('Rédaction par compléments'), _('Rédaction libre'), ),
1943     );
1944     $form->setSelect('flag_edition_integrale', $content);
1945 softime 10573
1946     $contenu = array();
1947     foreach(array('waiting', 'in_progress', 'canceled', 'expired', 'finished') as $value) {
1948     $contenu[0][] = $value;
1949     $contenu[1][] = $this->get_trad_for_statut($value);
1950     }
1951     $form->setSelect('statut_signature', $contenu);
1952    
1953    
1954     if ($maj == 401) {
1955     $file = $this->f->storage->get($this->getVal('om_fichier_instruction'));
1956 softime 11418 $form->setSelect('preview_edition', array(
1957     'base64' => base64_encode($file['file_content']),
1958     'mimetype' => $file['metadata']['mimetype'],
1959     'label' => 'instruction_'.$this->getVal($this->clePrimaire),
1960     'href' => sprintf(
1961     '../app/index.php?module=form&snippet=file&obj=instruction&champ=om_fichier_instruction&id=%1$s',
1962     $this->getVal($this->clePrimaire)
1963     )
1964     ));
1965 softime 10573 }
1966 mbroquet 3730 }
1967    
1968 softime 8989 function cleSecondaire($id, &$dnu1 = null, $val = array(), $dnu2 = null) {
1969 mbroquet 3730 //
1970 softime 11228 // Vérifie uniquementla cle secondaire : demande
1971     $this->rechercheTable($this->f->db, "demande", "instruction_recepisse", $id);
1972 mbroquet 3730
1973     $id = $this->getVal($this->clePrimaire);
1974    
1975     //Requête de vérification que cet événement d'instruction n'est pas lié
1976     //à la création d'un dossier d'instruction
1977 softime 14064 $qres = $this->f->get_one_result_from_db_query(
1978     sprintf(
1979     'SELECT
1980     demande_type.dossier_instruction_type
1981     FROM
1982     %1$sdemande_type
1983     LEFT JOIN %1$sdemande
1984     ON demande.demande_type = demande_type.demande_type
1985     WHERE
1986     demande.instruction_recepisse = \'%2$d\'',
1987     DB_PREFIXE,
1988     intval($id)
1989     ),
1990     array(
1991     "origin" => __METHOD__,
1992     )
1993     );
1994 mbroquet 3730
1995     // Aucune clé secondaire n'a été trouvée ou c'est un événement sans
1996     //création de dossier d'instruction, l'événement d'instruction peut être
1997     //supprimé
1998 softime 14064 if ( $this->correct !== false || $qres['result'] == null || $qres['result'] == ""){
1999 mbroquet 3730 // Requête de vérification que cet événement d'instruction est lié
2000     // à une demande
2001 softime 14064 $qres = $this->f->get_one_result_from_db_query(
2002     sprintf(
2003     'SELECT
2004     demande
2005     FROM
2006     %1$sdemande
2007     WHERE
2008     instruction_recepisse = \'%2$d\'',
2009     DB_PREFIXE,
2010     intval($id)
2011     ),
2012     array(
2013     "origin" => __METHOD__,
2014     )
2015     );
2016 mbroquet 3730
2017     //Si c'est un événement d'instruction lié à une demande
2018 softime 14064 if ($qres['result'] != null || $qres['result'] != ""){
2019 softime 7996 $demande = $this->f->get_inst__om_dbform(array(
2020     "obj" => "demande",
2021 softime 14064 "idx" => $qres['result'],
2022 softime 7996 ));
2023 mbroquet 3730
2024 softime 14064 //On met à jour la demande en supprimant la liaison vers
2025 mbroquet 3730 //l'événement d'instruction
2026     $demande->setParameter("maj", 1);
2027     $valF = array();
2028     foreach($demande->champs as $identifiant => $champ) {
2029     $valF[$champ] = $demande->val[$identifiant];
2030     }
2031     $valF['date_demande']=$demande->dateDBToForm($valF['date_demande']);
2032     $valF['instruction_recepisse']=NULL;
2033 softime 8989 $ret = $demande->modifier($valF);
2034 mbroquet 3730 }
2035    
2036     /**
2037     * Vérification que l'élément supprimé est le dernier pour pouvoir
2038     * remodifier les données de manière itérative.
2039     */
2040 softime 14064 $qres = $this->f->get_one_result_from_db_query(
2041     sprintf(
2042     'SELECT
2043     max(instruction)
2044     FROM
2045     %1$sinstruction
2046     WHERE
2047     dossier = \'%2$s\'',
2048     DB_PREFIXE,
2049     $this->f->db->escapeSimple($this->getParameter("idxformulaire"))
2050     ),
2051     array(
2052     "origin" => __METHOD__,
2053     )
2054     );
2055    
2056 mbroquet 3730 // Si on se trouve effectivement sur le dernier evenement d'instruction
2057 softime 14064 // alors on valide la suppression sinon on l'annule
2058     $this->correct = false;
2059     $message = __("Seul le dernier evenement d'instruction peut etre supprime.");
2060     if ($qres['result'] == $id) {
2061 mbroquet 3730 // Alors on valide la suppression
2062     $this->correct = true;
2063 softime 14064 $message = __('Destruction_chronologique');
2064 mbroquet 3730 }
2065 softime 14064 $this->addToMessage($message);
2066 mbroquet 3730 }
2067     }
2068    
2069     /**
2070     * Vérification de la possibilité ou non de modifier des dates de suivi
2071     * @param string $champ champ date à vérifier
2072     */
2073     function updateDate($champ) {
2074    
2075     //Si le retourformulaire est "dossier_instruction"
2076     if ($this->getParameter("retourformulaire") == "dossier"
2077 softime 12847 || $this->f->contexte_dossier_instruction()) {
2078 mbroquet 3730
2079     // Vérification de la possibilité de modifier les dates si déjà éditées
2080     if($this->valF[$champ] != "" AND !$this->f->user_is_admin) {
2081     // si l'utilisateur n'est pas un admin
2082     if($this->getVal($champ) != "" AND $this->getVal($champ) != $this->valF[$champ]) {
2083 softime 15650
2084     // si le champ concerné est 'date_envoi_signature'
2085     // et que le statut du parapheur est 'expired'
2086     // alors on autorise le changement de la date
2087     // pour tous les autres cas, on ne peut modifier la date
2088     if ($champ !== 'date_envoi_signature' || $this->getVal('statut_signature') !== 'expired') {
2089     $this->correct = false;
2090     $this->addToMessage(_("Les dates de suivis ne peuvent etre modifiees"));
2091     }
2092 mbroquet 3730 }
2093     }
2094     }
2095    
2096     //
2097     return true;
2098     }
2099    
2100 softime 8989 /**
2101     * SETTER_FORM - setValsousformulaire (setVal).
2102     *
2103     * @return void
2104     */
2105     function setValsousformulaire(&$form, $maj, $validation, $idxformulaire, $retourformulaire, $typeformulaire, &$dnu1 = null, $dnu2 = null) {
2106     // parent::setValsousformulaire($form, $maj, $validation, $idxformulaire, $retourformulaire, $typeformulaire);
2107 mbroquet 3730 //
2108 softime 8989 $this->retourformulaire = $retourformulaire;
2109     //
2110 mbroquet 3730 if ($maj == 0) {
2111 softime 8989 $form->setVal("destinataire", $this->getParameter("idxformulaire"));
2112     $form->setVal("dossier", $this->getParameter("idxformulaire"));
2113 mbroquet 3730 }
2114 softime 12124
2115     // Si l'instruction a été envoyé au contrôle de légalité et que la
2116     // tâche envoi_cl lié n'a pas encore été traité il faut indiquer à
2117     // l'utilisateur que l'envoi au cl est en cours de traitement.
2118     if ($this->is_sent_to_cl() === true
2119     && empty($this->getVal('date_envoi_controle_legalite'))
2120     && $maj == 3) {
2121     $form->setVal("date_envoi_controle_legalite", __("En cours de traitement."));
2122     }
2123 mbroquet 3730 //
2124     $this->set_form_default_values($form, $maj, $validation);
2125     }
2126    
2127     /**
2128 softime 8989 * SETTER_FORM - set_form_default_values (setVal).
2129     *
2130     * @return void
2131 mbroquet 3730 */
2132     function set_form_default_values(&$form, $maj, $validation) {
2133 softime 8989 //
2134 mbroquet 3730 if ($maj == 0) {
2135     // si contexte DI
2136     if ($this->getParameter("retourformulaire") == "dossier"
2137 softime 12847 || $this->f->contexte_dossier_instruction()) {
2138 mbroquet 3730 // on recupère les signataires de la multicollectivité et de celle du DI
2139 softime 7996 $di = $this->f->get_inst__om_dbform(array(
2140     "obj" => "dossier_instruction",
2141 softime 8989 "idx" => $this->getParameter("idxformulaire"),
2142 softime 7996 ));
2143 softime 8989 $sql = str_replace(
2144     "<collectivite_di>",
2145     $di->getVal("om_collectivite"),
2146     $this->get_var_sql_forminc__sql("signataire_arrete_defaut_by_di")
2147     );
2148 mbroquet 3730 } else {
2149 softime 8989 $sql = $this->get_var_sql_forminc__sql("signataire_arrete_defaut");
2150 mbroquet 3730 }
2151 softime 14542
2152     $qres = $this->f->get_all_results_from_db_query($sql, array(
2153     "origin" => __METHOD__));
2154     $row = array_shift($qres['result']);
2155 softime 8989 if (isset($row["signataire_arrete"])
2156     && is_numeric($row["signataire_arrete"])) {
2157     //
2158     $form->setVal("signataire_arrete", $row["signataire_arrete"]);
2159 mbroquet 3730 }
2160 softime 8989 // Date du jour
2161     $form->setVal("date_evenement", date("Y-m-d"));
2162 mbroquet 3730 }
2163 softime 8989 //
2164 mbroquet 3730 if ($maj == 0 || $maj == 1 || $maj == 125) {
2165 softime 8989 $form->setVal("bible_auto", "bible_auto()");
2166     $form->setVal("bible", "bible(1)");
2167     $form->setVal("bible2", "bible(2)");
2168     $form->setVal("bible3", "bible(3)");
2169     $form->setVal("bible4", "bible(4)");
2170 mbroquet 3730 }
2171 softime 8989 //
2172 softime 7521 $collectivite_di = $this->get_dossier_instruction_om_collectivite();
2173 softime 8989 if ($maj == 1
2174     && $this->f->is_option_preview_pdf_enabled($collectivite_di) === true
2175 softime 7521 && $this->has_an_edition() === true) {
2176 softime 8989 //
2177     $form->setVal("live_preview", $this->getVal($this->clePrimaire));
2178     $form->setVal("btn_refresh", "reload_pdf_viewer()");
2179     $form->setVal("btn_preview", "show_instr_preview()");
2180     $form->setVal("btn_redaction", "show_instr_redaction()");
2181 softime 7521 }
2182 softime 10808
2183 softime 12654 // Gestion de l'affichage des suivis de notification des demandeurs, des services, des tiers et
2184     // des communes
2185     if ($maj == 3) {
2186     if ($this->can_display_notification_demandeur()) {
2187     $typeNotification = array(
2188     'notification_recepisse',
2189     'notification_instruction',
2190     'notification_decision',
2191     );
2192     $form->setVal("suivi_notification", $this->get_json_suivi_notification($typeNotification, true));
2193     }
2194     if ($this->can_display_notification_service()) {
2195     $form->setVal("suivi_notification_service", $this->get_json_suivi_notification(array('notification_service_consulte')));
2196     }
2197     if ($this->can_display_notification_tiers()) {
2198     $form->setVal("suivi_notification_tiers", $this->get_json_suivi_notification(array('notification_tiers_consulte')));
2199     }
2200     if ($this->can_display_notification_commune()) {
2201     $form->setVal("suivi_notification_commune", $this->get_json_suivi_notification(array('notification_depot_demat', 'notification_commune')));
2202     }
2203 softime 15835 if ($this->getVal('flag_edition_integrale') == 't') {
2204     $message = __("Aucun contenu à afficher.");
2205     if (empty($this->getVal('titre_om_htmletat'))) {
2206     $form->setVal("titre_om_htmletat", $message);
2207     }
2208     if (empty($this->getVal('corps_om_htmletatex'))) {
2209     $form->setVal("corps_om_htmletatex", $message);
2210     }
2211     }
2212 softime 10808 }
2213 mbroquet 3730 }
2214    
2215     function setLayout(&$form, $maj){
2216 softime 8593 $form->setBloc('evenement','D',"","sousform-instruction-action-".$maj);
2217 mbroquet 3730
2218 softime 8593 $form->setFieldset('evenement','D',_('Evenement'));
2219     $form->setFieldset('om_final_instruction_utilisateur','F','');
2220    
2221     $form->setBloc('om_final_instruction_utilisateur','F');
2222 softime 15835 // Idem que pour le layout de la synthèse des DI, on est obligé de "casser" le setBloc en utilisant que la fin
2223     // afin de bypasser le fait de ne pas avoir le form-content et le portlet dans le meme container
2224     $form->setBloc('om_final_instruction_utilisateur','F');
2225     $form->setBloc('parapheur_lien_page_signature','D');
2226 mbroquet 3730
2227 softime 8593 $form->setBloc('date_finalisation_courrier','D',"","");
2228 mbroquet 3730
2229 softime 15973 $form->setFieldset('date_finalisation_courrier','D',_('Dates'),"instruction--suivi-dates");
2230     $form->setBloc('date_finalisation_courrier','D');
2231     $form->setBloc('date_envoi_rar','F');
2232 mbroquet 3730
2233 softime 15973 $form->setBloc('date_retour_rar','D');
2234 softime 8593 $form->setBloc('date_retour_controle_legalite','F');
2235     $form->setFieldset('date_retour_controle_legalite','F','');
2236    
2237     $form->setBloc('date_retour_controle_legalite','F');
2238 mbroquet 3730
2239 softime 10573 $form->setBloc('statut_signature','D');
2240     $form->setFieldset('statut_signature','D','Suivi Parapheur');
2241     $form->setBloc('commentaire_signature','F');
2242     $form->setBloc('historique_signature','D');
2243     $form->setFieldset('historique_signature', 'DF', __("Historique"), "collapsible, startClosed");
2244     $form->setBloc('historique_signature','F');
2245     $form->setFieldset('historique_signature','F');
2246    
2247 softime 10808 $form->setFieldset('suivi_notification', 'D', __("Suivi notification"), "collapsible");
2248     $form->setFieldset('suivi_notification','F');
2249 softime 11585 $form->setFieldset('suivi_notification_service', 'D', __("Suivi notification service"), "collapsible");
2250     $form->setFieldset('suivi_notification_service','F');
2251     $form->setFieldset('suivi_notification_tiers', 'D', __("Suivi notification tiers"), "collapsible");
2252     $form->setFieldset('suivi_notification_tiers','F');
2253 softime 12654 $form->setFieldset('suivi_notification_commune', 'D', __("Suivi notification commune"), "collapsible");
2254     $form->setFieldset('suivi_notification_commune','F');
2255 softime 10808
2256 softime 8593 if ($maj == 1) {
2257     // Récupère la collectivité du dossier d'instruction
2258     $collectivite_di = $this->get_dossier_instruction_om_collectivite();
2259 mbroquet 3730
2260 softime 8593 //
2261     if ($this->f->is_option_preview_pdf_enabled($collectivite_di) === true
2262     && $this->has_an_edition() === true) {
2263 softime 7521 //
2264 softime 8593 $form->setBloc('complement_om_html','D',"","container_instr_edition");
2265     $form->setBloc('complement_om_html','D',"","hidelabel box_instr_edition redaction_instr_edition");
2266     $form->setBloc('complement_om_html','D',"","box_instr_edition_main");
2267     $form->setFieldset('complement_om_html','D',_('Complement'));
2268     $form->setFieldset('bible','F','');
2269     $form->setFieldset('complement2_om_html','D',_('Complement 2'));
2270     $form->setFieldset('bible2','F','');
2271     $form->setFieldset('complement3_om_html','D',_('Complement 3'));
2272     $form->setFieldset('bible3','F','');
2273     $form->setFieldset('complement4_om_html','D',_('Complement 4'));
2274     $form->setFieldset('bible4','F','');
2275     $form->setFieldset('titre_om_htmletat','DF',_('Titre'), 'startClosed');
2276     $form->setFieldset('corps_om_htmletatex','DF',_('Corps'));
2277     $form->setBloc('corps_om_htmletatex','F');
2278     $form->setBloc('btn_preview','DF',"","box_instr_edition_btn");
2279     $form->setBloc('btn_preview','F');
2280     $form->setBloc('btn_redaction','D', '',"hidelabel box_instr_edition preview_instr_edition");
2281     $form->setBloc('btn_redaction','DF',"","box_instr_edition_btn");
2282     $form->setFieldset('btn_refresh','D',_('Prévisualisation'), "box_instr_edition_main");
2283     $form->setFieldset('live_preview','F');
2284     $form->setBloc('live_preview','F');
2285     $form->setBloc('live_preview','F');
2286 softime 7521 } else {
2287 softime 8593 $form->setBloc('complement_om_html','D',"","hidelabel");
2288 softime 7521 $form->setFieldset('complement_om_html','D',_('Complement'));
2289     $form->setFieldset('bible','F','');
2290     $form->setFieldset('complement2_om_html','D',_('Complement 2'));
2291     $form->setFieldset('bible2','F','');
2292     $form->setFieldset('complement3_om_html','D',_('Complement 3'));
2293     $form->setFieldset('bible3','F','');
2294     $form->setFieldset('complement4_om_html','D',_('Complement 4'));
2295     $form->setFieldset('bible4','F','');
2296 softime 8593 $form->setFieldset('titre_om_htmletat','DF',_('Titre'), 'startClosed');
2297     $form->setFieldset('corps_om_htmletatex','DF',_('Corps'));
2298     $form->setBloc('corps_om_htmletatex','F');
2299 softime 7521 }
2300 softime 8593 } else {
2301     $form->setBloc('complement_om_html','D',"","hidelabel");
2302     $form->setFieldset('complement_om_html','D',_('Complement'));
2303     $form->setFieldset('bible','F','');
2304     $form->setFieldset('complement2_om_html','D',_('Complement 2'));
2305     $form->setFieldset('bible2','F','');
2306     $form->setFieldset('complement3_om_html','D',_('Complement 3'));
2307     $form->setFieldset('bible3','F','');
2308     $form->setFieldset('complement4_om_html','D',_('Complement 4'));
2309     $form->setFieldset('bible4','F','');
2310     $form->setFieldset('titre_om_htmletat','DF',_('Titre'), 'startClosed');
2311     $form->setFieldset('corps_om_htmletatex','DF',_('Corps'));
2312     $form->setBloc('corps_om_htmletatex','F');
2313 mbroquet 3730 }
2314     }
2315    
2316     function setLib(&$form, $maj) {
2317     //
2318     parent::setLib($form, $maj);
2319     //
2320     $form->setLib('bible_auto', "");
2321     $form->setLib('bible', "");
2322     $form->setLib('bible2', "");
2323     $form->setLib('bible3', "");
2324     $form->setLib('bible4', "");
2325 softime 7521 $form->setLib('btn_refresh', "");
2326 softime 8593 $form->setLib('btn_preview', "");
2327     $form->setLib('btn_redaction', "");
2328 softime 7521 $form->setLib('live_preview', "");
2329 mbroquet 3730 $form->setLib('om_final_instruction_utilisateur', _("finalise par"));
2330 softime 8989 $form->setLib('date_envoi_rar', __("date_envoi_ar"));
2331     $form->setLib('date_retour_rar', __("date_notification"));
2332 softime 10573 $form->setLib('statut_signature', __("statut"));
2333     $form->setLib('commentaire_signature', __("commentaire"));
2334     $form->setLib('historique_signature', '');
2335 softime 10808 $form->setLib('suivi_notification', '');
2336 softime 11585 $form->setLib('suivi_notification_service', '');
2337     $form->setLib('suivi_notification_tiers', '');
2338 softime 12654 $form->setLib('suivi_notification_commune', '');
2339 softime 10573 $form->setLib('preview_edition', "");
2340 softime 8593
2341     // Ajout d'une infobulle d'aide lorsque le formulaire est en mode
2342     // ajout et que l'option de rédaction libre est activée sur la
2343     // collectivité du dossier
2344     if ($maj === '0' && $this->is_option_redaction_libre_enabled() === true) {
2345     //
2346     $help_text_template = '%s <span class="info-16" title="%s"></span>';
2347     $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.");
2348     $form->setLib('flag_edition_integrale', sprintf($help_text_template, _("Type de rédaction"), $help_text));
2349     }
2350     else {
2351     $form->setLib('flag_edition_integrale', _("Type de rédaction"));
2352     }
2353    
2354     // Ajout d'une infobulle d'aide lorsque le formulaire est en mode
2355     // modification et que l'option de prévisualisation de l'édition est
2356     // activée sur la collectivité du dossier
2357     if ($maj === '1'
2358     && $this->f->is_option_preview_pdf_enabled($this->get_dossier_instruction_om_collectivite()) === true) {
2359     //
2360     $help_text_template = '%s <span class="info-16" title="%s"></span>';
2361     $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.");
2362     $form->setLib('date_evenement', sprintf($help_text_template, _('date_evenement'), $help_text));
2363     $form->setLib('signataire_arrete', sprintf($help_text_template, _('signataire_arrete'), $help_text));
2364     }
2365 mbroquet 3730 }
2366    
2367 softime 8989 /**
2368 softime 15835 * Surcharge om_dbform::set_form_specificity()
2369     *
2370     * Traitements spécifiques lié à l'affichage des formulaires.
2371     * Les traitements gérés ici sont les suivants :
2372     * - Affichage d'un message d'erreur si la lettretype de l'évènement n'a pas
2373     * pu être récupérée.
2374     * - Affichage d'un message d'information à l'attention de l'utilisateur si
2375     * la notification est activée mais qu'elle n'est pas possible à cause du
2376     * paramètrage.
2377     *
2378     * @param formulaire $form Instance formulaire.
2379     * @param string $maj
2380     *
2381     * @return void
2382     */
2383     function set_form_specificity(&$form, $maj) {
2384     parent::set_form_specificity($form, $maj);
2385    
2386     // En consultation, vérifie si une lettretype est associée à l'instruction et a pu être récupérée.
2387     // Si ce n'est pas le cas affiche un message d'erreur.
2388     if ((! empty($maj) && $maj == 3)) {
2389     if (! empty($this->getVal('lettretype'))) {
2390    
2391     $om_edition = $this->f->get_inst__om_edition();
2392     $dossier_instruction_om_collectivite = $this->get_dossier_instruction_om_collectivite();
2393     $collectivite = $this->f->getCollectivite($dossier_instruction_om_collectivite);
2394     $edition = $om_edition->get_edition_from_collectivite('om_lettretype', $this->getVal("lettretype"), $collectivite['om_collectivite_idx']);
2395    
2396     if (empty($edition)) {
2397     $this->display_error_message(__("Erreur de paramétrage, le modèle de document n'a pas pu être récupéré. Contactez votre administrateur."));
2398     }
2399     }
2400     }
2401    
2402     $this->display_notification_info($maj);
2403     }
2404    
2405     /**
2406     * En consultation, pour les dossiers qui n'ont pas été transmis par le portail
2407     * citoyen, si la notification des demandeurs est activée sur l'évenement
2408     * d'instruction et que le paramétrage du demandeur principal n'est pas
2409     * correct alors un message a destination de l'instructeur est affiché.
2410     *
2411     * @param string $maj
2412     *
2413     * @return void
2414     */
2415     public function display_notification_info($maj) {
2416     if ((! empty($maj) && $maj == 3)) {
2417     // Si le dossier n'a pas été déposé sur le portail citoyen (ou si
2418     // la requête permettant de savoir le type de demande à échouée) et si
2419     // la notification se fait par mail vérifie si il y a des erreurs de
2420     // paramétrage et si c'est le cas on affiche un message d'information
2421     if ($this->dossier_depose_sur_portail() == null || ! $this->dossier_depose_sur_portail()) {
2422     $erreurParam = $this->get_info_notification_fail();
2423     // Récupération de l'évenement d'instruction
2424     $instEV = $this->get_inst_evenement();
2425     if (! empty($instEV->getVal('notification')) && $erreurParam != array()) {
2426     $class = 'text-info ui-state-highlight ui-state-info';
2427     $message = __("La notification n'est pas possible.");
2428     $this->f->display_panel_information(
2429     $class,
2430     $message,
2431     $erreurParam,
2432     __('Les données suivantes doivent être modifiées'),
2433     'erreur_param_notif'
2434     );
2435     }
2436     }
2437     }
2438     }
2439    
2440     /**
2441     * Méthode permettant d'afficher des messages d'erreur sur les formulaires.
2442     */
2443     public function display_error_message($msg) {
2444     $this->correct = false;
2445     $this->msg = $msg;
2446     }
2447    
2448     /**
2449 softime 8989 * TRIGGER - triggerajouter.
2450     *
2451     * @return boolean
2452     */
2453     function triggerajouter($id, &$dnu1 = null, $val = array(), $dnu2 = null) {
2454     $this->addToLog(__METHOD__."(): start", EXTRA_VERBOSE_MODE);
2455 mbroquet 3730 /**
2456     * Le code suivant permet de récupérer des valeurs des tables evenement
2457     * et dossier pour les stocker dans l'instruction :
2458     * DEPUIS L'EVENEMENT
2459     * - action
2460     * - delai
2461     * - accord_tacite
2462     * - etat
2463     * - avis_decision
2464     * - delai_notification
2465     * - lettretype
2466     * - autorite_competente
2467 softime 10573 * - pec_metier
2468 softime 6565 * - complement_om_html
2469     * - complement2_om_html
2470     * - complement3_om_html
2471     * - complement4_om_html
2472     * - complement5_om_html
2473 mbroquet 3730 * DEPUIS LE DOSSIER D'INSTRUCTION
2474     * - archive_delai
2475     * - archive_accord_tacite
2476     * - archive_etat
2477     * - archive_avis
2478     * - date_complet
2479     * - date_rejet
2480     * - date_limite
2481     * - date_notification_delai
2482     * - date_decision
2483     * - date_validite
2484     * - date_achevement
2485     * - date_chantier
2486     * - date_conformite
2487     * - avis_decision
2488     */
2489     // Récupération de tous les paramètres de l'événement sélectionné
2490 softime 14542 // TODO : remplacer cette requête par l'instanciation de l'événement
2491     $qres = $this->f->get_all_results_from_db_query(
2492     sprintf(
2493     'SELECT
2494     *
2495     FROM
2496     %1$sevenement
2497     WHERE
2498     evenement = %2$d',
2499     DB_PREFIXE,
2500     intval($this->valF['evenement'])
2501     ),
2502     array(
2503     "origin" => __METHOD__,
2504     )
2505     );
2506     foreach ($qres['result'] as $row) {
2507 mbroquet 3730 // Récupération de l'identifiant de l'action
2508     // si une action est paramétrée dans l'événement
2509     $this->valF['action'] = NULL;
2510     if (isset($row['action']) and !empty($row['action'])) {
2511     $this->valF['action']=$row['action'];
2512     }
2513     // Récupération de la valeur du délai
2514     $this->valF['delai'] = $row['delai'];
2515     // Récupération de l'identifiant de l'état
2516     // si un état est paramétré dans l'événement
2517     $this->valF['etat']=NULL;
2518     if (isset($row['etat']) and !empty($row['etat'])) {
2519     $this->valF['etat']=$row['etat'];
2520     }
2521     // Récupération de la valeur d'accord tacite
2522     $this->valF['accord_tacite']=$row['accord_tacite'];
2523     // Récupération de la valeur du délai de notification
2524     $this->valF['delai_notification']=$row['delai_notification'];
2525     // Récupération de l'identifiant de l'avis
2526     // si un avis est paramétré dans l'événement
2527     $this->valF['avis_decision'] = NULL;
2528     if(isset($row['avis_decision']) and !empty($row['avis_decision'])) {
2529     $this->valF['avis_decision']=$row['avis_decision'];
2530     }
2531     // Récupération de la valeur de l'autorité compétente
2532     // si l'autorité compétente est paramétré dans l'événement
2533     $this->valF['autorite_competente'] = NULL;
2534     if(isset($row['autorite_competente']) and !empty($row['autorite_competente'])) {
2535     $this->valF['autorite_competente']=$row['autorite_competente'];
2536     }
2537     // Récupération de la valeur de la lettre type
2538     $this->valF['lettretype']=$row['lettretype'];
2539 softime 10573 // Récupération de la valeur de la prise en compte métier
2540     // si la prise en compte métier est paramétrée dans l'événement
2541     $this->valF['pec_metier'] = NULL;
2542     if(isset($row['pec_metier']) === true and empty($row['pec_metier']) === false) {
2543     $this->valF['pec_metier'] = $row['pec_metier'];
2544     }
2545 mbroquet 3730 }
2546     // Récupération de toutes les valeurs du dossier d'instruction en cours
2547 softime 14542 // TODO : remplacer cette requête par l'instanciation de l'objet
2548     $qres = $this->f->get_all_results_from_db_query(
2549     sprintf(
2550     'SELECT
2551     *
2552     FROM
2553     %1$sdossier
2554     WHERE
2555     dossier = \'%2$s\'',
2556     DB_PREFIXE,
2557     $this->f->db->escapeSimple($this->valF['dossier'])
2558     ),
2559     array(
2560     "origin" => __METHOD__,
2561     )
2562     );
2563     $row = array_shift($qres['result']);
2564 mbroquet 3730 $this->updateArchiveData($row);
2565    
2566     // Récupération de la duree de validite du dossier d'autorisation
2567 softime 14064 $qres = $this->f->get_one_result_from_db_query(
2568     sprintf(
2569     'SELECT
2570     duree_validite_parametrage
2571     FROM
2572     %1$sdossier_autorisation_type_detaille
2573     LEFT JOIN %1$sdossier_autorisation
2574     ON dossier_autorisation.dossier_autorisation_type_detaille = dossier_autorisation_type_detaille.dossier_autorisation_type_detaille
2575     LEFT JOIN %1$sdossier
2576     ON dossier.dossier_autorisation = dossier_autorisation.dossier_autorisation
2577     WHERE
2578     dossier.dossier = \'%2$s\'',
2579     DB_PREFIXE,
2580     $this->f->db->escapeSimple($this->valF['dossier'])
2581     ),
2582     array(
2583     "origin" => __METHOD__,
2584     )
2585     );
2586    
2587     if ($qres['result'] != '') {
2588     $this->valF['duree_validite_parametrage'] = $qres['result'];
2589 mbroquet 3730 }
2590    
2591     // Identifiant du type de courrier
2592     $idTypeCourrier = '11';
2593     $idCourrier = str_pad($this->valF["instruction"], 10, "0", STR_PAD_LEFT);
2594     // Code barres
2595     $this->valF["code_barres"] = $idTypeCourrier . $idCourrier;
2596     }
2597    
2598 softime 12124 /**
2599     * Test si une restriction est valide.
2600     *
2601     * @return boolean
2602     */
2603 mbroquet 3730 function restrictionIsValid($restriction){
2604     if($this->restriction_valid != null) {
2605     return $this->restriction_valid;
2606     }
2607     if(empty($restriction)) {
2608     $this->restriction_valid = true;
2609     return $this->restriction_valid;
2610     }
2611 nmeucci 3873 // Liste des opérateurs possibles sans espace
2612     $operateurs = array(">=", "<=", "+", "-", "&&", "||", "==", "!=");
2613     // Liste identique mais avec le marqueur §
2614     $mark = "§";
2615     $operateurs_marked = array();
2616     foreach ($operateurs as $operateur) {
2617     $operateurs_marked[] = $mark.$operateur.$mark;
2618     }
2619 mbroquet 3730
2620     // Supprime tous les espaces de la chaîne de caractère
2621 nmeucci 3873 $restriction = preg_replace('/\s+/', '', $restriction);
2622 mbroquet 3730
2623 nmeucci 3873 // Met un marqueur avant et après les opérateurs
2624     // puis transforme la chaine en un tableau
2625     $restriction = str_replace($operateurs, $operateurs_marked,
2626 mbroquet 3730 $restriction);
2627    
2628 nmeucci 3873 // Pour chaque opérateur logique
2629     foreach (array('&&', '||') as $operator) {
2630    
2631     // S'il est absent on ne fait aucun traitement
2632     if (strpos($restriction, $mark.$operator.$mark) === false) {
2633     continue;
2634     }
2635     // Sinon on vérifie les deux conditions avec le OU/ET logique
2636     $restrictions = explode($mark.$operator.$mark, $restriction);
2637     $restrictions[0] = explode($mark, $restrictions[0]);
2638     $restrictions[1] = explode($mark, $restrictions[1]);
2639     $res_bool = false;
2640     if ($operator == '&&') {
2641     if ($this->is_restriction_satisfied($restrictions[0], $operateurs)
2642     && $this->is_restriction_satisfied($restrictions[1], $operateurs)) {
2643     $res_bool = true;
2644     }
2645     }
2646     if ($operator == '||') {
2647     if ($this->is_restriction_satisfied($restrictions[0], $operateurs)
2648     || $this->is_restriction_satisfied($restrictions[1], $operateurs)) {
2649     $res_bool = true;
2650     }
2651     }
2652     return $res_bool;
2653     }
2654     $tabRestriction = explode($mark, $restriction);
2655     return $this->is_restriction_satisfied($tabRestriction, $operateurs);
2656    
2657     }
2658    
2659     function is_restriction_satisfied($restriction, $operateurs) {
2660 mbroquet 3730 // Tableau comprenant les résultat
2661     $res = array();
2662     // Compteur pour les résultat
2663     // commence à 1 car le 0 doit rester inchangé tout au long du traitement
2664     $j = 1;
2665     // Comparateur du calcul
2666     $comparateur = '';
2667     // Booléen retourné
2668     $res_bool = true;
2669    
2670     // S'il y a un comparateur
2671 nmeucci 3873 if (in_array(">=", $restriction)
2672     || in_array("<=", $restriction)
2673     || in_array("==", $restriction)
2674     || in_array("!=", $restriction)) {
2675 mbroquet 3730
2676     // Si le tableau n'est pas vide
2677 nmeucci 3873 if (count($restriction) > 0) {
2678 mbroquet 3730
2679     // Boucle dans le tableau pour récupérer seulement les valeurs
2680 nmeucci 3873 foreach ($restriction as $key => $value) {
2681 mbroquet 3730 //
2682     if (!in_array($value, $operateurs)) {
2683     if ($this->getRestrictionValue($value) != false) {
2684     $res[] = $this->getRestrictionValue($value);
2685     } else {
2686     // Message d'erreur
2687     $error_message = sprintf(_("Le champ %s de l'instruction %s est vide"), "<span class='bold'>".$value."</span>", "<span class='bold'>".$this->valF["instruction"]."</span>");
2688     $this->addToMessage($error_message);
2689     // Arrête le traitement
2690     return false;
2691     }
2692     }
2693     }
2694    
2695     // Boucle dans le tableau
2696     // commence à 1 car le 0 doit rester inchangé tout au long du
2697     // traitement
2698 nmeucci 3873 for ($i = 1; $i<count($restriction); $i++) {
2699 mbroquet 3730
2700     // Récupère le comparateur
2701 nmeucci 3873 if ($restriction[$i] === ">="
2702     || $restriction[$i] === "<="
2703     || $restriction[$i] === "=="
2704     || $restriction[$i] === "!=") {
2705     $comparateur = $restriction[$i];
2706 mbroquet 3730 }
2707    
2708     // Si l'opérateur qui suit est un "+"
2709 nmeucci 3873 if ($restriction[$i] === "+") {
2710 mbroquet 3730 $dateDep = $res[$j];
2711     unset($res[$j]);$j++;
2712     $duree = $res[$j];
2713     unset($res[$j]);
2714     $res[$j] = $this->f->mois_date($dateDep, $duree, "+");
2715     }
2716    
2717     // Si l'opérateur qui suit est un "-"
2718 nmeucci 3873 if ($restriction[$i] === "-") {
2719 mbroquet 3730 $dateDep = $res[$j];
2720     unset($res[$j]);$j++;
2721     $duree = $res[$j];
2722     unset($res[$j]);
2723     $res[$j] = $this->f->mois_date($dateDep, $duree, "-");
2724     }
2725     }
2726    
2727     }
2728    
2729     // Si les tableau des résultats n'est pas vide
2730     if (count($res) > 0) {
2731     //
2732     $res_bool = false;
2733     // Effectue le test
2734     if ($comparateur === ">=") {
2735     //
2736     if (strtotime($res[0]) >= strtotime($res[$j])) {
2737     $res_bool = true;
2738     }
2739     }
2740     if ($comparateur === "<=") {
2741 nmeucci 3873 //
2742 mbroquet 3730 if (strtotime($res[0]) <= strtotime($res[$j])) {
2743     $res_bool = true;
2744     }
2745     }
2746 nmeucci 3873 if ($comparateur === "==") {
2747     //
2748     if (strtotime($res[0]) == strtotime($res[$j])) {
2749     $res_bool = true;
2750     }
2751     }
2752     if ($comparateur === "!=") {
2753     //
2754     if (strtotime($res[0]) != strtotime($res[$j])) {
2755     $res_bool = true;
2756     }
2757     }
2758 mbroquet 3730 }
2759     // Sinon une erreur s'affiche
2760     } else {
2761    
2762     // Message d'erreur
2763     $error_message = _("Mauvais parametrage de la restriction.")." ".
2764     _("Contactez votre administrateur");
2765     $this->addToMessage($error_message);
2766     // Arrête le traitement
2767     return false;
2768     }
2769    
2770     return $res_bool;
2771    
2772     }
2773    
2774     /**
2775     * Permet de définir si l'événement passé en paramètre est un événement retour.
2776     * @param integer $evenement événement à tester
2777     *
2778     * @return boolean retourne true si événement retour sinon false
2779     */
2780     function is_evenement_retour($evenement) {
2781     if(empty($evenement) || !is_numeric($evenement)) {
2782     return "";
2783     }
2784 softime 14064
2785     $evenement = $this->f->get_inst__om_dbform(array(
2786     "obj" => "evenement",
2787     "idx" => $evenement,
2788     ));
2789    
2790     return $evenement->getVal('retour') == 't';
2791 mbroquet 3730 }
2792    
2793     /**
2794     * Retourne le champ restriction de l'événement passé en paramètre.
2795     *
2796     * @param integer $evenement id de l'événement sur lequel récupérer la restriction
2797     *
2798     * @return string contenu du champ restriction
2799     */
2800     function get_restriction($evenement) {
2801     if(empty($evenement) || !is_numeric($evenement)) {
2802     return "";
2803     }
2804     //Récupère la restriction
2805 softime 14064 $evenement = $this->f->get_inst__om_dbform(array(
2806     "obj" => "evenement",
2807     "idx" => $evenement,
2808     ));
2809    
2810     return $evenement->getVal('restriction');
2811 mbroquet 3730 }
2812    
2813     /**
2814     * Récupère la valeur du champ dans la restriction
2815     * @param string $restrictionValue Nom du champ
2816     * @return mixed Valeur du champ
2817     */
2818     function getRestrictionValue($restrictionValue){
2819    
2820     // Initialisation de la valeur de retour
2821     $return = false;
2822    
2823     // Récupére les valeurs du dossier
2824     $value_dossier = $this->get_dossier_actual();
2825    
2826     //
2827     if (is_numeric($restrictionValue)) {
2828     $return = $restrictionValue;
2829     }elseif (isset($value_dossier[$restrictionValue])) {
2830     $return = $value_dossier[$restrictionValue];
2831     }elseif (isset($this->valF[$restrictionValue])) {
2832     $return = $this->valF[$restrictionValue];
2833     }
2834    
2835     // Retourne la valeur du champ
2836     return $return;
2837     }
2838    
2839 softime 6565
2840 mbroquet 3730 /**
2841 softime 6565 * Calcul des règle d'action selon leur type.
2842     *
2843     * Types de règle :
2844     * - date
2845     * - numeric
2846     * - text
2847     * - bool
2848     * - specific
2849     * - technical_data
2850 mbroquet 3730 *
2851 softime 6565 * @param string $rule Règle d'action.
2852     * @param string $rule_name Nom de la règle.
2853     * @param string $type Type de la règle.
2854     *
2855 mbroquet 3730 * @return mixed Résultat de la règle
2856     */
2857 softime 6565 public function regle($rule, $rule_name, $type = null) {
2858 mbroquet 3730
2859     // Supprime tous les espaces de la chaîne de caractère
2860     $rule = str_replace(' ', '', $rule);
2861     // Coupe la chaîne au niveau de l'opérateur
2862     $operands = explode ("+", $rule);
2863     // Nombre d'opérande
2864     $nb_operands = count($operands);
2865    
2866     // Règle à null
2867     if ($rule == "null") {
2868     return null;
2869     }
2870    
2871     // Tableau des champs de type date
2872     $rule_type_date = array(
2873     "regle_date_limite",
2874     "regle_date_notification_delai",
2875     "regle_date_complet",
2876     "regle_date_validite",
2877     "regle_date_decision",
2878     "regle_date_chantier",
2879     "regle_date_achevement",
2880     "regle_date_conformite",
2881     "regle_date_rejet",
2882     "regle_date_dernier_depot",
2883     "regle_date_limite_incompletude",
2884 softime 6565 "regle_date_cloture_instruction",
2885     "regle_date_premiere_visite",
2886     "regle_date_derniere_visite",
2887     "regle_date_contradictoire",
2888     "regle_date_retour_contradictoire",
2889     "regle_date_ait",
2890     "regle_date_transmission_parquet",
2891 softime 8989 "regle_date_affichage",
2892 mbroquet 3730 );
2893     // Tableau des champs de type numérique
2894     $rule_type_numeric = array(
2895     "regle_delai",
2896     "regle_delai_incompletude",
2897     );
2898 softime 6565 // Tableau des champs de type text
2899     $rule_type_text = array(
2900     );
2901     // Tableau des champs de type booléen
2902     $rule_type_bool = array(
2903 softime 10573 "regle_a_qualifier",
2904     "regle_incompletude",
2905     "regle_incomplet_notifie",
2906     "regle_evenement_suivant_tacite_incompletude",
2907 softime 6565 );
2908     // Tableau des champs spécifiques
2909     $rule_type_specific = array(
2910     "regle_autorite_competente",
2911     "regle_etat",
2912     "regle_accord_tacite",
2913     "regle_avis",
2914 softime 10573 "regle_pec_metier",
2915     "regle_etat_pendant_incompletude",
2916 softime 6565 );
2917     // Tableau des champs de données techniques
2918     $rule_type_technical_data = array(
2919     'regle_donnees_techniques1',
2920     'regle_donnees_techniques2',
2921     'regle_donnees_techniques3',
2922     'regle_donnees_techniques4',
2923     'regle_donnees_techniques5',
2924     );
2925 softime 8593 // Tableau des champs simple
2926     $rule_type_simple = array(
2927     "regle_dossier_instruction_type",
2928     );
2929 mbroquet 3730
2930     // Définit le type du champ
2931     if (in_array($rule_name, $rule_type_date) == true) {
2932     $type = "date";
2933     }
2934     if (in_array($rule_name, $rule_type_numeric) == true) {
2935     $type = "numeric";
2936     }
2937 softime 6565 if (in_array($rule_name, $rule_type_text) === true) {
2938     $type = "text";
2939     }
2940     if (in_array($rule_name, $rule_type_bool) === true) {
2941     $type = "bool";
2942     }
2943     if (in_array($rule_name, $rule_type_specific) === true) {
2944     $type = "specific";
2945     }
2946     if (in_array($rule_name, $rule_type_technical_data) === true) {
2947     $type = 'text';
2948     }
2949 softime 8593 if (in_array($rule_name, $rule_type_simple) === true) {
2950     $type = 'simple';
2951     }
2952 mbroquet 3730
2953 softime 6565 // Si c'est un type spécifique ou booléen alors il n'a qu'un opérande
2954     // Récupère directement la valeur de l'opérande
2955 softime 10573 if ($type === 'specific') {
2956 softime 6565 //
2957     return $this->get_value_for_rule($rule);
2958     }
2959    
2960 mbroquet 3730 // Initialisation des variables
2961     $key_date = 0;
2962     $total_numeric = 0;
2963 softime 6565 $res_text = '';
2964 mbroquet 3730
2965     // Pour chaque opérande
2966     foreach ($operands as $key => $operand) {
2967    
2968     // Si c'est une règle de type date
2969     if ($type == 'date') {
2970     // Vérifie si au moins une des opérandes est une date
2971 softime 6565 if (is_numeric($operand) === false
2972     && $this->get_value_for_rule($operand) !== null
2973     && $this->f->check_date($this->get_value_for_rule($operand)) == true) {
2974 mbroquet 3730 // Récupère la position de la date
2975     $key_date = $key;
2976     }
2977     // Les autres opérandes doivent être que des numériques
2978     if (is_numeric($operand) == true) {
2979     // Ajoute l'opérande au total
2980     $total_numeric += $operand;
2981     }
2982 softime 6565 if (is_numeric($operand) === false
2983     && $this->get_value_for_rule($operand) !== null
2984     && is_numeric($this->get_value_for_rule($operand)) == true) {
2985 mbroquet 3730 // Ajoute l'opérande au total
2986 softime 6565 $total_numeric += $this->get_value_for_rule($operand);
2987 mbroquet 3730 }
2988     }
2989    
2990     // Si c'est une règle de type numérique
2991     if ($type == 'numeric') {
2992     // Les opérandes doivent être que des numériques
2993     if (is_numeric($operand) == true) {
2994     // Ajoute l'opérande au total
2995     $total_numeric += $operand;
2996     }
2997 softime 6565 if (is_numeric($operand) === false
2998     && $this->get_value_for_rule($operand) !== null
2999     && is_numeric($this->get_value_for_rule($operand)) == true) {
3000 mbroquet 3730 // Ajoute l'opérande au total
3001 softime 6565 $total_numeric += $this->get_value_for_rule($operand);
3002 mbroquet 3730 }
3003     }
3004 softime 6565
3005     // Si c'est une règle de type text
3006     if ($type === 'text') {
3007     // Concatène toutes les chaînes de caractère
3008     $res_text .= $this->get_value_for_rule($operand);
3009     }
3010 mbroquet 3730 }
3011    
3012     // Résultat pour une règle de type date
3013     if ($type == 'date') {
3014     // Retourne le calcul de la date
3015     return $this->f->mois_date($this->valF[$operands[$key_date]],
3016     $total_numeric, "+");
3017     }
3018    
3019     // Résultat pour une règle de type numérique
3020     if ($type == 'numeric') {
3021     // Retourne le calcul
3022     return $total_numeric;
3023     }
3024 softime 6565
3025     // Résultat pour une règle de type text
3026     if ($type === 'text') {
3027     // Retourne la chaîne de caractère
3028     return $res_text;
3029     }
3030 softime 10573 if ($type === 'simple' || $type === 'bool') {
3031 softime 8593 // Retourne la valeur du champs rule
3032     return $rule;
3033     }
3034 softime 6565 }
3035    
3036    
3037     /**
3038     * Récupère la valeur du champs dans l'instruction ou dans les données
3039     * techniques.
3040     * Spécifique au calcul des règles.
3041     *
3042     * @param string $field Champ
3043     *
3044     * @return mixed Valeur du champ
3045     */
3046     private function get_value_for_rule($field) {
3047     // Si le champ n'existe pas dans la table instruction
3048     if (array_key_exists($field, $this->valF) === false) {
3049     // Récupère l'instance de la classe donnees_techniques
3050     $inst_donnees_techniques = $this->get_inst_donnees_techniques();
3051     // Retourne la valeur de la donnée technique
3052     return $inst_donnees_techniques->getVal($field);
3053     }
3054    
3055     //
3056     return $this->valF[$field];
3057     }
3058    
3059    
3060     /**
3061     * [get_inst_donnees_techniques description]
3062     *
3063     * @param [type] $donnees_techniques [description]
3064     *
3065     * @return [type] [description]
3066     */
3067     function get_inst_donnees_techniques($donnees_techniques = null) {
3068     //
3069     if (isset($this->inst_donnees_techniques) === false or
3070     $this->inst_donnees_techniques === null) {
3071     //
3072     if (is_null($donnees_techniques)) {
3073     $donnees_techniques = $this->getDonneesTechniques();
3074     }
3075     //
3076 softime 7996 $this->inst_donnees_techniques = $this->f->get_inst__om_dbform(array(
3077     "obj" => "donnees_techniques",
3078     "idx" => $donnees_techniques,
3079     ));
3080 softime 6565 }
3081     //
3082     return $this->inst_donnees_techniques;
3083     }
3084    
3085    
3086     /**
3087     * Retourne l'identifiant des données techniques liées du dossier
3088     * @return string L'identifiant des données techniques liées du dossier
3089     */
3090     function getDonneesTechniques() {
3091 softime 14064
3092     $qres = $this->f->get_one_result_from_db_query(
3093     sprintf(
3094     'SELECT
3095     donnees_techniques
3096     FROM
3097     %1$sdonnees_techniques
3098     WHERE
3099     dossier_instruction = \'%2$s\'',
3100     DB_PREFIXE,
3101     $this->f->db->escapeSimple($this->valF["dossier"])
3102     ),
3103     array(
3104     "origin" => __METHOD__,
3105     )
3106     );
3107 mbroquet 3730
3108 softime 14064 return $qres['result'];
3109 mbroquet 3730 }
3110    
3111 fmichon 4708 /**
3112     * TRIGGER - triggerajouterapres.
3113     *
3114     * - Mise à jour des informations liées au workflow sur le dossier
3115     * - Interface avec le référentiel ERP [105][111]
3116     * - Mise à jour du DA
3117     * - Historisation de la vie du DI
3118     *
3119     * @return boolean
3120     */
3121 softime 8989 function triggerajouterapres($id, &$dnu1 = null, $val = array(), $dnu2 = null) {
3122     $this->addToLog(__METHOD__."(): start", EXTRA_VERBOSE_MODE);
3123 fmichon 4708
3124     // On a besoin de l'instance du dossier lié à l'événement d'instruction
3125     $inst_di = $this->get_inst_dossier($this->valF['dossier']);
3126     // Instance de la classe evenement
3127     $inst_evenement = $this->get_inst_evenement($this->valF['evenement']);
3128 softime 9245 // Instance de l'état courant du dossier d'instruction
3129     $inst_current_etat = $this->f->get_inst__om_dbform(array(
3130     "obj" => "etat",
3131     "idx" => $inst_di->get_id_etat(),
3132     ));
3133 fmichon 4708
3134 mbroquet 3730 /**
3135     * Mise à jour des valeurs du dossier en fonction des valeurs calculées
3136     * par l'action
3137     */
3138 fmichon 4708 // état de complétude actuel du dossier
3139     $incompletude = ($inst_di->getVal('incompletude') == 't' ? true : false);
3140 softime 10573 // L'événement suivant tacite paramétré est destiné à la gestion de l'incomplétude
3141     $ev_suiv_tacite_incompletude = false;
3142 mbroquet 3730 // Initialisation
3143 softime 9245 $valF = array();
3144     $valF_dt = array();
3145 fmichon 4708 //
3146 mbroquet 3730 // Récupération des paramètres de l'action
3147 softime 14542 // TODO : remplacer cette requête par l'instanciation de l'action
3148     $qres = $this->f->get_all_results_from_db_query(
3149     sprintf(
3150     'SELECT
3151     *
3152     FROM
3153     %1$saction
3154     WHERE
3155     action = \'%2$s\'',
3156     DB_PREFIXE,
3157     $this->f->db->escapeSimple($this->valF['action'])
3158     ),
3159     array(
3160     "origin" => __METHOD__
3161     )
3162     );
3163     foreach ($qres['result'] as $row) {
3164 mbroquet 3730
3165     // pour chacune des regles, on applique la regle
3166 softime 6565 if ($row['regle_delai'] != '') {
3167 mbroquet 3730 $valF['delai'] = $this->regle($row['regle_delai'], 'regle_delai');
3168     }
3169 softime 6565 if ($row['regle_accord_tacite'] != '') {
3170 mbroquet 3730 $valF['accord_tacite'] = $this->regle($row['regle_accord_tacite'], 'regle_accord_tacite');
3171     }
3172 softime 6565 if ($row['regle_avis'] != '') {
3173 mbroquet 3730 $valF['avis_decision'] = $this->regle($row['regle_avis'], 'regle_avis');
3174     }
3175 softime 6565 if ($row['regle_date_limite'] != '') {
3176     $valF['date_limite'] = $this->regle($row['regle_date_limite'], 'regle_date_limite');
3177 mbroquet 3730 }
3178 softime 6565 if ($row['regle_date_complet'] != '') {
3179     $valF['date_complet'] = $this->regle($row['regle_date_complet'], 'regle_date_complet');
3180 mbroquet 3730 }
3181 softime 6565 if ($row['regle_date_dernier_depot'] != '') {
3182     $valF['date_dernier_depot'] = $this->regle($row['regle_date_dernier_depot'], 'regle_date_dernier_depot');
3183 mbroquet 3730 }
3184 softime 6565 if ($row['regle_date_notification_delai'] != '') {
3185     $valF['date_notification_delai'] = $this->regle($row['regle_date_notification_delai'], 'regle_date_notification_delai');
3186 mbroquet 3730 }
3187 softime 6565 if ($row['regle_date_decision'] != '') {
3188     $valF['date_decision'] = $this->regle($row['regle_date_decision'], 'regle_date_decision');
3189 mbroquet 3730 }
3190 softime 6565 if ($row['regle_date_rejet'] != '') {
3191     $valF['date_rejet'] = $this->regle($row['regle_date_rejet'], 'regle_date_rejet');
3192 mbroquet 3730 }
3193 softime 6565 if ($row['regle_date_validite'] != '') {
3194     $valF['date_validite'] = $this->regle($row['regle_date_validite'], 'regle_date_validite');
3195 mbroquet 3730 }
3196 softime 6565 if ($row['regle_date_chantier'] != '') {
3197     $valF['date_chantier'] = $this->regle($row['regle_date_chantier'], 'regle_date_chantier');
3198 mbroquet 3730 }
3199 softime 6565 if ($row['regle_date_achevement'] != '') {
3200     $valF['date_achevement'] = $this->regle($row['regle_date_achevement'], 'regle_date_achevement');
3201 mbroquet 3730 }
3202 softime 6565 if ($row['regle_date_conformite'] != '') {
3203     $valF['date_conformite'] = $this->regle($row['regle_date_conformite'], 'regle_date_conformite');
3204 mbroquet 3730 }
3205 softime 6565 if ($row['regle_date_limite_incompletude'] != '') {
3206     $valF['date_limite_incompletude'] = $this->regle($row['regle_date_limite_incompletude'], 'regle_date_limite_incompletude');
3207 mbroquet 3730 }
3208 softime 6565 if ($row['regle_delai_incompletude'] != '') {
3209     $valF['delai_incompletude'] = $this->regle($row['regle_delai_incompletude'], 'regle_delai_incompletude');
3210 mbroquet 3730 }
3211 softime 6565 if ($row['regle_autorite_competente'] != '') {
3212     $valF['autorite_competente'] = $this->regle($row['regle_autorite_competente'], 'regle_autorite_competente');
3213 mbroquet 3730 }
3214 softime 6565 if ($row['regle_etat'] != '') {
3215 softime 10573 $valF['etat'] = $this->regle($row['regle_etat'], 'regle_etat');
3216 mbroquet 3730 }
3217 softime 6565 if ($row['regle_date_cloture_instruction'] !== '') {
3218     $valF['date_cloture_instruction'] = $this->regle($row['regle_date_cloture_instruction'], 'regle_date_cloture_instruction');
3219     }
3220     if ($row['regle_date_premiere_visite'] !== '') {
3221     $valF['date_premiere_visite'] = $this->regle($row['regle_date_premiere_visite'], 'regle_date_premiere_visite');
3222     }
3223     if ($row['regle_date_derniere_visite'] !== '') {
3224     $valF['date_derniere_visite'] = $this->regle($row['regle_date_derniere_visite'], 'regle_date_derniere_visite');
3225     }
3226     if ($row['regle_date_contradictoire'] !== '') {
3227     $valF['date_contradictoire'] = $this->regle($row['regle_date_contradictoire'], 'regle_date_contradictoire');
3228     }
3229     if ($row['regle_date_retour_contradictoire'] !== '') {
3230     $valF['date_retour_contradictoire'] = $this->regle($row['regle_date_retour_contradictoire'], 'regle_date_retour_contradictoire');
3231     }
3232     if ($row['regle_date_ait'] !== '') {
3233     $valF['date_ait'] = $this->regle($row['regle_date_ait'], 'regle_date_ait');
3234     }
3235     if ($row['regle_donnees_techniques1'] !== '') {
3236     $valF_dt[$row['cible_regle_donnees_techniques1']] = $this->regle($row['regle_donnees_techniques1'], 'regle_donnees_techniques1');
3237     }
3238     if ($row['regle_donnees_techniques2'] !== '') {
3239     $valF_dt[$row['cible_regle_donnees_techniques2']] = $this->regle($row['regle_donnees_techniques2'], 'regle_donnees_techniques2');
3240     }
3241     if ($row['regle_donnees_techniques3'] !== '') {
3242     $valF_dt[$row['cible_regle_donnees_techniques3']] = $this->regle($row['regle_donnees_techniques3'], 'regle_donnees_techniques3');
3243     }
3244     if ($row['regle_donnees_techniques4'] !== '') {
3245     $valF_dt[$row['cible_regle_donnees_techniques4']] = $this->regle($row['regle_donnees_techniques4'], 'regle_donnees_techniques4');
3246     }
3247     if ($row['regle_donnees_techniques5'] !== '') {
3248     $valF_dt[$row['cible_regle_donnees_techniques5']] = $this->regle($row['regle_donnees_techniques5'], 'regle_donnees_techniques5');
3249     }
3250     if ($row['regle_date_transmission_parquet'] !== '') {
3251     $valF['date_transmission_parquet'] = $this->regle($row['regle_date_transmission_parquet'], 'regle_date_transmission_parquet');
3252     }
3253 softime 8593 if ($row['regle_dossier_instruction_type'] !== '') {
3254     $valF['dossier_instruction_type'] = $this->regle($row['regle_dossier_instruction_type'], 'regle_dossier_instruction_type');
3255     }
3256 softime 8989 // La date d'affichage est modifiée seulement si le champ n'est pas
3257     // renseigné
3258     if ($row['regle_date_affichage'] !== ''
3259     && ($inst_di->getVal('date_affichage') === ''
3260     || $inst_di->getVal('date_affichage') === null)) {
3261     //
3262     $valF['date_affichage'] = $this->regle($row['regle_date_affichage'], 'regle_date_affichage');
3263     }
3264 softime 10573 //
3265     if ($row['regle_pec_metier'] != '') {
3266     $valF['pec_metier'] = $this->regle($row['regle_pec_metier'], 'regle_pec_metier');
3267     }
3268     if ($row['regle_a_qualifier'] != '') {
3269     $valF['a_qualifier'] = $this->regle($row['regle_a_qualifier'], 'regle_a_qualifier');
3270     }
3271     //
3272     if ($row['regle_incompletude'] != '') {
3273     $valF['incompletude'] = $this->regle($row['regle_incompletude'], 'regle_incompletude');
3274     }
3275     if ($row['regle_incomplet_notifie'] != '') {
3276     $valF['incomplet_notifie'] = $this->regle($row['regle_incomplet_notifie'], 'regle_incomplet_notifie');
3277     }
3278     if ($row['regle_etat_pendant_incompletude'] != '') {
3279     $valF['etat_pendant_incompletude'] = $this->regle($row['regle_etat_pendant_incompletude'], 'regle_etat_pendant_incompletude');
3280     }
3281     if ($row['regle_evenement_suivant_tacite_incompletude'] != '') {
3282     $resti = $this->regle($row['regle_evenement_suivant_tacite_incompletude'], 'regle_evenement_suivant_tacite_incompletude');
3283     if (strtolower($resti) === 't' || strtolower($resti) === 'true') {
3284     $ev_suiv_tacite_incompletude = true;
3285     }
3286     }
3287 mbroquet 3730 }
3288 softime 6063
3289     // Si l'événement a un événement suivant tacite
3290     if($inst_evenement->getVal('evenement_suivant_tacite') != '') {
3291 softime 10573 // En fonction de l'action de l'événement, l'événement suivant tacite ne sera
3292     // pas associé de le même façon au dossier d'instruction
3293     if ($ev_suiv_tacite_incompletude === false) {
3294 softime 6063 $valF['evenement_suivant_tacite'] = $inst_evenement->getVal('evenement_suivant_tacite');
3295 softime 10573 }
3296     if ($ev_suiv_tacite_incompletude === true) {
3297 softime 6063 $valF['evenement_suivant_tacite_incompletude'] = $inst_evenement->getVal('evenement_suivant_tacite');
3298 nhaye 5254 }
3299 mbroquet 3730 }
3300 softime 6565 // Si des valeurs de données techniques ont été calculées alors on met à jour l'enregistrement
3301 softime 9245 if (count($valF_dt) > 0) {
3302 softime 6565 $dt_id = $this->getDonneesTechniques();
3303     // On met à jour le dossier
3304     $cle = " donnees_techniques='".$dt_id."'";
3305 softime 12847 $res1 = $this->f->db->autoexecute(DB_PREFIXE.'donnees_techniques', $valF_dt, DB_AUTOQUERY_UPDATE, $cle);
3306     $this->addToLog(
3307     __METHOD__."(): db->autoexecute(\"".DB_PREFIXE."donnees_techniques\", ".print_r($valF_dt, true).", DB_AUTOQUERY_UPDATE, \"".$cle."\");",
3308     VERBOSE_MODE
3309     );
3310     $this->f->isDatabaseError($res1);
3311 softime 6565 // Affichage d'informations à l'utilisateur
3312 softime 8989 $this->addToMessage(_('enregistrement')." ".$this->valF['dossier']." "._('table')." dossier [".$this->f->db->affectedRows()." "._('enregistrement')." "._('mis_a_jour')."]");
3313 softime 6565 }
3314 mbroquet 3730 // Si des valeurs ont été calculées alors on met à jour l'enregistrement
3315 softime 9245 if (count($valF) > 0) {
3316 softime 10573 //
3317     $inst_dossier = $this->f->get_inst__om_dbform(array(
3318     "obj" => "dossier",
3319     "idx" => $this->valF['dossier'],
3320     ));
3321     $valF['instruction'] = $id;
3322 softime 10968 $valF['crud'] = 'create';
3323 softime 10573 $update_by_instruction = $inst_dossier->update_by_instruction($valF);
3324     if ($update_by_instruction === false) {
3325     $this->cleanMessage();
3326     $this->addToMessage(sprintf('%s %s', __("Une erreur s'est produite lors de la mise à jour du dossier d'instruction."), __("Veuillez contacter votre administrateur.")));
3327     return false;
3328 mbroquet 3730 }
3329     // Affichage d'informations à l'utilisateur
3330 softime 8989 $this->addToMessage(_('enregistrement')." ".$this->valF['dossier']." "._('table')." dossier [".$this->f->db->affectedRows()." "._('enregistrement')." "._('mis_a_jour')."]");
3331 mbroquet 3730 }
3332    
3333     /**
3334 fmichon 4708 * Interface avec le référentiel ERP.
3335     *
3336     * (WS->ERP)[105] Arrêté d'un dossier PC effectué -> PC qui concerne un ERP
3337     * (WS->ERP)[111] Décision de conformité effectuée -> PC qui concerne un ERP
3338     * Déclencheur :
3339     * - L'option ERP est activée
3340     * - Le dossier est marqué comme "connecté au référentiel ERP"
3341     * - Le dossier est de type PC
3342     * - Le formulaire d'ajout d'un événement d'instruction est validé
3343     * avec un événement pour lequel les services ERP doivent être
3344     * informé
3345 mbroquet 3730 */
3346 fmichon 4708 //
3347 softime 7521 if ($this->f->is_option_referentiel_erp_enabled() === true
3348 fmichon 4708 && $inst_di->is_connected_to_referentiel_erp() === true
3349     && $this->f->getDATCode($this->valF['dossier']) == $this->f->getParameter('erp__dossier__nature__pc')
3350     && in_array($inst_evenement->getVal($inst_evenement->clePrimaire), explode(";", $this->f->getParameter('erp__evenements__decision__pc')))) {
3351 mbroquet 3730 //
3352 fmichon 4708 $infos = array(
3353     "dossier_instruction" => $this->valF['dossier'],
3354     "decision" => $inst_evenement->getVal("libelle"),
3355     );
3356 mbroquet 3730 //
3357 fmichon 4708 $ret = $this->f->send_message_to_referentiel_erp(105, $infos);
3358     if ($ret !== true) {
3359     $this->cleanMessage();
3360     $this->addToMessage(_("Une erreur s'est produite lors de la notification (105) du référentiel ERP. Contactez votre administrateur."));
3361     return false;
3362 mbroquet 3730 }
3363 fmichon 4708 $this->addToMessage(_("Notification (105) du référentiel ERP OK."));
3364     }
3365 mbroquet 3730
3366 softime 8989 // Si le mode en rédaction intégrale est activé
3367     if (isset($this->valF['flag_edition_integrale']) === true
3368     && $this->valF['flag_edition_integrale'] === true) {
3369     $redactionIntegraleValF = array();
3370    
3371     // Récupère la collectivite du dossier d'instruction
3372     $dossier_instruction_om_collectivite = $this->get_dossier_instruction_om_collectivite();
3373     $collectivite = $this->f->getCollectivite($dossier_instruction_om_collectivite);
3374     // Récupère le corps de la lettre type
3375     $params = array(
3376     "specific" => array(
3377     "corps" => array(
3378     "mode" => "get",
3379     )
3380     ),
3381     );
3382     $result = $this->compute_pdf_output('lettretype', $this->valF['lettretype'], $collectivite, $id, $params);
3383     $redactionIntegraleValF['corps_om_htmletatex'] = $result['pdf_output'];
3384     // Récupère le titre de la lettre type
3385     $params = array(
3386     "specific" => array(
3387     "titre" => array(
3388     "mode" => "get",
3389     )
3390     ),
3391     );
3392     $result = $this->compute_pdf_output('lettretype', $this->valF['lettretype'], $collectivite, $id, $params);
3393     $redactionIntegraleValF['titre_om_htmletat'] = $result['pdf_output'];
3394    
3395     // mise à jour en base de données
3396     $res = $this->f->db->autoExecute(
3397     DB_PREFIXE.$this->table,
3398     $redactionIntegraleValF,
3399     DB_AUTOQUERY_UPDATE,
3400     $this->clePrimaire."=".$id
3401     );
3402     $this->addToLog(__METHOD__."(): db->autoexecute(\"".DB_PREFIXE.'.'.$this->table."\", ".print_r($redactionIntegraleValF, true).", DB_AUTOQUERY_UPDATE, \"".$this->clePrimaire."=".$id."\");", VERBOSE_MODE);
3403     if ($this->f->isDatabaseError($res, true) === true) {
3404     return false;
3405     }
3406     }
3407    
3408 fmichon 4708 /**
3409 softime 7996 * Finalisation automatique de l'instruction si le paramétrage de l'événement l'autorise
3410     */
3411     // Si la finalisation automatique de l'événement est activée
3412     // ET si l'instruction n'a pas déjà été finalisée
3413     // ET s'il existe une lettre type associée
3414     if ($inst_evenement->getVal('finaliser_automatiquement') === 't'
3415     && $inst_evenement->getVal('om_final_instruction') !== 't'
3416     && $inst_evenement->getVal('lettretype') !== ''
3417     && $inst_evenement->getVal('lettretype') !== null) {
3418    
3419     // On instancie l'instruction
3420     $inst_instruction = $this->f->get_inst__om_dbform(array(
3421     "obj" => "instruction",
3422     "idx" => $this->valF[$this->clePrimaire],
3423     ));
3424    
3425     // On finalise l'instruction dans le contexte de finalisation : action 100
3426     $inst_instruction->setParameter('maj', 100);
3427     $finalize = $inst_instruction->finalize($inst_instruction->valF);
3428    
3429     // Une erreur de finalisation renvoie 'false' : ajout dans les logs
3430     // et dans le message d'erreur
3431     if ($finalize === false) {
3432     $this->f->addToLog(__METHOD__."() : ERROR - Impossible de finaliser l'instruction.", DEBUG_MODE);
3433     $this->addToMessage(_("Erreur lors de la finalisation de l'instruction. Contactez votre administrateur."));
3434     return false;
3435     }
3436     }
3437    
3438     /**
3439 softime 7521 * Finalisation automatique des instructions tacites ou retours.
3440     */
3441 softime 7685 // Si l'option de finalisation automatique des instructions tacites ou
3442     // retours est activée et l'événement d'instruction a une lettre type
3443     // associée
3444     $collectivite_di = $this->get_dossier_instruction_om_collectivite($val['dossier']);
3445     if ($this->f->is_option_finalisation_auto_enabled($collectivite_di) === true
3446     && $inst_evenement->getVal('lettretype') !== ''
3447 softime 7521 && $inst_evenement->getVal('lettretype') !== null) {
3448    
3449     // Rècupère l'identifiant de l'événement
3450     $evenement_id = $inst_evenement->getVal($inst_evenement->clePrimaire);
3451    
3452     // Si l'événement d'instruction est identifié comme un événement
3453     // retour
3454     // OU l'événement d'instruction est l'événement suivant tacite du
3455     // dossier d'instruction (incomplétude prise en compte)
3456 softime 7996 // ET l'événement d'instruction n'a pas déjà été finalisé
3457     if (($inst_evenement->getVal("retour") === 't'
3458 softime 7521 || ($inst_di->getVal('evenement_suivant_tacite_incompletude') === $evenement_id
3459 softime 7996 || $inst_di->getVal('evenement_suivant_tacite') === $evenement_id))
3460     && ($inst_evenement->getVal('om_final_instruction') !== 't')) {
3461 softime 7521
3462     // Finalise l'instruction
3463 softime 7996 $inst_instruction = $this->f->get_inst__om_dbform(array(
3464     "obj" => "instruction",
3465     "idx" => $this->valF[$this->clePrimaire],
3466     ));
3467 softime 7521 $inst_instruction->setParameter('maj', 100);
3468     $finalize = $inst_instruction->finalize($inst_instruction->valF);
3469     if ($finalize === false) {
3470     //
3471     return false;
3472     }
3473     }
3474     }
3475    
3476     /**
3477 softime 9245 * Mise à jour de la version de clôture *version_clos* du dossier si et
3478     * seulement si l'instruction met à jour l'état du dossier.
3479     */
3480     if (isset($valF['etat']) === true
3481     && $valF['etat'] !== null
3482     && $valF['etat'] !== '') {
3483     // Instanciation de l'état appliqué sur le dossier par l'instruction
3484     $inst_etat = $this->f->get_inst__om_dbform(array(
3485     "obj" => "etat",
3486     "idx" => $valF['etat'],
3487     ));
3488     //
3489     $update_version_clos = null;
3490     // En cas d'instruction qui clôture le dossier
3491     if ($inst_etat->getVal('statut') === 'cloture') {
3492     $update_version_clos = $inst_di->update_version_clos('up');
3493     }
3494     // En cas d'instruction qui rouvre le dossier
3495     if ($inst_current_etat->getVal('statut') === 'cloture'
3496     && $inst_etat->getVal('statut') !== 'cloture') {
3497     //
3498     $update_version_clos = $inst_di->update_version_clos('down');
3499     //
3500     $params = array(
3501     'di_reopened' => true,
3502     );
3503     }
3504     //
3505     if ($update_version_clos === false) {
3506     $this->f->addToLog(sprintf(
3507     "%s() : ERREUR - %s %s",
3508     __METHOD__,
3509     sprintf(
3510     __("Impossible de mettre à jour la version de clôture du dossier d'instruction %s."),
3511     $inst_di->getVal($inst_di->clePrimaire)
3512     ),
3513     sprintf(
3514     __("L'instruction tente d'appliquer l'état %s."),
3515     $inst_etat->getVal($inst_etat->clePrimaire)
3516     )
3517     ));
3518     $this->addToMessage(sprintf(
3519     "%s %s",
3520     __("Erreur lors de la mise à jour de la version de clôture du dossier d'instruction."),
3521     __("Veuillez contacter votre administrateur.")
3522     ));
3523     return false;
3524     }
3525     }
3526    
3527     /**
3528 softime 10808 * Notification automatique
3529     */
3530     // Notification automatique à l'ajout de l'instruction si la notification
3531     // automatique est choisie et qu'il n'y a pas de lettretype associée à l'événement
3532     if ($inst_evenement->getVal('notification') === 'notification_automatique' &&
3533     ($inst_evenement->getVal('lettretype') === null ||
3534     $inst_evenement->getVal('lettretype') === '')) {
3535 softime 13137 // Message à afficher dans les logs pour indiquer quelle notification a échouée
3536 softime 13528 $msgLog = sprintf(
3537     '%s %s : %d',
3538     __('Erreur lors de la notification automatique du(des) pétitionnaire(s).'),
3539     __('Instruction notifiée'),
3540     $id
3541     );
3542 softime 13137
3543 softime 10808 // Récupération de la liste des demandeurs à notifier et de la catégorie
3544     $categorie = $this->f->get_param_option_notification($collectivite_di);
3545 softime 14064 $isPortal = $categorie === PORTAL;
3546 softime 10869 $demandeursANotifie = $this->get_demandeurs_notifiable(
3547     $this->valF['dossier'],
3548     $isPortal
3549     );
3550 softime 10808
3551     // Création d'une notification et d'une tâche pour chaque demandeur à notifier
3552 softime 12124 $demandeurPrincipalNotifie = false;
3553 softime 10808 foreach ($demandeursANotifie as $demandeur) {
3554 softime 12124 // Identifie si le demandeur principal a été notifié ou pas
3555     // et récupère ses informations
3556     if ($demandeur['petitionnaire_principal'] == 't') {
3557     $demandeurPrincipalNotifie = true;
3558     // Si le demandeur principal est notifiable mais qu'il y a des erreurs dans
3559     // son paramétrage, on effectue pas le traitement et on passe à l'itération
3560     // suivante. On le considère également comme non notifié pour gérer l'envoie
3561     // des messages d'erreurs
3562     // Si la demande a été déposée via le portail alors le paramétrage n'a pas
3563     // d'impact sur la notification
3564     $erreursParam = $this->get_info_notification_fail($val['dossier']);
3565     if (! $this->dossier_depose_sur_portail($val['dossier']) && $erreursParam != array()) {
3566     $demandeurPrincipalNotifie = false;
3567     continue;
3568     }
3569     }
3570 softime 10808 // Ajout de la notif et récupération de son id
3571     $idNotif = $this->ajouter_notification(
3572     $this->valF[$this->clePrimaire],
3573     $this->f->get_connected_user_login_name(),
3574 softime 10968 $demandeur,
3575     $collectivite_di,
3576 softime 12433 array(),
3577 softime 10968 true
3578 softime 10808 );
3579     if ($idNotif === false) {
3580 softime 13528 $this->addToLog(
3581     sprintf('%s() : %s', __METHOD__, $msgLog),
3582     DEBUG_MODE
3583     );
3584 softime 10808 return false;
3585     }
3586     // Création de la tache en lui donnant l'id de la notification
3587     $notification_by_task = $this->notification_by_task(
3588     $idNotif,
3589     $this->valF['dossier'],
3590     $categorie
3591     );
3592     if ($notification_by_task === false) {
3593 softime 13528 $this->addToLog(
3594     sprintf('%s() : %s', __METHOD__, $msgLog),
3595     DEBUG_MODE
3596     );
3597 softime 10808 $this->addToMessage(
3598     __("Erreur lors de la génération de la notification au(x) pétitionnaire(s).")
3599     );
3600     return false;
3601     }
3602     }
3603 softime 12847 // Pour la notification par mail ou la notification via portal si le dossier a
3604     // été déposés via portal, si le demandeur principal n'est pas notifiable,
3605     // on créé une nouvelle notification en erreur avec en commentaire la raison pour
3606     // laquelle le demandeur principal n'a pas pu être notifié
3607     $depotPortal = $this->dossier_depose_sur_portail();
3608     if (! $demandeurPrincipalNotifie && ($isPortal === false || $depotPortal === true)) {
3609 softime 13137 // Précision dans les logs que le pétitionnaire principal n'est pas notifiable.
3610     // ' ' permet de mettre un espace entre les 2 msg de log.
3611 softime 13528 $msgLog .= sprintf(' %s', __('Le pétitionnaire principale n\'est pas notifiable.'));
3612 softime 12124 // Analyse pour savoir pourquoi le demandeur principal n'est pas notifiable
3613     $erreursParam = $this->get_info_notification_fail($val['dossier']);
3614     $demandeurPrincipal = $this->get_info_petitionnaire_principal_dossier($val['dossier']);
3615     // Ajout de la notif et récupération de son id
3616     $idNotif = $this->ajouter_notification(
3617     $this->valF[$this->clePrimaire],
3618     $this->f->get_connected_user_login_name(),
3619     $demandeurPrincipal,
3620     $collectivite_di,
3621 softime 12433 array(),
3622 softime 12124 true,
3623     'Echec',
3624     implode(' ', $erreursParam)
3625     );
3626     if ($idNotif === false) {
3627 softime 13528 $this->addToLog(
3628     sprintf('%s() : %s', __METHOD__, $msgLog),
3629     DEBUG_MODE
3630     );
3631 softime 12124 $this->addToMessage(
3632     __('Erreur : la création de la notification a échouée.').
3633     __("Veuillez contacter votre administrateur.")
3634     );
3635     return false;
3636     }
3637     // Prépare un message d'alerte à destination de l'instructeur pour l'informer
3638     // de l'échec de la notification
3639     $dossier_message = $this->get_inst_dossier_message(0);
3640     $dossier_message_val = array(
3641     'dossier' => $val['dossier'],
3642     'type' => _('erreur expedition'),
3643     'emetteur' => $this->f->get_connected_user_login_name().' (automatique)',
3644     'login' => $_SESSION['login'],
3645     'date_emission' => date('Y-m-d H:i:s'),
3646     'contenu' => _('Échec lors de la notification de l\'instruction ').
3647     $inst_evenement->getVal('libelle').
3648     '.<br>'.
3649     implode("\n", $erreursParam).
3650     '<br>'.
3651     _('Veuillez corriger ces informations avant de renvoyer la notification.')
3652     );
3653     $add = $dossier_message->add_notification_message($dossier_message_val, true);
3654     // Si une erreur se produit pendant l'ajout
3655     if ($add !== true) {
3656     $this->addToLog(__METHOD__."(): Le message d'alerte concernant l'echec de l'envoi de la notification n'a pas pu être envoyé.", DEBUG_MODE);
3657     return false;
3658     }
3659     }
3660 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.")));
3661     }
3662    
3663 softime 12654 // Notification automatique en cas de dépôt de dossier dématérialisé
3664     // Vérifie si l'option de notification est active et si il s'agit bien d'une
3665     // instruction de récépissé
3666     if (
3667     $this->f->is_option_notification_depot_demat_enabled($collectivite_di)
3668     && $this->is_instruction_recepisse()
3669     ) {
3670 softime 13137 // Message à afficher dans les logs pour indiquer quelle notification a échouée
3671 softime 13528 $msgLog = sprintf(
3672     __('Erreur lors de la notification de dépôt du dossier dématérialisé : %s.'),
3673     $val['dossier']
3674     );
3675 softime 12654 // Récupère l'instance de la demande
3676     $demande = $inst_di->get_inst_demande();
3677 softime 13137 // Vérifie que le dossier a été déposé via platau ou portal
3678 softime 12654 if (
3679 softime 13137 ($demande->getVal('source_depot') == PLATAU ||
3680     $demande->getVal('source_depot') == PORTAL)
3681 softime 12654 ) {
3682 softime 13137 // Récupère la liste des mails fournis en paramètre. Si aucun adresse n'a été récupéré
3683     // l'envoi de la notification n'est pas effectué et un message d'erreur est affiché.
3684     $listeEmails = $this->f->get_param_courriel_de_notification_commune($collectivite_di);
3685     if (empty($listeEmails)) {
3686     $this->addToLog(
3687 softime 13528 sprintf(
3688     '%s(): %s %s',
3689     __METHOD__,
3690     $msgLog,
3691     __('Aucun courriel paramétré.')
3692     ),
3693 softime 13137 DEBUG_MODE
3694 softime 12654 );
3695 softime 13137 } else {
3696     foreach ($listeEmails as $email) {
3697     // Ajout de la notif et récupération de son id
3698     $destinataire = array(
3699     'destinataire' => $email,
3700     'courriel' => $email
3701 softime 12654 );
3702 softime 13137 $idNotif = $this->ajouter_notification(
3703     $this->valF[$this->clePrimaire],
3704     $this->f->get_connected_user_login_name(),
3705     $destinataire,
3706     $collectivite_di,
3707     array(),
3708     true
3709     );
3710     if ($idNotif === false) {
3711 softime 13528 $this->addToLog(
3712     sprintf('%s(): %s', __METHOD__, $msgLog),
3713     DEBUG_MODE
3714     );
3715 softime 13137 return false;
3716     }
3717     // Création de la tache en lui donnant l'id de la notification
3718     $notification_by_task = $this->notification_by_task(
3719     $idNotif,
3720     $this->valF['dossier'],
3721     'mail',
3722     'notification_depot_demat'
3723     );
3724     if ($notification_by_task === false) {
3725     $this->addToMessage(
3726     __("Erreur lors de la génération de la notification de dépot de dossier par voie dématérialisée.")
3727     );
3728 softime 13528 $this->addToLog(
3729     sprintf('%s(): %s', __METHOD__, $msgLog),
3730     DEBUG_MODE
3731     );
3732 softime 13137 return false;
3733     }
3734 softime 12654 }
3735     }
3736     }
3737     }
3738    
3739 softime 10808 /**
3740 softime 7996 * Mise à jour de la date de dernière modification du dossier
3741     */
3742     $inst_di->update_last_modification_date();
3743    
3744     /**
3745 softime 8640 * Mise à jour des données du DA.
3746     */
3747     $inst_da = $inst_di->get_inst_dossier_autorisation();
3748 softime 9245 $params['di_id'] = $this->valF['dossier'];
3749 softime 8640 if ($inst_da->majDossierAutorisation($params) === false) {
3750     $this->addToMessage(_("Erreur lors de la mise a jour des donnees du dossier d'autorisation. Contactez votre administrateur."));
3751     $this->correct = false;
3752     return false;
3753     }
3754    
3755     /**
3756 fmichon 4708 * Historisation de la vie du DI.
3757     */
3758     //
3759 nmeucci 3963 return $this->add_log_to_dossier($id, array_merge($val, $this->valF));
3760 nmeucci 3876 }
3761 mbroquet 3730
3762 softime 12124 /**
3763     * Cette méthode vérifie si toutes les conditions de l'envoi de la notification
3764     * sont remplies.
3765     * Les conditions vérifiées sont les suivantes :
3766 softime 14064 * - L'option de notification *option_notification* doit être définie
3767 softime 12124 * - Le petitionnaire principal doit accepter les notifications
3768     * - Le pétitionnaire principal doit avoir une adresse mail renseignée
3769     * - Le pétitionnaire principal doit avoir une adresse mail correcte
3770     * Pour chaque vérification effectué un message d'erreur est ajouté si la
3771     * condition n'est pas remplie.
3772     * Renvoie le message d'erreur en sortie.
3773     *
3774     * @param string identifiant du dossier sur lequel les notifications ont échouée
3775     * @return string
3776     */
3777     protected function get_info_notification_fail($dossier = null) {
3778     // Utilise l'identifiant du dossier passé en paramètre et si aucun dossier n'a été récupéré
3779     // utilise celui associé à l'instruction
3780     if ($dossier == null) {
3781     $dossier = $this->getVal('dossier');
3782     }
3783     // Tableau contenant la liste des messages d'erreur
3784     $errorMessage = array();
3785 softime 14064 // Récupère l'option de notification
3786     $collectivite_di = $this->get_dossier_instruction_om_collectivite($dossier);
3787     $option_notification = $this->f->get_param_option_notification($collectivite_di);
3788     if ($option_notification !== PORTAL && $option_notification !== 'mail') {
3789     $errorMessage[] = __("L'option de notification option_notification doit obligatoirement être définie.");
3790     }
3791 softime 12124 // Récupère les informations du demandeurs principal
3792     $infoPetitionnaire = $this->get_info_petitionnaire_principal_dossier($dossier);
3793     // Vérifie si le pétitionnaire principal à bien la case "accepte les notification" cochée
3794     if (isset($infoPetitionnaire['notification']) && $infoPetitionnaire['notification'] != 't') {
3795     $errorMessage[] = __('Le pétitionnaire principal n\'accepte pas les notifications.');
3796     }
3797     // Vérifie si l'adresse mail du pétitionnaire principale est renseignée
3798     if (isset($infoPetitionnaire['courriel']) && ! empty($infoPetitionnaire['courriel'])) {
3799     // Vérifie si le format de l'adresse mail est pas correct et, si ce n'est pas le cas, informe l'utilisateur
3800     // qu'il doit le corriger avant de pouvoir ajouter l'nstruction
3801     if (! $this->f->checkValidEmailAddress($infoPetitionnaire['courriel'])) {
3802     $errorMessage[] = __('Le courriel du pétitionnaire principal n\'est pas correct : ').
3803     $infoPetitionnaire['courriel'].
3804     '.';
3805     }
3806     } else {
3807     // Si le courriel du pétitionnaire principal
3808     $errorMessage[] = __('Le courriel du pétitionnaire principal n\'est pas renseigné.');
3809     }
3810 softime 11585
3811 softime 12124 return $errorMessage;
3812     }
3813    
3814     /**
3815     * Méthode servant à vérifier si un dossier a été déposé sur
3816     * le portail citoyen ou pas.
3817     * La verification se fait via une requête sql dans laquelle
3818     * on va chercher un dossier ayant pour id l'identifiant de
3819     * dossier associé à l'instruction et pour lequel la demande
3820     * associée la plus ancienne est une demande de création de
3821     * dossier via portail
3822     *
3823     * @param string identifiant du dossier. Si non renseigné c'est le dossier
3824     * associé à l'instruction qui est utilisé
3825     * @return boolean|void true : dossier déposé via portail, false : dossier
3826     * non déposé via portail et null : erreur de base de données.
3827     */
3828     protected function dossier_depose_sur_portail($dossier = null) {
3829     if (empty($dossier)) {
3830     $dossier = $this->getVal('dossier');
3831     }
3832 softime 13137 $qres = $this->f->get_one_result_from_db_query(
3833     sprintf(
3834     'SELECT
3835     dossier
3836     FROM
3837     %1$sdossier
3838     -- Récuperation de la première demande associée au dossier
3839     LEFT JOIN (
3840     SELECT
3841     demande,
3842     dossier_instruction,
3843     source_depot
3844     FROM
3845     %1$sdemande
3846     WHERE
3847     dossier_instruction = \'%2$s\'
3848     ORDER BY
3849     demande ASC
3850     LIMIT 1
3851 softime 14064 ) AS demande
3852     ON dossier.dossier = demande.dossier_instruction
3853 softime 13137 WHERE
3854     dossier.dossier = \'%2$s\'
3855     AND demande.source_depot = \'portal\'',
3856     DB_PREFIXE,
3857     $this->f->db->escapeSimple($dossier)
3858     ),
3859     array(
3860     "origin" => __METHOD__,
3861     "force_return" => true,
3862     )
3863 softime 12124 );
3864 softime 13137 if ($qres["code"] !== "OK") {
3865 softime 12124 $this->addToMessage(__('Erreur : La vérification du mode de dépôt du dossier à échoué'));
3866     return;
3867     }
3868     // Si on a un résultat c'est que le dossier a été déposé via le portail
3869 softime 13137 return ! empty($qres["result"]);
3870 softime 12124 }
3871    
3872 softime 11585 public function is_service_notifiable() {
3873     $evenement = $this->get_inst_evenement($this->getVal('evenement'));
3874    
3875     // Si l'instruction a une édition non finalisé quel que soit
3876     // le type de notification, il n'est pas notifiable
3877     if ($this->has_an_edition() === true) {
3878     if ($this->is_unfinalizable_without_bypass() === false) {
3879     return false;
3880     }
3881     }
3882     // Vérifie si la notification des tiers est active pour l'évènement
3883     return $this->get_boolean_from_pgsql_value($evenement->getVal('notification_service'));
3884     }
3885    
3886     public function is_tiers_notifiable() {
3887     $evenement = $this->get_inst_evenement($this->getVal('evenement'));
3888    
3889     // Si l'instruction a une édition non finalisé quel que soit
3890     // le type de notification, il n'est pas notifiable
3891     if ($this->has_an_edition() === true) {
3892     if ($this->is_unfinalizable_without_bypass() === false) {
3893     return false;
3894     }
3895     }
3896     // Vérifie si la notification des tiers est active pour l'évènement
3897 softime 13137 return ! empty($evenement->getVal('notification_tiers'));
3898 softime 11585 }
3899    
3900 softime 12124 /**
3901     * Méthode permettant de savoir si une instruction peut
3902     * être notifiée manuellement selon les différents types
3903     * de notification.
3904     *
3905     * Si l'instruction a une édition non finalisée alors elle n'est pas
3906     * manuellement notifiable.
3907     * Si l'instruction est associé à un événement de notification pour
3908     * lequel un retour signature est recquis, elle n'est notifiable que
3909     * si la date de retour de signature est remplie.
3910     * Par défaut si le type de notification n'est pas connu alors l'instruction
3911     * n'est pas notifiable.
3912     * Pour tous les autres cas l'instruction est manuellement notifiable.
3913     *
3914     * @return boolean true : notifiable | false : non notifiable
3915     */
3916 softime 10808 public function is_notifiable_by_task_manual() {
3917     $ev = $this->get_inst_evenement($this->getVal('evenement'));
3918    
3919     // Si l'instruction a une édition non finalisé quel que soit
3920     // le type de notification, il n'est pas notifiable
3921     if ($this->has_an_edition() === true) {
3922     if ($this->is_unfinalizable_without_bypass() === false) {
3923     return false;
3924     }
3925     }
3926    
3927     // Gestion des différents cas selon la valeur du champs notification
3928 softime 12124 if ($ev->getVal('notification') == 'notification_manuelle' ||
3929     $ev->getVal('notification') == 'notification_manuelle_annexe' ||
3930     $ev->getVal('notification') == 'notification_automatique'
3931     ) {
3932     return true;
3933     } elseif (($ev->getVal('notification') == 'notification_auto_signature_requise' ||
3934     $ev->getVal('notification') == 'notification_manuelle_signature_requise' ||
3935     $ev->getVal('notification') == 'notification_manuelle_annexe_signature_requise') &&
3936     $this->getVal('date_retour_signature') != null &&
3937     $this->getVal('date_retour_signature') != ''
3938     ) {
3939     return true ;
3940 softime 10808 }
3941 softime 12124 return false;
3942 softime 10808 }
3943    
3944 softime 8989 /**
3945 softime 14542 * Crée une instance de notification et une tache notification_instruction de catégorie portal
3946     * pour le demandeur principal.
3947 softime 10808 *
3948     * @return boolean true si le traitement à réussi
3949     */
3950 softime 14542 protected function notifier_demandeur_principal_via_portal() {
3951 softime 10808 $this->begin_treatment(__METHOD__);
3952     $message = '';
3953     // Récupération des informations concernant le demandeur
3954     $dossier = $this->getVal('dossier');
3955 softime 10968 $collectivite_di = $this->get_dossier_instruction_om_collectivite($dossier);
3956 softime 10808 $demandeur = $this->get_demandeurs_notifiable(
3957     $dossier,
3958     true
3959     );
3960     if ($demandeur !== array()) {
3961 softime 10869 $destinataire = array_values($demandeur);
3962 softime 10808 // Ajout de la notif et récupération de son id
3963     $idNotification = $this->ajouter_notification(
3964     $this->getVal($this->clePrimaire),
3965     $this->f->get_connected_user_login_name(),
3966 softime 10968 $destinataire[0],
3967     $collectivite_di,
3968 softime 12433 array(),
3969 softime 10968 true
3970 softime 10808 );
3971     if ($idNotification === false) {
3972     return $this->end_treatment(__METHOD__, false);
3973     }
3974     // Création de la tâche en lui donnant l'id de la notification
3975 softime 14542 $notification_by_task = $this->notification_by_task($idNotification, $dossier, PORTAL);
3976 softime 10808 if ($notification_by_task === false) {
3977     $this->addToMessage(
3978     __("Erreur lors de la génération de la notification au(x) pétitionnaire(s).")
3979     );
3980     return $this->end_treatment(__METHOD__, false);
3981     }
3982     $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.")));
3983     return $this->end_treatment(__METHOD__, true);
3984     }
3985     $this->addToMessage( __("Le demandeur principal n'est pas notifiable."));
3986 softime 12124 return $this->end_treatment(__METHOD__, false);
3987 softime 10808 }
3988    
3989     public function notification_by_task($object_id, $dossier, $category = null, $type = null) {
3990     // Si le type n'est pas correctement spécifié, alors il est calculé
3991 softime 11585 if ($type !== 'notification_recepisse'
3992     && $type !== 'notification_instruction'
3993     && $type !== 'notification_decision'
3994     && $type !== 'notification_service_consulte'
3995 softime 12654 && $type !== 'notification_tiers_consulte'
3996     && $type !== 'notification_depot_demat'
3997 softime 15037 && $type !== 'notification_commune'
3998     && $type !== 'notification_signataire') {
3999 softime 10808 //
4000     $type = 'notification_instruction';
4001     // Vérifie si l'instruction est un récépissé
4002 softime 12654 if ($this->is_instruction_recepisse()) {
4003     $type = 'notification_recepisse';
4004    
4005 softime 10808 }
4006     // Vérifie si l'instruction est une décision
4007     if ($type !== 'notification_recepisse') {
4008     $avis_decision = $this->getVal('avis_decision') !== null ? $this->getVal('avis_decision') : $this->valF['avis_decision'];
4009     if ($avis_decision !== null && $avis_decision !== '') {
4010     $type = 'notification_decision';
4011     }
4012     }
4013     }
4014 softime 14064 // Préparation des valeurs de la tâche
4015 softime 10808 $task_val = array(
4016     'type' => $type,
4017     'object_id' => $object_id,
4018     'dossier' => $dossier,
4019     'category' => $category,
4020     );
4021 softime 14064 // Préparation de la tache de notification
4022     $inst_task = $this->f->get_inst__om_dbform(array(
4023     "obj" => "task",
4024     "idx" => 0,
4025     ));
4026 softime 10808
4027     $add_task = $inst_task->add_task(array('val' => $task_val));
4028     if ($add_task === false) {
4029 softime 13528 $this->addToLog(
4030     sprintf(
4031     '%s(): %s %s : %s',
4032     __METHOD__,
4033     __('Echec de l\'ajout de la tâche de notification.'),
4034     __('Paramétrage de la tâche'),
4035     var_export($task_val, true)
4036     ),
4037     DEBUG_MODE
4038     );
4039 softime 10808 return false;
4040     }
4041    
4042     return true;
4043     }
4044    
4045 softime 10968 /**
4046 softime 12654 * Cette méthode permet de savoir si l'instruction est une instruction
4047     * de recepisse (instruction lié à l'ajout du dossier).
4048     *
4049     * Pour cela, on récupère la liste des actions qui ont menées à la création
4050     * de l'instruction. Si une de ces actions est lié à un objet "demande" on
4051     * en deduis que c'est l'ajout d'une demande qui a déclenché la création de
4052     * l'instruction et donc qu'il s'agit d'un recepisse.
4053     *
4054     * @return boolean
4055     */
4056     protected function is_instruction_recepisse() {
4057     // Récupère la liste des actions qui ont mené à la création de
4058     // l'instruction
4059     $trace = debug_backtrace();
4060     // Parcours la liste des actions et si une de ces actions est lié
4061     // à la classe demande on cosidère que l'instruction est un recepisse
4062     foreach ($trace as $key => $value) {
4063     if (isset($trace[$key]['class']) === true
4064     && empty($trace[$key]['class']) === false) {
4065     if (strtolower($trace[$key]['class']) === 'demande') {
4066     return true;
4067     }
4068     }
4069     }
4070     return false;
4071     }
4072    
4073     /**
4074 softime 10968 * A partir des informations passée en argument ajoute un nouvel élément
4075     * dans la table instruction_notification.
4076     * Avant l'ajout vérifie en utilisant l'id de la collectivité passée en
4077     * paramètre si le paramétrage attendus est ok.
4078     * Ajoute également un nouvel élement dans instruction_notification_document
4079     * si l'instruction possède une lettretype.
4080     * Si un identifiant d'une instruction annexe est donnée ajoute un deuxième
4081     * élement dans la table instruction_notification_document qui correspondra
4082     * à l'annexe de la notification.
4083     *
4084     * @param integer identifiant de l'instruction notifiée
4085     * @param string information concernant l'emetteur
4086     * @param array tableau contenant 2 entrées
4087     * - destinatire : nom, prenom ou raison sociale, dénomination et courriel
4088     * - courriel : adresse mail de la personne à notifier
4089     * @param integer identifiant de la collectivité permettant de récupèrer les
4090     * paramètres à valider
4091     * @param boolean indique si la notification est automatique ou manuelle
4092     * @param integer identifiant d'une instruction dont l'édition sera annexé
4093     * à la notification
4094     *
4095     * @return integer|boolean identifiant de la notification créée si le traitement
4096     * a réussie, false sinon.
4097     */
4098 softime 10869 protected function ajouter_notification(
4099     $idInstruction,
4100     $emetteur,
4101     $destinataire,
4102 softime 10968 $collectiviteId,
4103 softime 12433 $annexes = array(),
4104 softime 10968 $demandeAuto = false,
4105 softime 12124 $statut = 'en cours d\'envoi',
4106 softime 12433 $commentaire = 'Notification en cours de traitement'
4107 softime 10869 ) {
4108 softime 10968 // Vérification que les paramètres nécessaires à l'envoi de la notification existe avant
4109     // de créer la notification
4110     if (! $this->is_parametrage_notification_correct($collectiviteId)) {
4111 softime 13137 $msgErreur = __("Erreur de paramétrage. L'url d'accès au(x) document(s) notifié(s) n'est pas paramétrée.");
4112     $this->addToMessage($msgErreur);
4113 softime 13528 $this->addToLog(
4114     sprintf('%s() : %s', __METHOD__, $msgErreur),
4115     DEBUG_MODE
4116     );
4117 softime 10968 return false;
4118     }
4119 softime 10808 // Préparation de la notification
4120     $inst_notif = $this->f->get_inst__om_dbform(array(
4121     "obj" => "instruction_notification",
4122     "idx" => "]",
4123     ));
4124     $notif_val = array(
4125     'instruction_notification' => null,
4126     'instruction' => $idInstruction,
4127     'automatique' => $demandeAuto,
4128     'emetteur' => $emetteur,
4129     'date_envoi' => null,
4130 softime 10869 'destinataire' => $destinataire['destinataire'],
4131     'courriel' => $destinataire['courriel'],
4132 softime 10808 'date_premier_acces' => null,
4133 softime 12124 'statut' => $statut,
4134     'commentaire' => $commentaire
4135 softime 10808 );
4136    
4137     // Création de la notification
4138     $add_notif = $inst_notif->ajouter($notif_val);
4139     if ($add_notif === false) {
4140 softime 10968 $this->addToMessage(__("Erreur lors de la génération de la notification au(x) pétitionnaire(s)."));
4141 softime 13528 $this->addToLog(
4142     sprintf(
4143     '%s() : %s %s : %s',
4144     __METHOD__,
4145     __("Echec de l'ajout de la notification en base de données."),
4146     __('Paramétrage de la notification'),
4147     var_export($notif_val, true)
4148     ),
4149     DEBUG_MODE
4150     );
4151 softime 10808 return false;
4152     }
4153    
4154 softime 10869 // Si il y a une lettretype finalisé stockage de la clé d'accès au documents
4155     if ($this->evenement_has_an_edition($this->getVal('evenement')) === true) {
4156 softime 12433 $add_notif_doc = $this->ajouter_notification_document(
4157     $inst_notif->getVal($inst_notif->clePrimaire),
4158 softime 10869 $this->getVal($this->clePrimaire),
4159 softime 12433 'instruction'
4160 softime 10808 );
4161     if ($add_notif_doc === false) {
4162 softime 10968 $this->addToMessage(__("Erreur lors de la génération de la notification du document."));
4163 softime 10808 return false;
4164     }
4165 softime 10869 }
4166     // Si une annexe a été choisie stockage de la clé d'accès à l'annexe
4167 softime 12433 if (! empty($annexes) && is_array($annexes)) {
4168     $add_notif_annexe = $this->ajouter_notification_document_multiple(
4169 softime 10869 $inst_notif->getVal($inst_notif->clePrimaire),
4170 softime 12433 $annexes
4171 softime 10869 );
4172     if ($add_notif_annexe === false) {
4173 softime 10968 $this->addToMessage(__("Erreur lors de la génération de la notification de l'annexe."));
4174 softime 10869 return false;
4175     }
4176     }
4177 softime 10808
4178     // Renvoie l'id de la nouvelle instance de instruction_notification
4179     return $inst_notif->getVal($inst_notif->clePrimaire);
4180     }
4181    
4182     /**
4183 softime 11585 * Pour chaque élément du tableau passé en paramètre ajoute une nouvelle
4184     * instance dans la table instruction_notification_document lié a la
4185     * notification dont l'id est passé en paramètre.
4186     *
4187     * @param array tableau contenant les informations nécessaires pour créer les annexes
4188     *
4189     * @return integer|boolean identifiant de la notification créée si le traitement
4190     * a réussie, false sinon.
4191     */
4192     protected function ajouter_notification_document_multiple($idNotification, $listeDocument) {
4193 softime 12433 foreach ($listeDocument as $paramDoc) {
4194     if (! $this->ajouter_notification_document($idNotification, $paramDoc['id'], $paramDoc['tableDocument'], $paramDoc['isAnnexe'])) {
4195 softime 11585 $this->addToMessage(__("Erreur lors de la génération des documents à notifier."));
4196     return false;
4197     }
4198     }
4199     return true;
4200     }
4201    
4202     /**
4203     * Ajoute un élément dans la table instruction_notification_document en utilisant
4204     * les éléments fourni en paramètre
4205     *
4206     * @param integer $idNotification : id de la notification à laquelle on associe le document
4207     * @param integer $idDocument : id de l'objet auquel est rattaché le document
4208     * @param string $tableDocument : nom de la table a laquelle est rattaché le document
4209     * @param boolean $isAnnexe : indique si le document est une annexe ou pas
4210     *
4211     * @return boolean indique si le traitement a réussi
4212     */
4213     protected function ajouter_notification_document($idNotification, $idDocument, $tableDocument, $isAnnexe = false) {
4214     $inst_notif_doc = $this->f->get_inst__om_dbform(array(
4215     "obj" => "instruction_notification_document",
4216     "idx" => "]",
4217     ));
4218     // l'attribut instruction doit obligatoirement être renseigné
4219     // pour éviter toutes confusion avec d'autres instruction l'id
4220     // 0 est donné au document n'appartenant pas aux instructions
4221     $notif_doc_val = array(
4222     'instruction_notification_document' => null,
4223     'instruction_notification' => $idNotification,
4224     'instruction' => $tableDocument == 'instruction' ? $idDocument : 0,
4225     'document_type' => $tableDocument,
4226     'document_id' => $idDocument,
4227     'cle' => $this->getCleAccesDocument(),
4228     'annexe' => $isAnnexe
4229     );
4230    
4231     $add_notif_doc = $inst_notif_doc->ajouter($notif_doc_val);
4232     if ($add_notif_doc === false) {
4233 softime 13528 $this->addToLog(
4234     sprintf(
4235     '%s() : %s %s : %s',
4236     __METHOD__,
4237     __('Echec de l\'ajout du paramétrage du document notifié en base de données.'),
4238     __('Paramétrage du document'),
4239     var_export($notif_doc_val, true)
4240     ),
4241     DEBUG_MODE
4242     );
4243 softime 11585 return false;
4244     }
4245     return true;
4246     }
4247    
4248     /**
4249 softime 10968 * Vérifie si le paramétrage de la notification des demandeurs est correct.
4250     *
4251     * @param integer identifiant de la collectivité
4252     * @return boolean
4253     */
4254     protected function is_parametrage_notification_correct($collectiviteId) {
4255     $categorie = $this->f->get_param_option_notification($collectiviteId);
4256     $urlAccesNotif = $this->f->get_parametre_notification_url_acces($collectiviteId);
4257 softime 14064 if ($categorie === 'mail' && $urlAccesNotif === null) {
4258 softime 10968 return false;
4259     }
4260     return true;
4261     }
4262    
4263     /**
4264 softime 8989 * TRIGGER - triggermodifierapres.
4265     *
4266     * @return boolean
4267     */
4268     function triggermodifierapres($id, &$dnu1 = null, $val = array(), $dnu2 = null) {
4269     $this->addToLog(__METHOD__."(): start", EXTRA_VERBOSE_MODE);
4270 softime 10808 $collectivite_di = $this->get_dossier_instruction_om_collectivite($val['dossier']);
4271     $message = '';
4272 mbroquet 3730
4273 softime 13137 // Définit si le dossier d'instruction doit être mis à jour
4274     $update_dossier = true;
4275     // Les actions de mise à jour des dates ne doivent pas appliquer
4276     // l'action de l'événement et donc ne pas mettre à jour le dossier
4277     if ($this->getParameter("maj") == 125
4278     || $this->getParameter("maj") == 170
4279     || $this->getParameter("maj") == 175) {
4280     $update_dossier = false;
4281     }
4282    
4283     // Traitement en cas de mise à jour du dossier
4284     if ($update_dossier === true) {
4285     /**
4286     * L'objectif ici est d'effectuer les recalculs de date dans le dossier
4287     * si la date de l'evenement est modifiee
4288     */
4289     // Initialisation
4290     $valF = array();
4291     $valF_dt = array();
4292     // Initialisation du type d'événement
4293     $type_evmt = "";
4294     // Récupération de l'action correspondante à l'événement
4295 softime 14064 $evenement = $this->f->get_inst__om_dbform(array(
4296     "obj" => "evenement",
4297     "idx" => $this->valF['evenement']
4298     ));
4299 softime 13137
4300     // Récupération des paramètres de l'action
4301 softime 14542 // TODO : remplacer cette requête par l'instanciation de l'action
4302     $qres = $this->f->get_all_results_from_db_query(
4303     sprintf(
4304     'SELECT
4305     *
4306     FROM
4307     %1$saction
4308     WHERE
4309     action = \'%2$s\'',
4310     DB_PREFIXE,
4311     $this->f->db->escapeSimple($evenement->getVal('action'))
4312     ),
4313     array(
4314     "origin" => __METHOD__
4315     )
4316 softime 14064 );
4317 softime 14542 foreach ($qres['result'] as $row) {
4318 softime 13137 // application des regles sur le courrier + delai
4319     if(preg_match("/date_evenement/",$row['regle_date_limite'])){
4320     $valF['date_limite']= $this->regle($row['regle_date_limite'], 'regle_date_limite');
4321     }
4322     if(preg_match("/date_evenement/",$row['regle_date_complet'])){
4323     $valF['date_complet']= $this->regle($row['regle_date_complet'], 'regle_date_complet');
4324     }
4325     if(preg_match("/date_evenement/",$row['regle_date_dernier_depot'])){
4326     $valF['date_dernier_depot']= $this->regle($row['regle_date_dernier_depot'], 'regle_date_dernier_depot');
4327     }
4328     if(preg_match("/date_evenement/",$row['regle_date_notification_delai'])){
4329     $valF['date_notification_delai']= $this->regle($row['regle_date_notification_delai'], 'regle_date_notification_delai');
4330     }
4331     if(preg_match("/date_evenement/",$row['regle_date_decision'])){
4332     $valF['date_decision']= $this->regle($row['regle_date_decision'], 'regle_date_decision');
4333     }
4334     if(preg_match("/date_evenement/",$row['regle_date_rejet'])){
4335     $valF['date_rejet']= $this->regle($row['regle_date_rejet'], 'regle_date_rejet');
4336     }
4337     if(preg_match("/date_evenement/",$row['regle_date_validite'])){
4338     $valF['date_validite']= $this->regle($row['regle_date_validite'], 'regle_date_validite');
4339     }
4340     if(preg_match("/date_evenement/",$row['regle_date_chantier'])){
4341     $valF['date_chantier']= $this->regle($row['regle_date_chantier'], 'regle_date_chantier');
4342     }
4343     if(preg_match("/date_evenement/",$row['regle_date_achevement'])){
4344     $valF['date_achevement']= $this->regle($row['regle_date_achevement'], 'regle_date_achevement');
4345     }
4346     if(preg_match("/date_evenement/",$row['regle_date_conformite'])){
4347     $valF['date_conformite']= $this->regle($row['regle_date_conformite'], 'regle_date_conformite');
4348     }
4349     if(preg_match("/date_evenement/",$row['regle_date_cloture_instruction'])){
4350     $valF['date_cloture_instruction']= $this->regle($row['regle_date_cloture_instruction'], 'regle_date_cloture_instruction');
4351     }
4352     if(preg_match("/date_evenement/",$row['regle_date_premiere_visite'])){
4353     $valF['date_premiere_visite']= $this->regle($row['regle_date_premiere_visite'], 'regle_date_premiere_visite');
4354     }
4355     if(preg_match("/date_evenement/",$row['regle_date_derniere_visite'])){
4356     $valF['date_derniere_visite']= $this->regle($row['regle_date_derniere_visite'], 'regle_date_derniere_visite');
4357     }
4358     if(preg_match("/date_evenement/",$row['regle_date_contradictoire'])){
4359     $valF['date_contradictoire']= $this->regle($row['regle_date_contradictoire'], 'regle_date_contradictoire');
4360     }
4361     if(preg_match("/date_evenement/",$row['regle_date_retour_contradictoire'])){
4362     $valF['date_retour_contradictoire']= $this->regle($row['regle_date_retour_contradictoire'], 'regle_date_retour_contradictoire');
4363     }
4364     if(preg_match("/date_evenement/",$row['regle_date_ait'])){
4365     $valF['date_ait']= $this->regle($row['regle_date_ait'], 'regle_date_ait');
4366     }
4367     if(preg_match("/date_evenement/",$row['regle_date_transmission_parquet'])){
4368     $valF['date_transmission_parquet']= $this->regle($row['regle_date_transmission_parquet'], 'regle_date_transmission_parquet');
4369     }
4370     if ($row['regle_donnees_techniques1'] !== '') {
4371     $valF_dt[$row['cible_regle_donnees_techniques1']] = $this->regle($row['regle_donnees_techniques1'], 'regle_donnees_techniques1');
4372     }
4373     if ($row['regle_donnees_techniques2'] !== '') {
4374     $valF_dt[$row['cible_regle_donnees_techniques2']] = $this->regle($row['regle_donnees_techniques2'], 'regle_donnees_techniques2');
4375     }
4376     if ($row['regle_donnees_techniques3'] !== '') {
4377     $valF_dt[$row['cible_regle_donnees_techniques3']] = $this->regle($row['regle_donnees_techniques3'], 'regle_donnees_techniques3');
4378     }
4379     if ($row['regle_donnees_techniques4'] !== '') {
4380     $valF_dt[$row['cible_regle_donnees_techniques4']] = $this->regle($row['regle_donnees_techniques4'], 'regle_donnees_techniques4');
4381     }
4382     if ($row['regle_donnees_techniques5'] !== '') {
4383     $valF_dt[$row['cible_regle_donnees_techniques5']] = $this->regle($row['regle_donnees_techniques5'], 'regle_donnees_techniques5');
4384     }
4385     if ($row['regle_dossier_instruction_type'] !== '') {
4386     $valF['dossier_instruction_type'] = $this->regle($row['regle_dossier_instruction_type'], 'regle_dossier_instruction_type');
4387     }
4388 mbroquet 3730 }
4389 softime 13137 // Si des valeurs de données techniques ont été calculées alors on met à jour l'enregistrement
4390     if (count($valF_dt) > 0) {
4391     $dt_id = $this->getDonneesTechniques();
4392     // On met à jour le dossier
4393     $cle = " donnees_techniques='".$dt_id."'";
4394     $res1 = $this->f->db->autoExecute(DB_PREFIXE.'donnees_techniques', $valF_dt, DB_AUTOQUERY_UPDATE, $cle);
4395     $this->addToLog(
4396     __METHOD__."(): db->autoexecute(\"".DB_PREFIXE."donnees_techniques\", ".print_r($valF_dt, true).", DB_AUTOQUERY_UPDATE, \"".$cle."\");",
4397     VERBOSE_MODE
4398     );
4399     $this->f->isDatabaseError($res1);
4400     // Affichage d'informations à l'utilisateur
4401     $this->addToMessage(_('enregistrement')." ".$this->valF['dossier']." "._('table')." dossier [".$this->f->db->affectedRows()." "._('enregistrement')." "._('mis_a_jour')."]");
4402 mbroquet 3730 }
4403 softime 13137 // Si des valeurs ont été calculées alors on met à jour l'enregistrement
4404     if (count($valF) > 0) {
4405     $inst_dossier = $this->f->get_inst__om_dbform(array(
4406     "obj" => "dossier",
4407     "idx" => $this->valF['dossier'],
4408     ));
4409     $valF['instruction'] = $id;
4410     $valF['crud'] = 'update';
4411     $update_by_instruction = $inst_dossier->update_by_instruction($valF);
4412     if ($update_by_instruction === false) {
4413     $this->cleanMessage();
4414     $this->addToMessage(sprintf('%s %s', __("Une erreur s'est produite lors de la mise à jour du dossier d'instruction."), __("Veuillez contacter votre administrateur.")));
4415     return false;
4416     }
4417     // Affichage d'informations à l'utilisateur
4418     $this->addToMessage(_('enregistrement')." ".$this->valF['dossier']." "._('table')." dossier [".$this->f->db->affectedRows()." "._('enregistrement')." "._('mis_a_jour')."]");
4419 mbroquet 3730 }
4420     }
4421    
4422 softime 14064 // Par défaut les instructions à ajouter suite à la saisie d'une date
4423     // de retour signature ou de notification, utilisent l'action 0
4424     // Si la création d'événement d'instruction suivant est déclenchée par
4425     // une notification suite au traitement d'une tâche (démat') alors l'ajout
4426     // de la nouvelle instruction se fait avec l'action 176
4427     // Cela permet de ne pas contrôler la restriction lors de l'ajout de la
4428     // nouvelle instruction, depuis la méthode verifier()
4429     $code_action_add = 0;
4430     if ($this->getParameter("maj") == 175) {
4431     $code_action_add = 176;
4432     }
4433 mbroquet 3730 $restriction = $this->get_restriction($val['evenement']);
4434     $this->restriction_valid = $this->restrictionIsValid($restriction);
4435    
4436     if($restriction == "" || $this->restriction_valid ){
4437     // Récupération de tous les paramètres de l'événement sélectionné
4438 softime 14542 // TODO : remplacer cette requête par l'instanciation de l'evenement
4439     $qres = $this->f->get_all_results_from_db_query(
4440     sprintf(
4441     'SELECT
4442     *
4443     FROM
4444     %1$sevenement
4445     WHERE
4446     evenement = %2$d',
4447     DB_PREFIXE,
4448     intval($this->valF['evenement'])
4449     ),
4450     array(
4451     "origin" => __METHOD__
4452     )
4453     );
4454 nmeucci 3965 $current_id = $this->getVal($this->clePrimaire);
4455 softime 14542 foreach ($qres['result'] as $row) {
4456 mbroquet 3730 // Si la date de retour signature est éditée on vérifie si il existe un événement automatique
4457     if ($this->getVal('date_retour_signature') == "" AND
4458     $this->valF['date_retour_signature'] != "" AND
4459     $row['evenement_retour_signature'] != "") {
4460 softime 7996 $new_instruction = $this->f->get_inst__om_dbform(array(
4461     "obj" => "instruction",
4462     "idx" => "]",
4463     ));
4464 mbroquet 3730 // Création d'un tableau avec la liste des champs de l'instruction
4465     foreach($new_instruction->champs as $champ) {
4466     $valNewInstr[$champ] = "";
4467     }
4468     // Définition des valeurs de la nouvelle instruction
4469     $valNewInstr["evenement"] = $row['evenement_retour_signature'];
4470     $valNewInstr["destinataire"] = $this->valF['destinataire'];
4471     $valNewInstr["dossier"] = $this->valF['dossier'];
4472     $valNewInstr["date_evenement"] = $this->f->formatDate($this->valF['date_retour_signature']);
4473     $valNewInstr["date_envoi_signature"] = $this->f->formatDate($this->valF['date_envoi_signature']);
4474     $valNewInstr["date_retour_signature"] = $this->f->formatDate($this->valF['date_retour_signature']);
4475     $valNewInstr["date_envoi_rar"] = $this->f->formatDate($this->valF['date_envoi_rar']);
4476     $valNewInstr["date_retour_rar"] = $this->f->formatDate($this->valF['date_retour_rar']);
4477     $valNewInstr["date_envoi_controle_legalite"] = $this->f->formatDate($this->valF['date_envoi_controle_legalite']);
4478     $valNewInstr["date_retour_controle_legalite"] = $this->f->formatDate($this->valF['date_retour_controle_legalite']);
4479 softime 14064 $new_instruction->setParameter("maj", $code_action_add);
4480     $new_instruction->class_actions[$code_action_add]["identifier"] =
4481 softime 13528 sprintf(
4482     __("Ajout suite au retour signature de l'instruction %s"),
4483     $current_id
4484     );
4485 softime 8989 $retour = $new_instruction->ajouter($valNewInstr);
4486 mbroquet 3730
4487     //Si une erreur s'est produite et qu'il s'agit d'un problème
4488     //de restriction
4489     if ($retour == false && !$new_instruction->restriction_valid){
4490     $error_message = $this->get_restriction_error_message($restriction);
4491     $this->f->displayMessage("error", $error_message);
4492 softime 8989 $this->addToLog(__METHOD__."(): evenement retour ".
4493 mbroquet 3730 "instruction ".$this->valF[$this->clePrimaire]." : ".
4494     $new_instruction->msg);
4495     }
4496     //Si une erreur s'est produite après le test de la restriction
4497     elseif ($retour == false && $new_instruction->restriction_valid){
4498     $this->correct = false ;
4499     $this->msg .= $new_instruction->msg;
4500     return false;
4501     }
4502     }
4503     // Si la date de retour AR est éditée on vérifie si il existe un événement automatique
4504     if ($this->getVal('date_retour_rar') == "" AND
4505     $this->valF['date_retour_rar'] != "") {
4506    
4507     if($row['evenement_retour_ar'] != "") {
4508 softime 7996 $new_instruction = $this->f->get_inst__om_dbform(array(
4509     "obj" => "instruction",
4510     "idx" => "]",
4511     ));
4512 mbroquet 3730 // Création d'un tableau avec la liste des champs de l'instruction
4513     foreach($new_instruction->champs as $champ) {
4514     $valNewInstr[$champ] = "";
4515     }
4516     // Définition des valeurs de la nouvelle instruction
4517     $valNewInstr["evenement"] = $row['evenement_retour_ar'];
4518     $valNewInstr["destinataire"] = $this->valF['destinataire'];
4519     $valNewInstr["dossier"] = $this->valF['dossier'];
4520     $valNewInstr["date_evenement"] = $this->f->formatDate($this->valF['date_retour_rar']);
4521     $valNewInstr["date_envoi_signature"] = $this->f->formatDate($this->valF['date_envoi_signature']);
4522     $valNewInstr["date_retour_signature"] = $this->f->formatDate($this->valF['date_retour_signature']);
4523     $valNewInstr["date_envoi_rar"] = $this->f->formatDate($this->valF['date_envoi_rar']);
4524     $valNewInstr["date_retour_rar"] = $this->f->formatDate($this->valF['date_retour_rar']);
4525     $valNewInstr["date_envoi_controle_legalite"] = $this->f->formatDate($this->valF['date_envoi_controle_legalite']);
4526     $valNewInstr["date_retour_controle_legalite"] = $this->f->formatDate($this->valF['date_retour_controle_legalite']);
4527 softime 14064 $new_instruction->setParameter("maj", $code_action_add);
4528     $new_instruction->class_actions[$code_action_add]["identifier"] =
4529 softime 13137 sprintf(__("Ajout suite à la notification de l'instruction %s"), $current_id);
4530 softime 8989 $retour = $new_instruction->ajouter($valNewInstr);
4531 mbroquet 3730
4532     //Si une erreur s'est produite et qu'il s'agit d'un problème
4533     //de restriction
4534     if ($retour == false && !$new_instruction->restriction_valid) {
4535     $error_message = $this->get_restriction_error_message($restriction);
4536     $this->f->displayMessage("error", $error_message);
4537     $this->addToLog(
4538 softime 8989 __METHOD__."(): evenement retour instruction ".
4539 mbroquet 3730 $this->valF[$this->clePrimaire]." : ".
4540     $new_instruction->msg
4541     );
4542     }
4543     //Si une erreur s'est produite après le test de la restriction
4544     elseif ($retour == false && $new_instruction->restriction_valid){
4545     $this->correct = false ;
4546     $this->msg .= $new_instruction->msg;
4547     return false;
4548     }
4549     }
4550     }
4551     }
4552     }
4553    
4554 softime 13137 // Traitement en cas de mise à jour du dossier
4555     if ($update_dossier === true) {
4556     /**
4557     * Mise à jour de la date de dernière modification du dossier
4558     * d'instruction
4559     */
4560     $inst_di = $this->get_inst_dossier($this->getVal('dossier'));
4561     $inst_di->update_last_modification_date();
4562 softime 8640
4563 softime 13137 // Mise à jour des données du dossier d'autorisation
4564     $da = $this->f->get_inst__om_dbform(array(
4565     "obj" => "dossier_autorisation",
4566     "idx" => $this->getNumDemandeAutorFromDossier($this->valF['dossier']),
4567     ));
4568     $params = array(
4569     'di_id' => $this->getVal('dossier'),
4570     );
4571     if($da->majDossierAutorisation($params) === false) {
4572     $this->addToMessage(_("Erreur lors de la mise a jour des donnees du dossier d'autorisation. Contactez votre administrateur."));
4573     $this->correct = false;
4574     return false;
4575     }
4576 mbroquet 3730 }
4577 softime 7996
4578 softime 10573 // mise à jour des métadonnées issues des dates de suivi
4579     $dateRetourSignatureModified = ($this->valF['date_retour_signature'] != $this->getVal('date_retour_signature'));
4580     $dateRetourRARModified = ($this->valF['date_retour_rar'] != $this->getVal('date_retour_rar'));
4581     if ($dateRetourSignatureModified || $dateRetourRARModified) {
4582    
4583     // Calculs des nouvelles métadonnées
4584     $metadata = $this->getMetadata("om_fichier_instruction");
4585    
4586     // On vérifie si l'instruction à finaliser a un événement de type arrete
4587 softime 14064 // TODO : A voir pour remplacer par une instanciation de l'événement.
4588     // Voir également si l'événement ne dois pas être instancié en début de
4589     // méthode pour pouvoir être réutilisé.
4590     $qres = $this->f->get_one_result_from_db_query(
4591     sprintf(
4592     'SELECT
4593     type
4594     FROM
4595     %1$sevenement
4596     WHERE
4597     evenement = \'%2$d\'',
4598     DB_PREFIXE,
4599     intval($this->getVal("evenement"))
4600     ),
4601     array(
4602     "origin" => __METHOD__,
4603     "force_return" => true,
4604     )
4605     );
4606    
4607     if ($qres["code"] !== "OK") {
4608 softime 10573 $this->correct = false;
4609     $this->addToMessage(__("Erreur de traitement de fichier."));
4610 softime 14064 $this->addToLog(__METHOD__."() erreur BDD: ".var_export($qres['message'], true), DEBUG_MODE);
4611 softime 10573 return false;
4612     }
4613    
4614     // Si l'événement est de type arrete, on ajoute les métadonnées spécifiques
4615 softime 14064 if ($qres['result'] == 'arrete'){
4616 softime 10573 $metadata = array_merge($metadata, $this->getMetadata("arrete"));
4617     }
4618    
4619     // Filtre pour conserver uniquement les métadonnées liées aux dates
4620     $metadataToKeep = array(
4621     "statutAutorisation",
4622     "dateEvenementDocument",
4623     'date_cloture_metier',
4624     "NotificationArrete",
4625     "dateNotificationArrete",
4626     "controleLegalite",
4627     "dateSignature",
4628     "nomSignataire",
4629     "qualiteSignataire",
4630     "dateControleLegalite",
4631     );
4632     $metadata = array_filter(
4633     $metadata,
4634     function($key) use ($metadataToKeep) { return in_array($key, $metadataToKeep); },
4635     ARRAY_FILTER_USE_KEY
4636     );
4637    
4638     // Mise à jour des métadonnées du document en GED
4639     $docUid = $this->getVal("om_fichier_instruction");
4640     $operationOrUID = $this->f->storage->update_metadata($docUid, $metadata);
4641     if ($operationOrUID == 'OP_FAILURE') {
4642     $this->correct = false;
4643     $this->addToMessage(__("Erreur de traitement de fichier."));
4644     $this->addToLog(__METHOD__."() failed to update metadata: ".var_export($operationOrUID, true), DEBUG_MODE);
4645     return false;
4646     }
4647    
4648     // mise à jour de l'UID du document en BDD
4649     else {
4650     $valF = array('om_fichier_instruction' => $operationOrUID);
4651     $res = $this->f->db->autoExecute(DB_PREFIXE.$this->table, $valF, DB_AUTOQUERY_UPDATE, $this->getCle($id));
4652     $this->addToLog(__METHOD__.'() : db->autoExecute("'.DB_PREFIXE.$this->table.'", '.print_r($valF, true).', DB_AUTOQUERY_UPDATE, "'.$this->getCle($id).'")', VERBOSE_MODE);
4653     if ($this->f->isDatabaseError($res, true) === true) {
4654     $this->correct = false;
4655     $this->addToMessage(__("Erreur de traitement de fichier."));
4656     $this->addToLog(__METHOD__."() erreur BDD: ".var_export($res->getMessage(), true), DEBUG_MODE);
4657     return false;
4658     }
4659     $this->addToMessage(__("La mise a jour du document s'est effectuee avec succes."));
4660     }
4661     }
4662    
4663 softime 13137 // Déclenchement des notifications automatique après finalisation et
4664     // retour de signature
4665 softime 10808 if ($dateRetourSignatureModified === true
4666     && $this->valF['date_retour_signature'] !== ''
4667     && $this->valF['date_retour_signature'] !== null) {
4668 softime 13137
4669     // Message à afficher dans les logs pour indiquer quelle notification a échouée
4670 softime 13528 $msgLog = sprintf(
4671     '%s %s : %d',
4672     __('Erreur lors de la notification automatique du(des) pétitionnaire(s) après retour signature.'),
4673     __('Instruction notifiée'),
4674     $id
4675     );
4676 softime 13137
4677     // Récupération de l'instance de l'événement pour accéder au paramètrage
4678     // des notifications
4679 softime 10808 $ev = $this->get_inst_evenement($this->valF['evenement']);
4680 softime 13137 // Si la notification automatique des tiers consulté est active
4681     // déclenche le traitement de notification.
4682     // Ce traitement va envoyer des courriels de notification à tous les tiers concernés
4683     $typeNotifTiers = $ev->getVal('notification_tiers');
4684     $inst_di = $this->get_inst_dossier($this->getVal('dossier'));
4685     if ($typeNotifTiers === 'notification_automatique') {
4686     if ($this->traitement_notification_automatique_tiers_consulte($ev, $inst_di) === false) {
4687     $this->addToMessage(__('Le traitement de la notification automatique de tiers à échoué.'));
4688     $this->correct = false;
4689     }
4690     }
4691    
4692 softime 10808 if ($ev->getVal('notification') === 'notification_auto_signature_requise') {
4693     // Récupération de la liste des demandeurs à notifier et de la catégorie
4694     $categorie = $this->f->get_param_option_notification($collectivite_di);
4695 softime 14064 $isPortal = $categorie === PORTAL;
4696 softime 10869 $demandeursANotifie = $this->get_demandeurs_notifiable(
4697     $this->valF['dossier'],
4698     $isPortal
4699     );
4700 softime 10808
4701     // Création d'une notification et d'une tâche pour chaque demandeur à notifier
4702 softime 12124 $demandeurPrincipalNotifie = false;
4703 softime 10808 foreach ($demandeursANotifie as $demandeur) {
4704 softime 12124 // Identifie si le demandeur principal a été notifié ou pas
4705     // et récupère ses informations
4706     if ($demandeur['petitionnaire_principal'] == 't') {
4707     $demandeurPrincipalNotifie = true;
4708     // Si le demandeur principal est notifiable mais qu'il y a des erreurs dans
4709     // son paramétrage, on effectue pas le traitement et on passe à l'itération
4710     // suivante. On le considère également comme non notifié pour gérer l'envoie
4711     // des messages d'erreurs
4712     // Si la demande a été déposée via le portail alors le paramétrage n'a pas
4713     // d'impact sur la notification
4714     $erreursParam = $this->get_info_notification_fail();
4715     if (! $this->dossier_depose_sur_portail() && $erreursParam != array()) {
4716     $demandeurPrincipalNotifie = false;
4717     continue;
4718     }
4719     }
4720 softime 10808 // Ajout de la notif et récupération de son id
4721     $idNotif = $this->ajouter_notification(
4722     $this->valF[$this->clePrimaire],
4723     $this->f->get_connected_user_login_name(),
4724 softime 10968 $demandeur,
4725     $collectivite_di,
4726 softime 12433 array(),
4727 softime 10968 true
4728 softime 10808 );
4729     if ($idNotif === false) {
4730 softime 13528 $this->addToLog(
4731     sprintf('%s() : %s',__METHOD__, $msgLog),
4732     DEBUG_MODE
4733     );
4734 softime 10808 return false;
4735     }
4736     // Création de la tache en lui donnant l'id de la notification
4737     $notification_by_task = $this->notification_by_task(
4738     $idNotif,
4739     $this->valF['dossier'],
4740     $categorie
4741     );
4742     if ($notification_by_task === false) {
4743 softime 13528 $this->addToLog(
4744     sprintf('%s() : %s',__METHOD__, $msgLog),
4745     DEBUG_MODE
4746     );
4747 softime 10808 $this->addToMessage(
4748     __("Erreur lors de la génération de la notification au(x) pétitionnaire(s).")
4749     );
4750     return false;
4751     }
4752     }
4753 softime 12847 // Pour la notification par mail ou la notification via portal si le dossier a
4754     // été déposés via portal, si le demandeur principal n'est pas notifiable,
4755     // on créé une nouvelle notification en erreur avec en commentaire la raison pour
4756     // laquelle le demandeur principal n'a pas pu être notifié
4757     $depotPortal = $this->dossier_depose_sur_portail();
4758     if (! $demandeurPrincipalNotifie && ($isPortal === false || $depotPortal === true)) {
4759 softime 13137 // Précise dans les logs que le pétitionnaire principal n'a pas été notifié
4760 softime 13528 $msgLog .= sprintf(' %s', __('Le pétitionnaire principale n\'est pas notifiable.'));
4761 softime 12124 // Analyse pour savoir pourquoi le demandeur principal n'est pas notifiable
4762     $erreursParam = $this->get_info_notification_fail();
4763     $demandeurPrincipal = $this->get_info_petitionnaire_principal_dossier($this->getVal('dossier'));
4764     // Ajout de la notif et récupération de son id
4765     $idNotif = $this->ajouter_notification(
4766     $this->valF[$this->clePrimaire],
4767     $this->f->get_connected_user_login_name(),
4768     $demandeurPrincipal,
4769     $collectivite_di,
4770 softime 12433 array(),
4771 softime 12124 true,
4772     'Echec',
4773     implode(' ', $erreursParam)
4774     );
4775     if ($idNotif === false) {
4776 softime 13528 $this->addToLog(
4777     sprintf('%s() : %s', __METHOD__, $msgLog),
4778     DEBUG_MODE
4779     );
4780 softime 12124 $this->addToMessage(
4781     __('Erreur : la création de la notification a échouée.').
4782     __("Veuillez contacter votre administrateur.")
4783     );
4784     return false;
4785     }
4786     // Prépare un message d'alerte à destination de l'instructeur pour l'informer
4787     // de l'échec de la notification
4788     $dossier_message = $this->get_inst_dossier_message(0);
4789     $dossier_message_val = array(
4790     'dossier' => $this->getVal('dossier'),
4791     'type' => _('erreur expedition'),
4792     'emetteur' => $this->f->get_connected_user_login_name(),
4793     'login' => $_SESSION['login'],
4794     'date_emission' => date('Y-m-d H:i:s'),
4795     'contenu' => _('Échec lors de la notification de l\'instruction ').
4796     $ev->getVal('libelle').
4797     '.<br>'.
4798     implode("\n", $erreursParam).
4799     '<br>'.
4800     _('Veuillez corriger ces informations avant de renvoyer la notification.')
4801     );
4802     $add = $dossier_message->add_notification_message($dossier_message_val, true);
4803     // Si une erreur se produit pendant l'ajout
4804     if ($add !== true) {
4805 softime 13528 $this->addToLog(
4806     sprintf(
4807     '%s() : %s',
4808     __METHOD__,
4809     __("Le message d'alerte concernant l'echec de l'envoi de la notification n'a pas pu être envoyé.")
4810     ),
4811     DEBUG_MODE
4812     );
4813 softime 12124 return false;
4814     }
4815     }
4816 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.")));
4817     }
4818     }
4819    
4820 nmeucci 3933 return $this->add_log_to_dossier($id, $val);
4821 fmichon 4708 }
4822 mbroquet 3730
4823 softime 8989 /**
4824     * TRIGGER - triggersupprimer.
4825     *
4826     * @return boolean
4827     */
4828     function triggersupprimer($id, &$dnu1 = null, $val = array(), $dnu2 = null) {
4829     $this->addToLog(__METHOD__."(): start", EXTRA_VERBOSE_MODE);
4830 mbroquet 3730 /**
4831     * L'objectif ici est de repositionner les valeurs récupérées en
4832     * archive dans le dossier d'instruction avant de supprimer l'événement
4833 softime 10573 * d'instruction si les valeurs du dossier sont différentes
4834 mbroquet 3730 */
4835 softime 10573 $valF = array();
4836     $inst_di = $this->get_inst_dossier($this->getVal('dossier'));
4837     foreach ($inst_di->champs as $key => $champ) {
4838     // Si le champ du DI à une archive dans l'instruction
4839     if (isset($val[sprintf('archive_%s', $champ)]) === true) {
4840     // Si la valeur entre le champ du DI et son archive dans instruction
4841     // est différente
4842     if ($inst_di->getVal($champ) !== $val[sprintf('archive_%s', $champ)]) {
4843     $val[sprintf('archive_%s', $champ)] === '' ? $valF[$champ] = null : $valF[$champ] = $val[sprintf('archive_%s', $champ)];
4844 softime 15037 // Gestion du cas particulier 'accord_tacite' pour renvoyer la valeur ' ' (3 espaces vides) au lieu de null
4845     // Car les valeurs possibles du champ accord_tacite sont : 'Oui', 'Non' ou ' '
4846     if ($champ === "accord_tacite" && $valF[$champ] === null) {
4847     $valF[$champ] = ' ';
4848     }
4849 softime 10573 }
4850     }
4851 softime 5024 }
4852 softime 10573 // Spécificité du champ avis_decision dont le champ archive est nommé
4853     // différemment
4854     if ($inst_di->getVal('avis_decision') !== $val['archive_avis']) {
4855     $val['archive_avis'] === '' ? $valF['avis_decision'] = null : $valF['avis_decision'] = $val['archive_avis'];
4856 softime 5024 }
4857 softime 10573 // Spécificité de la date d'affichage dont la valeur n'ai jamais modifiée
4858     // par l'archive
4859     unset($valF['date_affichage']);
4860 softime 6565
4861 softime 9245 /**
4862     * Mise à jour de la version de clôture *version_clos* du dossier si et
4863     * seulement si l'instruction met à jour l'état du dossier.
4864     */
4865 softime 10573 if (isset($valF['etat']) === true
4866     && $valF['etat'] !== null
4867 softime 9245 && $valF['etat'] !== '') {
4868 softime 10573 // Récupère l'état actuel du dossier d'instruction
4869     $inst_current_etat = $this->f->get_inst__om_dbform(array(
4870     "obj" => "etat",
4871     "idx" => $inst_di->get_id_etat(),
4872     ));
4873 softime 9245 // Instanciation de l'état archivé appliqué sur le dossier
4874     $inst_etat = $this->f->get_inst__om_dbform(array(
4875     "obj" => "etat",
4876     "idx" => $valF['etat'],
4877     ));
4878     //
4879     $update_version_clos = null;
4880     // En cas de clôture du dossier par l'état archivé
4881     if ($inst_etat->getVal('statut') === 'cloture') {
4882     $update_version_clos = $inst_di->update_version_clos('up');
4883     }
4884     // En cas de réouverture du dossier par l'état archivé
4885     if ($inst_current_etat->getVal('statut') === 'cloture'
4886     && $inst_etat->getVal('statut') !== 'cloture') {
4887     //
4888     $update_version_clos = $inst_di->update_version_clos('down');
4889     //
4890     $this->set_att_di_reopened(true);
4891     }
4892     //
4893     if ($update_version_clos === false) {
4894     $this->f->addToLog(sprintf(
4895     "%s() : ERREUR - %s %s",
4896     __METHOD__,
4897     sprintf(
4898     __("Impossible de mettre à jour la version de clôture du dossier d'instruction %s."),
4899     $inst_di->getVal($inst_di->clePrimaire)
4900     ),
4901     sprintf(
4902     __("L'instruction tente d'appliquer l'état %s."),
4903     $inst_etat->getVal($inst_etat->clePrimaire)
4904     )
4905     ));
4906     $this->addToMessage(sprintf(
4907     "%s %s",
4908     __("Erreur lors de la mise à jour de la version de clôture du dossier d'instruction."),
4909     __("Veuillez contacter votre administrateur.")
4910     ));
4911     return false;
4912     }
4913     }
4914 softime 10808 // On supprime toutes les notications liées à l'instruction
4915 softime 12654 $notifASupprimer = $this->get_instruction_notification(
4916     $this->getVal($this->clePrimaire),
4917     array(
4918     'notification_recepisse',
4919     'notification_instruction',
4920     'notification_decision',
4921     'notification_service_consulte',
4922     'notification_tiers_consulte',
4923 softime 13137 'notification_depot_demat',
4924 softime 15037 'notification_commune',
4925     'notification_signataire'
4926 softime 12654 ),
4927     true
4928     );
4929    
4930 softime 10808 foreach ($notifASupprimer as $idNotif) {
4931     $inst_notif = $this->f->get_inst__om_dbform(array(
4932     "obj" => "instruction_notification",
4933     "idx" => $idNotif,
4934     ));
4935     $val_notif = array();
4936     foreach ($inst_notif->champs as $champ) {
4937     $val_notif[$champ] = $inst_notif->getVal($champ);
4938     }
4939     // La suppression des notifications entrainera la suppression des tâches qui y sont
4940     // liées
4941     $supprNotif = $inst_notif->supprimer($val_notif);
4942     if ($supprNotif == false) {
4943     $this->addToMessage(sprintf(
4944     "%s %s",
4945     __("Erreur lors de la suppression des notifications de l'instruction."),
4946     __("Veuillez contacter votre administrateur.")
4947     ));
4948     return false;
4949     }
4950     }
4951 softime 9245
4952 softime 10573 // On met à jour le dossier
4953     $valF['instruction'] = $id;
4954 softime 10968 $valF['crud'] = 'delete';
4955 softime 10573 $update_by_instruction = $inst_di->update_by_instruction($valF);
4956     if ($update_by_instruction === false) {
4957     $this->cleanMessage();
4958     $this->addToMessage(sprintf('%s %s', __("Une erreur s'est produite lors de la mise à jour du dossier d'instruction."), __("Veuillez contacter votre administrateur.")));
4959     return false;
4960     }
4961    
4962 softime 5024 // Affichage d'informations à l'utilisateur
4963 softime 8989 $this->addToMessage(_("Suppression de l'instruction")." [".$this->f->db->affectedRows()." "._('enregistrement')." "._('mis_a_jour')."]");
4964 softime 5024
4965     // Mise à jour de la demande si un récépissé d'instruction correspond à l'instruction à supprimer
4966 mbroquet 3730 }
4967    
4968 softime 8989 /**
4969     * TRIGGER - triggersupprimerapres.
4970     *
4971     * @return boolean
4972     */
4973     function triggersupprimerapres($id, &$dnu1 = null, $val = array(), $dnu2 = null) {
4974     $this->addToLog(__METHOD__."(): start", EXTRA_VERBOSE_MODE);
4975 softime 8640 /**
4976     * Mise à jour de la date de dernière modification du dossier
4977     * d'instruction
4978     */
4979     $inst_di = $this->get_inst_dossier($this->getVal('dossier'));
4980     $inst_di->update_last_modification_date();
4981    
4982     /**
4983     * Mise à jour des données du dossier d'autorisation
4984     */
4985 softime 7996 $da = $this->f->get_inst__om_dbform(array(
4986     "obj" => "dossier_autorisation",
4987     "idx" => $this->getNumDemandeAutorFromDossier($val["dossier"]),
4988     ));
4989 softime 8640 $params = array(
4990     'di_id' => $this->getVal('dossier'),
4991 softime 9245 'di_reopened' => $this->get_att_di_reopened(),
4992 softime 8640 );
4993     if($da->majDossierAutorisation($params) === false) {
4994 mbroquet 3730 $this->addToMessage(_("Erreur lors de la mise a jour des donnees du dossier d'autorisation. Contactez votre administrateur."));
4995     $this->correct = false;
4996     return false;
4997     }
4998 softime 7996
4999 softime 10573 /**
5000     * Gestion des tâches pour la dématérialisation
5001     */
5002     $inst_task_empty = $this->f->get_inst__om_dbform(array(
5003     "obj" => "task",
5004     "idx" => 0,
5005     ));
5006     foreach ($inst_di->task_types as $task_type) {
5007     $task_exists = $inst_task_empty->task_exists($task_type, $id);
5008     if ($task_exists !== false) {
5009     $inst_task = $this->f->get_inst__om_dbform(array(
5010     "obj" => "task",
5011     "idx" => $task_exists,
5012     ));
5013     if ($inst_task->getVal('state') === $inst_task::STATUS_NEW || $inst_task->getVal('state') === $inst_task::STATUS_DRAFT) {
5014     $task_val = array(
5015     'state' => $inst_task::STATUS_CANCELED,
5016     );
5017     $update_task = $inst_task->update_task(array('val' => $task_val));
5018     if ($update_task === false) {
5019     $this->addToMessage(sprintf('%s %s',
5020     sprintf(__("Une erreur s'est produite lors de la modification de la tâche %."), $inst_task->getVal($inst_task->clePrimaire)),
5021     __("Veuillez contacter votre administrateur.")
5022     ));
5023     $this->correct = false;
5024     return false;
5025     }
5026     }
5027     }
5028     }
5029    
5030 softime 7996 //
5031 softime 8640 $val['evenement'] = $this->getVal('evenement');
5032 nmeucci 3933 return $this->add_log_to_dossier($id, $val);
5033 mbroquet 3730 }
5034    
5035     /**
5036 softime 9245 * Permet de mettre la valeur passée en paramètre dans l'attribut de classe
5037     * "di_reopened".
5038     *
5039     * @param boolean $val
5040     */
5041     function set_att_di_reopened($val) {
5042     $this->di_reopened = $val;
5043     }
5044    
5045     /**
5046     * Permet de récupérer la valeur de l'attribut de classe "di_reopened".
5047     *
5048     * @return boolean
5049     */
5050     function get_att_di_reopened() {
5051     return $this->di_reopened;
5052     }
5053    
5054     /**
5055 mbroquet 3730 * Permet de composer un message d'erreur sur restriction non valide en
5056     * fonction du contexte.
5057     *
5058     * @param string $restriction formule de la restriction
5059     *
5060     * @return string message d'erreur
5061     */
5062     function get_restriction_error_message($restriction) {
5063     // Affichage du message si la restriction s'applique
5064     // Contexte du suivi des dates (message simple)
5065     $message_restrict = _("Probleme de dates :");
5066     // Split restriction
5067     $champs_restrict = preg_split(
5068     '/(\W+)/',
5069     $restriction,
5070     null,
5071     PREG_SPLIT_NO_EMPTY|PREG_SPLIT_DELIM_CAPTURE
5072     );
5073     $formated_restrict = "";
5074     // Ajout des chaînes à traduire
5075     foreach ($champs_restrict as $value) {
5076     $formated_restrict .= _($value)." ";
5077     }
5078     $formated_restrict = substr($formated_restrict, 0, -1);
5079     // Message d'erreur dans le contexte du suivi des dates
5080     if($this->getParameter("maj") == 170) {
5081     $message_restrict .= " "._("contactez l'instructeur du dossier");
5082     $message_restrict .= "<br/>(".$formated_restrict.")";
5083     } else {
5084     // Affichage du message si la restriction s'applique
5085     // Contexte instruction
5086     $message_restrict .= "<br/>".$formated_restrict;
5087     }
5088    
5089     return $message_restrict;
5090     }
5091    
5092     /**
5093 softime 12124 * Surcharge de la méthode verifier() de la classe om_dbform pour y ajouter
5094     * les vérifications suivantes :
5095     * - Si l'instruction à un événement associé et que cet événement à des restrictions :
5096     * 1. vérifie si la restriction est valide, si ce n'est pas le cas récupère et affiche
5097     * le message d'erreur associé à la restriction
5098     * 2. vérifie si les restrictions sont respectées. Si ce n'est pas le cas bloque l'ajout
5099     * et / ou la modification et affiche un message d'erreur
5100     * -
5101     * -
5102     * -
5103     * -
5104     * -
5105     * -
5106     *
5107     * @param array val : tableau contenant les valeurs issues du formulaire.
5108     * @param - dnu1 : Paramètre déprécié et non utilisé.
5109     * @param - dnu2 : Paramètre déprécié et non utilisé.
5110     *
5111 softime 8989 * @return void
5112 mbroquet 3730 */
5113 softime 8989 function verifier($val = array(), &$dnu1 = null, $dnu2 = null) {
5114     parent::verifier($val);
5115     //
5116 mbroquet 3730 if ( isset($val['evenement']) && is_numeric($val['evenement'])){
5117     $restriction = $this->get_restriction($val['evenement']);
5118    
5119     //Test qu'une restriction est présente
5120     if ($restriction != "" ){
5121    
5122 softime 14064 // Vérifie le contexte de la modification et test si la restriction est valide.
5123     // Si l'instruction est modifiée par une tache le dossier n'est pas impacté.
5124     // Il n'est donc pas nécessaire de vérifier les restrictions.
5125 mbroquet 3730 $this->restriction_valid = $this->restrictionIsValid($restriction);
5126 softime 14064 if ($this->getParameter("maj") != 176
5127     && !$this->restriction_valid) {
5128 mbroquet 3730
5129     // Affichage du message si la restriction s'applique
5130     $this->addToMessage(
5131     $this->get_restriction_error_message($restriction)
5132     );
5133     $this->correct=false;
5134     return false;
5135     }
5136    
5137     // Liste des opérateurs possible
5138 nmeucci 3873 $operateurs = array(">=", "<=", "+", "-", "&&", "||", "==", "!=");
5139 mbroquet 3730 // Supprime tous les espaces de la chaîne de caractère
5140     $restriction = str_replace(' ', '', $restriction);
5141    
5142     // Met des espace avant et après les opérateurs puis transforme la
5143     // chaine en un tableau
5144     $tabRestriction = str_replace($operateurs, " ", $restriction);
5145     // Tableau des champ
5146     $tabRestriction = explode(" ", $tabRestriction);
5147     // Supprime les numériques du tableau
5148     foreach ($tabRestriction as $key => $value) {
5149     if (is_numeric($value)) {
5150     unset($tabRestriction[$key]);
5151     }
5152     }
5153    
5154     // Vérifie les champs utilisés pour la restriction
5155     $check_field_exist = $this->f->check_field_exist($tabRestriction, 'instruction');
5156     if ($check_field_exist !== true) {
5157    
5158     // Liste des champs en erreur
5159     $string_error_fields = implode(", ", $check_field_exist);
5160    
5161     // Message d'erreur
5162     $error_message = _("Le champ %s n'est pas utilisable pour le champ %s");
5163     if (count($check_field_exist) > 1) {
5164     $error_message = _("Les champs %s ne sont pas utilisable pour le champ %s");
5165     }
5166    
5167     // Affiche l'erreur
5168     $this->correct=false;
5169     $this->addToMessage(sprintf($error_message, $string_error_fields, _("restriction")));
5170     $this->addToMessage(_("Veuillez contacter votre administrateur."));
5171     }
5172     }
5173    
5174     }
5175     if(!$this->updateDate("date_envoi_signature")) {
5176     return false;
5177     }
5178     if(!$this->updateDate("date_retour_signature")) {
5179     return false;
5180     }
5181     if(!$this->updateDate("date_envoi_rar")) {
5182     return false;
5183     }
5184     if(!$this->updateDate("date_retour_rar")) {
5185     return false;
5186     }
5187     if(!$this->updateDate("date_envoi_controle_legalite")) {
5188     return false;
5189     }
5190     if(!$this->updateDate("date_retour_controle_legalite")) {
5191     return false;
5192     }
5193    
5194     }
5195 softime 12124
5196     /**
5197     * Récupère et stocket dans un tableau toutes les infos du pétitionnaire
5198     * principal du dossier auquel appartiens l'instruction.
5199     * Renvoie un tableau contenant les informations du pétitionnaire principal.
5200     *
5201     * Si l'identifiant de l'instruction n'a pas pu etre récupéré renvoie false
5202     * et affiche un message dans les logs.
5203     * En cas d'erreur de base de donnée renvoie false et affiche un message d'erreur.
5204     *
5205     * @param string identifiant du dossier
5206     * @return array|boolean
5207     */
5208     protected function get_info_petitionnaire_principal_dossier($dossier = null) {
5209     // Si l'identifiant de l'instruction n'a pas été fournit on récupère celui de
5210     // l'objet courant
5211     if (empty($dossier)) {
5212     $dossier = $this->getVal('dossier');
5213     // Si la récupération de l'identifiant de l'instruction a échoué la méthode renvoie
5214     // false et on affiche un message d'erreur dans les logs
5215     if (empty($dossier)) {
5216     $this->addToLog(__METHOD__.' : L\'identifiant du dossier n\'a pas pu être récupéré');
5217     return false;
5218     }
5219     }
5220    
5221     // Requête sql servant à récupérer toutes les informations relatives au demandeurs
5222     // principal
5223 softime 13137 $qres = $this->f->get_all_results_from_db_query(
5224     sprintf(
5225     'SELECT
5226     -- Récupère toutes les informations du demandeur principal
5227     demandeur.*,
5228     CASE
5229     WHEN demandeur.qualite=\'particulier\'
5230     THEN TRIM(CONCAT(demandeur.particulier_nom, \' \', demandeur.particulier_prenom, \' \', demandeur.courriel))
5231     ELSE
5232     TRIM(CONCAT(demandeur.personne_morale_raison_sociale, \' \', demandeur.personne_morale_denomination, \' \', demandeur.courriel))
5233     END AS destinataire
5234     FROM
5235     %1$sdossier
5236     LEFT JOIN %1$slien_dossier_demandeur
5237     ON lien_dossier_demandeur.dossier = dossier.dossier
5238     LEFT JOIN %1$sdemandeur
5239     ON demandeur.demandeur = lien_dossier_demandeur.demandeur
5240     WHERE
5241     dossier.dossier = \'%2$s\'
5242     AND lien_dossier_demandeur.petitionnaire_principal IS TRUE',
5243     DB_PREFIXE,
5244     $this->f->db->escapeSimple($dossier)
5245     ),
5246     array(
5247     "origin" => __METHOD__,
5248     )
5249 softime 12124 );
5250 softime 13137 if (is_array($qres["result"]) === true
5251     && array_key_exists(0, $qres["result"]) === true) {
5252     //
5253     return $qres["result"][0];
5254 softime 12124 }
5255 softime 13137 return null;
5256 softime 12124 }
5257    
5258    
5259 mbroquet 3730
5260     /**
5261     * Finalisation des documents.
5262     * @param string $champ champ du fichier à finaliser
5263     * @param booleen $status permet de définir si on finalise ou définalise
5264     * @param string $sousform permet de savoir si se trouve dans un sousformulaire (passé au javascript)
5265     */
5266     function manage_finalizing($mode = null, $val = array()) {
5267 softime 5024 //
5268     $this->begin_treatment(__METHOD__);
5269 mbroquet 3730
5270 softime 5024 //
5271     $id_inst = $this->getVal($this->clePrimaire);
5272 mbroquet 3730
5273 softime 5024 //
5274     $admin_msg_error = _("Veuillez contacter votre administrateur.");
5275     $file_msg_error = _("Erreur de traitement de fichier.")
5276     ." ".$admin_msg_error;
5277     $bdd_msg_error = _("Erreur de base de données.")
5278     ." ".$admin_msg_error;
5279 softime 5169 $log_msg_error = "Finalisation non enregistrée - id instruction = %s - uid fichier = %s";
5280 mbroquet 3730
5281     // Si on finalise le document
5282     if ($mode == "finalize"){
5283 softime 5024 //
5284     $etat = _('finalisation');
5285 mbroquet 3730
5286     // Récupère la collectivite du dossier d'instruction
5287     $dossier_instruction_om_collectivite = $this->get_dossier_instruction_om_collectivite();
5288    
5289     //
5290     $collectivite = $this->f->getCollectivite($dossier_instruction_om_collectivite);
5291 softime 8593
5292     //
5293     $params = array(
5294     "specific" => array(),
5295     );
5296     // Si la rédaction libre est activée sur l'instruction
5297     if ($this->getVal("flag_edition_integrale") == 't') {
5298     $params["specific"]["corps"] = array(
5299     "mode" => "set",
5300     "value" => $this->getVal("corps_om_htmletatex"),
5301     );
5302     $params["specific"]["titre"] = array(
5303     "mode" => "set",
5304     "value" => $this->getVal("titre_om_htmletat"),
5305     );
5306     }
5307 mbroquet 3730 // Génération du PDF
5308 softime 8593 $result = $this->compute_pdf_output('lettretype', $this->getVal('lettretype'), $collectivite, null, $params);
5309 mbroquet 3730 $pdf_output = $result['pdf_output'];
5310 softime 10573
5311 mbroquet 3730 //Métadonnées du document
5312     $metadata = array(
5313 softime 5024 'filename' => 'instruction_'.$id_inst.'.pdf',
5314 mbroquet 3730 'mimetype' => 'application/pdf',
5315     'size' => strlen($pdf_output)
5316     );
5317    
5318     // Récupération des métadonnées calculées après validation
5319     $spe_metadata = $this->getMetadata("om_fichier_instruction");
5320    
5321     //On vérifie si l'instruction à finaliser a un événement de type arrete
5322 softime 14064 // TODO : A voir pour remplacer par une instanciation de l'événement.
5323     // Voir également si l'événement ne dois pas être instancié en début de
5324     // méthode pour pouvoir être réutilisé.
5325     $qres = $this->f->get_one_result_from_db_query(
5326     sprintf(
5327     'SELECT
5328     type
5329     FROM
5330     %1$sevenement
5331     WHERE
5332     evenement = \'%2$d\'',
5333     DB_PREFIXE,
5334     intval($this->getVal("evenement"))
5335     ),
5336     array(
5337     "origin" => __METHOD__,
5338     "force_return" => true,
5339     )
5340     );
5341    
5342     if ($qres["code"] !== "OK") {
5343 softime 5024 $this->correct = false;
5344     $this->addToMessage($bdd_msg_error);
5345     return $this->end_treatment(__METHOD__, false);
5346 mbroquet 3730 }
5347    
5348     //Initialisation de la variable
5349     $arrete_metadata = array();
5350     // Si l'événement est de type arrete, on ajoute les métadonnées spécifiques
5351 softime 14064 if ($qres['result'] === 'arrete'){
5352 mbroquet 3730 $arrete_metadata = $this->getMetadata("arrete");
5353     }
5354    
5355     $metadata = array_merge($metadata, $spe_metadata, $arrete_metadata);
5356    
5357 softime 10573 /*
5358     // transforme le tableau de métadonnées en objet
5359     $mdf = new MetadataFactory();
5360     $md = $mdf->build('Instruction', $metadata);
5361     */
5362    
5363 softime 5024 // Si le document a déjà été finalisé on le met à jour
5364     // en conservant son UID
5365 mbroquet 3730 if ($this->getVal("om_fichier_instruction") != ''){
5366     $uid = $this->f->storage->update(
5367     $this->getVal("om_fichier_instruction"), $pdf_output, $metadata);
5368     }
5369 softime 5024 // Sinon on crée un nouveau document et dont on récupère l'UID
5370 mbroquet 3730 else {
5371 softime 10573 $uid = $this->f->storage->create($pdf_output, $metadata, "from_content", $this->table.".om_fichier_instruction");
5372 mbroquet 3730 }
5373     }
5374    
5375 softime 5024 // Si on définalise le document
5376 mbroquet 3730 if ($mode == "unfinalize") {
5377 softime 5024 //
5378     $etat = _('définalisation');
5379 mbroquet 3730 // Récupération de l'uid du document finalisé
5380     $uid = $this->getVal("om_fichier_instruction");
5381     }
5382 softime 5024
5383     // Si on définalise l'UID doit être défini
5384     // Si on finalise la création/modification du fichier doit avoir réussi
5385 mbroquet 3730 if ($uid == '' || $uid == 'OP_FAILURE' ) {
5386 softime 5024 $this->correct = false;
5387     $this->addToMessage($file_msg_error);
5388 softime 8989 $this->addToLog(sprintf($log_msg_error, $id_inst, $uid), DEBUG_MODE);
5389 softime 5024 return $this->end_treatment(__METHOD__, false);
5390 mbroquet 3730 }
5391    
5392     //
5393     foreach ($this->champs as $key => $champ) {
5394     //
5395     $val[$champ] = $this->val[$key];
5396     }
5397    
5398     //
5399 softime 6565 $val['date_evenement'] = $this->dateDBToForm($val['date_evenement']);
5400     $val['archive_date_complet'] = $this->dateDBToForm($val['archive_date_complet']);
5401     $val['archive_date_rejet'] = $this->dateDBToForm($val['archive_date_rejet']);
5402     $val['archive_date_limite'] = $this->dateDBToForm($val['archive_date_limite']);
5403     $val['archive_date_notification_delai'] = $this->dateDBToForm($val['archive_date_notification_delai']);
5404     $val['archive_date_decision'] = $this->dateDBToForm($val['archive_date_decision']);
5405     $val['archive_date_validite'] = $this->dateDBToForm($val['archive_date_validite']);
5406     $val['archive_date_achevement'] = $this->dateDBToForm($val['archive_date_achevement']);
5407     $val['archive_date_chantier'] = $this->dateDBToForm($val['archive_date_chantier']);
5408     $val['archive_date_conformite'] = $this->dateDBToForm($val['archive_date_conformite']);
5409     $val['archive_date_dernier_depot'] = $this->dateDBToForm($val['archive_date_dernier_depot']);
5410     $val['archive_date_limite_incompletude'] = $this->dateDBToForm($val['archive_date_limite_incompletude']);
5411     $val['date_finalisation_courrier'] = $this->dateDBToForm($val['date_finalisation_courrier']);
5412     $val['date_envoi_signature'] = $this->dateDBToForm($val['date_envoi_signature']);
5413     $val['date_retour_signature'] = $this->dateDBToForm($val['date_retour_signature']);
5414     $val['date_envoi_rar'] = $this->dateDBToForm($val['date_envoi_rar']);
5415     $val['date_retour_rar'] = $this->dateDBToForm($val['date_retour_rar']);
5416     $val['date_envoi_controle_legalite'] = $this->dateDBToForm($val['date_envoi_controle_legalite']);
5417     $val['date_retour_controle_legalite'] = $this->dateDBToForm($val['date_retour_controle_legalite']);
5418     $val['archive_date_cloture_instruction'] = $this->dateDBToForm($val['archive_date_cloture_instruction']);
5419     $val['archive_date_premiere_visite'] = $this->dateDBToForm($val['archive_date_premiere_visite']);
5420     $val['archive_date_derniere_visite'] = $this->dateDBToForm($val['archive_date_derniere_visite']);
5421     $val['archive_date_contradictoire'] = $this->dateDBToForm($val['archive_date_contradictoire']);
5422     $val['archive_date_retour_contradictoire'] = $this->dateDBToForm($val['archive_date_retour_contradictoire']);
5423     $val['archive_date_ait'] = $this->dateDBToForm($val['archive_date_ait']);
5424     $val['archive_date_transmission_parquet'] = $this->dateDBToForm($val['archive_date_transmission_parquet']);
5425 softime 8989 $val['archive_date_affichage'] = $this->dateDBToForm($val['archive_date_affichage']);
5426 mbroquet 3730 $this->setvalF($val);
5427    
5428     // Verification de la validite des donnees
5429 softime 8989 $this->verifier($this->val);
5430 mbroquet 3730 // Si les verifications precedentes sont correctes, on procede a
5431     // la modification, sinon on ne fait rien et on retourne une erreur
5432 softime 5024 if ($this->correct === true) {
5433 mbroquet 3730 //
5434     $valF = array(
5435     "om_fichier_instruction" => $uid,
5436     "date_finalisation_courrier" => date('Y-m-d')
5437     );
5438     //
5439     if($mode=="finalize") {
5440     // état finalisé vrai
5441 softime 5024 $valF["om_final_instruction"] = true;
5442 mbroquet 3730 // ajout log utilisateur
5443     $login = $_SESSION['login'];
5444     $nom = "";
5445     $this->f->getUserInfos();
5446     if (isset($this->f->om_utilisateur["nom"])
5447     && !empty($this->f->om_utilisateur["nom"])) {
5448     $nom = $this->f->om_utilisateur["nom"];
5449     }
5450     $valF["om_final_instruction_utilisateur"] = $_SESSION['login'];
5451     if ($nom != "") {
5452     $valF["om_final_instruction_utilisateur"] .= " (".$nom.")";
5453     }
5454     } else {
5455     // état finalisé faux
5456 softime 5024 $valF["om_final_instruction"] = false;
5457 mbroquet 3730 // suppression log utilisateur
5458     $valF["om_final_instruction_utilisateur"] = '';
5459     }
5460    
5461     // Execution de la requête de modification des donnees de l'attribut
5462     // valF de l'objet dans l'attribut table de l'objet
5463 softime 8989 $res = $this->f->db->autoExecute(DB_PREFIXE.$this->table, $valF,
5464 softime 5024 DB_AUTOQUERY_UPDATE, $this->getCle($id_inst));
5465     $this->addToLog(__METHOD__."() : db->autoExecute(\"".DB_PREFIXE.$this->table."\", ".print_r($valF, true).", DB_AUTOQUERY_UPDATE, \"".$this->getCle($id_inst)."\")", VERBOSE_MODE);
5466     //
5467     if ($this->f->isDatabaseError($res, true) === true) {
5468     $this->correct = false;
5469     $this->addToMessage($bdd_msg_error);
5470     return $this->end_treatment(__METHOD__, false);
5471     }
5472 mbroquet 3730
5473 softime 5024 //
5474     $this->addToMessage(sprintf(_("La %s du document s'est effectuee avec succes."), $etat));
5475     //
5476     if ($this->add_log_to_dossier($id_inst, $val) === false) {
5477     return $this->end_treatment(__METHOD__, false);
5478     }
5479     //
5480     return $this->end_treatment(__METHOD__, true);
5481 mbroquet 3730 }
5482 softime 5024 // L'appel de verifier() a déjà positionné correct à false
5483     // et défini un message d'erreur.
5484 softime 8989 $this->addToLog(sprintf($log_msg_error, $id_inst, $uid), DEBUG_MODE);
5485 softime 5024 return $this->end_treatment(__METHOD__, false);
5486 mbroquet 3730 }
5487    
5488     /**
5489     * Récupération du numéro de dossier d'instruction à ajouter aux métadonnées
5490     * @return string numéro de dossier d'instruction
5491     */
5492 softime 10573 protected function getDossier($champ = null) {
5493 mbroquet 3730 if(empty($this->specificMetadata)) {
5494     $this->getSpecificMetadata();
5495     }
5496     return $this->specificMetadata->dossier;
5497     }
5498     /**
5499     * Récupération la version du dossier d'instruction à ajouter aux métadonnées
5500     * @return int Version
5501     */
5502     protected function getDossierVersion() {
5503     if(empty($this->specificMetadata)) {
5504     $this->getSpecificMetadata();
5505     }
5506     return $this->specificMetadata->version;
5507     }
5508     /**
5509     * Récupération du numéro de dossier d'autorisation à ajouter aux métadonnées
5510     * @return string numéro de dossier d'autorisation
5511     */
5512     protected function getNumDemandeAutor() {
5513     if(empty($this->specificMetadata)) {
5514     $this->getSpecificMetadata();
5515     }
5516     return $this->specificMetadata->dossier_autorisation;
5517     }
5518     /**
5519     * Récupération de la date de demande initiale du dossier à ajouter aux métadonnées
5520     * @return date de la demande initiale
5521     */
5522     protected function getAnneemoisDemandeAutor() {
5523     if(empty($this->specificMetadata)) {
5524     $this->getSpecificMetadata();
5525     }
5526     return $this->specificMetadata->date_demande_initiale;
5527     }
5528     /**
5529     * Récupération du type de dossier d'instruction à ajouter aux métadonnées
5530     * @return string type du dossier d'instruction
5531     */
5532     protected function getTypeInstruction() {
5533     if(empty($this->specificMetadata)) {
5534     $this->getSpecificMetadata();
5535     }
5536     return $this->specificMetadata->dossier_instruction_type;
5537     }
5538     /**
5539     * Récupération du statut du dossier d'autorisation à ajouter aux métadonnées
5540     * @return string avis
5541     */
5542     protected function getStatutAutorisation() {
5543     if(empty($this->specificMetadata)) {
5544     $this->getSpecificMetadata();
5545     }
5546     return $this->specificMetadata->statut;
5547     }
5548     /**
5549     * Récupération du type de dossier d'autorisation à ajouter aux métadonnées
5550     * @return string type du dossier d'autorisation
5551     */
5552     protected function getTypeAutorisation() {
5553     if(empty($this->specificMetadata)) {
5554     $this->getSpecificMetadata();
5555     }
5556     return $this->specificMetadata->dossier_autorisation_type;
5557     }
5558     /**
5559     * Récupération de la date d'ajout de document à ajouter aux métadonnées
5560     * @return date de l'évènement
5561     */
5562     protected function getDateEvenementDocument() {
5563     return date("Y-m-d");
5564     }
5565     /**
5566     * Récupération du groupe d'instruction à ajouter aux métadonnées
5567     * @return string Groupe d'instruction
5568     */
5569     protected function getGroupeInstruction() {
5570     if(empty($this->specificMetadata)) {
5571     $this->getSpecificMetadata();
5572     }
5573     return $this->specificMetadata->groupe_instruction;
5574     }
5575     /**
5576     * Récupération du libellé du type du document à ajouter aux métadonnées
5577     * @return string Groupe d'instruction
5578     */
5579     protected function getTitle() {
5580    
5581     // Récupère le champ événement
5582     if (isset($this->valF["evenement"]) AND $this->valF["evenement"] != "") {
5583     $evenement = $this->valF["evenement"];
5584     } else {
5585     $evenement = $this->getVal("evenement");
5586     }
5587    
5588     // Requête sql
5589 softime 14064 $evenement = $this->f->get_inst__om_dbform(array(
5590     "obj" => "evenement",
5591     "idx" => $evenement
5592     ));
5593    
5594 mbroquet 3730 // Retourne le libelle de l'événement
5595 softime 14064 return $evenement->getVal('libelle');
5596 mbroquet 3730 }
5597    
5598 softime 6272
5599 mbroquet 3730 /**
5600 softime 6272 * Récupération du champ ERP du dossier d'instruction.
5601     *
5602     * @return boolean
5603     */
5604     public function get_concerne_erp() {
5605     //
5606     if(empty($this->specificMetadata)) {
5607     $this->getSpecificMetadata();
5608     }
5609     //
5610     return $this->specificMetadata->erp;
5611     }
5612    
5613    
5614     /**
5615 mbroquet 3730 * Cette méthode permet de stocker en attribut toutes les métadonnées
5616     * nécessaire à l'ajout d'un document.
5617     */
5618     public function getSpecificMetadata() {
5619     if (isset($this->valF["dossier"]) AND $this->valF["dossier"] != "") {
5620     $dossier = $this->valF["dossier"];
5621     } else {
5622     $dossier = $this->getVal("dossier");
5623     }
5624     //Requête pour récupérer les informations essentiels sur le dossier d'instruction
5625 softime 14542 $qres = $this->f->get_all_results_from_db_query(
5626     sprintf(
5627     'SELECT
5628     dossier.dossier AS dossier,
5629     dossier_autorisation.dossier_autorisation AS dossier_autorisation,
5630     to_char(dossier.date_demande, \'YYYY/MM\') AS date_demande_initiale,
5631     dossier_instruction_type.code AS dossier_instruction_type,
5632     etat_dossier_autorisation.libelle AS statut,
5633     dossier_autorisation_type.code AS dossier_autorisation_type,
5634     groupe.code AS groupe_instruction,
5635     CASE WHEN dossier.erp IS TRUE
5636     THEN \'true\'
5637     ELSE \'false\'
5638     END AS erp
5639     FROM
5640     %1$sdossier
5641     LEFT JOIN %1$sdossier_instruction_type
5642 mbroquet 3730 ON dossier.dossier_instruction_type = dossier_instruction_type.dossier_instruction_type
5643 softime 14542 LEFT JOIN %1$sdossier_autorisation
5644 mbroquet 3730 ON dossier.dossier_autorisation = dossier_autorisation.dossier_autorisation
5645 softime 14542 LEFT JOIN %1$setat_dossier_autorisation
5646 mbroquet 3730 ON dossier_autorisation.etat_dossier_autorisation = etat_dossier_autorisation.etat_dossier_autorisation
5647 softime 14542 LEFT JOIN %1$sdossier_autorisation_type_detaille
5648 mbroquet 3730 ON dossier_autorisation.dossier_autorisation_type_detaille = dossier_autorisation_type_detaille.dossier_autorisation_type_detaille
5649 softime 14542 LEFT JOIN %1$sdossier_autorisation_type
5650 mbroquet 3730 ON dossier_autorisation_type_detaille.dossier_autorisation_type = dossier_autorisation_type.dossier_autorisation_type
5651 softime 14542 LEFT JOIN %1$sgroupe
5652 mbroquet 3730 ON dossier_autorisation_type.groupe = groupe.groupe
5653 softime 14542 WHERE
5654     dossier.dossier = \'%2$s\'',
5655     DB_PREFIXE,
5656     $this->f->db->escapeSimple($dossier)
5657     ),
5658     array(
5659     "origin" => __METHOD__,
5660     )
5661     );
5662     $row = array_shift($qres['result']);
5663 mbroquet 3730
5664     //Si il y a un résultat
5665 softime 14542 if (! empty($row)) {
5666 mbroquet 3730
5667 fmichon 3892 // Instrance de la classe dossier
5668     $inst_dossier = $this->get_inst_dossier($dossier);
5669 softime 14542 // TODO : améliorer ce code
5670     //
5671     // Avant l e résultat été récupéré dans un objet à partir de la requête mais en modifiant pour
5672     // utiliser la méthode get_all_results_from_db_query() c'est maintenant un tableau
5673     // qu'on obtiens. Pour garder le même fonctionnement on transforme le tableau des
5674     // valeurs issues de la requête en objet.
5675     $metadata = (object)$row;
5676 fmichon 3892 // Insère l'attribut version à l'objet
5677 softime 14542 $metadata->version = $inst_dossier->get_di_numero_suffixe();
5678 fmichon 3892
5679 mbroquet 3730 //Alors on créé l'objet dossier_instruction
5680 softime 14542 $this->specificMetadata = $metadata;
5681 mbroquet 3730
5682     }
5683     }
5684    
5685     /**
5686     * Retourne le statut du dossier d'instruction
5687     * @param string $idx Identifiant du dossier d'instruction
5688     * @return string Le statut du dossier d'instruction
5689     */
5690     function getStatutAutorisationDossier($idx){
5691    
5692     $statut = '';
5693    
5694     //Si l'identifiant du dossier d'instruction fourni est correct
5695     if ( $idx != '' ){
5696    
5697     //On récupère le statut de l'état du dossier à partir de l'identifiant du
5698     //dossier
5699 softime 14064 $qres = $this->f->get_one_result_from_db_query(
5700     sprintf(
5701     'SELECT
5702     etat.statut
5703     FROM
5704     %1$sdossier
5705     LEFT JOIN
5706     %1$setat
5707     ON
5708     dossier.etat = etat.etat
5709     WHERE
5710     dossier = \'%2$s\'',
5711     DB_PREFIXE,
5712     $this->f->db->escapeSimple($idx)
5713     ),
5714     array(
5715     "origin" => __METHOD__,
5716     )
5717     );
5718 mbroquet 3730 }
5719 softime 14064
5720     return $qres['result'];
5721 mbroquet 3730 }
5722    
5723     /**
5724     * Récupère les données du dossier
5725     * @return array
5726     */
5727     function get_dossier_actual() {
5728    
5729     // Initialisation de la valeur de retour
5730     $return = array();
5731    
5732     // Récupération de toutes les valeurs du dossier d'instruction en cours
5733 softime 14542 // TODO : remplacer cette requête par une instanciation de l'objet
5734     $qres = $this->f->get_all_results_from_db_query(
5735     sprintf(
5736     'SELECT
5737     *
5738     FROM
5739     %1$sdossier
5740     WHERE
5741     dossier = \'%2$s\'',
5742     DB_PREFIXE,
5743     $this->f->db->escapeSimple($this->valF['dossier'])
5744     ),
5745     array(
5746     'origin' => __METHOD__
5747     )
5748     );
5749 mbroquet 3730
5750 softime 14542 foreach ($qres['result'] as $row) {
5751 mbroquet 3730
5752     // Récupération de la valeur actuelle du délai, de l'accord tacite,
5753     // de l'état et de l'avis du dossier d'instruction
5754 softime 6565 $return['archive_delai'] = $row['delai'];
5755     $return['archive_accord_tacite'] = $row['accord_tacite'];
5756     $return['archive_etat'] = $row['etat'];
5757     $return['archive_avis'] = $row['avis_decision'];
5758     // Récupération de la valeur actuelle des dates du dossier
5759 mbroquet 3730 // d'instruction
5760 softime 6565 $return['archive_date_complet'] = $row['date_complet'];
5761     $return['archive_date_dernier_depot'] = $row['date_dernier_depot'];
5762     $return['archive_date_rejet'] = $row['date_rejet'];
5763     $return['archive_date_limite'] = $row['date_limite'];
5764     $return['archive_date_notification_delai'] = $row['date_notification_delai'];
5765     $return['archive_date_decision'] = $row['date_decision'];
5766     $return['archive_date_validite'] = $row['date_validite'];
5767     $return['archive_date_achevement'] = $row['date_achevement'];
5768     $return['archive_date_chantier'] = $row['date_chantier'];
5769     $return['archive_date_conformite'] = $row['date_conformite'];
5770     $return['archive_incompletude'] = $row['incompletude'];
5771     $return['archive_incomplet_notifie'] = $row['incomplet_notifie'];
5772     $return['archive_evenement_suivant_tacite'] = $row['evenement_suivant_tacite'];
5773     $return['archive_evenement_suivant_tacite_incompletude'] = $row['evenement_suivant_tacite_incompletude'];
5774     $return['archive_etat_pendant_incompletude'] = $row['etat_pendant_incompletude'];
5775     $return['archive_date_limite_incompletude'] = $row['date_limite_incompletude'];
5776     $return['archive_delai_incompletude'] = $row['delai_incompletude'];
5777     $return['archive_autorite_competente'] = $row['autorite_competente'];
5778 softime 8593 $return['archive_dossier_instruction_type'] = $row['dossier_instruction_type'];
5779 softime 6565 $return['duree_validite'] = $row['duree_validite'];
5780     $return['date_depot'] = $row['date_depot'];
5781 softime 10573 $return['date_depot_mairie'] = $row['date_depot_mairie'];
5782 softime 6565 $return['archive_date_cloture_instruction'] = $row['date_cloture_instruction'];
5783     $return['archive_date_premiere_visite'] = $row['date_premiere_visite'];
5784     $return['archive_date_derniere_visite'] = $row['date_derniere_visite'];
5785     $return['archive_date_contradictoire'] = $row['date_contradictoire'];
5786     $return['archive_date_retour_contradictoire'] = $row['date_retour_contradictoire'];
5787     $return['archive_date_ait'] = $row['date_ait'];
5788     $return['archive_date_transmission_parquet'] = $row['date_transmission_parquet'];
5789 softime 8989 $return['archive_date_affichage'] = $row['date_affichage'];
5790 softime 10573 $return['archive_pec_metier'] = $row['pec_metier'];
5791     $return['archive_a_qualifier'] = $row['a_qualifier'];
5792 mbroquet 3730 }
5793    
5794     // Retour de la fonction
5795     return $return;
5796    
5797     }
5798    
5799     /**
5800     * Permet de vérifier qu'un événement est verrouillable
5801     * @param integer $idx Identifiant de l'instruction
5802     * @return boolean
5803     */
5804     function checkEvenementNonVerrouillable($idx) {
5805     // Si la condition n'est pas vide
5806     if ($idx != "") {
5807    
5808     // Requête SQL
5809 softime 14064 $qres = $this->f->get_one_result_from_db_query(
5810     sprintf(
5811     'SELECT
5812     evenement.non_verrouillable
5813     FROM
5814     %1$sevenement
5815     LEFT JOIN %1$sinstruction
5816     ON instruction.evenement = evenement.evenement
5817     WHERE
5818     instruction.instruction = \'%2$s\'',
5819     DB_PREFIXE,
5820     intval($idx)
5821     ),
5822     array(
5823     "origin" => __METHOD__,
5824     )
5825     );
5826 mbroquet 3730 }
5827    
5828 softime 14064 // Si on a un résultat et que ce résultat indique que l'événement n'est
5829     // pas vérrouillable renvoie true, sinon renvoie false
5830     return isset($qres) && isset($qres['result']) && $qres['result'] == 't';
5831 mbroquet 3730 }
5832    
5833     /**
5834     * Mise à jour des champs archive_*
5835     * @param mixed $row La ligne de données
5836     */
5837     public function updateArchiveData($row){
5838    
5839     // Récupération de la valeur actuelle du délai, de l'accord tacite,
5840     // de l'état et de l'avis du dossier d'instruction
5841     $this->valF['archive_delai']=$row['delai'];
5842     $this->valF['archive_accord_tacite']=$row['accord_tacite'];
5843     $this->valF['archive_etat']=$row['etat'];
5844     $this->valF['archive_avis']=$row['avis_decision'];
5845     // Récupération de la valeur actuelle des 9 dates du dossier
5846     // d'instruction
5847     if ($row['date_complet'] != '') {
5848     $this->valF['archive_date_complet']=$row['date_complet'];
5849     }
5850     if ($row['date_dernier_depot'] != '') {
5851     $this->valF['archive_date_dernier_depot']=$row['date_dernier_depot'];
5852     }
5853 softime 6565 if ($row['date_rejet'] != '') {
5854 mbroquet 3730 $this->valF['archive_date_rejet']= $row['date_rejet'];
5855     }
5856 softime 6565 if ($row['date_limite'] != '') {
5857 mbroquet 3730 $this->valF['archive_date_limite']= $row['date_limite'];
5858     }
5859 softime 6565 if ($row['date_notification_delai'] != '') {
5860 mbroquet 3730 $this->valF['archive_date_notification_delai']= $row['date_notification_delai'];
5861     }
5862 softime 6565 if ($row['date_decision'] != '') {
5863 mbroquet 3730 $this->valF['archive_date_decision']= $row['date_decision'];
5864     }
5865 softime 6565 if ($row['date_validite'] != '') {
5866 mbroquet 3730 $this->valF['archive_date_validite']= $row['date_validite'];
5867     }
5868 softime 6565 if ($row['date_achevement'] != '') {
5869 mbroquet 3730 $this->valF['archive_date_achevement']= $row['date_achevement'];
5870     }
5871 softime 6565 if ($row['date_chantier'] != '') {
5872 mbroquet 3730 $this->valF['archive_date_chantier']= $row['date_chantier'];
5873     }
5874 softime 6565 if ($row['date_conformite'] != '') {
5875 mbroquet 3730 $this->valF['archive_date_conformite']= $row['date_conformite'];
5876     }
5877 softime 6565 if ($row['incompletude'] != '') {
5878 mbroquet 3730 $this->valF['archive_incompletude']= $row['incompletude'];
5879     }
5880 softime 6565 if ($row['incomplet_notifie'] != '') {
5881 mbroquet 3730 $this->valF['archive_incomplet_notifie']= $row['incomplet_notifie'];
5882     }
5883 softime 6565 if ($row['evenement_suivant_tacite'] != '') {
5884 mbroquet 3730 $this->valF['archive_evenement_suivant_tacite']= $row['evenement_suivant_tacite'];
5885     }
5886 softime 6565 if ($row['evenement_suivant_tacite_incompletude'] != '') {
5887 mbroquet 3730 $this->valF['archive_evenement_suivant_tacite_incompletude']= $row['evenement_suivant_tacite_incompletude'];
5888     }
5889 softime 6565 if ($row['etat_pendant_incompletude'] != '') {
5890 mbroquet 3730 $this->valF['archive_etat_pendant_incompletude']= $row['etat_pendant_incompletude'];
5891     }
5892 softime 6565 if ($row['date_limite_incompletude'] != '') {
5893 mbroquet 3730 $this->valF['archive_date_limite_incompletude']= $row['date_limite_incompletude'];
5894     }
5895 softime 6565 if ($row['delai_incompletude'] != '') {
5896 mbroquet 3730 $this->valF['archive_delai_incompletude']= $row['delai_incompletude'];
5897     }
5898 softime 6565 if ($row['autorite_competente'] != '') {
5899 mbroquet 3730 $this->valF['archive_autorite_competente']= $row['autorite_competente'];
5900     }
5901 softime 6565 if ($row['duree_validite'] != '') {
5902 mbroquet 3730 $this->valF['duree_validite']= $row['duree_validite'];
5903     }
5904 softime 6565 if ($row['date_depot'] != '') {
5905 nmeucci 3873 $this->valF['date_depot']= $row['date_depot'];
5906     }
5907 softime 10573 if ($row['date_depot_mairie'] != '') {
5908     $this->valF['date_depot_mairie']= $row['date_depot_mairie'];
5909     }
5910 softime 6565 // Dates concernant les dossiers contentieux
5911     if ($row['date_cloture_instruction'] != '') {
5912     $this->valF['archive_date_cloture_instruction']= $row['date_cloture_instruction'];
5913     }
5914     if ($row['date_premiere_visite'] != '') {
5915     $this->valF['archive_date_premiere_visite']= $row['date_premiere_visite'];
5916     }
5917     if ($row['date_derniere_visite'] != '') {
5918     $this->valF['archive_date_derniere_visite']= $row['date_derniere_visite'];
5919     }
5920     if ($row['date_contradictoire'] != '') {
5921     $this->valF['archive_date_contradictoire']= $row['date_contradictoire'];
5922     }
5923     if ($row['date_retour_contradictoire'] != '') {
5924     $this->valF['archive_date_retour_contradictoire']= $row['date_retour_contradictoire'];
5925     }
5926     if ($row['date_ait'] != '') {
5927     $this->valF['archive_date_ait']= $row['date_ait'];
5928     }
5929     if ($row['date_transmission_parquet'] != '') {
5930     $this->valF['archive_date_transmission_parquet']= $row['date_transmission_parquet'];
5931     }
5932 softime 8989 //
5933 softime 8593 if ($row['dossier_instruction_type'] != '') {
5934     $this->valF['archive_dossier_instruction_type']= $row['dossier_instruction_type'];
5935     }
5936 softime 8989 if ($row['date_affichage'] != '') {
5937     $this->valF['archive_date_affichage']= $row['date_affichage'];
5938     }
5939 softime 10573 if (isset($row['pec_metier']) === true && $row['pec_metier'] != '') {
5940     $this->valF['archive_pec_metier']= $row['pec_metier'];
5941     }
5942     if (isset($row['a_qualifier']) === true && $row['a_qualifier'] != '') {
5943     $this->valF['archive_a_qualifier']= $row['a_qualifier'];
5944     }
5945 mbroquet 3730 }
5946    
5947     // {{{
5948     // Méthodes de récupération des métadonnées arrêté
5949     /**
5950     * @return string Retourne le numéro d'arrêté
5951     */
5952     function getNumArrete() {
5953     return $this->getVal("numero_arrete");
5954     }
5955     /**
5956     * @return chaîne vide
5957     */
5958     function getReglementaireArrete() {
5959     return 'true';
5960     }
5961     /**
5962     * @return boolean de notification au pétitionnaire
5963     */
5964     function getNotificationArrete() {
5965     return 'true';
5966     }
5967     /**
5968     * @return date de notification au pétitionnaire
5969     */
5970     function getDateNotificationArrete() {
5971     if (empty($this->metadonneesArrete)) {
5972     $this->getArreteMetadata();
5973     }
5974     return $this->metadonneesArrete["datenotification"];
5975     }
5976     /**
5977     * @return boolean check si le document est passé au contrôle de légalité
5978     */
5979     function getControleLegalite() {
5980     return 'true';
5981     }
5982     /**
5983     * @return date de signature de l'arrêté
5984     */
5985     function getDateSignature() {
5986     if (empty($this->metadonneesArrete)) {
5987     $this->getArreteMetadata();
5988     }
5989     return $this->metadonneesArrete["datesignaturearrete"];
5990     }
5991     /**
5992     * @return string nom du signataire
5993     */
5994     function getNomSignataire() {
5995     if (empty($this->metadonneesArrete)) {
5996     $this->getArreteMetadata();
5997     }
5998     return $this->metadonneesArrete["nomsignataire"];
5999     }
6000     /**
6001     * @return string qualité du signataire
6002     */
6003     function getQualiteSignataire() {
6004     if (empty($this->metadonneesArrete)) {
6005     $this->getArreteMetadata();
6006     }
6007     return $this->metadonneesArrete["qualitesignataire"];
6008     }
6009     /**
6010     * @return string numéro du terrain
6011     */
6012     function getAp_numRue() {
6013     if (empty($this->metadonneesArrete)) {
6014     $this->getArreteMetadata();
6015     }
6016     return $this->metadonneesArrete["ap_numrue"];
6017     }
6018     /**
6019     * @return string nom de la rue du terrain
6020     */
6021     function getAp_nomDeLaVoie() {
6022     if (empty($this->metadonneesArrete)) {
6023     $this->getArreteMetadata();
6024     }
6025     return $this->metadonneesArrete["ap_nomdelavoie"];
6026     }
6027     /**
6028     * @return string code postal du terrain
6029     */
6030     function getAp_codePostal() {
6031     if (empty($this->metadonneesArrete)) {
6032     $this->getArreteMetadata();
6033     }
6034     return $this->metadonneesArrete["ap_codepostal"];
6035     }
6036     /**
6037     * @return string ville du terrain
6038     */
6039     function getAp_ville() {
6040     if (empty($this->metadonneesArrete)) {
6041     $this->getArreteMetadata();
6042     }
6043     return $this->metadonneesArrete["ap_ville"];
6044     }
6045     /**
6046     * @return string activité
6047     */
6048     function getActivite() {
6049     return "Droit du sol";
6050     }
6051     /**
6052     * @return string date du retour de controle légalité
6053     */
6054     function getDateControleLegalite() {
6055     if (empty($this->metadonneesArrete)) {
6056     $this->getArreteMetadata();
6057     }
6058     return $this->metadonneesArrete["datecontrolelegalite"];
6059     }
6060    
6061     // Fin des méthodes de récupération des métadonnées
6062     // }}}
6063    
6064     /**
6065     * Méthode de récupération des métadonnées arrêtés dans la base de données,
6066     * les données sont stockés dans l'attribut $this->metadonneesArrete
6067     */
6068     function getArreteMetadata() {
6069    
6070 softime 14542 //Récupération de la dernière instruction dont l'événement est de type 'arrete'
6071     $this->metadonneesArrete = array("nomsignataire"=>"", "qualitesignataire"=>"",
6072     "decisionarrete"=>"", "datenotification"=>"", "datesignaturearrete"=>"",
6073     "datecontrolelegalite"=>"", "ap_numrue"=>"", "ap_nomdelavoie"=>"",
6074     "ap_codepostal"=>"", "ap_ville"=>"");
6075 mbroquet 3730
6076 softime 14542 $qres = $this->f->get_all_results_from_db_query(
6077     sprintf(
6078     'SELECT
6079     signataire_arrete.prenom || \' \' ||signataire_arrete.nom as nomsignataire,
6080     signataire_arrete.qualite as qualitesignataire,
6081     instruction.etat as decisionarrete,
6082     instruction.date_retour_rar as datenotification,
6083     instruction.date_retour_signature as datesignaturearrete,
6084     instruction.date_retour_controle_legalite as datecontrolelegalite,
6085     dossier.terrain_adresse_voie_numero as ap_numrue,
6086     dossier.terrain_adresse_voie as ap_nomdelavoie,
6087     dossier.terrain_adresse_code_postal as ap_codepostal,
6088     dossier.terrain_adresse_localite as ap_ville
6089     FROM
6090     %1$sinstruction
6091     LEFT JOIN %1$ssignataire_arrete
6092     ON instruction.signataire_arrete = signataire_arrete.signataire_arrete
6093     LEFT JOIN %1$sdossier
6094     ON instruction.dossier = dossier.dossier
6095     LEFT JOIN %1$sdonnees_techniques
6096     ON donnees_techniques.dossier_instruction = dossier.dossier
6097     WHERE
6098     instruction.instruction = %2$d',
6099     DB_PREFIXE,
6100     intval($this->getVal('instruction'))
6101     ),
6102     array(
6103     'origin' => __METHOD__
6104     )
6105     );
6106     $this->metadonneesArrete = array_shift($qres['result']);
6107 mbroquet 3730 }
6108    
6109     /**
6110     * CONDITION - has_an_edition.
6111     *
6112     * Condition pour afficher le bouton de visualisation de l'édition.
6113     *
6114     * @return boolean
6115     */
6116     function has_an_edition() {
6117     // Récupère la valeur du champ lettretype
6118     $lettretype = $this->getVal("lettretype");
6119     // Si le champ est vide
6120 softime 7521 if ($lettretype !== '' && $lettretype !== null) {
6121 mbroquet 3730 //
6122 softime 7521 return true;
6123 mbroquet 3730 }
6124    
6125     //
6126 softime 7521 return false;
6127 mbroquet 3730 }
6128    
6129     /**
6130 softime 10573 * CONDITION - is_modifiable.
6131     *
6132     * Controle si l'évenement est modifiable.
6133     *
6134     * @return boolean
6135     */
6136     function is_evenement_modifiable() {
6137     $evenement = $this->get_inst_evenement($this->getVal('evenement'));
6138     return ! $this->get_boolean_from_pgsql_value($evenement->getVal('non_modifiable'));
6139     }
6140    
6141     /**
6142 mbroquet 3730 * CONDITION - is_editable.
6143     *
6144     * Condition pour la modification.
6145     *
6146     * @return boolean
6147     */
6148     function is_editable() {
6149 softime 10573
6150     // XXX
6151     // 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é)
6152     // Si cette tâche identifiée est DONE alors la suppression/modification de cette intruction est impossible
6153    
6154 mbroquet 3730 // Contrôle si l'utilisateur possède un bypass
6155 softime 7996 $bypass = $this->f->isAccredited($this->get_absolute_class_name()."_modifier_bypass");
6156 mbroquet 3730 //
6157     if ($bypass == true) {
6158     //
6159     return true;
6160     }
6161 softime 6565
6162 mbroquet 3730 // Si l'utilisateur est un instructeur, que le dossier est cloturé et
6163     // que l'événement n'est pas identifié comme non verrouillable
6164     if ($this->f->isUserInstructeur()
6165     && $this->getStatutAutorisationDossier($this->getParameter("idxformulaire")) == "cloture"
6166     && $this->checkEvenementNonVerrouillable($this->getVal("instruction")) === false) {
6167     //
6168     return false;
6169     }
6170    
6171 softime 6565 // Si l'utilisateur est un intructeur qui correspond à la division du
6172     // dossier
6173     if ($this->is_instructeur_from_division_dossier() === true) {
6174     //
6175     return true;
6176     }
6177    
6178     // Si l'utilisateur est instructeur de la commune du dossier et que
6179     // l'instruction est créée par un instructeur de la commune
6180     if ($this->is_instructeur_from_collectivite_dossier() === true and
6181     $this->getVal('created_by_commune') === 't') {
6182     return true;
6183     }
6184    
6185 mbroquet 3730 //
6186 softime 6565 return false;
6187 mbroquet 3730 }
6188    
6189     /**
6190 softime 10573 * Vérifie si l'événement est supprimable ou pas.
6191     *
6192     * @return boolean
6193     */
6194     function is_evenement_supprimable() {
6195     // Controle si l'évenement est supprimable
6196     $evenement = $this->get_inst_evenement($this->getVal('evenement'));
6197     return ! $this->get_boolean_from_pgsql_value($evenement->getVal('non_supprimable'));
6198     }
6199    
6200     /**
6201 mbroquet 3730 * CONDITION - is_deletable.
6202     *
6203 softime 6864 * Condition pour la suppression.
6204 mbroquet 3730 *
6205     * @return boolean
6206     */
6207     function is_deletable() {
6208 softime 10573
6209     // XXX
6210     // 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é)
6211     // Si cette tâche identifiée est DONE alors la suppression/modification de cette intruction est impossible
6212    
6213 softime 6864 // Contrôle si l'utilisateur possède un bypass intégral
6214 softime 7996 $bypass = $this->f->isAccredited($this->get_absolute_class_name()."_supprimer_bypass");
6215 mbroquet 3730 //
6216     if ($bypass == true) {
6217    
6218     //
6219     return true;
6220     }
6221    
6222     // Si l'utilisateur est un intructeur qui ne correspond pas à la
6223 softime 6864 // division du dossier et si l'utilisateur n'a pas la permission bypass
6224     // de la division
6225     if ($this->is_instructeur_from_division_dossier() === false
6226 softime 7996 && $this->f->isAccredited($this->get_absolute_class_name()."_supprimer_bypass_division") === false) {
6227 mbroquet 3730
6228     //
6229     return false;
6230     }
6231 softime 5024
6232     // l'événement est-il le dernier ?
6233     $dernier_evenement = false;
6234     // instanciation dossier
6235 softime 7996 $dossier = $this->f->get_inst__om_dbform(array(
6236     "obj" => "dossier",
6237     "idx" => $this->getVal('dossier'),
6238     ));
6239 softime 5024 // récupération dernier événement
6240     $id_dernier_evenement = $dossier->get_dernier_evenement();
6241     if ($id_dernier_evenement == $this->getVal($this->clePrimaire)) {
6242     $dernier_evenement = true;
6243     }
6244 mbroquet 3730
6245 softime 5024 // Si dossier cloturé ou si pas dernier événement
6246     // ou de type retour ou si une date est renseignée
6247     // ET utilisateur non administrateur
6248     if ($this->getStatutAutorisationDossier($this->getVal('dossier')) == 'cloture'
6249     || $dernier_evenement == false
6250     || $this->is_evenement_retour($this->getVal("evenement")) == true
6251     || $this->getVal('date_envoi_signature') != ''
6252     || $this->getVal('date_retour_signature') != ''
6253     || $this->getVal('date_envoi_rar') != ''
6254     || $this->getVal('date_retour_rar') != ''
6255     || $this->getVal('date_envoi_controle_legalite') != ''
6256     || $this->getVal('date_retour_controle_legalite') != '') {
6257     // pas le droit de supprimer
6258     return false;;
6259     }
6260    
6261 mbroquet 3730 //
6262     return true;
6263     }
6264 softime 6565
6265    
6266 mbroquet 3730 /**
6267 softime 6565 * Vérifie que l'utilisateur est instructeur et qu'il est de la division du
6268     * dossier.
6269     *
6270     * @return, boolean true/false
6271     */
6272     function is_instructeur_from_collectivite_dossier() {
6273     if ($this->f->isUserInstructeur() === true and
6274     $this->f->om_utilisateur["om_collectivite"] == $this->get_dossier_instruction_om_collectivite()) {
6275     return true;
6276     }
6277     return false;
6278     }
6279    
6280     /**
6281 mbroquet 3730 * CONDITION - is_addable.
6282     *
6283     * Condition pour afficher les boutons modifier et supprimer.
6284     *
6285     * @return boolean
6286     */
6287     function is_addable() {
6288     // Contrôle si l'utilisateur possède un bypass
6289 softime 7996 $bypass = $this->f->isAccredited($this->get_absolute_class_name()."_ajouter_bypass");
6290 mbroquet 3730 //
6291     if ($bypass == true) {
6292    
6293     //
6294     return true;
6295     }
6296 softime 6565 // Si l'utilisateur est un intructeur qui correspond à la
6297     // division du dossier ou qu'il peut changer la décision
6298     if ($this->is_instructeur_from_division_dossier() === true or
6299     $this->isInstrCanChangeDecision($this->getParameter('idxformulaire')) === true) {
6300 mbroquet 3730 //
6301 softime 6565 return true;
6302 mbroquet 3730 }
6303    
6304     //
6305 softime 6565 return false;
6306 mbroquet 3730 }
6307    
6308     /**
6309     * CONDITION - is_finalizable.
6310     *
6311     * Condition pour afficher le bouton.
6312     *
6313     * @return boolean
6314     */
6315     function is_finalizable() {
6316     // Contrôle si l'utilisateur possède un bypass
6317 softime 7996 $bypass = $this->f->isAccredited($this->get_absolute_class_name()."_finaliser_bypass");
6318 mbroquet 3730 //
6319     if ($bypass == true) {
6320     //
6321     return true;
6322     }
6323 softime 6565
6324 mbroquet 3730 // Si l'utilisateur est un instructeur, que le dossier est cloturé et
6325     // que l'événement n'est pas identifié comme non verrouillable
6326     if ($this->f->isUserInstructeur()
6327     && $this->getStatutAutorisationDossier($this->getParameter("idxformulaire")) == "cloture"
6328     && $this->checkEvenementNonVerrouillable($this->getVal("instruction")) === false) {
6329     //
6330     return false;
6331     }
6332 softime 6565
6333     // Si l'utilisateur est un intructeur qui correspond à la division du
6334     // dossier
6335     if ($this->is_instructeur_from_division_dossier() === true) {
6336     //
6337     return true;
6338     }
6339 mbroquet 3730
6340 softime 6565 // Si l'utilisateur est instructeur de la commune du dossier et que
6341     // l'instruction est créée par un instructeur de la commune
6342     if ($this->is_instructeur_from_collectivite_dossier() === true and
6343     $this->getVal('created_by_commune') === 't') {
6344     return true;
6345     }
6346    
6347 mbroquet 3730 //
6348 softime 6565 return false;
6349 mbroquet 3730 }
6350    
6351     /**
6352     * CONDITION - is_finalize_without_bypass.
6353     *
6354     * Condition pour afficher le bouton sans le bypass.
6355     *
6356     * @return boolean [description]
6357     */
6358     function is_finalizable_without_bypass() {
6359     // Récupère la valeur du champ finalisé
6360     $om_final_instruction = $this->getVal('om_final_instruction');
6361    
6362     // Si le rapport n'est pas finalisé
6363     if (empty($om_final_instruction)
6364     || $om_final_instruction == 'f') {
6365     //
6366     return true;
6367     }
6368    
6369     //
6370     return false;
6371     }
6372    
6373     /**
6374     * CONDITION - is_unfinalizable.
6375     *
6376     * Condition pour afficher le bouton.
6377     *
6378     * @return boolean
6379     */
6380     function is_unfinalizable(){
6381     // Contrôle si l'utilisateur possède un bypass
6382 softime 7996 $bypass = $this->f->isAccredited($this->get_absolute_class_name()."_definaliser_bypass");
6383 mbroquet 3730 //
6384     if ($bypass == true) {
6385     //
6386     return true;
6387     }
6388 softime 6565
6389     // Si l'utilisateur est un instructeur, que le dossier est cloturé et
6390     // que l'événement n'est pas identifié comme non verrouillable
6391 mbroquet 3730 if ($this->f->isUserInstructeur()
6392 softime 6565 && $this->getStatutAutorisationDossier($this->getParameter("idxformulaire")) == "cloture"
6393     && $this->checkEvenementNonVerrouillable($this->getVal("instruction")) === false) {
6394 mbroquet 3730 //
6395     return false;
6396     }
6397    
6398 softime 6565 // Si l'utilisateur est un intructeur qui correspond à la division du
6399     // dossier
6400     if ($this->is_instructeur_from_division_dossier() === true) {
6401     //
6402     return true;
6403 mbroquet 3730 }
6404    
6405 softime 6565 // Si l'utilisateur est instructeur de la commune du dossier et que
6406     // l'instruction est créée par un instructeur de la commune
6407     if ($this->is_instructeur_from_collectivite_dossier() === true and
6408     $this->getVal('created_by_commune') === 't') {
6409     return true;
6410 mbroquet 3730 }
6411    
6412     //
6413 softime 6565 return false;
6414 mbroquet 3730 }
6415    
6416     /**
6417     * CONDITION - is_unfinalizable_without_bypass.
6418     *
6419     * Condition pour afficher le bouton sans le bypass.
6420     *
6421     * @return boolean
6422     */
6423     function is_unfinalizable_without_bypass() {
6424     // Récupère la valeur du champ finalisé
6425     $om_final_instruction = $this->getVal('om_final_instruction');
6426    
6427     // Si l'instruction est finalisée
6428     if ($om_final_instruction == 't') {
6429     //
6430     return true;
6431     }
6432    
6433     //
6434     return false;
6435     }
6436    
6437 softime 5169
6438 mbroquet 3730 /**
6439 softime 6565 * Permet de définir si un instructeur commune peut editer une instruction
6440     *
6441     * @return boolean true si il peut
6442     */
6443     function isInstrCanChangeDecision($idx) {
6444    
6445     if ($this->f->isAccredited(array("instruction", "instruction_changer_decision"), "OR") !== true or
6446     $this->f->isUserInstructeur() !== true) {
6447     return false;
6448     }
6449    
6450    
6451    
6452     // Sinon on vérifie l'éligibilité du dossier au changement de décision
6453 softime 11876 // /!\ Requête lié à celles du widget indiquant les dossiers éligible au changement
6454     // de décision :
6455     // * dossier_instruction.class.php : view_widget_dossiers_evenement_retour_finalise()
6456     // * dossier_instruction.inc.php : si le paramètre filtre_decision = true
6457     $sql = sprintf(
6458     'SELECT
6459 softime 6565 dossier.dossier
6460     FROM
6461 softime 11876 %1$sdossier
6462     JOIN %1$setat
6463     ON dossier.etat = etat.etat AND etat.statut = \'encours\'
6464     JOIN %1$slien_dossier_demandeur
6465     ON dossier.dossier = lien_dossier_demandeur.dossier AND lien_dossier_demandeur.petitionnaire_principal IS TRUE
6466     JOIN %1$sdossier_instruction_type
6467     ON dossier.dossier_instruction_type=dossier_instruction_type.dossier_instruction_type
6468     JOIN %1$sinstruction
6469     -- Recherche de la dernière instruction qui ne soit pas liée à un événement retour
6470     ON instruction.instruction = (
6471     SELECT instruction
6472     FROM %1$sinstruction
6473     JOIN %1$sevenement ON instruction.evenement=evenement.evenement
6474     AND evenement.retour IS FALSE
6475     WHERE instruction.dossier = dossier.dossier
6476     ORDER BY date_evenement DESC, instruction DESC
6477     LIMIT 1
6478     )
6479     -- On ne garde que les dossiers pour lesquels la dernière instruction est finalisée
6480     -- ou alors pour laquelle l instruction a été ajouté par la commune et est
6481     -- non signée, non notifié, etc.
6482     AND (instruction.om_final_instruction IS TRUE
6483     OR instruction.created_by_commune IS TRUE)
6484     AND instruction.date_retour_signature IS NULL
6485     AND instruction.date_envoi_rar IS NULL
6486     AND instruction.date_retour_rar IS NULL
6487     AND instruction.date_envoi_controle_legalite IS NULL
6488     AND instruction.date_retour_controle_legalite IS NULL
6489     -- On vérifie que l instruction soit un arrêté ou un changement de décision
6490     JOIN %1$sevenement
6491     ON instruction.evenement=evenement.evenement
6492     AND (evenement.type = \'arrete\'
6493     OR evenement.type = \'changement_decision\')
6494     -- Recherche les informations du pétitionnaire principal pour l affichage
6495     JOIN %1$sdemandeur
6496     ON lien_dossier_demandeur.demandeur = demandeur.demandeur
6497     -- Recherche la collectivité rattachée à l instructeur
6498     JOIN %1$sinstructeur
6499     ON dossier.instructeur=instructeur.instructeur
6500     JOIN %1$sdivision
6501     ON instructeur.division=division.division
6502     JOIN %1$sdirection
6503     ON division.direction=direction.direction
6504     JOIN %1$som_collectivite
6505     ON direction.om_collectivite=om_collectivite.om_collectivite
6506 softime 6565 WHERE
6507 softime 11876 -- Vérification que la décision a été prise par l agglo
6508     om_collectivite.niveau = \'2\'
6509     AND dossier.dossier = \'%2$s\'
6510     ',
6511     DB_PREFIXE,
6512 softime 14064 $this->f->db->escapeSimple($idx)
6513 softime 11876 );
6514 softime 6565
6515    
6516     // Si collectivité de l'utilisateur niveau mono alors filtre sur celle-ci
6517     if ($this->f->isCollectiviteMono($_SESSION['collectivite']) === true) {
6518 softime 11876 $sql .= sprintf(
6519 softime 14064 ' AND dossier.om_collectivite = %1$d',
6520     intval($_SESSION['collectivite'])
6521 softime 11876 );
6522 softime 6565 }
6523 softime 14064 $qres = $this->f->get_one_result_from_db_query(
6524     $sql,
6525     array(
6526     "origin" => __METHOD__,
6527     )
6528     );
6529    
6530     return $qres['result'] !== null;
6531 softime 6565 }
6532    
6533    
6534     /**
6535 softime 5169 * CONDITION - can_monitoring_dates.
6536     *
6537     * Condition pour afficher le bouton de suivi des dates.
6538     *
6539     * @return boolean
6540     */
6541     public function can_monitoring_dates() {
6542     // Récupère la valeur du champ finalisé
6543     $om_final_instruction = $this->getVal('om_final_instruction');
6544    
6545     // Si l'instruction n'est pas finalisée
6546     if ($om_final_instruction !== 't') {
6547     //
6548     return false;
6549     }
6550    
6551     // Contrôle si l'utilisateur possède un bypass
6552 softime 7996 $bypass = $this->f->isAccredited($this->get_absolute_class_name()."_modification_dates_bypass");
6553 softime 5169 if ($bypass === true) {
6554     return true;
6555     }
6556    
6557 softime 8989 // Permission de modifier le suivi des dates sur un dossier cloturé pour
6558     // un utilisateur lié à un instructeur
6559     $perm_moni_dates_d_closed = $this->f->isAccredited($this->get_absolute_class_name()."_modification_dates_cloture");
6560    
6561     // On vérifie en premier lieu que le DI n'est pas clôturé et que
6562     // l'utilisateur ne possède pas la permission de modifier le suivi des
6563     // dates sur un dossier clôturé
6564 softime 5169 $inst_dossier = $this->get_inst_dossier();
6565 softime 8989 if ($inst_dossier->getStatut() === 'cloture'
6566     && $perm_moni_dates_d_closed === false) {
6567 softime 5169 //
6568     return false;
6569     }
6570     // On récupère ses infos
6571     $coll_di = $inst_dossier->getVal('om_collectivite');
6572     $div_di = $this->getDivisionFromDossier();
6573     // et celles de son éventuel instructeur
6574     $instr_di = $inst_dossier->getVal('instructeur');
6575    
6576 softime 6565 // Il faut disposer d'une entrée instructeur
6577     if ($this->f->isUserInstructeur() === false) {
6578     return false;
6579     }
6580    
6581 softime 5169 // Par défaut on prétend que l'instructeur n'est pas multi
6582     $instr_di_coll_multi = false;
6583     // Si un instructeur est affecté au dossier
6584     if ($instr_di !== '' && $instr_di !== null) {
6585     // Vérifie si l'instructeur est de la collectivité de niveau 2
6586 softime 5295 $instr_di_coll = $this->get_instructeur_om_collectivite($instr_di);
6587 softime 5169 if ($this->f->isCollectiviteMono($instr_di_coll) === false) {
6588     //
6589     $instr_di_coll_multi = true;
6590     }
6591     }
6592    
6593 softime 6565 // Il faut qu'il instruise le dossier ou soit de la même division
6594     if ($this->f->om_utilisateur['instructeur'] === $instr_di
6595     || $this->f->om_utilisateur['division'] === $div_di) {
6596 softime 5169 //
6597     return true;
6598     }
6599    
6600 softime 6565 // On donne également le droit s'il est de la même collectivité que
6601     // le dossier ET si l'instruction est déléguée à la communauté
6602     if ($this->f->isCollectiviteMono($this->f->om_utilisateur['om_collectivite']) === true
6603     && $this->f->om_utilisateur['om_collectivite'] === $coll_di
6604     && $instr_di_coll_multi === true) {
6605 softime 5169 //
6606     return true;
6607     }
6608    
6609 softime 6565 // Si l'instructeur ne rentre pas dans les deux cas précédents
6610 softime 5169 return false;
6611     }
6612    
6613    
6614     /**
6615 softime 12847 * CONDITION - is_finalized.
6616     *
6617     * Condition pour vérifier si une instruction est finalisée.
6618     *
6619     * @return boolean
6620     */
6621     public function is_finalized() {
6622    
6623     return $this->getVal('om_final_instruction') === "t";
6624     }
6625    
6626     /**
6627     * CONDITION - is_not_date_retour_signature_set.
6628     *
6629     * Condition pour vérifier si une date de retour signature n'est pas définie.
6630     *
6631     * @return boolean
6632     */
6633     public function is_not_date_retour_signature_set() {
6634    
6635     return $this->getVal('date_retour_signature') == null;
6636    
6637     }
6638    
6639    
6640     /**
6641 mbroquet 3730 * TREATMENT - finalize.
6642     *
6643     * Permet de finaliser un enregistrement.
6644     *
6645     * @param array $val valeurs soumises par le formulaire
6646     *
6647     * @return boolean
6648     */
6649     function finalize($val = array()) {
6650    
6651     // Cette méthode permet d'exécuter une routine en début des méthodes
6652     // dites de TREATMENT.
6653     $this->begin_treatment(__METHOD__);
6654 softime 10808 $message = '';
6655 softime 11585 $ev = $this->get_inst_evenement($this->getVal('evenement'));
6656 mbroquet 3730
6657 softime 11585 // Controle du signataire
6658     if (! $this->controle_signataire($ev)) {
6659     $this->addToMessage(__("Le document ne peut pas être finalisé car aucun signataire n'a été sélectionné."));
6660     // Termine le traitement
6661     return $this->end_treatment(__METHOD__, false);
6662     }
6663    
6664 mbroquet 3730 // Traitement de la finalisation
6665     $ret = $this->manage_finalizing("finalize", $val);
6666    
6667     // Si le traitement retourne une erreur
6668     if ($ret !== true) {
6669    
6670     // Termine le traitement
6671 softime 5024 return $this->end_treatment(__METHOD__, false);
6672 mbroquet 3730 }
6673    
6674 softime 10808 // Envoi des notifications aux demandeurs si la notification est automatique
6675     // et que la signature n'est pas requise
6676     if ($ev->getVal('notification') === 'notification_automatique') {
6677 softime 13137 // Préparation du message de log en cas d'erreur de notification
6678 softime 13528 $msgLog = sprintf(
6679     '%s %s : %d',
6680     __('Erreur lors de la notification automatique du(des) pétitionnaire(s) suite à la finalisation de l\'instruction.'),
6681     __('Instruction notifiée'),
6682     $this->getVal($this->clePrimaire)
6683     );
6684 softime 10808 // Récupération de la catégorie et envoie des notifications au(x) demandeur(s)
6685     $collectivite_di = $this->get_dossier_instruction_om_collectivite($this->getVal('dossier'));
6686     // Récupération de la liste des demandeurs à notifier et de la catégorie
6687     $categorie = $this->f->get_param_option_notification($collectivite_di);
6688 softime 14064 $isPortal = $categorie === PORTAL;
6689 softime 10869 $demandeursANotifie = $this->get_demandeurs_notifiable(
6690     $this->getVal('dossier'),
6691     $isPortal
6692     );
6693 softime 10808
6694     // Création d'une notification et d'une tâche pour chaque demandeur à notifier
6695 softime 12124 $demandeurPrincipalNotifie = false;
6696 softime 10813 if (count($demandeursANotifie) > 0) {
6697     foreach ($demandeursANotifie as $demandeur) {
6698 softime 12124 // Identifie si le demandeur principal a été notifié ou pas
6699     // et récupère ses informations
6700     if ($demandeur['petitionnaire_principal'] == 't') {
6701     $demandeurPrincipalNotifie = true;
6702     // Si le demandeur principal est notifiable mais qu'il y a des erreurs dans
6703     // son paramétrage, on effectue pas le traitement et on passe à l'itération
6704     // suivante. On le considère également comme non notifié pour gérer l'envoie
6705     // des messages d'erreurs
6706     // Si la demande a été déposée via le portail alors le paramétrage n'a pas
6707     // d'impact sur la notification
6708     $erreursParam = $this->get_info_notification_fail();
6709     if (! $this->dossier_depose_sur_portail() && $erreursParam != array()) {
6710     $demandeurPrincipalNotifie = false;
6711     continue;
6712     }
6713     }
6714 softime 10813 // Ajout de la notif et récupération de son id
6715     $idNotif = $this->ajouter_notification(
6716     $this->getVal($this->clePrimaire),
6717     $this->f->get_connected_user_login_name(),
6718 softime 10968 $demandeur,
6719     $collectivite_di,
6720 softime 12433 array(),
6721 softime 10968 true
6722 softime 10808 );
6723 softime 10813 if ($idNotif === false) {
6724     // Termine le traitement
6725 softime 13528 $this->addToLog(
6726     sprintf('%s() : %s', __METHOD__, $msgLog),
6727     DEBUG_MODE
6728     );
6729 softime 10813 return $this->end_treatment(__METHOD__, false);
6730     }
6731     $notification_by_task = $this->notification_by_task(
6732     $idNotif,
6733     $this->getVal('dossier'),
6734     $categorie
6735 softime 10808 );
6736 softime 10813 if ($notification_by_task === false) {
6737 softime 13528 $this->addToLog(
6738     sprintf('%s() : %s', __METHOD__, $msgLog),
6739     DEBUG_MODE
6740     );
6741 softime 10813 $this->addToMessage(
6742     __("Erreur lors de la génération de la notification au(x) pétitionnaire(s).")
6743     );
6744     // Termine le traitement
6745     return $this->end_treatment(__METHOD__, false);
6746     }
6747 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.")));
6748 softime 10808 }
6749     }
6750 softime 12847 // Pour la notification par mail ou la notification via portal si le dossier a
6751     // été déposés via portal, si le demandeur principal n'est pas notifiable,
6752     // on créé une nouvelle notification en erreur avec en commentaire la raison pour
6753     // laquelle le demandeur principal n'a pas pu être notifié
6754     $depotPortal = $this->dossier_depose_sur_portail();
6755     if (! $demandeurPrincipalNotifie && ($isPortal === false || $depotPortal === true)) {
6756 softime 13137 // Préparation des logs pour indiquer que le pétitionnaire principale n'est pas notifiable
6757 softime 13528 $msgLog .= sprintf(' %s', __('Le pétitionnaire principale n\'est pas notifiable.'));
6758 softime 12124 // Analyse pour savoir pourquoi le demandeur principal n'est pas notifiable
6759     $erreursParam = $this->get_info_notification_fail();
6760     $demandeurPrincipal = $this->get_info_petitionnaire_principal_dossier($this->getVal('dossier'));
6761     // Ajout de la notif et récupération de son id
6762     $idNotif = $this->ajouter_notification(
6763     $this->valF[$this->clePrimaire],
6764     $this->f->get_connected_user_login_name(),
6765     $demandeurPrincipal,
6766     $collectivite_di,
6767 softime 12433 array(),
6768 softime 12124 true,
6769     'Echec',
6770     implode(' ', $erreursParam)
6771     );
6772     if ($idNotif === false) {
6773     $this->addToMessage(
6774     __('Erreur : la création de la notification a échouée.').
6775     __("Veuillez contacter votre administrateur.")
6776     );
6777 softime 13528 $this->addToLog(
6778     sprintf('%s() : %s', __METHOD__, $msgLog),
6779     DEBUG_MODE
6780     );
6781 softime 12124 return false;
6782     }
6783     // Prépare un message d'alerte à destination de l'instructeur pour l'informer
6784     // de l'échec de la notification
6785     $dossier_message = $this->get_inst_dossier_message(0);
6786     $dossier_message_val = array(
6787     'dossier' => $this->getVal('dossier'),
6788     'type' => _('erreur expedition'),
6789     'emetteur' => $this->f->get_connected_user_login_name(),
6790     'login' => $_SESSION['login'],
6791     'date_emission' => date('Y-m-d H:i:s'),
6792     'contenu' => _('Échec lors de la notification de l\'instruction ').
6793     $ev->getVal('libelle').
6794     '.<br>'.
6795     implode("\n", $erreursParam).
6796     '<br>'.
6797     _('Veuillez corriger ces informations avant de renvoyer la notification.')
6798     );
6799     $add = $dossier_message->add_notification_message($dossier_message_val, true);
6800     // Si une erreur se produit pendant l'ajout
6801     if ($add !== true) {
6802     $this->addToLog(__METHOD__."(): Le message d'alerte concernant l'echec de l'envoi de la notification n'a pas pu être envoyé.", DEBUG_MODE);
6803     return false;
6804     }
6805     }
6806 softime 10808 }
6807    
6808 mbroquet 3730 // Termine le traitement
6809     return $this->end_treatment(__METHOD__, true);
6810     }
6811    
6812     /**
6813 softime 12124 * Récupère l'instance de dossier message.
6814     *
6815     * @param string $dossier_message Identifiant du message.
6816     *
6817     * @return object
6818     */
6819     private function get_inst_dossier_message($dossier_message = null) {
6820     //
6821     return $this->get_inst_common("dossier_message", $dossier_message);
6822     }
6823    
6824     /**
6825 softime 11585 * Vérifie si le signataire est obligatoire pour finaliser
6826     * le document apartir du paramétrage de l'événement.
6827     * Si c'est le cas, vérifie si il y a bien un signataire
6828     * renseigné.
6829     * Si c'est le cas renvoie true, sinon renvoie false.
6830     *
6831     * @param evenement évenement de l'instruction permettant de
6832     * récupérer le paramétrage
6833     * @return boolean
6834     */
6835     protected function controle_signataire($evenement) {
6836     // Vérifie si le signataire est obligatoire et si c'est le cas
6837     // vérifie si il y a bien un signataire pour le document
6838     if ($evenement->is_signataire_obligatoire() &&
6839     ($this->getVal('signataire_arrete') === null ||
6840     $this->getVal('signataire_arrete') === '')) {
6841     return false;
6842     }
6843     return true;
6844     }
6845    
6846     /**
6847 mbroquet 3730 * TREATMENT - unfinalize.
6848     *
6849     * Permet de définaliser un enregistrement.
6850     *
6851     * @param array $val valeurs soumises par le formulaire
6852     *
6853     * @return boolean
6854     */
6855     function unfinalize($val = array()) {
6856    
6857     // Cette méthode permet d'exécuter une routine en début des méthodes
6858     // dites de TREATMENT.
6859     $this->begin_treatment(__METHOD__);
6860    
6861     // Traitement de la finalisation
6862     $ret = $this->manage_finalizing("unfinalize", $val);
6863    
6864     // Si le traitement retourne une erreur
6865     if ($ret !== true) {
6866    
6867     // Termine le traitement
6868 softime 5024 return $this->end_treatment(__METHOD__, false);
6869 mbroquet 3730 }
6870    
6871     // Termine le traitement
6872     return $this->end_treatment(__METHOD__, true);
6873     }
6874    
6875     /**
6876     * VIEW - view_edition
6877     *
6878     * Edite l'édition de l'instruction ou affiche celle contenue dans le stockage.
6879     *
6880     * @return null Si l'action est incorrecte
6881     */
6882     function view_edition() {
6883    
6884     // Si l'instruction est finalisée
6885     if($this->getVal("om_final_instruction") == 't'
6886     && $this->getVal("om_final_instruction") != null) {
6887    
6888     // Ouvre le document
6889 softime 7996 $lien = '../app/index.php?module=form&snippet=file&obj='.$this->table.'&'.
6890 mbroquet 3730 'champ=om_fichier_instruction&id='.$this->getVal($this->clePrimaire);
6891     //
6892     header("Location: ".$lien);
6893     } else {
6894    
6895     // Récupère la collectivite du dossier d'instruction
6896     $dossier_instruction_om_collectivite = $this->get_dossier_instruction_om_collectivite();
6897    
6898     //
6899     $collectivite = $this->f->getCollectivite($dossier_instruction_om_collectivite);
6900    
6901     // Paramètre du PDF
6902     $params = array(
6903     "watermark" => true,
6904     "specific" => array(
6905     "mode" => "previsualisation",
6906     ),
6907     );
6908 softime 8593 // Si la rédaction libre est activée sur l'instruction
6909     if ($this->getVal("flag_edition_integrale") == 't') {
6910     $params["specific"]["corps"] = array(
6911     "mode" => "set",
6912     "value" => $this->getVal("corps_om_htmletatex"),
6913     );
6914     $params["specific"]["titre"] = array(
6915     "mode" => "set",
6916     "value" => $this->getVal("titre_om_htmletat"),
6917     );
6918     }
6919 mbroquet 3730
6920     // Génération du PDF
6921     $result = $this->compute_pdf_output('lettretype', $this->getVal("lettretype"), $collectivite, null, $params);
6922     // Affichage du PDF
6923     $this->expose_pdf_output(
6924     $result['pdf_output'],
6925     $result['filename']
6926     );
6927     }
6928     }
6929    
6930     /**
6931     * Récupère la collectivité du dossier d'instruction.
6932     *
6933 softime 7685 * @param string $dossier_instruction_id Identifiant du DI.
6934     *
6935 mbroquet 3730 * @return integer
6936     */
6937 softime 7685 function get_dossier_instruction_om_collectivite($dossier_instruction_id = null) {
6938 mbroquet 3730
6939 softime 7685 // Si l'identifiant n'est pas renseigné
6940     if ($dossier_instruction_id === null) {
6941 softime 8593 // Récupère la valeur
6942     if ($this->getVal('dossier') !== null && $this->getVal('dossier') !== '') {
6943     $dossier_instruction_id = $this->getVal('dossier');
6944     } elseif ($this->getParameter('idxformulaire') !== null
6945     && $this->getParameter('idxformulaire') !== '') {
6946     //
6947     $dossier_instruction_id = $this->getParameter('idxformulaire');
6948     } elseif ($this->f->get_submitted_get_value('idxformulaire') !== null
6949     && $this->f->get_submitted_get_value('idxformulaire') !== '') {
6950     //
6951     $dossier_instruction_id = $this->f->get_submitted_get_value('idxformulaire');
6952     }
6953 softime 7685 }
6954    
6955 mbroquet 3730 //
6956 softime 7996 $dossier_instruction = $this->f->get_inst__om_dbform(array(
6957     "obj" => "dossier_instruction",
6958     "idx" => $dossier_instruction_id,
6959     ));
6960 mbroquet 3730
6961     //
6962     return $dossier_instruction->getVal('om_collectivite');
6963     }
6964    
6965     /**
6966     * VIEW - view_bible
6967     *
6968     * Affiche la bible manuelle.
6969     *
6970     * @return void
6971     */
6972     function view_bible() {
6973     // Vérification de l'accessibilité sur l'élément
6974     $this->checkAccessibility();
6975    
6976     /**
6977     * Affichage de la structure HTML
6978     */
6979     //
6980 softime 8989 if ($this->f->isAjaxRequest()) {
6981 mbroquet 3730 //
6982     header("Content-type: text/html; charset=".HTTPCHARSET."");
6983     } else {
6984     //
6985 softime 8989 $this->f->setFlag("htmlonly");
6986     $this->f->display();
6987 mbroquet 3730 }
6988     //
6989 softime 8989 $this->f->displayStartContent();
6990 mbroquet 3730 //
6991 softime 8989 $this->f->setTitle(_("Liste des éléments de la bible en lien avec un evenement"));
6992     $this->f->displayTitle();
6993 mbroquet 3730
6994     /**
6995     *
6996     */
6997     //
6998 softime 8989 ($this->f->get_submitted_get_value("ev") ? $evenement = $this->f->get_submitted_get_value("ev") : $evenement = "");
6999 mbroquet 3730 $evenement = intval($evenement);
7000     //
7001 softime 8989 ($this->f->get_submitted_get_value("idx") ? $idx = $this->f->get_submitted_get_value("idx") : $idx = "");
7002 softime 5169 // Récupération du code du type de DA
7003     $code_da_type = '';
7004     if (preg_match('/[A-Za-z]{2,3}/', $idx, $matches) !== false) {
7005     $code_da_type = $matches[0];
7006     }
7007 mbroquet 3730 //
7008 softime 8989 ($this->f->get_submitted_get_value("complement") ? $complement = $this->f->get_submitted_get_value("complement") : $complement = "1");
7009 mbroquet 3730
7010     // Récupération de la collectivité du dossier
7011 softime 7996 $dossier = $this->f->get_inst__om_dbform(array(
7012     "obj" => "dossier",
7013     "idx" => $idx,
7014     ));
7015 mbroquet 3730
7016 softime 14542 $qres = $this->f->get_all_results_from_db_query(
7017     sprintf(
7018     'SELECT
7019     *,
7020     bible.libelle as bible_lib
7021     FROM
7022     %1$sbible
7023     LEFT OUTER JOIN %1$sdossier_autorisation_type
7024     ON bible.dossier_autorisation_type = dossier_autorisation_type.dossier_autorisation_type
7025     LEFT JOIN %1$som_collectivite
7026     ON bible.om_collectivite = om_collectivite.om_collectivite
7027     WHERE
7028     (evenement = %2$d
7029     OR evenement IS NULL)
7030     AND (complement = %3$d
7031     OR complement IS NULL)
7032     AND (bible.dossier_autorisation_type IS NULL
7033     OR dossier_autorisation_type.code = \'%4$s\')
7034     AND (om_collectivite.niveau = \'2\'
7035     OR bible.om_collectivite = %5$d)
7036     ORDER BY
7037     bible_lib ASC',
7038     DB_PREFIXE,
7039     intval($evenement),
7040     intval($complement),
7041     $this->f->db->escapeSimple($code_da_type),
7042     intval($dossier->getVal("om_collectivite"))
7043     ),
7044     array(
7045     'origin' => __METHOD__
7046     )
7047     );
7048 mbroquet 3730 //
7049     echo "<form method=\"post\" name=\"f3\" action=\"#\">\n";
7050     //
7051 softime 15835 if ($qres['row_count'] > 0) {
7052 mbroquet 3730 //
7053     echo "\t<table id='tab-bible' width='100%'>\n";
7054     //
7055     echo "\t\t<tr class=\"ui-tabs-nav ui-accordion ui-state-default tab-title\">";
7056     echo "<th>"._("Choisir")."</th>";
7057     echo "<th>"._("Libelle")."</th>";
7058     echo "</tr>\n";
7059     //
7060     $i = 0;
7061     //
7062 softime 14542 foreach ($qres['result'] as $row) {
7063 mbroquet 3730 //
7064     echo "\t\t<tr";
7065     echo " class=\"".($i % 2 == 0 ? "odd" : "even")."\"";
7066     echo ">";
7067     //
7068     echo "<td class=\"center\"><input type=\"checkbox\" name=\"choix[]\" value=\"".$i."\" id=\"checkbox".$i."\" /></td>";
7069     // XXX utilisation de l'attribut titre pour afficher une infobulle
7070     echo "<td><span class=\"content\" title=\"".htmlentities($row['contenu'])."\" id=\"content".$i."\">".$row['bible_lib']."</span></td>";
7071     //
7072     echo "</tr>\n";
7073     //
7074     $i++;
7075     }
7076     echo "\t</table>\n";
7077     //
7078     echo "<div class=\"formControls\">\n";
7079 softime 8989 $this->f->layout->display_form_button(array(
7080 mbroquet 3730 "value" => _("Valider"),
7081     "onclick" => "bible_return('f2', 'complement".($complement == "1" ? "" : $complement)."_om_html'); return false;",
7082     ));
7083 softime 8989 $this->f->displayLinkJsCloseWindow();
7084 mbroquet 3730 echo "</div>\n";
7085    
7086     } else {
7087     //
7088     $message_class = "error";
7089     $message = _("Aucun element dans la bible pour l'evenement")." : ".$evenement;
7090 softime 8989 $this->f->displayMessage($message_class, $message);
7091 mbroquet 3730 //
7092     echo "<div class=\"formControls\">\n";
7093 softime 8989 $this->f->displayLinkJsCloseWindow();
7094 mbroquet 3730 echo "</div>\n";
7095     }
7096     //
7097     echo "</form>\n";
7098    
7099     /**
7100     * Affichage de la structure HTML
7101     */
7102     //
7103 softime 8989 $this->f->displayEndContent();
7104 mbroquet 3730 }
7105    
7106     /**
7107 softime 5169 * VIEW - view_bible_auto
7108 mbroquet 3730 *
7109 softime 5169 * Renvoie les valeurs de la bible à placer dans les compléments de l'instruction.
7110 mbroquet 3730 *
7111     * @return void
7112     */
7113     function view_bible_auto() {
7114     // Vérification de l'accessibilité sur l'élément
7115     $this->checkAccessibility();
7116     //
7117 softime 8989 $this->f->disableLog();
7118 mbroquet 3730
7119     $formatDate="AAAA-MM-JJ";
7120    
7121     // Récupération des paramètres
7122 softime 8989 $idx = $this->f->get_submitted_get_value('idx');
7123     $evenement = $this->f->get_submitted_get_value('ev');
7124 mbroquet 3730
7125     // Initialisation de la variable de retour
7126     $retour['complement_om_html'] = '';
7127     $retour['complement2_om_html'] = '';
7128     $retour['complement3_om_html'] = '';
7129     $retour['complement4_om_html'] = '';
7130 softime 14064
7131 mbroquet 3730 // Vérification d'une consultation liée à l'événement
7132 softime 14064 $instEvenement = $this->f->get_inst__om_dbform(array(
7133     "obj" => "evenement",
7134     "idx" => $evenement,
7135     ));
7136    
7137 mbroquet 3730 // Si consultation liée, récupération du retour d'avis
7138 softime 14064 if($instEvenement->getVal('consultation') == 'Oui'){
7139 softime 14542
7140     $qres = $this->f->get_all_results_from_db_query(
7141     sprintf(
7142     'SELECT
7143     date_retour,
7144     avis_consultation.libelle as avis_consultation,
7145     COALESCE(service.libelle, tiers_consulte.libelle) as service
7146     FROM
7147     %1$sconsultation
7148     LEFT JOIN %1$stiers_consulte
7149     ON consultation.tiers_consulte = tiers_consulte.tiers_consulte
7150     LEFT JOIN %1$sservice
7151     ON consultation.service = service.service
7152     LEFT JOIN %1$savis_consultation
7153     ON consultation.avis_consultation = avis_consultation.avis_consultation
7154     WHERE
7155     dossier = \'%2$s\'
7156     AND consultation.visible',
7157     DB_PREFIXE,
7158     $this->f->db->escapeSimple($idx)
7159     ),
7160     array(
7161     'origin' => __METHOD__
7162     )
7163 softime 11876 );
7164 mbroquet 3730 // Récupération des consultations
7165 softime 14542 foreach ($qres['result'] as $row) {
7166 mbroquet 3730 $correct=false;
7167     // date retour
7168     if ($row['date_retour']<>""){
7169     if ($formatDate=="AAAA-MM-JJ"){
7170     $date = explode("-", $row['date_retour']);
7171     // controle de date
7172     if (count($date) == 3 and
7173     checkdate($date[1], $date[2], $date[0])) {
7174     $date_retour_f= $date[2]."/".$date[1]."/".$date[0];
7175     $correct=true;
7176     }else{
7177     $msg= $msg."<br>La date ".$row['date_retour']." n'est pas une date.";
7178     $correct=false;
7179     }
7180     }
7181     }
7182     //
7183     $temp="Vu l'avis ".$row['avis_consultation']." du service ".$row['service'];
7184     if($correct == true){
7185     $temp=$temp." du ".$date_retour_f;
7186     }
7187     // Concaténation des retours d'avis de consultation
7188 softime 7067 $retour['complement_om_html'] .= $temp . "<br/><br/>";
7189 mbroquet 3730 } // while
7190    
7191     } // consultation
7192     // Récupération des bibles automatiques pour le champ complement_om_html
7193 softime 8989 $retour['complement_om_html'] .= $this->getBible($evenement, $idx, '1');
7194 mbroquet 3730 // Récupération des bibles automatiques pour le champ complement2_om_html
7195 softime 8989 $retour['complement2_om_html'] .= $this->getBible($evenement, $idx, '2');
7196 mbroquet 3730 // Récupération des bibles automatiques pour le champ complement3_om_html
7197 softime 8989 $retour['complement3_om_html'] .= $this->getBible($evenement, $idx, '3');
7198 mbroquet 3730 // Récupération des bibles automatiques pour le champ complement4_om_html
7199 softime 8989 $retour['complement4_om_html'] .= $this->getBible($evenement, $idx, '4');
7200 mbroquet 3730
7201    
7202    
7203     echo json_encode($retour);
7204     }
7205    
7206     /**
7207 softime 7521 * VIEW - view_pdf_temp
7208     *
7209     * @return void
7210     */
7211     function view_pdf_temp() {
7212     $this->checkAccessibility();
7213 softime 8593 // Utilisation de $_POST pour ne pas que les textes soient altérés.
7214 softime 7521 $this->f->set_submitted_value();
7215 softime 8593 $merge_fields = array();
7216     //
7217     if (array_key_exists('c1', $_POST) === true) {
7218 softime 11876 $merge_fields['[complement_instruction]'] = $_POST['c1'];
7219     $merge_fields['[complement1_instruction]'] = $_POST['c1'];
7220 softime 8593 }
7221     if (array_key_exists('c2', $_POST) === true) {
7222 softime 11876 $merge_fields['[complement2_instruction]'] = $_POST['c2'];
7223 softime 8593 }
7224     if (array_key_exists('c3', $_POST) === true) {
7225 softime 11876 $merge_fields['[complement3_instruction]'] = $_POST['c3'];
7226 softime 8593 }
7227     if (array_key_exists('c4', $_POST) === true) {
7228 softime 11876 $merge_fields['[complement4_instruction]'] = $_POST['c4'];
7229 softime 8593 }
7230 softime 7521 $params = array(
7231     "watermark" => true,
7232     "specific" => array(
7233     "merge_fields" => $merge_fields,
7234     ),
7235     );
7236 softime 8593 //
7237     if (array_key_exists('corps', $_POST) === true) {
7238     $params["specific"]["corps"] = array(
7239     "mode" => "set",
7240 softime 11876 "value" => $_POST['corps'],
7241 softime 8593 );
7242     }
7243     if (array_key_exists('titre', $_POST) === true) {
7244     $params["specific"]["titre"] = array(
7245     "mode" => "set",
7246 softime 11876 "value" => $_POST['titre'],
7247 softime 8593 );
7248     }
7249 softime 7521 $dossier_instruction_om_collectivite = $this->get_dossier_instruction_om_collectivite();
7250     $collectivite = $this->f->getCollectivite($dossier_instruction_om_collectivite);
7251     $result = $this->compute_pdf_output('lettretype', $this->getVal('lettretype'), $collectivite, null, $params);
7252     $retour = array(
7253     'base' => base64_encode($result['pdf_output']),
7254     );
7255     echo json_encode($retour);
7256     }
7257    
7258     /**
7259     * Dans le contexte de prévisualisation des éditions, génère le rendu du
7260     * PDF sans prise en compte de la valeur des compléments et le retourne en
7261     * base 64.
7262     *
7263     * @return string Rendu PDF converti en base 64.
7264     */
7265     function init_pdf_temp() {
7266     $params = array(
7267     "watermark" => true,
7268     );
7269 softime 8593 // Si la rédaction libre est activée sur l'instruction
7270     if ($this->getVal("flag_edition_integrale") == 't') {
7271     $params["specific"]["corps"] = array(
7272     "mode" => "set",
7273     "value" => $this->getVal("corps_om_htmletatex"),
7274     );
7275     $params["specific"]["titre"] = array(
7276     "mode" => "set",
7277     "value" => $this->getVal("titre_om_htmletat"),
7278     );
7279     }
7280 softime 7521 $dossier_instruction_om_collectivite = $this->get_dossier_instruction_om_collectivite();
7281     $collectivite = $this->f->getCollectivite($dossier_instruction_om_collectivite);
7282     $result = $this->compute_pdf_output('lettretype', $this->getVal('lettretype'), $collectivite, null, $params);
7283    
7284     return base64_encode($result['pdf_output']);
7285     }
7286    
7287     /**
7288 mbroquet 3730 * Récupération des éléments de bible.
7289     *
7290     * @param integer $event id de l'événement
7291     * @param string $idx id du dossier
7292     * @param integer $compnb numéro du champ complement
7293     *
7294     * @return string Chaîne de texte à insérer dans le champ complement
7295     */
7296 softime 8989 function getBible($event, $idx, $compnb) {
7297 mbroquet 3730 // Récupération de la collectivité du dossier
7298 softime 7996 $dossier = $this->f->get_inst__om_dbform(array(
7299     "obj" => "dossier",
7300     "idx" => $idx,
7301     ));
7302 softime 5169 // Récupération du code du type de DA
7303     $code_da_type = '';
7304     if (preg_match('/[A-Za-z]{2,3}/', $idx, $matches) !== false) {
7305     $code_da_type = $matches[0];
7306     }
7307 mbroquet 3730
7308 softime 14542 $qres = $this->f->get_all_results_from_db_query(
7309     sprintf(
7310     'SELECT
7311     *
7312     FROM
7313     %1$sbible
7314     LEFT OUTER JOIN %1$sdossier_autorisation_type
7315     ON bible.dossier_autorisation_type =
7316     dossier_autorisation_type.dossier_autorisation_type
7317     LEFT JOIN %1$som_collectivite
7318     ON bible.om_collectivite = om_collectivite.om_collectivite
7319     WHERE
7320     (evenement = %2$d
7321     OR evenement IS NULL)
7322     AND (complement = %3$d
7323     OR complement IS NULL)
7324     AND automatique = \'Oui\'
7325     AND (dossier_autorisation_type.code = \'%4$s\'
7326     OR bible.dossier_autorisation_type IS NULL)
7327     AND (om_collectivite.niveau = \'2\'
7328     OR bible.om_collectivite = %5$d)',
7329     DB_PREFIXE,
7330     intval($event),
7331     intval($compnb),
7332     $this->f->db->escapeSimple($code_da_type),
7333     intval($dossier->getVal("om_collectivite"))
7334     ),
7335     array(
7336     "origin" => __METHOD__
7337     )
7338     );
7339 mbroquet 3730 $temp = "";
7340 softime 14542 foreach ($qres['result'] as $row) {
7341 mbroquet 3730 // Remplacement des retours à la ligne par des br
7342     $temp .= preg_replace(
7343     '#(\\\r|\\\r\\\n|\\\n)#', '<br/>', $row['contenu']
7344     );
7345 softime 7521 // Ajout d'un saut de ligne entre chaque bible.
7346     $temp .= '<br/>';
7347 mbroquet 3730 } // fin while
7348     return $temp;
7349     }
7350    
7351     /**
7352     * VIEW - view_suivi_bordereaux.
7353     *
7354 nmeucci 4317 * Formulaire de choix du bordereau de suivi, permettant de générer les 4 bordereaux.
7355     * Si l'utilisateur est d'une collectivité de niveau 2 il a le choix de la
7356     * collectivité des dossiers affichés.
7357 mbroquet 3730 *
7358     * @return void
7359     */
7360     function view_suivi_bordereaux() {
7361     // Vérification de l'accessibilité sur l'élément
7362     $this->checkAccessibility();
7363    
7364     /**
7365     * Validation du formulaire
7366     */
7367     // Si le formulaire a été validé
7368 softime 8989 if ($this->f->get_submitted_post_value("validation") !== null) {
7369 mbroquet 3730 // Si un bordereau à été sélectionné
7370 softime 8989 if ($this->f->get_submitted_post_value("bordereau") !== null && $this->f->get_submitted_post_value("bordereau") == "" ) {
7371 mbroquet 3730 // Si aucun bordereau n'a été sélectionné
7372     $message_class = "error";
7373     $message = _("Veuillez selectionner un bordereau.");
7374     }
7375     // Sinon si les dates ne sont pas valide
7376 softime 8989 elseif (($this->f->get_submitted_post_value("date_bordereau_debut") !== null
7377     && $this->f->get_submitted_post_value("date_bordereau_debut") == "")
7378     || ($this->f->get_submitted_post_value("date_bordereau_fin") !== null
7379     && $this->f->get_submitted_post_value("date_bordereau_fin") == "")) {
7380 mbroquet 3730 // Si aucune date n'a été saisie
7381     $message_class = "error";
7382     $message = _("Veuillez saisir une date valide.");
7383     }
7384 softime 7366 // Sinon si les dates ne sont pas valides
7385 softime 8989 elseif ($this->f->get_submitted_post_value("bordereau") === "bordereau_avis_maire_prefet"
7386     && $this->f->getParameter("id_evenement_bordereau_avis_maire_prefet") == null) {
7387 softime 7366 // Si aucune date n'a été saisie
7388     $message_class = "error";
7389     $message = _("Erreur de parametrage. Contactez votre administrateur.");
7390     }
7391 mbroquet 3730 // Affiche le message de validation
7392     else {
7393     // On récupère le libellé du bordereau pour l'afficher à l'utilisateur
7394 softime 14064 $etat = $this->f->get_inst__om_dbform(array(
7395     "obj" => "om_etat",
7396     "idx" => $this->f->get_submitted_post_value("bordereau")
7397     ));
7398     $qres = $this->f->get_one_result_from_db_query(
7399     sprintf(
7400     'SELECT
7401     om_etat.libelle
7402     FROM
7403     %som_etat
7404     WHERE
7405     om_etat.id = \'%s\'',
7406     DB_PREFIXE,
7407     $this->f->db->escapeSimple($this->f->get_submitted_post_value("bordereau"))
7408     ),
7409     array(
7410     "origin" => __METHOD__,
7411     )
7412     );
7413    
7414 mbroquet 3730 //
7415     $message_class = "valid";
7416     $message = _("Cliquez sur le lien ci-dessous pour telecharger votre bordereau");
7417     $message .= " : <br/><br/>";
7418     $message .= "<a class='om-prev-icon pdf-16'";
7419     $message .= " title=\""._("Bordereau")."\"";
7420 softime 7996 $message .= "href='".OM_ROUTE_FORM."&obj=instruction";
7421 nmeucci 4317 $message .= "&action=220";
7422     $message .= "&idx=0";
7423 softime 8989 $message .= "&type_bordereau=".$this->f->get_submitted_post_value("bordereau");
7424     $message .= "&date_bordereau_debut=".$this->f->get_submitted_post_value("date_bordereau_debut");
7425     $message .= "&date_bordereau_fin=".$this->f->get_submitted_post_value("date_bordereau_fin");
7426 mbroquet 3730 // Si l'utilisateur est MULTI alors on ajoute le paramètre collectivite
7427 softime 8989 if ($this->f->get_submitted_post_value("om_collectivite") !== null) {
7428     $message .= "&collectivite=".$this->f->get_submitted_post_value("om_collectivite");
7429 mbroquet 3730 }
7430     $message .= "'"." target='_blank'>";
7431 softime 14064 $message .= $qres['result']." "._("du")." ".$this->f->get_submitted_post_value("date_bordereau_debut")
7432 softime 8989 ." "._("au")." ".$this->f->get_submitted_post_value("date_bordereau_fin");
7433 mbroquet 3730 $message .= "</a>";
7434     }
7435     }
7436    
7437     /**
7438     * Affichage des messages et du formulaire
7439     */
7440     // Affichage du message de validation ou d'erreur
7441     if (isset($message) && isset($message_class) && $message != "") {
7442 softime 8989 $this->f->displayMessage($message_class, $message);
7443 mbroquet 3730 }
7444     // Ouverture du formulaire
7445     printf("\t<form");
7446     printf(" method=\"post\"");
7447     printf(" id=\"suivi_bordereaux_form\"");
7448     printf(" action=\"\"");
7449     printf(">\n");
7450     // Paramétrage des champs du formulaire
7451     $champs = array("date_bordereau_debut", "date_bordereau_fin", "bordereau");
7452 softime 8989 // Si l'utilisateur est d'une collectivité de niveau 2 on affiche un select
7453 mbroquet 3730 // collectivité dans le formulaire
7454 softime 8989 if ($_SESSION["niveau"] == 2) {
7455 mbroquet 3730 array_push($champs, "om_collectivite");
7456     }
7457     // Création d'un nouvel objet de type formulaire
7458 softime 7996 $form = $this->f->get_inst__om_formulaire(array(
7459     "validation" => 0,
7460     "maj" => 0,
7461     "champs" => $champs,
7462     ));
7463 mbroquet 3730 // Paramétrage du champ date_bordereau_debut
7464     $form->setLib("date_bordereau_debut", _("date_bordereau_debut"));
7465     $form->setType("date_bordereau_debut", "date");
7466     $form->setTaille("date_bordereau_debut", 12);
7467     $form->setMax("date_bordereau_debut", 12);
7468     $form->setRequired("date_bordereau_debut");
7469     $form->setOnchange("date_bordereau_debut", "fdate(this)");
7470     $form->setVal("date_bordereau_debut", date("d/m/Y"));
7471     // Paramétrage du champ date_bordereau_fin
7472     $form->setLib("date_bordereau_fin", _("date_bordereau_fin"));
7473     $form->setType("date_bordereau_fin", "date");
7474     $form->setTaille("date_bordereau_fin", 12);
7475     $form->setMax("date_bordereau_fin", 12);
7476     $form->setRequired("date_bordereau_fin");
7477     $form->setOnchange("date_bordereau_fin", "fdate(this)");
7478     $form->setVal("date_bordereau_fin", date("d/m/Y"));
7479     // Paramétrage du champ bordereau
7480     $form->setLib("bordereau", _("bordereau"));
7481     $form->setType("bordereau", "select");
7482     $form->setRequired("bordereau");
7483     // Valeurs des champs
7484 softime 8989 if ($this->f->get_submitted_post_value("validation") !== null) {
7485     $form->setVal("date_bordereau_debut", $this->f->get_submitted_post_value("date_bordereau_debut"));
7486     $form->setVal("date_bordereau_fin", $this->f->get_submitted_post_value("date_bordereau_fin"));
7487     $form->setVal("bordereau", $this->f->get_submitted_post_value("bordereau"));
7488     $form->setVal("om_collectivite", $this->f->get_submitted_post_value("om_collectivite"));
7489 mbroquet 3730 }
7490     // Données du select - On récupère ici la liste de tous les états disponibles
7491     // dans la table om_etat qui ont un id qui commence par la cahine de caractères
7492     // 'bordereau_'
7493 softime 14542 $qres = $this->f->get_all_results_from_db_query(
7494     sprintf(
7495     'SELECT
7496     om_etat.id,
7497     om_etat.libelle
7498     FROM
7499     %1$som_etat
7500     WHERE
7501     om_etat.id LIKE \'bordereau_%%\'
7502     ORDER BY
7503     om_etat.id',
7504     DB_PREFIXE
7505     ),
7506     array(
7507     "origin" => __METHOD__
7508     )
7509     );
7510 mbroquet 3730 // Données du select
7511     $contenu = array(
7512     0 => array("", ),
7513     1 => array(_("choisir bordereau")),
7514     );
7515 softime 14542 foreach ($qres['result'] as $row) {
7516 mbroquet 3730 $contenu[0][] = $row['id'];
7517     $contenu[1][] = $row['libelle'];
7518     }
7519     $form->setSelect("bordereau", $contenu);
7520 softime 8989 //
7521     if ($_SESSION["niveau"] == 2) {
7522     $form->setLib("om_collectivite", _("collectivite"));
7523     $form->setType("om_collectivite", "select");
7524 mbroquet 3730
7525 softime 8989 // Données du select - On récupère ici la liste de tous toutes les collectivités
7526     // de niveau 1
7527 softime 14542 $qres = $this->f->get_all_results_from_db_query(
7528     sprintf(
7529     'SELECT
7530     om_collectivite,
7531     libelle
7532     FROM
7533     %1$som_collectivite
7534     WHERE
7535     niveau = \'1\'
7536     ORDER BY
7537     libelle',
7538     DB_PREFIXE
7539     ),
7540     array(
7541     "origin" => __METHOD__
7542     )
7543     );
7544 softime 8989 // La valeur par défaut du select est Toutes
7545     $list_collectivites = array(
7546     0 => array("", ),
7547     1 => array(_("toutes"))
7548     );
7549 mbroquet 3730
7550 softime 8989 $id_colls = "";
7551     // On stocke dans $id_colls l'id de toutes les collectivités de niveau 1 séparées
7552     // par des virgules, pour un traitement plus facile dans la requête de sous-état
7553 softime 14542 foreach ($qres['result'] as $row) {
7554 softime 8989 if ($id_colls != "") {
7555     $id_colls .= ",";
7556     }
7557     $id_colls .= $row['om_collectivite'];
7558     $list_collectivites[0][] = $row['om_collectivite'];
7559     $list_collectivites[1][] = $row['libelle'];
7560 mbroquet 3730 }
7561 softime 8989 // On affecte la liste d'identifiants à l'option Toutes
7562     $list_collectivites[0][0] = $id_colls ;
7563     $form->setSelect("om_collectivite", $list_collectivites);
7564 mbroquet 3730 }
7565     // Affichage du formulaire
7566     $form->entete();
7567     $form->afficher($champs, 0, false, false);
7568     $form->enpied();
7569     // Affichage du bouton
7570     printf("\t<div class=\"formControls\">\n");
7571 softime 8989 $this->f->layout->display_form_button(array("value" => _("Valider"), "name" => "validation"));
7572 mbroquet 3730 printf("\t</div>\n");
7573     // Fermeture du formulaire
7574     printf("\t</form>\n");
7575     }
7576    
7577 nmeucci 4317
7578     /**
7579     * VIEW - view_generate_suivi_bordereaux.
7580     *
7581     * Génère et affiche les bordereaux de suivi.
7582     *
7583     * @return [void]
7584     */
7585     function view_generate_suivi_bordereaux() {
7586     // Vérification de l'accessibilité sur l'élément
7587     $this->checkAccessibility();
7588     // Récupération du type de bordereau
7589     $bordereau = $this->f->get_submitted_get_value('type_bordereau');
7590     // Génération du PDF
7591     $result = $this->compute_pdf_output('etat', $bordereau, null, $this->getVal($this->clePrimaire));
7592     // Affichage du PDF
7593     $this->expose_pdf_output(
7594     $result['pdf_output'],
7595     $result['filename']
7596     );
7597     }
7598    
7599    
7600 mbroquet 3730 /**
7601     * VIEW - view_suivi_envoi_lettre_rar.
7602     *
7603 softime 8989 * Vue pour imprimer les AR.
7604 mbroquet 3730 *
7605     * @return void
7606     */
7607     function view_suivi_envoi_lettre_rar() {
7608     // Vérification de l'accessibilité sur l'élément
7609     $this->checkAccessibility();
7610    
7611     //
7612 softime 8989 if ($this->f->get_submitted_post_value("date") !== null) {
7613     $date = $this->f->get_submitted_post_value("date");
7614 mbroquet 3730 } else {
7615     $date = "";
7616     }
7617     //
7618 softime 8989 if ($this->f->get_submitted_post_value("liste_code_barres_instruction") !== null) {
7619     $liste_code_barres_instruction = $this->f->get_submitted_post_value("liste_code_barres_instruction");
7620 mbroquet 3730 } else {
7621     $liste_code_barres_instruction = "";
7622     }
7623    
7624     // Compteur du nombre de page générées
7625     $nbLettres = 0;
7626     // Liste d'id des instructions
7627     $id4Gen = array();
7628     //
7629     $error = "";
7630    
7631 softime 5504 // Initialisation du tableau qui va contenir les DI pour lister les liens
7632     $dossierTab = array();
7633     // On vérifie que l'utilisateur ait les droits pour afficher des consultations
7634     $isAccredited = $this->f->isAccredited(array("dossier_instruction","dossier_instruction_consulter"), "OR");
7635     $hasHidden = true;
7636     // S'il ne peut pas les consulter il aura des dossiers caché
7637     if ($isAccredited === true) {
7638     $hasHidden = false;
7639     }
7640    
7641 mbroquet 3730 /**
7642     * Validation du formulaire
7643     */
7644     // Si le formulaire a été validé
7645 softime 8989 if ($this->f->get_submitted_post_value('validation') !== null) {
7646 mbroquet 3730 //
7647     if (empty($date) || empty($liste_code_barres_instruction)) {
7648     //
7649     $message_class = "error";
7650     $message = _("Tous les champs doivent etre remplis.");
7651     } else {
7652     // Création d'un tableau d'instruction
7653 softime 8989 $liste = explode("\r\n", $this->f->get_submitted_post_value("liste_code_barres_instruction"));
7654 mbroquet 3730 //
7655     foreach ($liste as $code_barres) {
7656     // On enlève les éventuels espaces saisis
7657     $code_barres = trim($code_barres);
7658     // Vérification de l'existence de l'instruction
7659     if ($code_barres != "") {
7660     // Si la valeur transmise est numérique
7661     if (is_numeric($code_barres)) {
7662     //
7663 softime 6565 $sql = "SELECT count(*)
7664     FROM ".DB_PREFIXE."instruction
7665     INNER JOIN ".DB_PREFIXE."dossier
7666     ON dossier.dossier=instruction.dossier
7667     INNER JOIN ".DB_PREFIXE."dossier_instruction_type
7668     ON dossier.dossier_instruction_type = dossier_instruction_type.dossier_instruction_type
7669     INNER JOIN ".DB_PREFIXE."dossier_autorisation_type_detaille
7670     ON dossier_instruction_type.dossier_autorisation_type_detaille = dossier_autorisation_type_detaille.dossier_autorisation_type_detaille
7671     INNER JOIN ".DB_PREFIXE."dossier_autorisation_type
7672     ON dossier_autorisation_type_detaille.dossier_autorisation_type = dossier_autorisation_type.dossier_autorisation_type
7673     INNER JOIN ".DB_PREFIXE."groupe
7674     ON dossier_autorisation_type.groupe = groupe.groupe
7675     WHERE code_barres='".$this->f->db->escapesimple($code_barres)."'";
7676 softime 7067
7677     // Ajout d'un filtre sur les groupes auxquels l'utilisateur a accès
7678     $group_clause = array();
7679     foreach ($_SESSION["groupe"] as $key => $value) {
7680     $group_clause[$key] = "(groupe.code = '".$key."'";
7681     if($value["confidentiel"] !== true) {
7682     $group_clause[$key] .= " AND dossier_autorisation_type.confidentiel IS NOT TRUE";
7683     }
7684     $group_clause[$key] .= ")";
7685     }
7686     $conditions = implode(" OR ", $group_clause);
7687     $sql .= " AND (" . $conditions . ")";
7688    
7689 softime 14064 $qres = $this->f->get_one_result_from_db_query(
7690     $sql,
7691     array(
7692     "origin" => __METHOD__,
7693     )
7694     );
7695    
7696     if ($qres['result'] == "1") {
7697 mbroquet 3730 // Récupération de la date d'envoi de l'instruction bippé
7698 softime 14542 $qres = $this->f->get_all_results_from_db_query(
7699     sprintf(
7700     'SELECT
7701     to_char(date_envoi_rar, \'DD/MM/YYYY\') as date_envoi_rar,
7702     instruction
7703     FROM
7704     %1$sinstruction
7705     WHERE
7706     code_barres = \'%2$s\'',
7707     DB_PREFIXE,
7708     $this->f->db->escapeSimple($code_barres)
7709     ),
7710     array(
7711     'origin' => __METHOD__
7712     )
7713     );
7714     $row = array_shift($qres['result']);
7715 mbroquet 3730 // Si pas de date ou correspond à la date du formulaire on
7716     // effectue le traitement
7717     if ($row["date_envoi_rar"] == "" || $row["date_envoi_rar"] == $date) {
7718 softime 7996 $instr = $this->f->get_inst__om_dbform(array(
7719     "obj" => "instruction",
7720     "idx" => $row['instruction'],
7721     ));
7722 mbroquet 3730 $valF = array();
7723     foreach($instr->champs as $id => $champ) {
7724     $valF[$champ] = $instr->val[$id];
7725     }
7726 softime 5504
7727     # Si on peut consulter les dossiers et que le dossier n'existe pas déjà dans la liste
7728     if ($isAccredited === true
7729     && array_key_exists($instr->getVal("dossier"), $dossierTab) === false) {
7730 softime 7996 $dossier = $this->f->get_inst__om_dbform(array(
7731     "obj" => "dossier",
7732     "idx" => $instr->getVal("dossier"),
7733     ));
7734 softime 5504 if ($dossier->is_user_from_allowed_collectivite()){
7735     $dossierTab[$instr->getVal("dossier")] = $dossier;
7736     } else {
7737     $hasHidden = true;
7738     }
7739     }
7740    
7741 mbroquet 3730 $valF['date_evenement']=
7742     $instr->dateDBToForm($valF['date_evenement']);
7743     $valF['archive_date_complet']=
7744     $instr->dateDBToForm($valF['archive_date_complet']);
7745     $valF['archive_date_rejet']=
7746     $instr->dateDBToForm($valF['archive_date_rejet']);
7747     $valF['archive_date_limite']=
7748     $instr->dateDBToForm($valF['archive_date_limite']);
7749     $valF['archive_date_notification_delai']=
7750     $instr->dateDBToForm($valF['archive_date_notification_delai']);
7751     $valF['archive_date_decision']=
7752     $instr->dateDBToForm($valF['archive_date_decision']);
7753     $valF['archive_date_validite']=
7754     $instr->dateDBToForm($valF['archive_date_validite']);
7755     $valF['archive_date_achevement']=
7756     $instr->dateDBToForm($valF['archive_date_achevement']);
7757     $valF['archive_date_chantier']=
7758     $instr->dateDBToForm($valF['archive_date_chantier']);
7759     $valF['archive_date_conformite']=
7760     $instr->dateDBToForm($valF['archive_date_conformite']);
7761     $valF['archive_date_dernier_depot']=
7762     $instr->dateDBToForm($valF['archive_date_dernier_depot']);
7763     $valF['archive_date_limite_incompletude']=
7764     $instr->dateDBToForm($valF['archive_date_limite_incompletude']);
7765     $valF['date_finalisation_courrier']=
7766     $instr->dateDBToForm($valF['date_finalisation_courrier']);
7767     $valF['date_envoi_signature']=
7768     $instr->dateDBToForm($valF['date_envoi_signature']);
7769     $valF['date_retour_signature']=
7770     $instr->dateDBToForm($valF['date_retour_signature']);
7771     $valF['date_envoi_rar']=
7772     $instr->dateDBToForm($valF['date_envoi_rar']);
7773     $valF['date_retour_rar']=
7774     $instr->dateDBToForm($valF['date_retour_rar']);
7775     $valF['date_envoi_controle_legalite']=
7776     $instr->dateDBToForm($valF['date_envoi_controle_legalite']);
7777     $valF['date_retour_controle_legalite']=
7778     $instr->dateDBToForm($valF['date_retour_controle_legalite']);
7779     $valF['date_envoi_rar'] = $date;
7780    
7781     // Vérification de la finalisation du document
7782     // correspondant au code barres
7783     if($instr->getVal("om_final_instruction") === 't') {
7784     $instr->setParameter('maj', 1);
7785 nmeucci 3971 $instr->class_actions[1]["identifier"] =
7786     "envoi lettre RAR (depuis le menu suivi des pièces)";
7787 softime 8989 if ($instr->modifier($valF) == true) {
7788 mbroquet 3730 $id4Gen[] = $code_barres;
7789     $nbLettres ++;
7790     } else {
7791     //
7792     if ($error != "") {
7793     $error .= "<br/>";
7794     }
7795     $error .= sprintf(_("Une erreur s'est produite lors de la modification de l'instruction %s."),
7796     $code_barres);
7797     $error .= " ";
7798     $error .= _("Veuillez contacter votre administrateur.");
7799     }
7800     } else {
7801     //
7802     if ($error != "") {
7803     $error .= "<br/>";
7804     }
7805     $error .= sprintf(_("Le document correspondant au
7806     code barres %s n'est pas finalise,
7807     le bordereau ne sera pas genere."),
7808     $code_barres);
7809     }
7810    
7811     } else {
7812     //
7813     if ($error != "") {
7814     $error .= "<br/>";
7815     }
7816     $error .= _("Une lettre correspondante a l'instruction ayant pour code barres")." ".$code_barres." "._("a deja ete envoyee, le bordereau ne sera pas genere.");
7817     }
7818     } else {
7819     //
7820     if ($error != "") {
7821     $error .= "<br/>";
7822     }
7823     $error .= _("Le numero")." ".$code_barres." "._("ne correspond a aucun code barres d'instruction.");
7824     }
7825     } else {
7826     //
7827     if ($error != "") {
7828     $error .= "<br/>";
7829     }
7830     $error .= _("Le code barres d'instruction")." ".$code_barres." "._("n'est pas valide.");
7831     }
7832     }
7833     }
7834     }
7835     }
7836    
7837     /**
7838     * Affichage des messages et du formulaire
7839     */
7840     // Affichage du message de validation ou d'erreur
7841     if (isset($message) && isset($message_class) && $message != "") {
7842 softime 8989 $this->f->displayMessage($message_class, $message);
7843 mbroquet 3730 }
7844     // Affichage du message d'erreur
7845     if(!empty($error)) {
7846 softime 8989 $this->f->displayMessage("error", $error);
7847 mbroquet 3730 }
7848     // Affichage du message de validation de la saisie
7849     if ($nbLettres > 0) {
7850     //
7851 softime 5504 echo "\n<div class=\"message ui-widget ui-corner-all ui-state-highlight ui-state-valid\" >";
7852     echo "\n<p>";
7853     echo "\n<span class=\"ui-icon ui-icon-info\"></span>";
7854     echo "\n<span class=\"text\">";
7855     echo _("Cliquez sur le lien ci-dessous pour telecharger votre document");
7856     echo " : \n<br/><br/>";
7857     echo "\n<a class='om-prev-icon pdf-16'";
7858 softime 8989 echo "\n title=\""._("imprimer les AR")."\"";
7859 softime 7996 echo "\n href=\"".OM_ROUTE_FORM."&obj=instruction&action=180&idx=0&liste=".implode(",",$id4Gen)."\"";
7860 softime 5504 echo "\n target='_blank'>";
7861 softime 8989 echo _("Telecharger le document pour")." ".$nbLettres." "._("AR");
7862 softime 5504 echo "\n</a>";
7863     echo "\n</span>";
7864     echo "\n</p>";
7865     echo "\n<br/>\n";
7866     if ($isAccredited === true) {
7867     echo '<fieldset id="fieldset-form-rar-lien_di" class="cadre ui-corner-all startClosed" style="background-color: inherite;">';
7868     echo "\n<legend class=\"ui-corner-all ui-widget-content ui-state-active\" style=\"background-color: transparent; color: inherit;\">\n";
7869     echo _('Dossiers concernés par ce traitement');
7870     echo "\n</legend>";
7871     echo "\n<div class=\"fieldsetContent\" style=\"display: none;background-color: inherite\">";
7872    
7873     if ($hasHidden === true) {
7874     echo "\n<br/>";
7875     echo "\n<p>";
7876     echo "\n<span class='text'>";
7877     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.");
7878     echo "</span>";
7879     echo "\n</p>";
7880     echo "\n<br/>";
7881     }
7882     foreach ($dossierTab as $dossier) {
7883 softime 7067
7884     $inst_da = $this->get_inst_common("dossier_autorisation", $dossier->getVal('dossier_autorisation'));
7885     $inst_datd = $this->get_inst_common("dossier_autorisation_type_detaille", $inst_da->getVal('dossier_autorisation_type_detaille'));
7886     $code_datd = $inst_datd->getVal('code');
7887    
7888     $obj = "dossier_instruction";
7889     if ($code_datd === 'REC' OR $code_datd === 'REG') {
7890     $obj = "dossier_contentieux_tous_recours";
7891     }
7892     if ($code_datd === 'IN') {
7893     $obj = "dossier_contentieux_toutes_infractions";
7894     }
7895    
7896 softime 5504 echo "\n<div class=\"bloc group\">";
7897     echo "\n<div class=\"field field-type-text\">";
7898    
7899     echo "\n<p>";
7900     echo "\n<span class='text'>";
7901     echo "\n<a class=\"om-icon om-icon-16 consult-16\" title=\"" . _('Consulter') . "\"";
7902 softime 7996 echo "\n href=\"".OM_ROUTE_FORM."&obj=dossier_instruction&action=3&idx=";
7903 softime 5504 echo $dossier->getVal("dossier");
7904     echo "\">";
7905     echo "\n</a>";
7906    
7907     echo "\n<a title=\""._("Consulter")."\" style=\"vertical-align:middle;\"";
7908 softime 7996 echo " href=\"".OM_ROUTE_FORM."&obj=";
7909 softime 7067 echo $obj;
7910     echo "&action=3&idx=";
7911 softime 5504 echo $dossier->getVal("dossier");
7912     echo "\">";
7913     echo $dossier->getVal("dossier_libelle");
7914     echo "\n</a>";
7915     echo "\n</span>";
7916     echo "\n</p>";
7917    
7918     echo "\n</div>";
7919     echo "\n</div>";
7920     }
7921     echo "\n</div>";
7922     echo "\n</fieldset>";
7923     }
7924     echo "\n</div>";
7925     echo "\n</div>";
7926 mbroquet 3730 }
7927     // Ouverture du formulaire
7928     echo "\t<form";
7929     echo " method=\"post\"";
7930     echo " id=\"suivi_envoi_lettre_rar_form\"";
7931     echo " action=\"\"";
7932     echo ">\n";
7933     // Paramétrage des champs du formulaire
7934     $champs = array("date", "liste_code_barres_instruction");
7935     // Création d'un nouvel objet de type formulaire
7936 softime 7996 $form = $this->f->get_inst__om_formulaire(array(
7937     "validation" => 0,
7938     "maj" => 0,
7939     "champs" => $champs,
7940     ));
7941 mbroquet 3730 // Paramétrage du champ date du formulaire
7942     $form->setLib("date", _("Date")."* :");
7943     $form->setType("date", "date");
7944     $form->setOnchange("date", "fdate(this)");
7945     $form->setVal("date", ($date == "" ? date("d/m/Y") : $date));
7946     $form->setTaille("date", 10);
7947     $form->setMax("date", 10);
7948     // Paramétrage du champ liste_code_barres_instruction du formulaire
7949     $form->setLib("liste_code_barres_instruction", _("Liste des codes barres d'instructions scannes")."* :");
7950     $form->setType("liste_code_barres_instruction", "textarea");
7951     $form->setVal("liste_code_barres_instruction", $liste_code_barres_instruction);
7952     $form->setTaille("liste_code_barres_instruction", 20);
7953     $form->setMax("liste_code_barres_instruction", 20);
7954     // Affichage du formulaire
7955     $form->entete();
7956     $form->afficher($champs, 0, false, false);
7957     $form->enpied();
7958     // Affichage du bouton
7959     echo "\t<div class=\"formControls\">\n";
7960 softime 8989 $this->f->layout->display_form_button(array("value" => _("Valider"), "name" => "validation"));
7961 mbroquet 3730 echo "\t</div>\n";
7962     // Fermeture du formulaire
7963     echo "\t</form>\n";
7964     }
7965    
7966     /**
7967     * VIEW - view_suivi_mise_a_jour_des_dates.
7968     *
7969     * Vu pour mettre à jour les dates de suivi de l'instruction.
7970     *
7971     * @return void
7972     */
7973     function view_suivi_mise_a_jour_des_dates() {
7974     // Vérification de l'accessibilité sur l'élément
7975     $this->checkAccessibility();
7976    
7977     // Récupération des valeur passées en POST ou GET
7978 softime 8989 if($this->f->get_submitted_post_value("type_mise_a_jour") !== null) {
7979     $type_mise_a_jour = $this->f->get_submitted_post_value("type_mise_a_jour");
7980     } elseif($this->f->get_submitted_get_value('type_mise_a_jour') !== null) {
7981     $type_mise_a_jour = $this->f->get_submitted_get_value('type_mise_a_jour');
7982 mbroquet 3730 } else {
7983     $type_mise_a_jour = "";
7984     }
7985 softime 8989 if($this->f->get_submitted_post_value('date') !== null) {
7986     $date = $this->f->get_submitted_post_value('date');
7987     } elseif($this->f->get_submitted_get_value('date') !== null) {
7988     $date = $this->f->get_submitted_get_value('date');
7989 mbroquet 3730 } else {
7990     $date = "";
7991     }
7992 softime 8989 if($this->f->get_submitted_post_value('code_barres') !== null) {
7993     $code_barres = $this->f->get_submitted_post_value('code_barres');
7994     } elseif($this->f->get_submitted_get_value('code_barres') !== null) {
7995     $code_barres = $this->f->get_submitted_get_value('code_barres');
7996 mbroquet 3730 } else {
7997     $code_barres = "";
7998     }
7999     // Booléen permettant de définir si un enregistrement à eu lieu
8000     $correct = false;
8001     // Booléen permettant de définir si les dates peuvent êtres enregistrées
8002     $date_error = false;
8003     // Champs date à mettre à jour
8004     $liste_champs=array();
8005    
8006     // Si le formulaire a été validé
8007 softime 8989 if ($this->f->get_submitted_post_value('validation') !== null) {
8008 mbroquet 3730 if(!empty($type_mise_a_jour) and !empty($date) and !empty($code_barres)) {
8009    
8010 softime 7067 // Ajout d'un filtre sur les groupes auxquels l'utilisateur a accès
8011     $group_clause = array();
8012     foreach ($_SESSION["groupe"] as $key => $value) {
8013     $group_clause[$key] = "(groupe.code = '".$key."'";
8014     if($value["confidentiel"] !== true) {
8015     $group_clause[$key] .= " AND dossier_autorisation_type.confidentiel IS NOT TRUE";
8016     }
8017     $group_clause[$key] .= ")";
8018     }
8019     $conditions = implode(" OR ", $group_clause);
8020 softime 14542 $groupFilter = " AND (" . $conditions . ")";
8021 softime 7067
8022 softime 14542 $qres = $this->f->get_all_results_from_db_query(
8023     sprintf(
8024     'SELECT
8025     instruction
8026     FROM
8027     %1$sinstruction
8028     INNER JOIN %1$sdossier
8029     ON dossier.dossier = instruction.dossier
8030     INNER JOIN %1$sdossier_instruction_type
8031     ON dossier.dossier_instruction_type = dossier_instruction_type.dossier_instruction_type
8032     INNER JOIN %1$sdossier_autorisation_type_detaille
8033     ON dossier_instruction_type.dossier_autorisation_type_detaille = dossier_autorisation_type_detaille.dossier_autorisation_type_detaille
8034     INNER JOIN %1$sdossier_autorisation_type
8035     ON dossier_autorisation_type_detaille.dossier_autorisation_type = dossier_autorisation_type.dossier_autorisation_type
8036     INNER JOIN %1$sgroupe
8037     ON dossier_autorisation_type.groupe = groupe.groupe
8038     WHERE
8039     code_barres = \'%2$s\'
8040     %3$s',
8041     DB_PREFIXE,
8042     $this->f->db->escapeSimple($code_barres),
8043     $groupFilter
8044     ),
8045     array(
8046     'origin' => __METHOD__
8047     )
8048     );
8049 softime 15835 if($qres['row_count'] === 1) {
8050 mbroquet 3730 $liste_champs = explode(";", $type_mise_a_jour);
8051 softime 14542 $row = array_shift($qres['result']);
8052 softime 11418 $instr = $this->f->get_inst__om_dbform(array(
8053     "obj" => "instruction",
8054     "idx" => $row['instruction'],
8055     ));
8056 mbroquet 3730 // Mise à jour des dates après l'écran de verification
8057 softime 8989 if($this->f->get_submitted_post_value('is_valid') !== null and $this->f->get_submitted_post_value('is_valid') == "true") {
8058 mbroquet 3730 $valF = array();
8059     foreach($instr->champs as $id => $champ) {
8060     $valF[$champ] = $instr->val[$id];
8061     }
8062 softime 6565 $valF['date_evenement'] = $instr->dateDBToForm($valF['date_evenement']);
8063     $valF['archive_date_complet'] = $instr->dateDBToForm($valF['archive_date_complet']);
8064     $valF['archive_date_rejet'] = $instr->dateDBToForm($valF['archive_date_rejet']);
8065     $valF['archive_date_limite'] = $instr->dateDBToForm($valF['archive_date_limite']);
8066     $valF['archive_date_notification_delai'] = $instr->dateDBToForm($valF['archive_date_notification_delai']);
8067     $valF['archive_date_decision'] = $instr->dateDBToForm($valF['archive_date_decision']);
8068     $valF['archive_date_validite'] = $instr->dateDBToForm($valF['archive_date_validite']);
8069     $valF['archive_date_achevement'] = $instr->dateDBToForm($valF['archive_date_achevement']);
8070     $valF['archive_date_chantier'] = $instr->dateDBToForm($valF['archive_date_chantier']);
8071     $valF['archive_date_conformite'] = $instr->dateDBToForm($valF['archive_date_conformite']);
8072     $valF['archive_date_dernier_depot'] = $instr->dateDBToForm($valF['archive_date_dernier_depot']);
8073     $valF['archive_date_limite_incompletude'] = $instr->dateDBToForm($valF['archive_date_limite_incompletude']);
8074     $valF['date_finalisation_courrier'] = $instr->dateDBToForm($valF['date_finalisation_courrier']);
8075     $valF['date_envoi_signature'] = $instr->dateDBToForm($valF['date_envoi_signature']);
8076     $valF['date_retour_signature'] = $instr->dateDBToForm($valF['date_retour_signature']);
8077     $valF['date_envoi_rar'] = $instr->dateDBToForm($valF['date_envoi_rar']);
8078     $valF['date_retour_rar'] = $instr->dateDBToForm($valF['date_retour_rar']);
8079     $valF['date_envoi_controle_legalite'] = $instr->dateDBToForm($valF['date_envoi_controle_legalite']);
8080     $valF['date_retour_controle_legalite'] = $instr->dateDBToForm($valF['date_retour_controle_legalite']);
8081     $valF['archive_date_cloture_instruction'] = $instr->dateDBToForm($valF['archive_date_cloture_instruction']);
8082     $valF['archive_date_premiere_visite'] = $instr->dateDBToForm($valF['archive_date_premiere_visite']);
8083     $valF['archive_date_derniere_visite'] = $instr->dateDBToForm($valF['archive_date_derniere_visite']);
8084     $valF['archive_date_contradictoire'] = $instr->dateDBToForm($valF['archive_date_contradictoire']);
8085     $valF['archive_date_retour_contradictoire'] = $instr->dateDBToForm($valF['archive_date_retour_contradictoire']);
8086     $valF['archive_date_ait'] = $instr->dateDBToForm($valF['archive_date_ait']);
8087     $valF['archive_date_transmission_parquet'] = $instr->dateDBToForm($valF['archive_date_transmission_parquet']);
8088 mbroquet 3730
8089     foreach(explode(";", $type_mise_a_jour) as $maj_date) {
8090     $valF[$maj_date]=$date;
8091     }
8092    
8093     // Vérification de la finalisation du document
8094     // correspondant au code barres
8095     if($valF["om_final_instruction"] === 't' or
8096     $valF["lettretype"] == '') {
8097     $code_barres = "";
8098    
8099     //Désactivation de l'autocommit
8100 softime 8989 $this->f->db->autoCommit(false);
8101 mbroquet 3730
8102     //On modifie les valeurs de l'instruction
8103     $instr->setParameter('maj', 170);
8104 nmeucci 3965 $instr->class_actions[170]["identifier"] =
8105 nmeucci 3972 "mise à jour des dates (depuis le menu suivi des pièces)";
8106 softime 8989 $retour = $instr->modifier($valF);
8107 mbroquet 3730
8108     //Si une erreur s'est produite, on défait les modifications
8109     //qui ont été faites
8110     if (!$retour){
8111     $instr->undoValidation();
8112     }
8113     //Sinon, on valide en base de données les modifications
8114     else {
8115 softime 8989 $this->f->db->commit();
8116 mbroquet 3730 }
8117    
8118     // Variable correct retourné depuis la classe instruction
8119     $correct = $instr->correct;
8120    
8121     // Si la modification sur l'instruction a échoué
8122     if ($correct === false) {
8123    
8124     // Message d'erreur de la classe instruction
8125     $error = $instr->msg;
8126     }
8127    
8128     } else {
8129     // Indique que le traitement est en erreur
8130     $correct = false;
8131     // Message d'erreur
8132     $error = sprintf(_("Le document n'est pas finalise."),
8133     "<span class='bold'>".$code_barres."</span>");
8134     }
8135     } else {
8136     // Récupération des infos du dossier
8137 softime 14542 $qres = $this->f->get_all_results_from_db_query(
8138     sprintf(
8139     'SELECT
8140     dossier.dossier_libelle,
8141     evenement.libelle as evenement,
8142     autorite_competente.code as autorite_competente_code,
8143     autorite_competente.libelle as autorite_competente,
8144     evenement.type as evenement_type,
8145     to_char(date_envoi_signature,\'DD/MM/YYYY\') as date_envoi_signature,
8146     to_char(date_retour_signature,\'DD/MM/YYYY\') as date_retour_signature,
8147     to_char(date_envoi_controle_legalite,\'DD/MM/YYYY\') as date_envoi_controle_legalite,
8148     to_char(date_retour_controle_legalite,\'DD/MM/YYYY\') as date_retour_controle_legalite,
8149     to_char(date_envoi_rar,\'DD/MM/YYYY\') as date_envoi_rar,
8150     to_char(date_retour_rar,\'DD/MM/YYYY\') as date_retour_rar
8151     FROM
8152     %1$sinstruction
8153     INNER JOIN %1$sdossier
8154     ON dossier.dossier=instruction.dossier
8155     LEFT JOIN %1$sautorite_competente
8156     ON dossier.autorite_competente=autorite_competente.autorite_competente
8157     INNER JOIN %1$sevenement
8158     ON instruction.evenement=evenement.evenement
8159     WHERE
8160     code_barres = \'%2$s\'',
8161     DB_PREFIXE,
8162     $this->f->db->escapeSimple($code_barres)
8163     ),
8164     array(
8165     "origin" => __METHOD__
8166     )
8167     );
8168     $infos = array_shift($qres['result']);
8169 mbroquet 3730
8170     // Vérification de la non modification des dates de suivi
8171     foreach(explode(";", $type_mise_a_jour) as $champ) {
8172 softime 11418 if ($champ === 'date_envoi_controle_legalite') {
8173     if ($instr->is_sent_to_cl() === true) {
8174     $error = __("Les dates de suivis ne peuvent etre modifiees");
8175     $date_error = true;
8176     break;
8177     }
8178     }
8179 mbroquet 3730 if($infos[$champ] != "" AND $infos[$champ] != $date) {
8180     $error = _("Les dates de suivis ne peuvent etre modifiees");
8181     $date_error = true;
8182 softime 11418 break;
8183 mbroquet 3730 }
8184     }
8185     }
8186     } else {
8187     $error = _("Le numero saisi ne correspond a aucun code barres d'instruction.");
8188     }
8189    
8190     } else {
8191     $error = _("Tous les champs doivent etre remplis.");
8192     }
8193     }
8194    
8195     /**
8196     * Affichage des messages et du formulaire
8197     */
8198     // Affichage du message de validation ou d'erreur
8199     if (isset($message) && isset($message_class) && $message != "") {
8200 softime 8989 $this->f->displayMessage($message_class, $message);
8201 mbroquet 3730 }
8202     // Affichage du message d'erreur
8203     if(!empty($error)) {
8204 softime 8989 $this->f->displayMessage("error", $error);
8205 mbroquet 3730 }
8206    
8207     // Affichage du message de validation de la saisie
8208     if($correct === true) {
8209 softime 8989 $this->f->displayMessage("ok", _("Saisie enregistree"));
8210 mbroquet 3730 }
8211     // Ouverture du formulaire
8212     echo "\t<form";
8213     echo " method=\"post\"";
8214     echo " id=\"suivi_mise_a_jour_des_dates_form\"";
8215     echo " action=\"\"";
8216     echo ">\n";
8217     // Paramétrage des champs du formulaire
8218     if(isset($infos)) {
8219     $champs = array("type_mise_a_jour", "date", "code_barres", "dossier_libelle", "evenement"
8220     , "autorite_competente", "date_envoi_signature",
8221     "date_retour_signature", "date_envoi_controle_legalite",
8222     "date_retour_controle_legalite", "date_envoi_rar",
8223     "date_retour_rar", "is_valid");
8224     } else {
8225     $champs = array("type_mise_a_jour", "date", "code_barres");
8226     }
8227     // Création d'un nouvel objet de type formulaire
8228 softime 7996 $form = $this->f->get_inst__om_formulaire(array(
8229     "validation" => 0,
8230     "maj" => 0,
8231     "champs" => $champs,
8232     ));
8233 mbroquet 3730 // Paramétrage des champs du formulaire
8234     // Parametrage du champ type_mise_a_jour
8235     $form->setLib("type_mise_a_jour", _("Date a mettre a jour")."* :");
8236     if(isset($infos)) {
8237     $form->setType("type_mise_a_jour", "selecthiddenstatic");
8238    
8239     } else {
8240     $form->setType("type_mise_a_jour", "select");
8241    
8242     }
8243     $form->setVal("type_mise_a_jour", $type_mise_a_jour);
8244     $contenu = array();
8245    
8246     $contenu[0][0] = "date_envoi_signature";
8247     $contenu[1][0] = _("date d'envoi pour signature Mairie/Prefet");
8248    
8249     $contenu[0][1] = "date_retour_signature";
8250     $contenu[1][1] = _("date de retour de signature Mairie/Prefet");
8251    
8252     $contenu[0][2] = "date_retour_signature;date_envoi_controle_legalite";
8253     $contenu[1][2] = _("date de retour de signature + Envoi controle legalite");
8254    
8255     $contenu[0][3] = "date_envoi_controle_legalite";
8256     $contenu[1][3] = _("date d'envoi au controle de legalite");
8257    
8258     $contenu[0][4] = "date_retour_controle_legalite";
8259     $contenu[1][4] = _("date de retour de controle de legalite");
8260    
8261     $contenu[0][5] = "date_retour_rar";
8262 softime 8989 $contenu[1][5] = __("date de notification du correspondant");
8263 mbroquet 3730
8264     $form->setSelect("type_mise_a_jour", $contenu);
8265    
8266     // Parametrage du champ date
8267     $form->setLib("date", _("Date")."* :");
8268     if(isset($infos)) {
8269     $form->setType("date", "hiddenstaticdate");
8270    
8271     } else {
8272     $form->setType("date", "date");
8273     }
8274     $form->setVal("date", $date);
8275     $form->setTaille("date", 10);
8276     $form->setMax("date", 10);
8277    
8278     // Parametrage du champ code_barres
8279     $form->setLib("code_barres", _("Code barres d'instruction")."* :");
8280     if(isset($infos)) {
8281     $form->setType("code_barres", "hiddenstatic");
8282     } else {
8283     $form->setType("code_barres", "text");
8284     }
8285     $form->setVal("code_barres", $code_barres);
8286     $form->setTaille("code_barres", 20);
8287     $form->setMax("code_barres", 20);
8288    
8289     // Ajout des infos du dossier correspondantes à l'instruction séléctionnée
8290     if(isset($infos)) {
8291    
8292     // Tous les champs sont défini par defaut à static
8293     foreach ($infos as $key => $value) {
8294     $form->setType($key, "static");
8295     if(in_array($key, $liste_champs)) {
8296     $form->setVal($key, $date);
8297     } else {
8298     $form->setVal($key, $value);
8299     }
8300     }
8301    
8302     // Les champs dont on viens de définir la valeur sont en gras
8303     foreach ($liste_champs as $value) {
8304     $form->setBloc($value,'DF',"",'bold');
8305     }
8306    
8307     // Parametrage du champ dossier
8308     $form->setLib("dossier_libelle", _("dossier_libelle")." :");
8309     $form->setType("dossier_libelle", "static");
8310     $form->setVal("dossier_libelle", $infos['dossier_libelle']);
8311    
8312     // Parametrage du champ evenement
8313     $form->setLib("evenement", _("evenement")." :");
8314     $form->setType("evenement", "static");
8315     $form->setVal("evenement", $infos['evenement']);
8316    
8317     // Parametrage du champ autorite_competente
8318     $form->setLib("autorite_competente", _("Autorite competente")." :");
8319     $form->setType("autorite_competente", "static");
8320     $form->setVal("autorite_competente", $infos['autorite_competente']);
8321    
8322 softime 8989 // Parametrage des libellés d'envoi avec AR
8323     $form->setLib("date_envoi_rar", __("date_envoi_ar")." :");
8324     $form->setLib("date_retour_rar", __("date_notification")." :");
8325 mbroquet 3730
8326     $form->setLib("date_envoi_signature", _("date_envoi_signature")." :");
8327     $form->setLib("date_retour_signature", _("date_retour_signature")." :");
8328     $form->setLib("date_envoi_controle_legalite", _("date_envoi_controle_legalite")." :");
8329     $form->setLib("date_retour_controle_legalite", _("date_retour_controle_legalite")." :");
8330     // Configuration des libellé en fonction de l'autorité compétente
8331     if($infos['autorite_competente_code'] == 'ETAT') {
8332     $form->setType("date_envoi_controle_legalite", "hiddendate");
8333     $form->setType("date_retour_controle_legalite", "hiddendate");
8334     }
8335    
8336     // Ajout d'un champ hidden permettant de savoir que le formulaire précédant est celui de vérification
8337     $form->setLib("is_valid", _("Valide")." :");
8338     $form->setType("is_valid", "hidden");
8339     $form->setVal("is_valid", 'true');
8340    
8341     $form->setFieldset('dossier_libelle','D',_('Synthese'));
8342     $form->setFieldset('is_valid','F');
8343    
8344     }
8345    
8346    
8347     // Création du fieldset regroupant les champs permettant la mise à jour des date
8348     $form->setFieldset('type_mise_a_jour','D',_('Mise a jour'));
8349     $form->setFieldset('code_barres','F');
8350     // Affichage du formulaire
8351     $form->entete();
8352     $form->afficher($champs, 0, false, false);
8353     $form->enpied();
8354     // Affichage du bouton
8355     echo "\t<div class=\"formControls\">\n";
8356     //
8357     if(!$date_error) {
8358 softime 8989 $this->f->layout->display_form_button(array("value" => _("Valider"), "name" => "validation"));
8359 mbroquet 3730 }
8360     // Si pas sur l'écran de validation
8361     if(isset($infos)) {
8362 softime 7996 echo "<a class=\"retour\" href=\"".OM_ROUTE_FORM."&obj=instruction_suivi_mise_a_jour_des_dates&action=170&idx=0";
8363 mbroquet 3730 echo "&amp;type_mise_a_jour=".$type_mise_a_jour."&amp;date=".$date."&amp;code_barres=".$code_barres;
8364     echo "\">Retour</a>";
8365     }
8366     echo "\t</div>\n";
8367     // Fermeture du formulaire
8368     echo "\t</form>\n";
8369     }
8370    
8371     /**
8372     * [view_pdf_lettre_rar description]
8373     *
8374     * @return [type] [description]
8375     */
8376     function view_pdf_lettre_rar() {
8377     // Vérification de l'accessibilité sur l'élément
8378     $this->checkAccessibility();
8379 softime 8989 //
8380     $this->f->disableLog();
8381 mbroquet 3730
8382 softime 8989 if($this->f->get_submitted_get_value('liste') != null) {
8383     $listeCodeBarres = explode(',',$this->f->get_submitted_get_value('liste'));
8384 mbroquet 3730
8385     // Classe permettant la mise en page de l'édition pdf
8386     require_once "../obj/pdf_lettre_rar.class.php";
8387     $pdf_lettre_rar = new pdf_lettre_rar('P', 'mm', 'A4');
8388     // Initialisation de la mise en page
8389 softime 8989 $pdf_lettre_rar->init($this->f);
8390 mbroquet 3730
8391     foreach ($listeCodeBarres as $code_barres) {
8392    
8393 softime 7067 // On récupère le dossier
8394 softime 14064 $qres = $this->f->get_one_result_from_db_query(
8395     sprintf(
8396     'SELECT
8397     dossier
8398     FROM
8399     %1$sinstruction
8400     WHERE
8401     code_barres = \'%2$s\'',
8402     DB_PREFIXE,
8403     $this->f->db->escapeSimple($code_barres)
8404     ),
8405     array(
8406     "origin" => __METHOD__,
8407     )
8408     );
8409    
8410 softime 7996 $inst_dossier = $this->f->get_inst__om_dbform(array(
8411     "obj" => "dossier",
8412 softime 14064 "idx" => $qres['result'],
8413 softime 7996 ));
8414 softime 7067
8415     // En fonction du type de dossier, on récupère un demandeur différent dans les requêtes
8416     $groupe = $inst_dossier->get_type_affichage_formulaire();
8417     switch ($groupe) {
8418     case 'CTX IN':
8419     $sql_demandeur = "(lien_dossier_demandeur.petitionnaire_principal IS TRUE AND demandeur.type_demandeur='plaignant')";
8420     break;
8421     case 'CTX RE':
8422     $sql_demandeur = "(lien_dossier_demandeur.petitionnaire_principal IS TRUE AND demandeur.type_demandeur='requerant')";
8423     break;
8424     case 'ADS':
8425     case 'DPC':
8426 softime 10573 case 'CONSULTATION ENTRANTE':
8427 softime 7067 default:
8428     $sql_demandeur = "((lien_dossier_demandeur.petitionnaire_principal IS TRUE AND demandeur.type_demandeur='petitionnaire') OR demandeur.type_demandeur='delegataire')";
8429     break;
8430     }
8431    
8432 mbroquet 3730 // Test si l'evenement est de type arrete et si un délégataire a été nommé
8433 softime 14542 $qres = $this->f->get_all_results_from_db_query(
8434     sprintf(
8435     'SELECT
8436 mbroquet 3730 dossier.dossier_libelle,
8437     evenement.type,
8438 softime 3834 count(lien_dossier_demandeur) as nbdemandeur,
8439     CASE
8440     WHEN division.libelle IS NOT NULL AND phase.code IS NOT NULL
8441 softime 14542 THEN CONCAT(phase.code, \' - \', division.libelle)
8442 softime 3834 ELSE
8443     phase.code
8444     END AS code_phase
8445 softime 14542 FROM
8446     %1$sinstruction
8447     LEFT JOIN %1$sdossier
8448     ON instruction.dossier = dossier.dossier
8449     LEFT JOIN %1$sdivision
8450     ON dossier.division = division.division
8451     INNER JOIN %1$sevenement
8452     ON instruction.evenement=evenement.evenement
8453     LEFT JOIN %1$sphase
8454     ON evenement.phase = phase.phase
8455     inner JOIN %1$slien_dossier_demandeur
8456     ON instruction.dossier=lien_dossier_demandeur.dossier
8457     inner join %1$sdemandeur
8458     ON demandeur.demandeur=lien_dossier_demandeur.demandeur
8459     WHERE
8460     code_barres = \'%2$s\'
8461     AND %3$s
8462     GROUP BY
8463     dossier.dossier_libelle,
8464     evenement.type,
8465     phase.code,
8466     division.libelle',
8467     DB_PREFIXE,
8468     $this->f->db->escapeSimple($code_barres),
8469     $sql_demandeur
8470     ),
8471     array(
8472     "origin" => __METHOD__
8473     )
8474     );
8475     $testDemandeur = array_shift($qres['result']);
8476 mbroquet 3730
8477    
8478     // Recuperation de l'adresse de destination
8479     // Envoi pour delegataire ou petitionnaire principal selon le type d'evenement
8480 softime 14542 $sqlAdresse = " AND demandeur.type_demandeur='petitionnaire' AND lien_dossier_demandeur.petitionnaire_principal IS TRUE";
8481 mbroquet 3730 if($testDemandeur['type'] != 'arrete' AND $testDemandeur['nbdemandeur'] > 1) {
8482 softime 14542 $sqlAdresse = " AND demandeur.type_demandeur='delegataire'";
8483 mbroquet 3730 }
8484    
8485 softime 14542 $qres = $this->f->get_all_results_from_db_query(
8486     sprintf(
8487     'SELECT
8488     CASE WHEN demandeur.qualite = \'particulier\'
8489     THEN TRIM(CONCAT_WS(\' \', pc.libelle, demandeur.particulier_nom, demandeur.particulier_prenom))
8490     ELSE TRIM(demandeur.personne_morale_denomination)
8491     END as ligne1,
8492     CASE WHEN demandeur.qualite = \'personne_morale\'
8493     THEN TRIM(demandeur.personne_morale_raison_sociale)
8494     ELSE \'\'
8495     END as ligne1_1,
8496     CASE WHEN demandeur.qualite = \'personne_morale\' AND (demandeur.personne_morale_nom IS NOT NULL OR demandeur.personne_morale_prenom IS NOT NULL)
8497     THEN TRIM(CONCAT_WS(\' \', \'rep. par\', demandeur.personne_morale_nom, demandeur.personne_morale_prenom))
8498     ELSE \'\'
8499     END as ligne1_2,
8500     trim(concat(demandeur.numero,\' \',demandeur.voie)) as ligne2,
8501     CASE demandeur.complement
8502     WHEN null THEN \'\'
8503     ELSE trim(demandeur.complement)
8504     END as ligne3,
8505     CASE demandeur.lieu_dit
8506     WHEN null THEN \'\'
8507     ELSE trim(demandeur.lieu_dit)
8508     END as ligne4,
8509     CONCAT_WS(\' \', demandeur.code_postal, demandeur.localite,
8510     (CASE WHEN demandeur.bp IS NOT NULL
8511     THEN CONCAT_WS(\' \', \'BP\', demandeur.bp)
8512     ELSE \'\'
8513     END),
8514     (CASE WHEN demandeur.cedex IS NOT NULL
8515     THEN CONCAT_WS(\' \', \'CEDEX\', demandeur.cedex)
8516     ELSE \'\'
8517     END))
8518     as ligne5,
8519     code_barres as code_barres
8520     FROM
8521     %1$sinstruction
8522     INNER JOIN %1$sdossier
8523     ON dossier.dossier = instruction.dossier
8524     INNER JOIN %1$slien_dossier_demandeur
8525     ON dossier.dossier = lien_dossier_demandeur.dossier
8526     INNER JOIN %1$sdemandeur
8527     ON lien_dossier_demandeur.demandeur = demandeur.demandeur
8528     LEFT OUTER JOIN %1$scivilite AS pc
8529     ON demandeur.particulier_civilite = pc.civilite
8530     OR demandeur.personne_morale_civilite = pc.civilite
8531     WHERE
8532     instruction.code_barres = \'%2$s\'
8533     %3$s',
8534     DB_PREFIXE,
8535     $this->f->db->escapeSimple($code_barres),
8536     $sqlAdresse
8537     ),
8538     array(
8539     "origin" => __METHOD__
8540     )
8541     );
8542     $adresse_dest = array_shift($qres['result']);
8543 mbroquet 3730
8544     // Création adresse destinataire sans ligne vide
8545     $adresse_destinataire = array();
8546     if (!empty($adresse_dest['ligne1'])) {
8547     $adresse_destinataire[] = $adresse_dest['ligne1'];
8548     }
8549     if (!empty($adresse_dest['ligne1_1'])) {
8550     $adresse_destinataire[] = $adresse_dest['ligne1_1'];
8551     }
8552     if (!empty($adresse_dest['ligne1_2'])) {
8553     $adresse_destinataire[] = $adresse_dest['ligne1_2'];
8554     }
8555     $adresse_destinataire[] = $adresse_dest['ligne2'];
8556     if (!empty($adresse_dest['ligne3'])) {
8557     $adresse_destinataire[] = $adresse_dest['ligne3'];
8558     }
8559     if (!empty($adresse_dest['ligne4'])) {
8560     $adresse_destinataire[] = $adresse_dest['ligne4'];
8561     }
8562     $adresse_destinataire[] = $adresse_dest['ligne5'];
8563    
8564     // Création du champ specifique
8565     $specifique_content = array();
8566     $specifique_content[] = $adresse_dest['ligne1'];
8567     $specifique_content[] = $adresse_dest['ligne1_1'];
8568     $specifique_content[] = $adresse_dest['ligne1_2'];
8569     $specifique_content[] = $testDemandeur['dossier_libelle'];
8570     $specifique_content[] = "|||||".$adresse_dest['code_barres']."|||||";
8571     unset($adresse_dest['code_barres']);
8572     // Ajout d'une page aux pdf
8573 softime 3834 $pdf_lettre_rar->addLetter($adresse_destinataire, $specifique_content, $testDemandeur['code_phase']);
8574 mbroquet 3730
8575     }
8576     $pdf_output = $pdf_lettre_rar->output("lettre_rar".date("dmYHis").".pdf","S");
8577 softime 7685 $om_edition = $this->f->get_inst__om_edition();
8578 mbroquet 3730 $om_edition->expose_pdf_output($pdf_output, "lettre_rar".date("dmYHis").".pdf");
8579     }
8580     }
8581    
8582     /**
8583     * VIEW - view_bordereau_envoi_maire.
8584     *
8585     * Formulaire demandant :
8586     * - le code-barres de l'événement d'instruction
8587     * - la date d'envoi du courrier pour signature par le maire
8588     *
8589     * Lors de la validation :
8590     * => met à jour cette date dans l'événement d'instruction
8591     * => crée un lien permettant de générer en PDF le bordereau
8592     *
8593     * @return void
8594     */
8595     function view_bordereau_envoi_maire() {
8596     // Vérification de l'accessibilité sur l'élément
8597     $this->checkAccessibility();
8598    
8599     // Récupération des valeur passées en POST ou GET
8600     $code_barres = "";
8601     if($this->f->get_submitted_post_value('code_barres') !== null) {
8602     $code_barres = $this->f->get_submitted_post_value('code_barres');
8603     } elseif($this->f->get_submitted_get_value('code_barres')!==null) {
8604     $code_barres = $this->f->get_submitted_get_value('code_barres');
8605     }
8606     $date = "";
8607     if($this->f->get_submitted_post_value('date') !== null) {
8608     $date = $this->f->get_submitted_post_value('date');
8609     } elseif($this->f->get_submitted_get_value('date') !== null) {
8610     $date = $this->f->get_submitted_get_value('date');
8611     }
8612     $validation = 0;
8613     if($this->f->get_submitted_post_value('validation') !== null) {
8614     $validation = $this->f->get_submitted_post_value('validation');
8615     } elseif($this->f->get_submitted_get_value('validation') !== null) {
8616     $validation = $this->f->get_submitted_get_value('validation');
8617     }
8618    
8619     // Si le formulaire a été validé
8620     if ($this->f->get_submitted_post_value('validation') !== null) {
8621     // Tous les champs doivent obligatoirement être remplis
8622     if (!empty($date) && !empty($code_barres)) {
8623     $date_en = $this->dateDB($date);
8624     // Si date valide
8625     if ($date_en != "") {
8626     $id_instruction = $this->get_instruction_by_barcode($code_barres);
8627     // Si un événement d'instruction a été trouvé pour ce code-barres
8628     if ($id_instruction !== null) {
8629     $ret = $this->update_date_envoi_signature($id_instruction, $date_en);
8630     // Si mise à jour réussie de la date d'envoi du courrier
8631     // pour signature par l'autorité compétente
8632     if($ret === true) {
8633     // Message de validation avec lien PDF
8634     $message_class = "valid";
8635     $message = '&bullet; '._("Veuillez cliquer sur le lien ci-dessous pour telecharger votre bordereau");
8636     $message .= " : <br/><br/>";
8637     $message .= "<a class='om-prev-icon pdf-16'";
8638     $message .= " id=\"generer_bordereau_envoi_maire\"";
8639     $message .= " title=\""._("Bordereau")."\"";
8640 softime 7996 $message .= " href='".OM_ROUTE_FORM."&obj=instruction";
8641 mbroquet 3730 $message .= "&action=200";
8642     $message .= "&idx=".$id_instruction."'";
8643     $message .= " target='_blank'>";
8644     $message .= _("Bordereau d'envoi au maire");
8645     $message .= "</a><br/><br/>";
8646     $message .= '&bullet; '._("Rappel des informations saisies")." :<br/><br/>";
8647     $message .= _("Code du courrier")." : ".$code_barres."<br/>";
8648     $message .= _("Date d'envoi du courrier pour signature par le maire")." : ".$date;
8649    
8650     } else {
8651     // Message d'erreur
8652     $message_class = "error";
8653     $message = sprintf(_("Erreur lors de la mise a jour de l'evenement d'instruction correspondant au code barres %s."),
8654     $code_barres);
8655     }
8656     }
8657     else {
8658     $message_class = "error";
8659     $message = _("Le numero saisi ne correspond a aucun code-barres d'evenement d'instruction.");
8660     }
8661     }
8662     else {
8663     $message_class = "error";
8664     $message = _("La date est invalide.");
8665     }
8666     } else {
8667     $message_class = "error";
8668     $message = _("Tous les champs doivent etre remplis.");
8669     }
8670     }
8671    
8672     /**
8673     * Affichage des messages et du formulaire
8674     */
8675    
8676     // Affichage du message de validation ou d'erreur
8677     if (isset($message) && isset($message_class) && $message != "") {
8678     $this->f->displayMessage($message_class, $message);
8679     }
8680    
8681     // Ouverture du formulaire
8682     $datasubmit = $this->getDataSubmit();
8683     echo "\n<!-- ########## START DBFORM ########## -->\n";
8684     echo "<form";
8685     echo " id=\"bordereau_envoi_maire\"";
8686     echo " method=\"post\"";
8687     echo " name=\"f1\"";
8688     echo " action=\"";
8689     echo $datasubmit;
8690     echo "\"";
8691     echo ">\n";
8692    
8693     // Paramétrage des champs du formulaire
8694     $champs = array("code_barres","date");
8695    
8696     // Création d'un nouvel objet de type formulaire
8697 softime 7996 $form = $this->f->get_inst__om_formulaire(array(
8698     "validation" => 0,
8699     "maj" => 0,
8700     "champs" => $champs,
8701     ));
8702 mbroquet 3730
8703     $template_required_label = '%s *';
8704     // Parametrage du champ code_barres
8705     $form->setLib("code_barres", sprintf($template_required_label,_("Code du courrier")));
8706     $form->setType("code_barres", "text");
8707     $form->setVal("code_barres", $code_barres);
8708     $form->setTaille("code_barres", 20);
8709     $form->setMax("code_barres", 20);
8710     // Parametrage du champ date
8711     $form->setLib("date", sprintf($template_required_label,_("Date d'envoi du courrier pour signature par le maire")));
8712     $form->setType("date", "date") ;
8713     if (empty($date)) {
8714     $date = date('d/m/Y');
8715     }
8716     $form->setVal("date", $date);
8717     $form->setTaille("date", 10);
8718     $form->setMax("date", 10);
8719    
8720     // Création du bloc regroupant les champs
8721     $form->setBloc('code_barres','D');
8722     $form->setBloc('date','F');
8723     // Affichage du formulaire
8724     $form->entete();
8725     $form->afficher($champs, 0, false, false);
8726     $form->enpied();
8727     // Affichage du bouton
8728     printf("\t<div class=\"formControls\">\n");
8729     //
8730     $this->f->layout->display_form_button(array("value" => _("Valider"), "name" => "validation"));
8731     printf("\t</div>\n");
8732     // Fermeture du formulaire
8733     printf("\t</form>\n");
8734     }
8735    
8736     /**
8737     * VIEW - view_bordereau_envoi_maire.
8738     *
8739     * PDF de bordereau d'envoi au maire pour l'événement d'instruction instancié
8740     *
8741     * @return [void]
8742     */
8743     function view_generate_bordereau_envoi_maire() {
8744     // Vérification de l'accessibilité sur l'élément
8745     $this->checkAccessibility();
8746     // Récupération de la collectivité du dossier d'instruction
8747     $collectivite_di = $this->get_dossier_instruction_om_collectivite();
8748     // Récupération de ses paramètres
8749     $collectivite = $this->f->getCollectivite($collectivite_di);
8750     // Génération du PDF
8751     $result = $this->compute_pdf_output('etat', 'communaute_bordereau_envoi_maire', $collectivite, $this->getVal(($this->clePrimaire)));
8752     // Affichage du PDF
8753     $this->expose_pdf_output(
8754     $result['pdf_output'],
8755     $result['filename']
8756     );
8757     }
8758    
8759     /**
8760 softime 10808 * VIEW - view_rapport_instruction.
8761     *
8762     * Ouvre le sous-formulaire en ajaxIt dans un overlay.
8763     * Cette action est bindée pour utiliser la fonction popUpIt.
8764     *
8765     * @return void
8766     */
8767     function view_overlay_notification_manuelle() {
8768    
8769     // Vérification de l'accessibilité sur l'élément
8770     $this->checkAccessibility();
8771    
8772     printf(
8773     '<script type="text/javascript" >
8774     overlayIt(\'%1$s\',\'%2$s&objsf=%1$s&idxformulaire=%4$s&retourformulaire=dossier_instruction&obj=%1$s&action=411&idx=%3$s\', 1);
8775     </script>',
8776     'instruction_notification_manuelle',
8777     OM_ROUTE_SOUSFORM,
8778     $this->getVal($this->clePrimaire),
8779     $this->getVal('dossier')
8780     );
8781     }
8782    
8783     /**
8784 softime 11585 * VIEW - view_overlay_notification_service_consulte.
8785     *
8786     * Ouvre le sous-formulaire de notification des services consulte
8787     * en ajaxIt dans un overlay.
8788     * Cette action est bindée pour utiliser la fonction popUpIt.
8789     *
8790     * @return void
8791     */
8792     function view_overlay_notification_service_consulte() {
8793    
8794     // Vérification de l'accessibilité sur l'élément
8795     $this->checkAccessibility();
8796    
8797     printf(
8798     '<script type="text/javascript" >
8799     overlayIt(\'%1$s\',\'%2$s&objsf=%1$s&idxformulaire=%4$s&retourformulaire=dossier_instruction&obj=%1$s&action=420&idx=%3$s\', 1);
8800     </script>',
8801     'instruction_notification_manuelle',
8802     OM_ROUTE_SOUSFORM,
8803     $this->getVal($this->clePrimaire),
8804     $this->getVal('dossier')
8805     );
8806     }
8807    
8808     /**
8809     * VIEW - overlay_notification_tiers_consulte.
8810     *
8811     * Ouvre le sous-formulaire de notification des tiers consulte
8812     * en ajaxIt dans un overlay.
8813     * Cette action est bindée pour utiliser la fonction popUpIt.
8814     *
8815     * @return void
8816     */
8817     function view_overlay_notification_tiers_consulte() {
8818    
8819     // Vérification de l'accessibilité sur l'élément
8820     $this->checkAccessibility();
8821    
8822     printf(
8823     '<script type="text/javascript" >
8824     overlayIt(\'%1$s\',\'%2$s&objsf=%1$s&idxformulaire=%4$s&retourformulaire=dossier_instruction&obj=%1$s&action=430&idx=%3$s\', 1);
8825     </script>',
8826     'instruction_notification_manuelle',
8827     OM_ROUTE_SOUSFORM,
8828     $this->getVal($this->clePrimaire),
8829     $this->getVal('dossier')
8830     );
8831     }
8832 softime 12847
8833 softime 11585 /**
8834 softime 12847 * VIEW - view_modale_selection_document_signe
8835     *
8836     * Ouvre le sous-formulaire de notification des services consulte
8837     * en ajaxIt dans un overlay.
8838     * Cette action est bindée pour utiliser la fonction popUpIt.
8839     *
8840     * @return void
8841     */
8842     function view_modale_selection_document_signe() {
8843    
8844     // Vérification de l'accessibilité sur l'élément
8845     $this->checkAccessibility();
8846    
8847     printf(
8848     '<script type="text/javascript" >
8849     overlayIt(\'%1$s\',\'%2$s&objsf=%1$s&idxformulaire=%4$s&retourformulaire=dossier_instruction&obj=%1$s&action=115&idx=%3$s\', 1);
8850     </script>',
8851     'instruction_modale',
8852     OM_ROUTE_SOUSFORM,
8853     $this->getVal($this->clePrimaire),
8854     $this->getVal('dossier')
8855     );
8856     }
8857    
8858     /**
8859 softime 6565 * Retourne l'événement d'instruction dont on donne le code-barres, avec un filtre
8860     * pour exclure les dossiers du groupe contentieux.
8861 mbroquet 3730 *
8862     * @param [string] $barcode numéro du code-barres
8863     * @return [mixed] ID de son instruction ou null si aucun code
8864     */
8865     function get_instruction_by_barcode($barcode) {
8866     // Begin
8867     $this->begin_treatment(__METHOD__);
8868 softime 14064
8869 mbroquet 3730 // Vérification de l'existence de l'événement d'instruction
8870 softime 6565 // pour le code-barres donné, en excluant les dossiers liés au groupe CTX
8871 softime 14064 $qres = $this->f->get_one_result_from_db_query(
8872     sprintf(
8873     'SELECT
8874     instruction
8875     FROM
8876     %1$sinstruction
8877     INNER JOIN %1$sdossier
8878 softime 6565 ON dossier.dossier=instruction.dossier
8879 softime 14064 INNER JOIN %1$sdossier_instruction_type
8880 softime 6565 ON dossier.dossier_instruction_type = dossier_instruction_type.dossier_instruction_type
8881 softime 14064 INNER JOIN %1$sdossier_autorisation_type_detaille
8882 softime 6565 ON dossier_instruction_type.dossier_autorisation_type_detaille = dossier_autorisation_type_detaille.dossier_autorisation_type_detaille
8883 softime 14064 INNER JOIN %1$sdossier_autorisation_type
8884 softime 6565 ON dossier_autorisation_type_detaille.dossier_autorisation_type = dossier_autorisation_type.dossier_autorisation_type
8885 softime 14064 INNER JOIN %1$sgroupe
8886 softime 6565 ON dossier_autorisation_type.groupe = groupe.groupe
8887 softime 14064 AND groupe.code != \'CTX\'
8888     WHERE
8889     code_barres = \'%2$s\'',
8890     DB_PREFIXE,
8891     $this->f->db->escapeSimple($barcode)
8892     ),
8893     array(
8894     "origin" => __METHOD__,
8895     )
8896     );
8897    
8898 mbroquet 3730 // Retourne résultat
8899 softime 14064 return $this->end_treatment(__METHOD__, $qres['result']);
8900 mbroquet 3730 }
8901    
8902     /**
8903     * Met à jour le champ date d'envoi signature
8904     * avec la date fournie et pour l'instruction donnée
8905     *
8906     * @param [string] $id ID de l'événement d'instruction
8907     * @param [string] $date date au format EN
8908     * @return [boolean] true si mise à jour avec succès
8909     */
8910     function update_date_envoi_signature($id, $date) {
8911     // Préparation du tableau
8912     $valF = array();
8913     $valF['date_envoi_signature'] = $date;
8914     // Begin
8915     $this->begin_treatment(__METHOD__);
8916     // Requête
8917 softime 12847 $res = $this->f->db->autoexecute(
8918 mbroquet 3730 DB_PREFIXE.$this->table,
8919     $valF,
8920     DB_AUTOQUERY_UPDATE,
8921     $this->getCle($id)
8922     );
8923 softime 12847 $this->addToLog(
8924     __METHOD__."(): db->autoexecute(\"".DB_PREFIXE.'.'.$this->table."\", ".print_r($valF, true).", DB_AUTOQUERY_UPDATE, \"".$this->getCle($id)."\");",
8925     VERBOSE_MODE
8926     );
8927     if ($this->f->isDatabaseError($res, true) !== false) {
8928 mbroquet 3730 $this->end_treatment(__METHOD__, false);
8929     }
8930     //
8931     return $this->end_treatment(__METHOD__, true);
8932     }
8933    
8934     /**
8935     * Méthode permettant de définir des valeurs à envoyer en base après
8936     * validation du formulaire d'ajout.
8937     * @param array $val tableau des valeurs retournées par le formulaire
8938     */
8939 softime 6929 function setValFAjout($val = array()) {
8940 mbroquet 3730 // Mise à jour du flag created_by_commune lors d'un changement de décision
8941     // par un utilisateur de commune sur un dossier instruit par la comcom
8942 softime 6565 if ($this->isInstrCanChangeDecision($this->valF["dossier"])) {
8943 mbroquet 3730 $this->valF['created_by_commune'] = true;
8944     }
8945 softime 8593
8946     //
8947     if ($this->evenement_has_an_edition($this->valF['evenement']) === false) {
8948     if (isset($this->valF['flag_edition_integrale']) === true) {
8949     unset($this->valF['flag_edition_integrale']);
8950     }
8951     if (isset($this->valF['signataire_arrete']) === true) {
8952     unset($this->valF['signataire_arrete']);
8953     }
8954     }
8955 mbroquet 3730 }
8956 nmeucci 3876
8957 fmichon 3892
8958 fmichon 4708 /**
8959     * Récupère l'instance d'un événement de workflow.
8960     *
8961     * @param mixed $evenement Identifiant de l'événement.
8962     *
8963     * @return object
8964     */
8965     function get_inst_evenement($evenement = null) {
8966     //
8967     return $this->get_inst_common("evenement", $evenement);
8968     }
8969 softime 3976
8970 fmichon 3892 /**
8971 softime 3976 * Logue l'action de l'instruction dans son DI.
8972 nmeucci 3933 *
8973 softime 3976 * @param string $id Clé primaire de l'instruction.
8974     * @param array $val Valeurs de l'instruction.
8975     *
8976     * @return bool Vrai si traitement effectué avec succès
8977 nmeucci 3876 */
8978 softime 3976 private function add_log_to_dossier($id, array $val) {
8979 nmeucci 3933 $maj = $this->getParameter("maj");
8980 nmeucci 3943 // Action = Trace par défaut
8981     $action = $this->get_backtrace();
8982     // Action = Identifant de l'action si contexte connu
8983     if (empty($maj) === false
8984     || (empty($maj) === true && $maj === 0)) {
8985     $action = $this->get_action_param($maj, 'identifier');
8986 nmeucci 3965 if ($action === 'modifier_suivi') {
8987     $action = "modifier (via l'action suivi des dates)";
8988     }
8989 nmeucci 4108 if ($action === 'notifier_commune'
8990     && isset($val['mails_destinataires']) === true) {
8991     $action = "notification de la commune (courriels : ";
8992     $action .= $val['mails_destinataires'].")";
8993     }
8994 nmeucci 3943 }
8995 nmeucci 3876 // Création du log
8996     $log = array(
8997     'date' => date('Y-m-d H:i:s'),
8998     'user' => $_SESSION['login'],
8999     'action' => $action,
9000     'values' => array(
9001     'date_evenement' => $this->dateDB($val['date_evenement']),
9002     'date_retour_rar' => $this->dateDB($val['date_retour_rar']),
9003     'date_retour_signature' => $this->dateDB($val['date_retour_signature']),
9004     'evenement' => $val['evenement'],
9005     'action' => $val['action'],
9006 nmeucci 3963 'instruction' => $id,
9007 nmeucci 3876 'etat' => $val['etat'],
9008     ),
9009     );
9010     // Ajout du log
9011 softime 3976 $di = $this->get_inst_dossier($val['dossier']);
9012 nmeucci 3876 $ret = $di->add_log_instructions($log);
9013     if ($ret === false) {
9014     $this->correct = false;
9015     $this->msg = '';
9016     $this->addToMessage($di->msg);
9017     }
9018     return $ret;
9019     }
9020 nmeucci 3943
9021 softime 3976
9022 nmeucci 3943 /**
9023 softime 3976 * Retourne le contexte de déboguage formaté en HTML.
9024 nmeucci 3943 *
9025 softime 3976 * @return string Une ligne par trace
9026 nmeucci 3943 */
9027     private function get_backtrace() {
9028     $trace = debug_backtrace();
9029 nmeucci 3957 $backtrace = '';
9030     $i = 1;
9031 nmeucci 3943 foreach ($trace as $key => $value) {
9032 nmeucci 3957 $func = $trace[$key]['function'];
9033     // On ne s'autolog pas
9034     if ($func === 'get_backtrace'
9035     || $func === 'add_log_to_dossier') {
9036     continue;
9037     }
9038     $backtrace .= $i.') ';
9039     // Si dans une classe
9040     if (isset($trace[$key]['class']) === true
9041     && empty($trace[$key]['class']) === false) {
9042 nmeucci 3963 $backtrace .= $trace[$key]['class'].'->'.$func;
9043 nmeucci 3957 }
9044     // Si procédural
9045     else {
9046     $file = $trace[$key]['file'];
9047 nmeucci 3963 $line = $trace[$key]['line'];
9048 softime 3976 $truncated_file = $this->f->get_relative_path($file);
9049 nmeucci 3963 if ($truncated_file !== false) {
9050     $file = $truncated_file;
9051     }
9052     $backtrace .= $func.' IN<br/>&nbsp;&nbsp;&nbsp;&nbsp; '.$file.':'.$line;
9053 nmeucci 3957 }
9054     $backtrace .= '<br/>';
9055     $i++;
9056 nmeucci 3943 }
9057 nmeucci 3957 return $backtrace;
9058 nmeucci 3943 }
9059 nmeucci 3963
9060 nmeucci 4108 /**
9061     * CONDITION - is_notifiable.
9062     *
9063     * Condition pour afficher l'action notifier_commune.
9064     *
9065     * @return boolean
9066     */
9067     public function is_notifiable() {
9068     // L'instruction doit être finalisée, ce qui revient à dire
9069     // définalisable sans bypass
9070     if ($this->is_unfinalizable_without_bypass() === false) {
9071     return false;
9072     }
9073     // La collectivité de l'utilisateur doit être de niveau multi
9074     if ($this->f->has_collectivite_multi() === false) {
9075     return false;
9076     }
9077     // Le paramètre multi de l'objet du courriel doit exister
9078     if ($this->f->getParameter('param_courriel_de_notification_commune_objet_depuis_instruction') === NULL) {
9079     return false;
9080     }
9081     // Le paramètre multi du modèle du courriel doit exister
9082     if ($this->f->getParameter('param_courriel_de_notification_commune_modele_depuis_instruction') === NULL) {
9083     return false;
9084     }
9085     // A ce stade toutes les conditions sont satisfaites
9086     return true;
9087     }
9088 nmeucci 3963
9089 nmeucci 4108 /**
9090     * TREATMENT - notifier_commune.
9091     *
9092     * Notifie aux communes et par courriel la finalisation d'une instruction.
9093     *
9094     * @return boolean
9095     */
9096     public function notifier_commune() {
9097     // Cette méthode permet d'exécuter une routine en début des méthodes
9098     // dites de TREATMENT.
9099     $this->begin_treatment(__METHOD__);
9100 softime 14542 $message = __('Erreur de paramétrage :');
9101 softime 12654 $erreurParametrage = false;
9102     // Récupération du paramétrage de la collectivité du dossier
9103 nmeucci 4108 $id_di = $this->getVal('dossier');
9104     $di = $this->get_inst_dossier($id_di);
9105     $collectivite_di = $di->getVal('om_collectivite');
9106 softime 12654 // Récupération de l'url permettant d'accèder à l'instruction et au dossier
9107     $urlAcces = $this->f->get_parametre_notification_url_acces($collectivite_di);
9108     if (empty($urlAcces) && empty(PATH_BASE_URL)) {
9109     $erreurParametrage = true;
9110     $message .= '<br>'.__("* l'url de notification n'est pas correctement paramétré");
9111 nmeucci 4108 }
9112 softime 12654
9113     // Récupération de la liste des mails
9114     $adresses = $this->f->get_param_courriel_de_notification_commune($collectivite_di);
9115     if (empty($adresses)) {
9116     $erreurParametrage = true;
9117     $message .= '<br>'.__("* aucun courriel valide de destinataire de la commune");
9118 nmeucci 4108 }
9119 softime 12654
9120     // Vérification du paramétrage des mails
9121     $paramMail = $this->f->get_notification_commune_parametre_courriel_type($collectivite_di);
9122     if (empty($paramMail) || empty($paramMail['parametre_courriel_type_message'])) {
9123     $erreurParametrage = true;
9124     $message .= '<br>'.__("* le modèle du courriel envoyé aux communes est vide");
9125 nmeucci 4108 }
9126 softime 12654 if (empty($paramMail) || empty($paramMail['parametre_courriel_type_titre'])) {
9127     $erreurParametrage = true;
9128     $message .= '<br>'.__("* l'objet du courriel envoyé aux communes est vide");
9129 nmeucci 4108 }
9130 softime 12654
9131     // Si il y a des erreurs de paramétrage on ne déclenche pas la notification et
9132     // un message a destination de l'utilisateur est affiché
9133     if ($erreurParametrage) {
9134     $message .= '<br>'.__("Veuillez contacter votre administrateur.");
9135     $this->addToMessage($message);
9136 nmeucci 4108 return $this->end_treatment(__METHOD__, false);
9137     }
9138 softime 12654
9139     // Création d'un notification et de sa tâche associé pour chaque mail
9140     foreach ($adresses as $adresse) {
9141     // Ajout de la notif et récupération de son id
9142     $destinataire = array(
9143     'destinataire' => $adresse,
9144     'courriel' => $adresse
9145     );
9146     $idNotif = $this->ajouter_notification(
9147     $this->getVal($this->clePrimaire),
9148     $this->f->get_connected_user_login_name(),
9149     $destinataire,
9150     $collectivite_di
9151     );
9152     if ($idNotif === false) {
9153     $this->addToMessage(__("Veuillez contacter votre administrateur."));
9154     return $this->end_treatment(__METHOD__, false);
9155 nmeucci 4108 }
9156 softime 12654 // Création de la tache en lui donnant l'id de la notification
9157     $notification_by_task = $this->notification_by_task(
9158     $idNotif,
9159     $this->getVal('dossier'),
9160     'mail',
9161     'notification_commune'
9162     );
9163     if ($notification_by_task === false) {
9164     $this->addToMessage(__("Erreur lors de la préparation de la notification des communes."));
9165     $this->addToMessage(__("Veuillez contacter votre administrateur."));
9166     return $this->end_treatment(__METHOD__, false);
9167     }
9168 nmeucci 4108 }
9169 softime 12654 $this->addToMessage(__('La commune a été notifiée.'));
9170 nmeucci 4108 return $this->end_treatment(__METHOD__, true);
9171     }
9172    
9173     /**
9174 softime 5169 * Récupère l'instance de l'instructeur
9175     *
9176     * @param integer $instructeur Identifiant de l'instructeur.
9177     *
9178     * @return object
9179     */
9180     protected function get_inst_instructeur($instructeur) {
9181     //
9182     return $this->get_inst_common("instructeur", $instructeur);
9183     }
9184    
9185    
9186     /**
9187     * Récupère l'instance de l'utilisateur
9188     *
9189     * @param integer $om_utilisateur Identifiant de l'utilisateur.
9190     *
9191     * @return object
9192     */
9193     protected function get_inst_om_utilisateur($om_utilisateur) {
9194     //
9195     return $this->get_inst_common("om_utilisateur", $om_utilisateur);
9196     }
9197    
9198    
9199 softime 6565 /**
9200 softime 5295 * Récupère l'instance de la division.
9201     *
9202     * @param integer $division Identifiant de la division.
9203     *
9204     * @return object
9205     */
9206     protected function get_inst_division($division) {
9207     //
9208     return $this->get_inst_common("division", $division);
9209     }
9210    
9211    
9212     /**
9213     * Récupère l'instance de la direction.
9214     *
9215     * @param integer $direction Identifiant de la direction.
9216     *
9217     * @return object
9218     */
9219     protected function get_inst_direction($direction) {
9220     //
9221     return $this->get_inst_common("direction", $direction);
9222     }
9223    
9224    
9225     /**
9226     * Récupère la collectivité d'un instructeur en passant par sa division puis
9227     * par sa direction.
9228     *
9229     * @param integer $instructeur Identifiant de l'instructeur.
9230     *
9231     * @return integer
9232     */
9233     protected function get_instructeur_om_collectivite($instructeur) {
9234     // Chemin vers la collectivité d'un instructeur
9235     $inst_instr = $this->get_inst_instructeur($instructeur);
9236     $inst_division = $this->get_inst_division($inst_instr->getVal('division'));
9237     $inst_direction = $this->get_inst_direction($inst_division->getVal('direction'));
9238    
9239     // Collectivité
9240     $om_collectivite = $inst_direction->getVal('om_collectivite');
9241    
9242     //
9243     return $om_collectivite;
9244     }
9245    
9246 softime 6565 /*
9247     * CONDITION - can_user_access_dossier_contexte_ajout
9248     *
9249     * Vérifie que l'utilisateur a bien accès au dossier d'instruction passé dans le
9250     * formulaire d'ajout.
9251     * Cette méthode vérifie que l'utilisateur est lié au groupe du dossier, et si le
9252     * dossier est confidentiel qu'il a accès aux confidentiels de ce groupe.
9253     *
9254     */
9255     function can_user_access_dossier_contexte_ajout() {
9256 softime 5295
9257 softime 6565 ($this->f->get_submitted_get_value('idxformulaire') !== null ? $id_dossier =
9258     $this->f->get_submitted_get_value('idxformulaire') : $id_dossier = "");
9259     //
9260     if ($id_dossier !== "") {
9261 softime 7996 $dossier = $this->f->get_inst__om_dbform(array(
9262     "obj" => "dossier_instruction",
9263     "idx" => $id_dossier,
9264     ));
9265 softime 6565 //
9266     return $dossier->can_user_access_dossier();
9267     }
9268     return false;
9269     }
9270    
9271     /*
9272     * CONDITION - can_user_access_dossier
9273     *
9274     * Vérifie que l'utilisateur a bien accès au dossier lié à l'instruction instanciée.
9275     * Cette méthode vérifie que l'utilisateur est lié au groupe du dossier, et si le
9276     * dossier est confidentiel qu'il a accès aux confidentiels de ce groupe.
9277     *
9278     */
9279     function can_user_access_dossier_contexte_modification() {
9280    
9281     $id_dossier = $this->getVal('dossier');
9282     //
9283     if ($id_dossier !== "" && $id_dossier !== null) {
9284 softime 7996 $dossier = $this->f->get_inst__om_dbform(array(
9285     "obj" => "dossier_instruction",
9286     "idx" => $id_dossier,
9287     ));
9288 softime 6565 //
9289     return $dossier->can_user_access_dossier();
9290     }
9291     return false;
9292     }
9293    
9294 softime 8593 /**
9295 softime 10713 * TREATMENT - envoyer_a_signature_sans_relecture
9296     *
9297     * Permet d'envoyer le document de l'instruction au parapheur pour signature sans relecture
9298     *
9299     * @return boolean true si l'envoi a été effectué avec succès false sinon
9300     */
9301     function envoyer_a_signature_sans_relecture() {
9302     return $this->envoyer_a_signature();
9303     }
9304    
9305     /**
9306     * TREATMENT - envoyer_a_signature_avec_relecture
9307     *
9308     * Permet d'envoyer le document de l'instruction au parapheur pour signature avec relecture
9309     *
9310     * @return boolean true si l'envoi a été effectué avec succès false sinon
9311     */
9312     function envoyer_a_signature_avec_relecture() {
9313 softime 10808 $is_forced_view_files = true;
9314     return $this->envoyer_a_signature($is_forced_view_files);
9315 softime 10713 }
9316    
9317     /**
9318 softime 10573 * TREATMENT - envoyer_a_signature
9319     *
9320     * Permet d'envoyer le document de l'instruction au parapheur pour signature
9321 softime 10713 *
9322     * @param boolean $is_forced_view_files Indique si il y a une relecture (true) ou non (false)
9323 softime 10573 *
9324     * @return boolean true si l'envoi a été effectué avec succès false sinon
9325     */
9326 softime 10713 function envoyer_a_signature($is_forced_view_files = false) {
9327 softime 10573 $this->begin_treatment(__METHOD__);
9328     $this->correct = true;
9329    
9330     // Instanciation de l'objet signataire_arrete
9331     $inst_signataire_arrete = $this->f->get_inst__om_dbform(array(
9332     'obj' => 'signataire_arrete',
9333     'idx' => $this->getVal('signataire_arrete'),
9334     ));
9335    
9336     // Instanciation de l'objet dossier
9337     $inst_dossier = $this->f->get_inst__om_dbform(array(
9338     'obj' => 'dossier',
9339     'idx' => $this->getVal('dossier'),
9340     ));
9341    
9342 softime 15037 //Instanciation de la classe electronicsignature
9343     $inst_es = $this->get_electronicsignature_instance();
9344     if ($inst_es === false) {
9345     $this->correct = false;
9346     return $this->end_treatment(__METHOD__, false);
9347     }
9348    
9349     // Vérifie si la notification se fait via l'application ou via le parapheur
9350     try {
9351     $notification_required = $inst_es->signer_notification_is_delegated();
9352     } catch(electronicsignature_connector_method_not_implemented_exception $_) {
9353     // Si la méthode n'existe pas, on considère que la notification est faite par le parapheur
9354     $notification_required = false;
9355     }
9356    
9357     // Si la notification est faite par l'application vérifie que l'adresse mail du
9358     // signataire est correcte. Si ce n'est pas le cas le document n'est pas envoyé
9359     // au parapheur car il ne sera pas accessible sans le lien transmis dans la
9360     // notification
9361     if ($notification_required === true) {
9362     $signer_mail = $inst_signataire_arrete->getVal('email');
9363     $signer_name = trim($inst_signataire_arrete->getVal('prenom').' '.$inst_signataire_arrete->getVal('nom'));
9364    
9365     $err_msg = __('Le document n\'a pas pu être envoyé en signature car ');
9366    
9367     if (empty($signer_mail)) {
9368     $this->correct = false;
9369     $err_detail = sprintf(__("l'email du signataire '%s' est vide."), $signer_name);
9370     $this->addToMessage($err_msg.$err_detail);
9371     $this->addToLog(__METHOD__.$err_msg.$err_detail.' Instruction : '.$this->getVal($this->clePrimaire), DEBUG_MODE);
9372     return $this->end_treatment(__METHOD__, false);
9373     }
9374     if (! $this->f->checkValidEmailAddress($signer_mail)) {
9375     $this->correct = false;
9376     $err_detail = sprintf(__("l'email du signataire '%s' est invalide (%s)."), $signer_name, $signer_mail);
9377     $this->addToMessage($err_msg.$err_detail);
9378     $this->addToLog(__METHOD__.$err_msg.$err_detail.' Instruction : '.$this->getVal($this->clePrimaire), DEBUG_MODE);
9379     return $this->end_treatment(__METHOD__, false);
9380     }
9381     }
9382    
9383 softime 10573 // Récupération du document à signer
9384     $file = $this->f->storage->get($this->getVal('om_fichier_instruction'));
9385     if ($file === OP_FAILURE) {
9386     $this->correct = false;
9387     $this->addToMessage(__("Une erreur est survenue lors de la récupération du contenu du document de l'instruction."));
9388     // Termine le traitement
9389     return $this->end_treatment(__METHOD__, false);
9390     }
9391    
9392     // Initialisation des paramètre à passer pour l'envoi en signature
9393 softime 10808 $data = array(
9394 softime 10573 "om_utilisateur_email" => $this->f->om_utilisateur['email'],
9395     "om_utilisateur_nom" => $this->f->om_utilisateur['nom'],
9396     "signataire_arrete_email" => $inst_signataire_arrete->getVal('email'),
9397     "signataire_arrete_nom" => $inst_signataire_arrete->getVal('nom'),
9398     "signataire_arrete_prenom" => $inst_signataire_arrete->getVal('prenom'),
9399 softime 11876 // Permet d'envoyer en signature l'instruction le jour de la date limite
9400 softime 14064 "date_limite_instruction" => $this->compute_date_limite(1) != null ? $this->compute_date_limite(1) : null,
9401 softime 10573 "dossier" => $this->getVal('dossier'),
9402 softime 10713 "is_forced_view_files" => $is_forced_view_files,
9403     'commentaire_signature' => $is_forced_view_files === true ? __('relecture demandee.') : null
9404 softime 10573 );
9405    
9406 softime 10808 // Initialisation des métadonnées
9407     $metadonnee_dossier = $file['metadata'];
9408 softime 11228 // récupération de l'extension du fichier
9409     $extension = substr($metadonnee_dossier['filename'], strrpos($metadonnee_dossier['filename'], '.'));
9410     // Modification du libellé du document transmis au parapheur
9411     // pour le mettre sous la forme : instruction_xxx_libelle_lettretype.extension
9412     $metadonnee_dossier['filename'] = $this->getDocumentLibelle().$extension;
9413     $metadonnee_dossier['titre_document'] = $this->getDocumentTitre();
9414 softime 10808
9415     $metadonnee_dossier['url_di'] = sprintf(
9416 softime 15037 '%1$sapp/index.php?module=form&direct_link=true&obj=dossier_instruction&action=3&idx=%2$s&direct_field=dossier&direct_form=document_numerise&direct_action=4&direct_idx=%2$s',
9417 softime 11418 $this->f->get_param_base_path_metadata_url_di() !== null ? $this->f->get_param_base_path_metadata_url_di() : PATH_BASE_URL,
9418 softime 15037 $this->getVal('dossier')
9419 softime 10808 );
9420    
9421     $optional_data = null;
9422     // Si il y a des paramètres supplémentaire spécifié dans le signataire alors on les récupère
9423     if ($inst_signataire_arrete->getVal('parametre_parapheur') !== null && $inst_signataire_arrete->getVal('parametre_parapheur') !== '') {
9424     $optional_data = json_decode($inst_signataire_arrete->getVal('parametre_parapheur'), true);
9425     if (json_last_error() !== JSON_ERROR_NONE) {
9426     $this->correct = false;
9427     $this->addToMessage(__("Les paramètres supplémentaires envoyés au parapheur ne sont pas au bon format."));
9428     $this->addToLog(__METHOD__."(): ".
9429     __("Erreur lors du décodage du format json des paramètres supplémentaires envoyé au parapheur.
9430     Tableau : ").var_export($inst_signataire_arrete->getVal('parametre_parapheur'), true)
9431     );
9432     // Termine le traitement
9433     return $this->end_treatment(__METHOD__, false);
9434     }
9435     }
9436    
9437 softime 10573 // Appel de la méthode de l'abstracteur send_for_signature()
9438     // Cette méthode doit retourner un tableau de valeur
9439     try {
9440 softime 10808 $result = $inst_es->send_for_signature($data, $file['file_content'], $metadonnee_dossier, $optional_data);
9441 softime 10573 } catch (electronicsignature_exception $e) {
9442     $this->handle_electronicsignature_exception($e);
9443     return $this->end_treatment(__METHOD__, false);
9444     }
9445    
9446     // Après avoir reçu le résultat du parapheur, il faut mettre à jour les champs
9447     $valF = array();
9448    
9449     // Pour appeler la fonction modifier il faut traiter tous les champs de l'objet
9450     foreach($this->champs as $identifiant => $champ) {
9451     $valF[$champ] = $this->val[$identifiant];
9452     }
9453     // On fait ensuite nos modifications spécifiques
9454     $valF['id_parapheur_signature'] = $result['id_parapheur_signature'];
9455     $valF['statut_signature'] = $result['statut'];
9456     $valF['commentaire_signature'] = isset($result['commentaire_signature']) == true ? $result['commentaire_signature'] : null;
9457     $valF['date_envoi_signature'] = date("Y-m-d", strtotime($result['date_envoi_signature']));
9458     $valF['historique_signature'] = $this->get_updated_historique_signature($result);
9459 softime 15037 $valF['parapheur_lien_page_signature'] = isset($result['signature_page_url']) ? $result['signature_page_url'] : null;
9460 softime 10573 $ret = $this->modifier($valF);
9461    
9462     if ($ret === false) {
9463     $this->correct = false;
9464     $this->addToMessage(__("Une erreur est survenue lors de la mise à jour des champs."));
9465     // Termine le traitement
9466     return $this->end_treatment(__METHOD__, false);
9467     }
9468    
9469 softime 15037 // Notification du signataire
9470     if ($notification_required === true) {
9471     if ($this->notify_signer($signer_name, $signer_mail, $data['om_utilisateur_nom']) === false) {
9472     $msg = __("Une erreur s'est produite lors de la notification du signataire \"%s (%s)\". Annulation de l'envoi pour signature du document%s.");
9473     $this->addToMessage(sprintf($msg, $signer_name, $signer_mail, ''));
9474     $this->addToLog(sprintf($msg, $signer_name, $signer_mail, ' : '.$this->getVal($this->clePrimaire)), DEBUG_MODE);
9475     // Met à jour les valeurs de l'objet courant pour prendre en compte les modifications faites
9476     // precedemment
9477     $this->init_record_data($this->getVal($this->clePrimaire));
9478     $this->annuler_envoi_en_signature();
9479     $this->correct = false;
9480     return $this->end_treatment(__METHOD__, true);
9481     }
9482     }
9483    
9484 softime 10573 // Message
9485     $this->addToMessage(__("Le document a été envoyé pour signature dans le parapheur."));
9486 softime 15037 if ($this->f->is_option_enabled('option_afficher_lien_parapheur') === true
9487     && array_key_exists('signature_page_url', $result) === true) {
9488 softime 10573 $this->addToMessage(sprintf(
9489 softime 11228 '<br> > <a href="%1$s" title="%2$s" target="_blank">%2$s</a>',
9490     $result['signature_page_url'],
9491     __("Signez directement le document")
9492 softime 10573 ));
9493     }
9494 softime 15037 if ($notification_required !== true) {
9495     $this->addToMessage(__("L'envoi de la notification au signataire est effectué par la plateforme."));
9496     }
9497 softime 10573
9498     // Tout s'est bien passé, on termine le traitement
9499     return $this->end_treatment(__METHOD__, true);
9500     }
9501    
9502     /**
9503 softime 15037 * Notifie le signataire d'un document à signer.
9504     * Gère l'affichage des messages à destination de l'utilisateur selon l'état du traitement.
9505     * En cas d'erreur ajoute une ligne dans les logs de l'application.
9506     *
9507     * @param string $signer_name Nom du signataire
9508     * @param string $signer_mail Mail du signataire
9509     * @param string $user_name Nom de l'utilisateur openADS courant
9510     *
9511     * @return boolean true si succés, false si erreur
9512     */
9513     protected function notify_signer($signer_name, $signer_mail, $user_name) {
9514     // message d'erreur
9515     $err_msg_log = sprintf(
9516     __("Échec de la notification du signataire \"%s (%s)\" lors de l'envoi au parapaheur du document de l'instruction : %s"),
9517     $signer_name,
9518     $signer_mail,
9519     $this->getVal($this->clePrimaire)
9520     );
9521     $err_msg = sprintf(
9522     '%s %s (%s)"',
9523     __("Échec de la notification du signataire"),
9524     $signer_name,
9525     $signer_mail
9526     );
9527    
9528     // vérification des informations requises
9529     if (empty($signer_name)) {
9530     $err_detail = __("le nom du signataire est vide");
9531     $this->addToLog(__METHOD__.', '.$err_msg_log.', '.$err_detail, DEBUG_MODE);
9532     $this->addToMessage($err_msg.', '.$err_detail);
9533     return false;
9534     }
9535     if (empty($signer_mail)) {
9536     $err_detail = __("le courriel du signataire est vide");
9537     $this->addToLog(__METHOD__.', '.$err_msg_log.', '.$err_detail, DEBUG_MODE);
9538     $this->addToMessage($err_msg.', '.$err_detail);
9539     return false;
9540     }
9541     if (empty($this->getVal('dossier'))) {
9542     $err_detail = __("l'identifiant du dossier est vide");
9543     $this->addToLog(__METHOD__.', '.$err_msg_log.', '.$err_detail, DEBUG_MODE);
9544     $this->addToMessage($err_msg.', '.$err_detail);
9545     return false;
9546     }
9547    
9548     // ajout de la notification à la liste des notifications de l'instruction
9549     $instruction_id = $this->getVal($this->clePrimaire);
9550     $inst_notif = $this->f->get_inst__om_dbform(array(
9551     "obj" => "instruction_notification",
9552     "idx" => "]",
9553     ));
9554     $notif_val = array(
9555     'instruction_notification' => null,
9556     'instruction' => $instruction_id,
9557     'automatique' => true,
9558     'emetteur' => $user_name,
9559     'date_envoi' => null,
9560     'destinataire' => "$signer_name <$signer_mail>",
9561     'courriel' => $signer_mail,
9562     'date_premier_acces' => null,
9563     'statut' => '',
9564     'commentaire' => ''
9565     );
9566     $add_notif = $inst_notif->ajouter($notif_val);
9567     if ($add_notif === false) {
9568     $err_detail = __("Échec de l'ajout de la notification.");
9569     $this->addToLog(__METHOD__.' '.$err_msg_log.'. '.$err_detail.' Notification : '.var_export($notif_val, true), DEBUG_MODE);
9570     $this->addToMessage($err_msg);
9571     return false;
9572     }
9573     $notification_id = $inst_notif->getVal($inst_notif->clePrimaire);
9574    
9575     // ajout d'une tâche de notification (envoi du mail)
9576     $notification_task = $this->notification_by_task(
9577     $notification_id,
9578     $this->getVal('dossier'),
9579     'mail',
9580     'notification_signataire'
9581     );
9582     if ($notification_task === false) {
9583     $err_detail = sprintf(
9584     __("Échec de l'ajout de la tâche de notification (notification %s)."),
9585     $notification_id);
9586     $this->addToLog(__METHOD__.' '.$err_msg_log.'. '.$err_detail, DEBUG_MODE);
9587     $this->addToMessage($err_msg);
9588     return false;
9589     }
9590    
9591     // Vérification de la réussite de l'envoi du mail
9592     // Fais une requête pour récupérer la liste des notifications de signataire faites par mail
9593     // et associées à l'instruction en cours. Récupère uniquement la dernière qui doit être celle
9594     // qui viens d'être créée.
9595     // Si la tâche d'envoi du mail est en erreur alors on considère que l'envoi du mail a échoué.
9596     $qres = $this->f->get_one_result_from_db_query(
9597     sprintf(
9598     'SELECT
9599     state
9600     FROM
9601     %1$stask
9602     WHERE
9603     type = \'notification_signataire\'
9604     AND category = \'mail\'
9605     AND dossier = \'%2$s\'
9606     ORDER BY
9607     task DESC
9608     LIMIT 1',
9609     DB_PREFIXE,
9610     $this->f->db->escapeSimple($this->getVal('dossier'))
9611     ),
9612     array(
9613     'origin' => __METHOD__
9614     )
9615     );
9616     if ($qres['result'] === 'error') {
9617     $err_detail = sprintf(
9618     __("Échec de l'envoi du mail de notification (notification %s)."),
9619     $notification_id);
9620     $this->addToLog(__METHOD__.' '.$err_msg_log.'. '.$err_detail, DEBUG_MODE);
9621     $this->addToMessage($err_msg);
9622     return false;
9623     }
9624    
9625     // succès de la planification de la notification
9626     $this->addToMessage(sprintf(
9627     __('Le signataire "%s (%s)" sera notifié prochainement'),
9628     $signer_name,
9629     $signer_mail));
9630     return true;
9631     }
9632    
9633     /**
9634 softime 11876 * Permet de récupérer la bonne date limite en fonction de si l'instruction
9635     * est en incomplet notifié ou non.
9636     * On peut ajouter des jours à cette date grâce au paramètre "delay".
9637     * Cette fonction est utilisée dans un cas spécifique où on veut envoyer
9638     * l'instruction en signature le jour de la date limite.
9639     *
9640     * @param int $delay Le nombre de jour à ajouter à la date limite.
9641     *
9642     * @return string $date_limite la date limite calculé ou false
9643     */
9644     private function compute_date_limite($delay) {
9645     // Instanciation de l'objet dossier
9646     $inst_dossier = $this->f->get_inst__om_dbform(array(
9647     'obj' => 'dossier',
9648     'idx' => $this->getVal('dossier'),
9649     ));
9650    
9651     $date_to_compute = null;
9652     if ($inst_dossier->getVal('incomplet_notifie') === 't') {
9653     $date_to_compute = $inst_dossier->getVal('date_limite_incompletude');
9654     } else {
9655     $date_to_compute = $inst_dossier->getVal('date_limite');
9656     }
9657 softime 14064 if ($date_to_compute != null) {
9658     return date("Y-m-d", strtotime($date_to_compute."+ $delay days"));
9659     }
9660 softime 11876
9661 softime 14064 return null;
9662 softime 11876 }
9663    
9664     /**
9665 softime 10573 * Permet de récupérer la traduction de la valeur de statut_signature
9666     *
9667     * @return string la valeur de statut_signature traduite | false
9668     */
9669     function get_trad_for_statut($value_to_trad){
9670     $statut_signature_tab = array(
9671     'waiting' => __('en préparation'),
9672     'in_progress' => __('en cours de signature'),
9673     'canceled' => __('signature annulée'),
9674 softime 10808 'expired' => __('délai de signature expiré'),
9675 softime 10573 'finished' => __('signé')
9676     );
9677     if (array_key_exists($value_to_trad, $statut_signature_tab) === true) {
9678     return $statut_signature_tab[$value_to_trad];
9679     }
9680    
9681     return false;
9682     }
9683    
9684     /**
9685     * Permet de mettre à jour le tableau json sotcké dans le champ historique_signature
9686     *
9687     * @return string (json) la valeur de historique_signature mis à jour | false
9688     */
9689     function get_updated_historique_signature($historique_signature_values) {
9690    
9691     $historique_signature_value_tab = $this->get_historique_signature_decoded();
9692    
9693     if ($historique_signature_value_tab === false) {
9694     $this->addToLog(__METHOD__."(): erreur historique signature", DEBUG_MODE);
9695     return false;
9696     }
9697    
9698     $last_val_historique_signature = array();
9699    
9700     // Si la tableau récupéré n'est pas vide alors
9701     // on récupère la dernière ligne du tableau
9702     if (empty($historique_signature_value_tab) === false) {
9703     $last_val_historique_signature = end($historique_signature_value_tab);
9704     }
9705    
9706     $format_date = '';
9707     $format_date_hour = '';
9708     $date_converted=array();
9709    
9710     $date_to_convert = array(
9711     'date_envoi_signature' => $historique_signature_values['date_envoi_signature'],
9712 softime 11876 'date_limite_instruction' => $this->compute_date_limite(0),
9713 softime 10573 'date_retour_signature' => $historique_signature_values['date_retour_signature']
9714     );
9715    
9716     // Conversion des dates en fonction de leur format
9717     foreach ($date_to_convert as $key => $value) {
9718     $date_converted[$key] = null;
9719     if ($value != null) {
9720     $format_date = 'd/m/Y';
9721     $format_date_hour = 'd/m/Y H:i:s';
9722     $date_converted[$key] = empty(date_parse($value)['hour']) === false ? date($format_date_hour, strtotime($value)) : date($format_date, strtotime($value));
9723     }
9724     }
9725    
9726     // Ce tableau permet de lister les colonnes de historique_signature et de les rendre traduisibles.
9727     // Il faut en effet mettre les gettext avec l'intitulé explicite au moins
9728     // une fois afin qu'il puisse être reconnu par le logiciel de traduction.
9729     $tab_for_columns_trad = array(
9730     __('entry_date'),
9731     __('id_parapheur_signature'),
9732     __('emetteur'),
9733     __('signataire'),
9734     __('date_envoi'),
9735     __('date_limite'),
9736     __('date_retour'),
9737     __('statut_signature'),
9738     __('commentaire_signature')
9739     );
9740    
9741     array_push($historique_signature_value_tab, array(
9742     'entry_date' => date('d/m/Y H:i:s'),
9743     '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'],
9744     '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'],
9745     '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'],
9746     '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'],
9747     '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'],
9748     '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'],
9749     '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']),
9750     'commentaire_signature' => isset($historique_signature_values['commentaire_signature']) === false || $historique_signature_values['commentaire_signature'] == null ? null : $historique_signature_values['commentaire_signature'],
9751     ));
9752    
9753     return json_encode($historique_signature_value_tab, JSON_HEX_APOS);
9754     }
9755 softime 11876
9756     /**
9757     * TREATMENT - annuler_envoi_en_signature
9758     *
9759     * Permet d'annuler l'envoi du document de l'instruction au parapheur pour signature
9760     *
9761     * @return boolean true si l'annulation a été effectué avec succès false sinon
9762     */
9763     function annuler_envoi_en_signature() {
9764     $this->begin_treatment(__METHOD__);
9765     $this->correct = true;
9766 softime 10573
9767 softime 11876 //Instanciation de la classe electronicsignature
9768     $inst_es = $this->get_electronicsignature_instance();
9769     if ($inst_es === false) {
9770     $this->correct = false;
9771     return $this->end_treatment(__METHOD__, false);
9772     }
9773 softime 10573
9774 softime 11876 $data = array();
9775     if (! empty($this->getVal('id_parapheur_signature'))) {
9776     $data['id_parapheur_signature'] = $this->getVal('id_parapheur_signature');
9777     } else {
9778     $this->correct = false;
9779     $this->addToMessage(__("Il n'y a pas d'identifiant de parapheur."));
9780     return $this->end_treatment(__METHOD__, false);
9781     }
9782    
9783     // Appel de la méthode de l'abstracteur cancel_send_for_signature()
9784     // Cette méthode doit retourner un tableau de valeur
9785     try {
9786     $result = $inst_es->cancel_send_for_signature($data);
9787     } catch (electronicsignature_exception $e) {
9788     $this->handle_electronicsignature_exception($e);
9789     return $this->end_treatment(__METHOD__, false);
9790     }
9791    
9792     // Après avoir reçu le résultat du parapheur, il faut mettre à jour les champs
9793     $valF = array();
9794    
9795     // Pour appeler la fonction modifier il faut traiter tous les champs de l'objet
9796     foreach($this->champs as $identifiant => $champ) {
9797     $valF[$champ] = $this->val[$identifiant];
9798     }
9799     // On fait ensuite nos modifications spécifiques
9800     $valF['id_parapheur_signature'] = null;
9801     $valF['statut_signature'] = $result['statut'];
9802     $valF['commentaire_signature'] = isset($result['commentaire_signature']) == true ? $result['commentaire_signature'] : null;
9803     $valF['date_envoi_signature'] = null;
9804     $valF['historique_signature'] = $this->get_updated_historique_signature($result);
9805    
9806     $ret = $this->modifier($valF);
9807    
9808     if ($ret === false) {
9809     $this->correct = false;
9810     $this->addToMessage(__("Une erreur est survenue lors de la mise à jour des champs."));
9811     // Termine le traitement
9812     return $this->end_treatment(__METHOD__, false);
9813     }
9814    
9815     // Message
9816     $this->addToMessage(__("L'annulation a été effectuée avec succès."));
9817    
9818     // Tout s'est bien passé, on termine le traitement
9819     return $this->end_treatment(__METHOD__, true);
9820     }
9821    
9822    
9823 softime 10573 /**
9824     * Récupère le contenu du champ historique_signature et le converti en tableau
9825     *
9826     * @return array sinon false en cas d'erreur
9827     */
9828     protected function get_historique_signature_decoded() {
9829 softime 11876 $val = str_replace("'", '"', $this->getVal('historique_signature'));
9830     if ($val === '' || $val == 'false') {
9831 softime 10573 $val = json_encode(array());
9832     }
9833     if($this->isJson($val) === false) {
9834     return false;
9835     }
9836     return json_decode($val, true);
9837     }
9838    
9839 softime 10808 /**
9840     * Récupère les informations à afficher dans le tableau de suivi à l'aide
9841     * d'une requête sql. Stocke ces informations dans un tableau.
9842 softime 12433 * Converti le tableau au format json et renvoi le json obtenu.
9843 softime 10808 *
9844 softime 12433 * Pour identifier quel suivi est affiché (notification des demandeurs, des services ou
9845     * de tiers) ce sont les tâches liées aux notifications qui sont utilisés.
9846     * La clause where de la requête est construite à partir du tableau contenant les types
9847     * de tâches fourni en paramètre.
9848     * Il est également possible d'afficher les notifications n'étant pas lié à des tâches.
9849     *
9850     * Si le suivi concerne la notification des demandeurs via le portail citoyen,
9851     * la date de premier accès ne sera pas affichée.
9852     *
9853     * @param array liste des tâches permettant d'identifier quelles notification afficher
9854     * @param boolean permet d'afficher les notifications non liées à des tâches
9855 softime 10808 * @return json
9856     */
9857 softime 15037 public function get_json_suivi_notification($typeTache, $nonLieTache = false) {
9858 softime 11585 $whereTypeTache = '';
9859 softime 15037 $sqlTaskNull = 'INNER';
9860 softime 12654
9861     // Liste des champs à afficher. Permet également la traduction des noms de colonnes.
9862     $listeChampsTrad = array(
9863     __('emetteur'),
9864     __('date_envoi'),
9865     __('destinataire'),
9866     __('date_premier_acces'),
9867     __('instruction'),
9868     __('annexes'),
9869     __('statut'),
9870     __('commentaire')
9871     );
9872     $listeChamps = array(
9873     'emetteur',
9874     'date_envoi',
9875     'destinataire',
9876     'date_premier_acces',
9877     'instruction',
9878     'annexes',
9879     'statut',
9880     'commentaire'
9881     );
9882    
9883 softime 12124 // Défini si on veux que la requête récupère également les notifications qui n'ont pas
9884     // de tâches associées. C'est le cas pour les notifications de demandeurs lorsque la
9885     // notification du demandeur principal n'a pas pu être envoyée à cause d'un mauvais
9886     // paramétrage
9887     if(is_bool($nonLieTache) && $nonLieTache === true) {
9888 softime 15037 $sqlTaskNull = 'LEFT';
9889 softime 12124 }
9890     // Prépare la clause where pour ne récupérer que les notifications liées à certain type de tâches
9891     // Permet de différencier les notifications des demandeurs de celle des services et de celles des
9892     // tiers consulté
9893 softime 12433 if (is_array($typeTache) && $typeTache != array()) {
9894 softime 11585 if (is_array($typeTache)) {
9895     $whereTypeTache = sprintf(
9896 softime 15835 'AND (task.task IS NULL OR (task.task IS NOT NULL AND task.type IN (%1$s)))',
9897 softime 15037 "'".implode("', '", $typeTache)."'"
9898 softime 11585 );
9899     }
9900 softime 12433 // La date de premier accès n'a pas besoin d'être renseigné pour
9901     // les notifications des demandeurs via le portail citoyen.
9902     // Les notifications des demandeurs sont liés à 3 types de tâches
9903     // notification_recepisse, notification_instruction, notification_decision
9904     // Si le suivi de la notification concerne un de ces types de tâches on
9905     // considère que c'est une notification de demandeurs.
9906     // Dans ce cas on vérifie si cette notification est paramétrée pour passer
9907     // via le portail. Par défaut si rien n'est paramétré on considère que la
9908     // notification est faite via le portail
9909     if ((in_array('notification_recepisse', $typeTache) ||
9910     in_array('notification_instruction', $typeTache) ||
9911     in_array('notification_decision', $typeTache))) {
9912     $dossier = $this->getVal('dossier');
9913     $collectivite_di = $this->get_dossier_instruction_om_collectivite($dossier);
9914     $modeNotification = $this->f->get_param_option_notification($collectivite_di);
9915 softime 14064 if ($modeNotification === PORTAL) {
9916 softime 12654 $listeChamps = array(
9917     'emetteur',
9918     'date_envoi',
9919     'destinataire',
9920     'instruction',
9921     'annexes',
9922     'statut',
9923     'commentaire'
9924     );
9925 softime 12433 }
9926     }
9927 softime 12654 // Il n'y a pas d'annexe pour la notification des communes donc pas besoin
9928     // de les afficher dans le suivi
9929     if (in_array('notification_depot_demat', $typeTache)) {
9930     $listeChamps = array(
9931     'emetteur',
9932     'date_envoi',
9933     'destinataire',
9934     'instruction',
9935     'statut',
9936     'commentaire'
9937     );
9938     }
9939 softime 11585 }
9940 softime 12433
9941 softime 10808 $valSuivi = array();
9942     // Récupération des infos nécessaires à l'affichage du tableau
9943     $sql = sprintf(
9944 softime 11585 'SELECT DISTINCT
9945 softime 10869 instruction_notification.instruction_notification,
9946 softime 12124 -- Affiche la mention automatique avec le nom de l emetteur si la notification a été envoyé automatiquement
9947 softime 10869 CASE WHEN instruction_notification.automatique = TRUE
9948     THEN TRIM(CONCAT(instruction_notification.emetteur, \' \', \'(automatique)\'))
9949     ELSE instruction_notification.emetteur
9950     END as emetteur,
9951 softime 10808 date_envoi,
9952     instruction_notification.destinataire,
9953 softime 10869 instruction_notification.date_premier_acces,
9954 softime 10808 evenement.libelle as instruction,
9955 softime 10869 instruction_notification.statut,
9956     instruction_notification.commentaire,
9957 softime 12433 annexes.instruction_annexe as annexes
9958 softime 10808 FROM
9959     %1$sinstruction_notification
9960     LEFT JOIN %1$sinstruction
9961     ON instruction.instruction = instruction_notification.instruction
9962     LEFT JOIN %1$sevenement
9963     ON instruction.evenement = evenement.evenement
9964 softime 10869 LEFT JOIN %1$sinstruction_notification_document
9965     ON instruction_notification.instruction_notification = instruction_notification_document.instruction_notification
9966     AND instruction_notification_document.annexe = true
9967 softime 12124 -- Récupère les tâches liées au notification pour pouvoir par la suite identifier le type de notification
9968 softime 15037 %4$s JOIN %1$stask
9969 softime 11585 ON instruction_notification.instruction_notification::CHARACTER VARYING = task.object_id
9970 softime 15835 AND task.type LIKE \'notification%%\'
9971 softime 12124 -- Récupération de la liste des annexes sous la forme d une liste
9972 softime 11585 LEFT JOIN (
9973     SELECT
9974     instruction_notification,
9975 softime 12124 -- Récupère la liste des annexes de la notification
9976 softime 12433 -- sous la forme d un json pour récupérer toutes les informatiosn nécessaire
9977     -- à l affichage du lien vers les annexes
9978     CONCAT(
9979     \'[\',
9980     STRING_AGG(
9981     -- Affiche le nom du fichier selon le type de document/pièce
9982     CASE
9983     WHEN instruction_notification_document.document_type = \'instruction\'
9984     THEN CONCAT(
9985     \'{
9986     "obj" : "instruction",
9987     "champs" : "om_fichier_instruction",
9988     "label" : "\', evenement.libelle, \'",
9989     "id" : "\', instruction.instruction,\'"
9990     }\'
9991     )
9992     WHEN instruction_notification_document.document_type = \'consultation\'
9993     THEN CONCAT(
9994 softime 15218 \'{
9995     "obj" : "consultation",
9996     "champs" : "fichier",
9997     "label" : "\', CONCAT_WS( \' - \', \'Avis\', service.libelle, to_char(consultation.date_retour,\'DD/MM/YYYY\')), \'",
9998     "id" : "\', consultation.consultation, \'"
9999     }\'
10000 softime 12433 )
10001     ELSE
10002     CONCAT(
10003     \'{
10004     "obj" : "document_numerise",
10005     "champs" : "uid",
10006     "label" : "\', document_numerise.nom_fichier, \' - \', document_numerise_type.libelle, \'",
10007     "id" : "\', document_numerise.document_numerise,\'"
10008     }\'
10009     )
10010     END,
10011     \', \'),
10012     \']\'
10013 softime 11585 ) AS instruction_annexe
10014     FROM
10015     %1$sinstruction_notification_document
10016     LEFT JOIN %1$sinstruction
10017     ON instruction_notification_document.instruction = instruction.instruction
10018     LEFT JOIN %1$sevenement
10019     ON instruction.evenement = evenement.evenement
10020     LEFT JOIN %1$sconsultation
10021     ON instruction_notification_document.document_id = consultation.consultation
10022     LEFT JOIN %1$sservice
10023     ON consultation.service = service.service
10024 softime 12433 LEFT JOIN %1$sdocument_numerise
10025     ON instruction_notification_document.document_id = document_numerise.document_numerise
10026     LEFT JOIN %1$sdocument_numerise_type
10027     ON document_numerise.document_numerise_type = document_numerise_type.document_numerise_type
10028 softime 11585 WHERE
10029     instruction_notification_document.annexe = \'t\'
10030     GROUP BY
10031     instruction_notification
10032     ) AS annexes
10033     ON
10034     annexes.instruction_notification = instruction_notification.instruction_notification
10035 softime 10808 WHERE
10036 softime 10869 instruction.instruction = %2$s
10037 softime 15835 %3$s
10038 softime 10869 ORDER BY
10039     date_envoi ASC, instruction_notification.destinataire ASC',
10040 softime 10808 DB_PREFIXE,
10041 softime 14542 intval($this->getVal('instruction')),
10042 softime 15037 $whereTypeTache,
10043     $sqlTaskNull
10044 softime 10808 );
10045 softime 14542 $qres = $this->f->get_all_results_from_db_query($sql, array(
10046     "origin" => __METHOD__
10047     )
10048     );
10049 softime 12433 // Préparation du lien de téléchargement des annexes
10050     $htmlList =
10051     '<style>
10052     #content .gridjs-td a.lien_annexe {
10053     text-decoration : underline dotted 1px;
10054     }
10055     #content a.lien_annexe:hover {
10056     text-decoration : underline solid 1px;
10057     color : #46aede;
10058     }
10059     ol {padding-left : 10px;}
10060     </style>
10061     <ol>%1$s</ol>';
10062     $lienTelechargement =
10063     '<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">
10064     Annexe
10065     </a>';
10066 softime 10808 // Stockage des infos de chaque notification dans un tableau
10067 softime 14542 foreach ($qres['result'] as $row) {
10068 softime 10808 $valNotif = array();
10069     foreach($listeChamps as $champ) {
10070     $valNotif[$champ] = $row[$champ];
10071 softime 10815 if (($champ === 'date_envoi'
10072     || $champ === 'date_premier_acces')
10073     && $row[$champ] !== null
10074     && $row[$champ] !== '') {
10075 softime 10814 //
10076     $valNotif[$champ] = date('d/m/Y H:i:s', strtotime($row[$champ]));
10077 softime 12433 } else if ($champ === 'annexes') {
10078     $listeAnnexe = '';
10079     $infoAnnexes = json_decode($row[$champ], true);
10080     if (! empty($infoAnnexes) && json_last_error() === JSON_ERROR_NONE) {
10081     // A partir des infos récupérées prépare le code html du lien vers chacune
10082     // des annexes et ajoute un élément de liste par annexe
10083     foreach($infoAnnexes as $annexe) {
10084     $listeAnnexe .= sprintf(
10085     '<li>%s</li>',
10086     sprintf($lienTelechargement,
10087     $annexe['obj'],
10088     $annexe['champs'],
10089     $annexe['id'],
10090     $annexe['label']
10091     )
10092     );
10093     }
10094     // Construction de la liste des annexes
10095     $valNotif[$champ] = sprintf(
10096     $htmlList,
10097     $listeAnnexe
10098     );
10099     }
10100 softime 10814 }
10101 softime 10808 }
10102     array_push($valSuivi, $valNotif);
10103     }
10104    
10105     // Passage du tableau au format json
10106     return json_encode($valSuivi, JSON_HEX_APOS);
10107     }
10108    
10109 softime 10573 /**
10110     * Traitement des erreurs retournées par l'abstracteur electronicsignature.
10111     *
10112     * @param electronicsignature_exception $exception Exception retournée par l'abstracteur.
10113     *
10114     * @return void
10115     */
10116     public function handle_electronicsignature_exception(electronicsignature_exception $exception) {
10117     $this->f->displayMessage('error', $exception->getMessage());
10118     }
10119    
10120    
10121     /**
10122     * Retourne une instance du connecteur electronicsignature, et la créer si elle n'existe pas.
10123     *
10124     * @param boolean $with_handle_error Flag pour afficher ou non le message d'erreur à l'utilisateur.
10125     * @return electronicsignature Instance de l'abstracteur.
10126     */
10127     public function get_electronicsignature_instance($with_handle_error = true) {
10128     if(isset($this->electronicsignature_instance)) {
10129     return $this->electronicsignature_instance;
10130     }
10131     // Instanciation du connecteur electronicsignature
10132     try {
10133     require_once "electronicsignature.class.php";
10134     $collectivites = array("collectivite_idx" => $this->get_dossier_instruction_om_collectivite(), "collectivite_multi_idx" => $this->f->get_idx_collectivite_multi());
10135     $this->electronicsignature_instance = new electronicsignature($collectivites);
10136     } catch (electronicsignature_exception $e) {
10137     if ($with_handle_error === true) {
10138     $this->handle_electronicsignature_exception($e);
10139     }
10140     return false;
10141     }
10142     return $this->electronicsignature_instance;
10143     }
10144    
10145     /**
10146 softime 11418 * TREATMENT - envoyer_au_controle_de_legalite
10147     *
10148     * Ajoute la tâche envoi_CL.
10149     * C'est le traitement de la tâche qui mettra à jour la date d'envoi au contrôle de légalité.
10150     *
10151     * @return [type] [description]
10152     */
10153     function envoyer_au_controle_de_legalite() {
10154     $this->begin_treatment(__METHOD__);
10155     $this->correct = true;
10156    
10157     //
10158     if ($this->can_be_sended_to_cl() === true) {
10159     // Création de la task 'envoi_CL'
10160     $inst_task = $this->f->get_inst__om_dbform(array(
10161     "obj" => "task",
10162     "idx" => 0,
10163     ));
10164     $task_val = array(
10165     'type' => 'envoi_CL',
10166     'object_id' => $this->getVal('instruction'),
10167     'dossier' => $this->getVal('dossier'),
10168     );
10169     // Change l'état de la tâche de notification en fonction de l'état de
10170     // transmission du dossier d'instruction
10171     $inst_di = $this->get_inst_dossier($this->getVal('dossier'));
10172     if ($this->f->is_option_mode_service_consulte_enabled() === false
10173     && ($inst_di->getVal('etat_transmission_platau') == 'non_transmissible'
10174     || $inst_di->getVal('etat_transmission_platau') == 'transmis_mais_non_transmissible')) {
10175     //
10176     $task_val['state'] = $inst_task::STATUS_DRAFT;
10177     }
10178     $add_task = $inst_task->add_task(array('val' => $task_val));
10179     if ($add_task === false) {
10180     $this->addToMessage(sprintf('%s %s',
10181     __("Une erreur s'est produite lors de la création tâche."),
10182     __("Veuillez contacter votre administrateur.")
10183     ));
10184     $this->correct = false;
10185     return $this->end_treatment(__METHOD__, false);
10186     }
10187     // Mise à jour du champs 'envoye_cl_platau'
10188     $instr_val = array(
10189     'envoye_cl_platau' => 't',
10190     );
10191     $res = $this->f->db->autoExecute(
10192     DB_PREFIXE.$this->table,
10193     $instr_val,
10194     DB_AUTOQUERY_UPDATE,
10195     $this->getCle($this->getVal($this->clePrimaire))
10196     );
10197 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);
10198 softime 11418 if ($this->f->isDatabaseError($res, true) === true) {
10199     $this->addToMessage(sprintf('%s %s',
10200     __("Une erreur s'est produite lors de la mise à jour de l'instruction."),
10201     __("Veuillez contacter votre administrateur.")
10202     ));
10203     $this->correct = false;
10204     return $this->end_treatment(__METHOD__, false);
10205     }
10206     // Message de validation à l'utilisateur
10207     $this->addToMessage(__('Votre demande de transfert au contrôle de légalité à bien été prise en compte.'));
10208     $this->addToMessage(__("La date d'envoi au contrôle de légalité sera mise à jour ultérieurement."));
10209     }
10210     //
10211     return $this->end_treatment(__METHOD__, true);
10212     }
10213    
10214    
10215     /**
10216 softime 8593 * Retourne le lien de retour (VIEW formulaire et VIEW sousformulaire).
10217     *
10218     * @param string $view Appel dans le contexte de la vue 'formulaire' ou de
10219     * la vue 'sousformulaire'.
10220     *
10221     * @return string
10222     */
10223     function get_back_link($view = "formulaire") {
10224     //
10225     $href = parent::get_back_link($view);
10226     //
10227     $crud = $this->get_action_crud();
10228 mbroquet 3730
10229 softime 8593 // Redirection vers le formulaire de modification à la validation du
10230     // formulaire d'ajout si l'événement associé possède une lettre type
10231     if (($crud === 'create'
10232     || ($crud === null
10233     && $this->getParameter('maj') == 0))
10234     && $this->correct == true
10235     && $this->evenement_has_an_edition($this->valF['evenement']) === true) {
10236 softime 7996
10237 softime 8593 // On instancie l'instruction
10238     $inst_instruction = $this->f->get_inst__om_dbform(array(
10239     "obj" => "instruction",
10240     "idx" => $this->valF[$this->clePrimaire],
10241     ));
10242    
10243     // Si l'instruction n'est pas finalisée automatiquement
10244     if ($inst_instruction->getVal('om_final_instruction') !== 't') {
10245     $href = str_replace("&action=3", "&action=1", $href);
10246     //
10247     if (strpos($href, "&retour=tab") !== false) {
10248     $href = str_replace("&retour=tab", "&retour= form", $href);
10249     } else {
10250     $href .= "&retour=form";
10251     }
10252     }
10253     }
10254    
10255     //
10256     return $href;
10257     }
10258    
10259 softime 10573 public function view_json_data() {
10260     $this->checkAccessibility();
10261     $this->f->disableLog();
10262     $view = $this->get_json_data();
10263     printf(json_encode($view));
10264     }
10265    
10266     public function get_json_data() {
10267     $val = array_combine($this->champs, $this->val);
10268     foreach ($val as $key => $value) {
10269     $val[$key] = strip_tags($value);
10270     }
10271     $val['tacite'] = 'f';
10272     $inst_ad = $this->f->get_inst__om_dbform(array(
10273     "obj" => "avis_decision",
10274     "idx" => $val['avis_decision'],
10275     ));
10276     if (preg_match('/[tT]acite/', $inst_ad->getVal('libelle')) === 1) {
10277     $val['tacite'] = 't';
10278     }
10279     return $val;
10280     }
10281    
10282 softime 13528 /**
10283     * Permet de récupérer l'identifiant de l'instruction sur le dossier, ayant
10284     * comme événement lié le suivant définit dans l'événement de l'instruction
10285     * instanciée.
10286     *
10287     * @param string $next_type Correspond aux trois déclenchement automatique
10288     * de création d'instruction paramétré sur un événement.
10289     * @param integer $instruction Identifiant de l'instruction à instancier.
10290     * @return mixed Identifiant de l'instruction recherchée ou false.
10291     */
10292 softime 11418 public function get_related_instructions_next($next_type = 'retour_signature', $instruction = null) {
10293     if (in_array($next_type, array('retour_signature', 'retour_ar', 'suivant_tacite', )) === false) {
10294     return false;
10295     }
10296     $result = array();
10297     $evenements = array();
10298     if ($instruction === null) {
10299     $instruction = $this->getVal($this->clePrimaire);
10300     $evenement = $this->getVal('evenement');
10301     $dossier = $this->getVal('dossier');
10302     } else {
10303     $inst = $this->f->get_inst__om_dbform(array(
10304     "obj" => "instruction",
10305     "idx" => $instruction,
10306     ));
10307     $evenement = $inst->getVal('evenement');
10308     $dossier = $inst->getVal('dossier');
10309     }
10310 softime 13528 // Récupération de l'identifiant de l'événement paramétré comme suivant
10311     // sur l'instruction instanciée
10312 softime 13137 $qres = $this->f->get_one_result_from_db_query(
10313     sprintf(
10314     'SELECT
10315     evenement_%3$s
10316     FROM
10317     %1$sevenement
10318     WHERE
10319     evenement = %2$s',
10320     DB_PREFIXE,
10321     intval($evenement),
10322     $next_type
10323     ),
10324     array(
10325     "origin" => __METHOD__,
10326     "force_return" => true,
10327     )
10328 softime 11418 );
10329 softime 13137 if ($qres["code"] !== "OK") {
10330 softime 11418 return false;
10331     }
10332 softime 13137 $ev_next = $qres["result"];
10333 softime 13528 // Récupération de l'instruction dans le dossier utilisant l'événement
10334     // suivant identifié dans la requête précédente
10335     $qres = $this->f->get_one_result_from_db_query(
10336 softime 13137 sprintf(
10337     'SELECT
10338     MAX(instruction.instruction) as instruction
10339     FROM
10340     %1$sinstruction
10341     WHERE
10342     dossier = \'%3$s\'
10343     AND evenement = %2$s',
10344     DB_PREFIXE,
10345     intval($ev_next),
10346 softime 14064 $this->f->db->escapeSimple($dossier)
10347 softime 13137 ),
10348     array(
10349     "origin" => __METHOD__,
10350     "force_return" => true,
10351     )
10352 softime 11418 );
10353 softime 13137 if ($qres["code"] !== "OK") {
10354 softime 11418 return false;
10355     }
10356 softime 13137 return $qres["result"];
10357 softime 11418 }
10358    
10359 softime 10573 public function get_related_instructions($instruction = null) {
10360     $result = array();
10361     $evenements = array();
10362     if ($instruction === null) {
10363     $instruction = $this->getVal($this->clePrimaire);
10364     $evenement = $this->getVal('evenement');
10365     $dossier = $this->getVal('dossier');
10366     } else {
10367     $inst = $this->f->get_inst__om_dbform(array(
10368     "obj" => "instruction",
10369     "idx" => $instruction,
10370     ));
10371     $evenement = $inst->getVal('evenement');
10372     $dossier = $inst->getVal('dossier');
10373     }
10374     //
10375 softime 13137 $qres = $this->f->get_one_result_from_db_query(
10376     sprintf(
10377     'SELECT
10378     evenement
10379     FROM
10380     %1$sevenement
10381     WHERE
10382     evenement_retour_ar = %2$s
10383     OR evenement_retour_signature = %2$s',
10384     DB_PREFIXE,
10385     intval($evenement)
10386     ),
10387     array(
10388     "origin" => __METHOD__,
10389     "force_return" => true,
10390     )
10391 softime 10573 );
10392 softime 13137 if ($qres["code"] !== "OK") {
10393 softime 10573 return false;
10394     }
10395 softime 13137 $ev_parent = $qres["result"];
10396 softime 10573 //
10397 softime 13137 $qres = $this->f->get_one_result_from_db_query(
10398     sprintf(
10399     'SELECT
10400     MAX(instruction.instruction) as instruction
10401     FROM
10402     %1$sinstruction
10403     WHERE
10404     dossier = \'%3$s\'
10405     AND evenement = %2$s',
10406     DB_PREFIXE,
10407     intval($ev_parent),
10408     $this->f->db->escapeSimple($dossier)
10409     ),
10410     array(
10411     "origin" => __METHOD__,
10412     "force_return" => true,
10413     )
10414 softime 10573 );
10415 softime 13137 if ($qres["code"] !== "OK") {
10416 softime 10573 return false;
10417     }
10418 softime 13137 $result[] = $qres["result"];
10419 softime 10573 //
10420 softime 13137 $qres = $this->f->get_one_result_from_db_query(
10421     sprintf(
10422     'SELECT
10423     evenement_retour_ar
10424     FROM
10425     %1$sevenement
10426     WHERE
10427 softime 14542 evenement = %2$d
10428     AND evenement_retour_ar != %3$d',
10429 softime 13137 DB_PREFIXE,
10430     intval($ev_parent),
10431     intval($evenement)
10432     ),
10433     array(
10434     "origin" => __METHOD__,
10435     "force_return" => true,
10436     )
10437 softime 10573 );
10438 softime 13137 if ($qres["code"] !== "OK") {
10439 softime 10573 return false;
10440     }
10441 softime 13137 $evenements[] = $qres["result"];
10442 softime 10573 //
10443 softime 13137 $qres = $this->f->get_one_result_from_db_query(
10444     sprintf(
10445     'SELECT
10446     evenement_retour_signature
10447     FROM
10448     %1$sevenement
10449     WHERE
10450     evenement = %2$s
10451     AND evenement_retour_signature != %3$s
10452     ',
10453     DB_PREFIXE,
10454     intval($ev_parent),
10455     intval($evenement)
10456     ),
10457     array(
10458     "origin" => __METHOD__,
10459     "force_return" => true,
10460     )
10461 softime 10573 );
10462 softime 13137 if ($qres["code"] !== "OK") {
10463 softime 10573 return false;
10464     }
10465 softime 13137 $evenements[] = $qres["result"];
10466 softime 10573 foreach ($evenements as $value) {
10467     if ($value !== null) {
10468 softime 13137 $qres = $this->f->get_one_result_from_db_query(
10469     sprintf(
10470     'SELECT
10471     MAX(instruction.instruction) as instruction
10472     FROM
10473     %1$sinstruction
10474     WHERE
10475     dossier = \'%3$s\'
10476     AND evenement = %2$s',
10477     DB_PREFIXE,
10478     intval($value),
10479     $this->f->db->escapeSimple($dossier)
10480     ),
10481     array(
10482     "origin" => __METHOD__,
10483     "force_return" => true,
10484     )
10485 softime 10573 );
10486 softime 13137 if ($qres["code"] !== "OK") {
10487 softime 10573 return false;
10488     }
10489 softime 13137 $result[] = $qres["result"];
10490 softime 10573 }
10491     }
10492     return $result;
10493     }
10494    
10495     protected function getDocumentType($champ = null) {
10496     $evenementId = $this->getVal('evenement');
10497     if (! empty($evenementId)) {
10498     $evenement = $this->f->findObjectById('evenement', $evenementId);
10499     if (! empty($evenement)) {
10500     return __("Instruction").':'.$evenement->getVal('libelle');
10501     }
10502     }
10503     return parent::getDocumentType();
10504     }
10505    
10506 softime 10808 /**
10507     * Récupère à l'aide d'une requête sql la liste des demandeurs
10508     * pouvant être notifié. C'est à dire les demandeurs acceptant
10509     * les notifications et pour lesquels une adresse mail existe.
10510     *
10511     * Dans le cas, d'une notification pour le portail citoyen, seul
10512     * le pétitionnaire principal doit être notifier et uniquement si
10513     * il a une adress mail et qu'il accepte les notifications.
10514     *
10515     * @param string identifiant du dossier
10516     * @param boolean true si il faut récupérer la liste des demandeurs notifiable
10517     * pour une notification de categorie portail
10518     * @return array liste des demandeurs pouvant être notifié
10519     */
10520     protected function get_demandeurs_notifiable($idDossier = null, $portail = false) {
10521     if ($idDossier === null) {
10522     $idDossier = $this->getVal('dossier');
10523     }
10524     // Ajoute une condition sur le where pour ne récupérer que le pétitionnaire principal
10525     // pour une notification depuis le portail citoyen
10526     $sqlPetitionnairePrincipal = '';
10527 softime 12124 // Gestion des champs nécessaires pour la notification d'un demandeur
10528     $condition_demandeur = "AND demandeur.notification = 't'
10529     AND demandeur.courriel IS NOT NULL";
10530 softime 10808 if ($portail === true) {
10531     $sqlPetitionnairePrincipal = 'AND lien_dossier_demandeur.petitionnaire_principal = true';
10532 softime 12124 $condition_demandeur = "AND (
10533     (notification = 't' AND courriel IS NOT NULL)
10534     OR demande.source_depot = 'portal'
10535     )";
10536 softime 10808 }
10537    
10538     $listeDemandeursNotifiable = array();
10539    
10540     // Requête de récupération des demandeurs
10541 softime 14542 $qres = $this->f->get_all_results_from_db_query(
10542     sprintf(
10543     'SELECT
10544     demandeur.demandeur,
10545     CASE
10546     WHEN demandeur.qualite=\'particulier\'
10547     THEN TRIM(CONCAT(demandeur.particulier_nom, \' \', demandeur.particulier_prenom, \' \', demandeur.courriel))
10548     ELSE
10549     TRIM(CONCAT(demandeur.personne_morale_raison_sociale, \' \', demandeur.personne_morale_denomination, \' \', demandeur.courriel))
10550     END AS destinataire,
10551     demandeur.courriel,
10552     petitionnaire_principal
10553     FROM
10554     %1$sdossier
10555     INNER JOIN %1$slien_dossier_demandeur
10556     ON dossier.dossier = lien_dossier_demandeur.dossier
10557     INNER JOIN %1$sdemandeur
10558     ON lien_dossier_demandeur.demandeur = demandeur.demandeur
10559     -- Récupération de la plus ancienne demande associée au dossier (la demande
10560     -- de création du dossier)
10561     INNER JOIN (
10562     SELECT
10563     demande,
10564     dossier_instruction,
10565     source_depot
10566     FROM
10567     %1$sdemande
10568     WHERE
10569     dossier_instruction = \'%2$s\'
10570     ORDER BY
10571     demande ASC
10572     LIMIT 1
10573     ) as demande
10574     ON dossier.dossier = demande.dossier_instruction
10575     WHERE
10576     dossier.dossier = \'%2$s\'
10577     %3$s
10578     %4$s',
10579     DB_PREFIXE,
10580     $this->f->db->escapeSimple($idDossier),
10581     $condition_demandeur,
10582     $sqlPetitionnairePrincipal
10583     ),
10584     array(
10585     "origin" => __METHOD__
10586     )
10587 softime 10808 );
10588     // Récupération des infos des demandeurs et stockage dans un tableau
10589     // ayant pour clé les id des demandeurs
10590 softime 14542 foreach ($qres['result'] as $row) {
10591 softime 10869 $listeDemandeursNotifiable[$row['demandeur']] = $row;
10592 softime 10808 }
10593    
10594     return $listeDemandeursNotifiable;
10595     }
10596    
10597     /**
10598     * Renvoie la liste des notifications liées à l'instruction
10599     *
10600     * @param integer id de l'instruction dont on cherche les notifications
10601     * @return array liste des instruction_notification liés à l'instruction
10602     */
10603 softime 12124 public function get_instruction_notification($id_instruction, $typeNotification = null, $nonLieTache = false) {
10604 softime 11585 $whereTypeTache = '';
10605 softime 15037 $sqlTaskNull = 'INNER';
10606 softime 12124 // Défini si on veux que la requête récupère également les notifications qui n'ont pas
10607     // de tâches associées. C'est le cas pour les notifications de demandeurs lorsque la
10608     // notification du demandeur principal n'a pas pu être envoyée à cause d'un mauvais
10609     // paramétrage
10610     if(is_bool($nonLieTache) && $nonLieTache === true) {
10611 softime 15037 $sqlTaskNull = 'LEFT';
10612 softime 12124 }
10613 softime 11585 if ($typeNotification != null) {
10614     if (is_array($typeNotification)) {
10615     $whereTypeTache = sprintf(
10616 softime 15037 'AND (task.type IN (%1$s))',
10617     "'".implode("', '", $typeNotification)."'"
10618 softime 11585 );
10619     } else {
10620     $whereTypeTache = sprintf(
10621 softime 15037 'AND (task.type = \'%1$s\')',
10622     $typeNotification
10623 softime 11585 );
10624     }
10625     }
10626 softime 10808 $listeInstrNotif = array();
10627 softime 14542 $qres = $this->f->get_all_results_from_db_query(
10628     sprintf('
10629     SELECT
10630     instruction_notification.instruction_notification
10631     FROM
10632     %1$sinstruction_notification
10633 softime 15037 %4$s JOIN %1$stask
10634 softime 14542 ON instruction_notification.instruction_notification::CHARACTER VARYING = task.object_id
10635 softime 15037 %3$s
10636 softime 14542 WHERE
10637 softime 15037 instruction = %2$s',
10638 softime 14542 DB_PREFIXE,
10639     intval($id_instruction),
10640 softime 15037 $whereTypeTache,
10641     $sqlTaskNull
10642 softime 14542 ),
10643     array(
10644     "origin" => __METHOD__
10645     )
10646 softime 10808 );
10647 softime 14542 foreach ($qres['result'] as $row) {
10648 softime 10808 $listeInstrNotif[] = $row['instruction_notification'];
10649     }
10650     return $listeInstrNotif;
10651     }
10652    
10653     /**
10654     * Crée une clé d'accès unique permettant à un utilisateur
10655     * anonyme de récupérer le document.
10656     *
10657     * @return string clé d'accès du document
10658     */
10659     protected function getCleAccesDocument() {
10660 softime 10869 // Initialisation d'un tableau
10661     $number_list = array();
10662    
10663     // Génération aléatoire d'un nombre sur 4 caractères, 4 fois
10664     for ($i = 0; $i < 4; $i++) {
10665     $number_list[] = str_pad(mt_rand(0, 9999), 4, 0, STR_PAD_LEFT);
10666     }
10667    
10668     // Transformation en chaîne tout en séparant les nombres par un "-"
10669     $result = implode('-', $number_list);
10670    
10671     // Vérifie si la clé existe déjà et si c'est le cas génére une nouvelle clé
10672     if ($this->getUidDocumentInstructionWithKey($result) != null) {
10673     return $this->getCleAccesDocument();
10674     }
10675    
10676     //
10677     return $result;
10678 softime 10808 }
10679    
10680     /**
10681 softime 10869 * Récupère une clé et renvoie l'uid du document liée à cette
10682     * clé. Si la clé n'existe pas renvoie null.
10683     *
10684     * @param string $cleGen clé dont on cherche l'instruction
10685     * @return integer|null
10686     */
10687     protected function getUidDocumentInstructionWithKey($cleGen) {
10688 softime 14064 $qres = $this->f->get_one_result_from_db_query(
10689     sprintf(
10690     'SELECT
10691     instruction.om_fichier_instruction
10692     FROM
10693     %1$sinstruction_notification_document
10694     LEFT JOIN %1$sinstruction
10695     ON instruction_notification_document.instruction = instruction.instruction
10696     WHERE
10697     instruction_notification_document.cle = \'%2$s\'',
10698     DB_PREFIXE,
10699     $this->f->db->escapeSimple($cleGen)
10700     ),
10701     array(
10702     "origin" => __METHOD__,
10703     )
10704 softime 10869 );
10705 softime 14064
10706     return $qres['result'];
10707 softime 10869 }
10708    
10709     /**
10710     * Récupère une clé, fait une requête pour récupérer l'id de la notification liée a cette clé.
10711     * Récupère l'instance de instruction_notification dont l'id a été récupéré et la renvoie.
10712     *
10713     * @param string $cleGen
10714     * @return instruction_notification
10715     */
10716     protected function getInstanceNotificationWithKey($key) {
10717 softime 14064 $qres = $this->f->get_one_result_from_db_query(
10718     sprintf(
10719     'SELECT
10720     instruction_notification
10721     FROM
10722     %1$sinstruction_notification_document
10723     WHERE
10724     cle = \'%2$s\'',
10725     DB_PREFIXE,
10726     $this->f->db->escapeSimple($key)
10727     ),
10728     array(
10729     "origin" => __METHOD__,
10730     )
10731 softime 10869 );
10732    
10733     // Récupération de l'instance de notification
10734     $instNotif = $this->f->get_inst__om_dbform(array(
10735     "obj" => "instruction_notification",
10736 softime 14064 "idx" => $qres['result'],
10737 softime 10869 ));
10738     return $instNotif;
10739     }
10740    
10741    
10742     /**
10743 softime 10808 * Affiche la page de téléchargement du document de la notification.
10744     *
10745     * @param boolean $content_only Affiche le contenu seulement.
10746     *
10747     * @return void
10748     */
10749 softime 10869 public function view_telecharger_document_anonym() {
10750 softime 10808 // Par défaut on considère qu'on va afficher le formulaire
10751     $idx = 0;
10752     // Flag d'erreur
10753     $error = false;
10754     // Message d'erreur
10755     $message = '';
10756    
10757 softime 10869 // Paramètres GET : récupération de la clé d'accès
10758     $cle_acces_document = $this->f->get_submitted_get_value('key');
10759 softime 10808 $cle_acces_document = $this->f->db->escapeSimple($cle_acces_document);
10760 softime 10869 // Vérification de l'existence de la clé et récupération de l'uid du fichier
10761     $uidFichier = $this->getUidDocumentInstructionWithKey($cle_acces_document);
10762     if ($uidFichier != null) {
10763     // Récupération du document
10764     $file = $this->f->storage->get($uidFichier);
10765 softime 10808
10766 softime 10869 // Headers
10767     header("Cache-Control: no-cache, must-revalidate"); // HTTP/1.1
10768     header("Expires: Sat, 26 Jul 1997 05:00:00 GMT"); // Date dans le passé
10769     header("Content-Type: ".$file['metadata']['mimetype']);
10770     header("Accept-Ranges: bytes");
10771     header("Content-Disposition: inline; filename=\"".$file['metadata']['filename']."\";" );
10772     // Affichage du document
10773     echo $file['file_content'];
10774 softime 10808
10775 softime 10869 // Récupération de la date de premier accès et maj du suivi uniquement
10776     // si la date de 1er accès n'a pas encore été remplis
10777     $inst_notif = $this->getInstanceNotificationWithKey($cle_acces_document);
10778     if ($inst_notif->getVal('date_premier_acces') == null ||
10779     $inst_notif->getVal('date_premier_acces') == '') {
10780     $notif_val = array();
10781     foreach ($inst_notif->champs as $champ) {
10782     $notif_val[$champ] = $inst_notif->getVal($champ);
10783     }
10784     $notif_val['date_premier_acces'] = date("d/m/Y H:i:s");
10785     $notif_val['statut'] = 'vu';
10786     $notif_val['commentaire'] = 'Le document a été vu';
10787     $suivi_notif = $inst_notif->modifier($notif_val);
10788 softime 10808 }
10789    
10790     } else {
10791 softime 10869 // Page vide 404
10792     printf('Ressource inexistante');
10793     header('HTTP/1.0 404 Not Found');
10794 softime 10808 }
10795     }
10796    
10797 softime 11228 /**
10798     * Récupère le titre du document envoyé au parapheur
10799     */
10800 softime 10808 protected function getDocumentTitre($champ = null) {
10801     $title = $this->getTitle();
10802     $dossier = $this->getDossier();
10803     return $dossier.' '.$title;
10804     }
10805    
10806 softime 10869 /**
10807 softime 11228 * Compose le nom du document à transmettre au parapheur.
10808     * Le nom ets composé de cette manière :
10809     * instruction_xxx_libelle_de_la_lettre_type_associee
10810     * ou xxx correspond au numéro de l'instruction
10811     */
10812     protected function getDocumentLibelle() {
10813     // Récupère le champ instruction
10814     $instruction = $this->getVal("instruction");
10815    
10816     // Requête sql servant à récupérer le titre du document
10817     // TO_CHAR() introduit un espace avant l'affichage du nombre
10818     // comme les espaces sont remplacé par des '_' dans le retour de la fonction
10819     // il n'est pas nécessaire de mettre un '_' après le mot instruction.
10820 softime 14064 $documentLibelle = $this->f->get_one_result_from_db_query(
10821     sprintf(
10822     'SELECT
10823     CONCAT(
10824     \'instruction\',
10825     TO_CHAR(instruction.instruction, \'000\'),
10826     \'_\',
10827     LOWER(om_lettretype.libelle)
10828     ) AS nom_fichier
10829     FROM
10830     %1$sinstruction
10831     LEFT JOIN %1$som_lettretype
10832     ON om_lettretype.id = instruction.lettretype
10833     WHERE
10834     instruction = %2$d',
10835     DB_PREFIXE,
10836     intval($instruction)
10837     ),
10838     array(
10839     "origin" => __METHOD__,
10840     )
10841 softime 11228 );
10842    
10843 softime 14064 $documentLibelle = $documentLibelle['result'];
10844    
10845 softime 11228 // Transforamtion des ' ' en '_', des accents en lettres sans accents et des
10846     // caractères spéciaux en '_'
10847     // La méthode normalize_string est utilisé pour gérer les accents
10848     $documentLibelle = $this->f->normalize_string($documentLibelle);
10849     // TODO : comparer cette liste et celle de la méthode normalize_string
10850     // pour éviter les doublons + vérifier qu'il n'y a pas de doublons dans cette
10851     // liste
10852     $invalid = array('Œ'=>'oe', 'œ'=>'oe', 'Ÿ'=>'y', 'ü'=>'u',
10853     '¢' => '_', 'ß' => '_', '¥' => '_', '£' => '_', '™' => '_', '©' => '_',
10854     '®' => '_', 'ª' => '_', '×' => '_', '÷' => '_', '±' => '_', '²' => '_',
10855     '³' => '_', '¼' => '_', '½' => '_', '¾' => '_', 'µ' => '_', '¿' => '_',
10856     '¶' => '_', '·' => '_', '¸' => '_', 'º' => '_', '°' => '_', '¯' => '_',
10857     '§' => '_', '…' => '_', '¤' => '_', '¦' => '_', '≠' => '_', '¬' => '_',
10858     'ˆ' => '_', '¨' => '_', '‰' => '_', '¤' => '_', '€' => '_', '$' => '_',
10859     '«' => '_', '»' => '_', '‹' => '_', '›' => '_', 'ƒ' => '_', '¥' => '_',
10860     '‘‘' => '_', '‚' => '_', '!' => '_', '¡' => '_', '¢' => '_', '£' => '_',
10861     '?' => '_', '[' => '_', ']' => '_', '´' => '_', '`' => '_', '^' => '_',
10862     '~' => '_', '˜' => '_', '#' => '_', '*' => '_', '.' => '_', ':' => '_',
10863     ';' => '_', '•' => '_', '¯' => '_', '‾' => '_', '–' => '_', '–' => '_',
10864     '—' => '_', '_' => '_', '|' => '_', '¦‌' => '_', '‡' => '_', '§' => '_',
10865     '¶' => '_', '©' => '_', '®' => '_', '™' => '_', '&' => '_', '@' => '_',
10866     '/' => '_', '\\' => '_', '◊' => '_', '♠' => '_', '♣' => '_', '♥' => '_',
10867     '♦' => '_', '←' => '_', '↑' => '_', '→' => '_', '↓' => '_', '↔' => '_',
10868     '°' => '_', 'µ' => '_', '<' => '_', '>' => '_', '≤' => '_', '≥' => '_',
10869     '=' => '_', '≈' => '_', '≠' => '_', '≡' => '_', '±' => '_', '−' => '_',
10870     '+' => '_', '×' => '_', '÷' => '_', '⁄' => '_', '%' => '_', '‰' => '_',
10871     '¼' => '_', '½' => '_', '¾' => '_', '¹' => '_', '²' => '_', '³' => '_',
10872     '' => '_', 'º' => '_', 'ª' => '_', 'ƒ' => '_', '′' => '_', '″' => '_',
10873     '∂' => '_', '∏' => '_', '∑' => '_', '√' => '_', '∞' => '_', '¬' => '_',
10874     '∩' => '_', '∫' => '_', 'α' => '_', 'Α' => '_', 'β' => '_', 'Β' => '_',
10875     'γ' => '_', 'Γ' => '_', 'δ' => '_', 'Δ' => '_', 'ε' => '_', 'Ε' => '_',
10876     'ζ' => '_', 'Ζ' => '_', 'η' => '_', 'Η' => '_', 'θ' => '_', 'Θ' => '_',
10877     'ι' => '_', 'Ι' => '_', 'κ' => '_', 'Κ' => '_', 'λ' => '_', 'Λ' => '_',
10878     'μ' => '_', 'Μ' => '_', 'ν' => '_', 'Ν' => '_', 'ξ' => '_', 'Ξ' => '_',
10879     'ο' => '_', 'Ο' => '_', 'π' => '_', 'Π' => '_', 'ρ' => '_', 'Ρ' => '_',
10880     'σ' => '_', 'ς' => '_', 'Σ' => '_', 'τ' => '_', 'Τ' => '_', 'υ' => '_',
10881     'Υ' => '_', 'φ' => '_', 'Φ' => '_', 'χ' => '_', 'Χ' => '_', 'ψ' => '_',
10882     'Ψ' => '_', 'ω' => '_', 'Ω' => '_', ',' => '_', ' ' => '_'
10883     );
10884    
10885     return str_replace(array_keys($invalid), array_values($invalid), $documentLibelle);
10886     }
10887    
10888     /**
10889 softime 10869 * Surcharge permettant de ne pas afficher le fil d'Ariane dans
10890     * l'overlay de notification des demandeurs.
10891     */
10892     function getSubFormTitle($ent) {
10893 softime 11876 $actionSansPath = array('411', '420', '430');
10894     if (in_array($this->getParameter('maj'), $actionSansPath)) {
10895 softime 10869 return '';
10896     }
10897     return parent::getSubFormTitle($ent);
10898     }
10899 softime 13137
10900     /**
10901     * Traitement de la notification automatique des tiers consulté.
10902     *
10903     * Récupère la liste des adresses mails des tiers notifiables. Pour chaque adresses
10904     * récupérées ajoute une notification et une tâche de notification par mail.
10905     * La création de la tâche de notification par mail déclenchera l'envoi du mail
10906     * et la mise à jour du suivi.
10907     *
10908     * Les tiers notifiables sont ceux :
10909     * - n’ayant pas un ID PLAT’AU correspondant à l’ID PLAT’AU du service consultant
10910     * - ayant une habilitation dont le type est listé dans les paramètres de
10911     * notification de l’événement,
10912     * - intervenant sur la commune ou le département du dossier
10913     * - ayant au moins une adresse mail valide
10914     *
10915     * @param evenement instance de l'événement associée à l'instruction
10916     * @param dossier instance du dossier de l'instruction
10917     * @return boolean indique si le traitement à réussi
10918     */
10919     protected function traitement_notification_automatique_tiers_consulte($evenement, $dossier) {
10920     // Récupération de l'identifiant plat'au du service consultant
10921     $consultationEntrante = $dossier->get_inst_consultation_entrante();
10922     // Récupération de la liste des types d'habilitations autorisées pour
10923     // cette notification
10924     $typesHabilitationsNotifiable = $evenement->get_types_habilitation_notifiable();
10925     // Récupération du département et de la commune du dossier
10926     $commune = $dossier->getVal('commune');
10927     // Le département est récupéré à partir de la commune du dossier donc si la
10928     // commune n'a pas pu être récupéré on ne récupère pas non plus le département.
10929     $idDepartement = null;
10930     if (! empty($commune)) {
10931     $departement = $dossier->get_inst_departement_dossier();
10932     $idDepartement = $departement->getVal($departement->clePrimaire);
10933     }
10934     // Récupération des courriels des tiers notifiables
10935     $tiersANotifier = $this->get_courriels_tiers_notifiable(
10936     $typesHabilitationsNotifiable,
10937     $consultationEntrante->getVal('service_consultant_id'),
10938     $commune,
10939     $idDepartement
10940     );
10941     // Traitement de chacune des listes de diffusion pour extraire les
10942     // courriels, vérifier la validité des courriels et envoyer la
10943     // notification
10944     $notificationSend = false;
10945     if (empty($tiersANotifier)) {
10946     $this->addToLog(
10947     sprintf(
10948 softime 14542 '%s() : %s %s : %s',
10949 softime 13137 __METHOD__,
10950     __("La récupération des tiers à échoué."),
10951     __('Paramétrage'),
10952     var_export(
10953     array(
10954     'types_habilitations_notifiable' => $typesHabilitationsNotifiable,
10955     'service_consultant' => $consultationEntrante->getVal('service_consultant_id'),
10956     'id_commune' => $commune,
10957     'id_departement' => $idDepartement
10958     ),
10959     true
10960     )
10961     ),
10962     DEBUG_MODE
10963     );
10964     return false;
10965     }
10966     foreach($tiersANotifier as $tierANotifier) {
10967     // Découpe la liste de diffusion pour stocker les adresses mails
10968     // des tiers dans un tableau
10969     $courriels =
10970     array_filter(
10971     array_map(
10972     'trim',
10973     preg_split("/\r\n|\n|\r/", $tierANotifier['liste_diffusion'])));
10974    
10975     foreach ($courriels as $courriel) {
10976     // Pour chaque adresse mail vérifie si l'adresse est valide
10977     if (! $this->f->checkValidEmailAddress($courriel)) {
10978     continue;
10979     }
10980     $destinataire = array(
10981     'destinataire' => $tierANotifier['libelle'].' : '.$courriel,
10982     'courriel' => $courriel
10983     );
10984     // Si l'adresse est valide ajoute une nouvelle notification
10985     // et une tâche d'envoi de mails
10986     $idNotif = $this->ajouter_notification(
10987     $this->getVal($this->clePrimaire),
10988     $this->f->get_connected_user_login_name(),
10989     $destinataire,
10990     $this->get_dossier_instruction_om_collectivite(),
10991     array(),
10992     true
10993     );
10994     if ($idNotif === false) {
10995     $this->addToLog(
10996     __METHOD__.
10997     __("L'ajout de la notification a échoué."),
10998     DEBUG_MODE
10999     );
11000     return false;
11001     }
11002     // Création de la tache en lui donnant l'id de la notification
11003     $notification_by_task = $this->notification_by_task(
11004     $idNotif,
11005     $dossier->getVal('dossier'),
11006     'mail',
11007     'notification_tiers_consulte'
11008     );
11009     if ($notification_by_task === false) {
11010     $this->addToLog(
11011     __METHOD__.
11012     __("L'ajout de la tâche de notification a échoué."),
11013     DEBUG_MODE
11014     );
11015     $this->addToMessage(
11016     __("Erreur lors de la génération de la notification au(x) pétitionnaire(s).")
11017     );
11018     return false;
11019     }
11020     $notificationSend = true;
11021     }
11022     }
11023     // Si aucune notification n'a été envoyé car il n'y a pas de courriels
11024     // valide, affiche un message dans les logs pour avoir un suivi.
11025     if (! $notificationSend) {
11026     $this->addToLog(
11027     sprintf(
11028     '%s %s : %s %s : %s',
11029     __METHOD__,
11030     __("Il n'y a pas de tiers notifiable pour l'instruction"),
11031     $evenement->getVal('libelle'),
11032     __("du dossier"),
11033     $this->getVal('dossier')
11034     ),
11035     DEBUG_MODE
11036     );
11037     }
11038     return true;
11039     }
11040    
11041     /**
11042     * Récupère, à l'aide d'une requête, la liste de diffusion des tiers
11043     * respectant les conditions suvantes :
11044     * - le tiers consulté dois accepté les notifications
11045     * - la liste de diffusion ne dois pas être vide
11046     * - l'uid du tiers consulté ne dois pas être celui passé en paramètre
11047     * si pas d'uid passé en paramètre alors on ne filtre pas selon l'uid
11048     * du tiers
11049     * - le type d'habilitation des tiers dois appartenir à la liste
11050     * fournie en paramètre
11051     * - le tiers dois être associé à la commune ou au département passé
11052     * en paramètre
11053     *
11054     * @param array $typesHabilitations tableau contenant la liste des types d'habilitation
11055     * pouvant être notifiée
11056     * @param integer $idPlautau uid de l'acteur plat'au du dossier qui ne dois pas être notifié
11057     * @param integer $commune identifiant de la commune du dossier
11058     * @param integer $departement identifiant du département du dossier
11059     *
11060     * @return array listes de diffusion des tiers notifiable
11061     */
11062     protected function get_courriels_tiers_notifiable(array $typesHabilitations, $idPlatau, $commune, $departement) {
11063     // Si paramètre non renseigné alors ne renvoie rien
11064     if (empty($typesHabilitations) || empty($commune) || empty($departement)) {
11065     return false;
11066     }
11067     // Si il n'y a pas d'acteur associé au dossier alors on ne filtre pas sur l'uid de l'acteur
11068     $filtreServiceConsulteDI = '';
11069     if (! empty($idPlatau)) {
11070     $filtreServiceConsulteDI = sprintf(
11071 softime 14064 "-- Filtre les tiers ayant une ligne correspondante a l uid platau du service
11072     -- en charge du dossier
11073     AND (tiers_consulte.uid_platau_acteur !~ ('\y' || '%s' || '\y')
11074     OR tiers_consulte.uid_platau_acteur IS NULL)",
11075 softime 13137 $this->f->db->escapeSimple($idPlatau)
11076     );
11077     }
11078     $rst = $this->f->get_all_results_from_db_query(
11079     sprintf(
11080     'SELECT
11081 softime 14064 -- Tiers notifiables lié à la commune du dossier
11082 softime 13137 tiers_consulte.liste_diffusion,
11083     tiers_consulte.libelle
11084     FROM
11085     %1$shabilitation_tiers_consulte
11086     LEFT JOIN %1$stiers_consulte
11087     ON habilitation_tiers_consulte.tiers_consulte = tiers_consulte.tiers_consulte
11088     LEFT JOIN %1$slien_habilitation_tiers_consulte_commune
11089     ON habilitation_tiers_consulte.habilitation_tiers_consulte = lien_habilitation_tiers_consulte_commune.habilitation_tiers_consulte
11090 softime 14064 -- Conservation uniquement des tiers acteur de dossiers
11091     JOIN %1$slien_dossier_tiers
11092     ON tiers_consulte.tiers_consulte = lien_dossier_tiers.tiers
11093     WHERE
11094     tiers_consulte.accepte_notification_email IS TRUE
11095     AND tiers_consulte.liste_diffusion IS NOT NULL
11096     %3$s
11097     AND habilitation_tiers_consulte.type_habilitation_tiers_consulte IN (%2$s)
11098     AND lien_habilitation_tiers_consulte_commune.commune = %4$d
11099     -- Filtre sur les tiers acteur du dossier
11100     AND lien_dossier_tiers.dossier = \'%6$s\'
11101     UNION
11102     SELECT
11103     -- Tiers notifiables lié au département du dossier
11104     tiers_consulte.liste_diffusion,
11105     tiers_consulte.libelle
11106     FROM
11107     %1$shabilitation_tiers_consulte
11108     LEFT JOIN %1$stiers_consulte
11109     ON habilitation_tiers_consulte.tiers_consulte = tiers_consulte.tiers_consulte
11110 softime 13137 LEFT JOIN %1$slien_habilitation_tiers_consulte_departement
11111     ON habilitation_tiers_consulte.habilitation_tiers_consulte = lien_habilitation_tiers_consulte_departement.habilitation_tiers_consulte
11112 softime 14064 -- Conservation uniquement des tiers acteur de dossiers
11113     JOIN %1$slien_dossier_tiers
11114     ON tiers_consulte.tiers_consulte = lien_dossier_tiers.tiers
11115 softime 13137 WHERE
11116     tiers_consulte.accepte_notification_email IS TRUE
11117     AND tiers_consulte.liste_diffusion IS NOT NULL
11118     %3$s
11119     AND habilitation_tiers_consulte.type_habilitation_tiers_consulte IN (%2$s)
11120 softime 14064 AND lien_habilitation_tiers_consulte_departement.departement = %5$d
11121     -- Filtre sur les tiers acteur du dossier
11122     AND lien_dossier_tiers.dossier = \'%6$s\'',
11123 softime 13137 DB_PREFIXE,
11124     implode(', ', $typesHabilitations),
11125     $filtreServiceConsulteDI,
11126     intval($commune),
11127 softime 14064 intval($departement),
11128     $this->f->db->escapeSimple($this->getVal('dossier'))
11129 softime 13137 ),
11130     array(
11131     "origin" => __METHOD__
11132     )
11133     );
11134 softime 14064 // Faire un order by sur un union ne fonctionne pas. A la place
11135     // c'est le tableau des résultats qui est ordonné.
11136     usort($rst['result'], function($a, $b) {
11137     return strcmp($a['libelle'], $b['libelle']);
11138     });
11139 softime 13137 return $rst['result'];
11140     }
11141     }

Properties

Name Value
svn:keywords "Id"

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26