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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 17036 - (hide annotations)
Wed Feb 28 14:16:17 2024 UTC (10 months, 4 weeks ago) by softime
File size: 497067 byte(s)
chore(branch): fusion de la branche d'intégration 6.4.0-develop dans le trunk

1 mbroquet 3730 <?php
2     /**
3 softime 7996 * DBFORM - 'instruction' - Surcharge gen.
4     *
5 mbroquet 3730 * specific :
6     * - cle secondaire
7     * destruction autorisée que pour le dernier evenement
8     * [delete the last event ]
9     * - variable globale [global variables]
10     * var $retourformulaire;
11     * var $idxformulaire;
12     * - modification des données dans dossier trigger avant
13     * [modify dossier data with trigger function]
14     * - function mois_date : pour ajouter des mois a une date
15     * [add months (delay) and calculation final date]
16     * - voir script_lang.js : bible ...
17 softime 7996 *
18 mbroquet 3730 * @package openfoncier
19 nhaye 5254 * @version SVN : $Id$
20 mbroquet 3730 */
21    
22     //
23     require_once "../gen/obj/instruction.class.php";
24    
25     //
26     class instruction extends instruction_gen {
27    
28     // Champs contenant les UID des fichiers
29     var $abstract_type = array(
30     "om_fichier_instruction" => "file",
31     );
32 softime 8989
33 mbroquet 3730 var $valEvenement;
34     var $restriction_valid = null;
35     // Tableau contenant une partie des métadonnées arrêtés
36     var $metadonneesArrete;
37    
38 fmichon 3892 /**
39     * Instance de la classe dossier
40     *
41     * @var mixed
42     */
43     var $inst_dossier = null;
44    
45 softime 5169 /**
46     * Instance de la classe instructeur
47     *
48     * @var mixed
49     */
50     var $inst_instructeur = null;
51    
52     /**
53     * Instance de la classe om_utilisateur
54     *
55     * @var mixed
56     */
57     var $inst_om_utilisateur = null;
58    
59 mbroquet 3730 var $metadata = array(
60     "om_fichier_instruction" => array(
61     "dossier" => "getDossier",
62     "dossier_version" => "getDossierVersion",
63     "numDemandeAutor" => "getNumDemandeAutor",
64     "anneemoisDemandeAutor" => "getAnneemoisDemandeAutor",
65     "typeInstruction" => "getTypeInstruction",
66     "statutAutorisation" => "getStatutAutorisation",
67     "typeAutorisation" => "getTypeAutorisation",
68     "dateEvenementDocument" => "getDateEvenementDocument",
69     "groupeInstruction" => 'getGroupeInstruction',
70     "title" => 'getTitle',
71 softime 6272 'concerneERP' => 'get_concerne_erp',
72 softime 10573
73     'date_cloture_metier' => 'getDossierDateDecision',
74     'type' => 'getDocumentType',
75     'dossier_autorisation_type_detaille' => 'getDossierAutorisationTypeDetaille',
76     'dossier_instruction_type' => 'getDossierInstructionTypeLibelle',
77     'region' => 'getDossierRegion',
78     'departement' => 'getDossierDepartement',
79     'commune' => 'getDossierCommune',
80     'annee' => 'getDossierAnnee',
81     'division' => 'getDossierDivision',
82 softime 10808 'collectivite' => 'getDossierServiceOrCollectivite',
83 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 17036 //
478     $this->class_actions[405] = array(
479     "identifier" => "telecharger_editions",
480     "view" => "view_telecharger_editions",
481     "permission_suffix" => "om_fichier_instruction_telecharger",
482     );
483    
484 softime 10808 // ACTION - 410 - Notifier les pétitionnaires (mail ou autre)
485     $this->class_actions[410] = array(
486     "identifier" => "overlay_notification_manuelle",
487     "portlet" => array(
488     "libelle" => __("Notifier les pétitionnaires"),
489     "type" => "action-self",
490     "class" => "notifier_commune-16",
491     ),
492     "condition" => array(
493     "is_notifiable_by_task_manual",
494 softime 10869 "is_not_portail_notification_sans_annexe"
495 softime 10808 ),
496     "view" => "view_overlay_notification_manuelle",
497     "permission_suffix" => "modifier",
498     );
499    
500 softime 11585 // ACTION - 411 - Notifier les pétitionnaires (portail citoyen)
501 softime 10808 $this->class_actions[411] = array(
502     "identifier" => "notification_manuelle_portal",
503     "portlet" => array(
504     "libelle" => __("Notifier les pétitionnaires"),
505     "type" => "action-direct-with-confirmation",
506     "class" => "notifier_commune-16",
507     ),
508     "condition" => array(
509     "is_notifiable_by_task_manual",
510 softime 10869 "is_portail_notification_sans_annexe"
511 softime 10808 ),
512 softime 14542 "method" => "notifier_demandeur_principal_via_portal",
513 softime 10808 "permission_suffix" => "modifier",
514     );
515    
516 softime 11585 // ACTION - 420 - Notifier les services consultés (mail)
517     $this->class_actions[420] = array(
518     "identifier" => "overlay_notification_service_consulte",
519     "portlet" => array(
520     "libelle" => __("Notifier les services consultés"),
521     "type" => "action-self",
522     "class" => "notifier_commune-16",
523     ),
524     "condition" => array(
525     "is_service_notifiable"
526     ),
527     "view" => "view_overlay_notification_service_consulte",
528     "permission_suffix" => "tab",
529     );
530    
531     // ACTION - 430 - Notifier les tiers consultés (mail)
532     $this->class_actions[430] = array(
533     "identifier" => "overlay_notification_tiers_consulte",
534     "portlet" => array(
535     "libelle" => __("Notifier les tiers consultés"),
536     "type" => "action-self",
537     "class" => "notifier_commune-16",
538     ),
539     "condition" => array(
540     "is_tiers_notifiable"
541     ),
542     "view" => "view_overlay_notification_tiers_consulte",
543     "permission_suffix" => "tab",
544     );
545    
546 softime 10573 //
547 softime 11418 $this->class_actions[403] = array(
548     "identifier" => "envoyer_au_controle_de_legalite",
549     "portlet" => array(
550     "libelle" => __("Envoyer au contrôle de légalité"),
551     "type" => "action-direct-with-confirmation",
552     "class" => "envoyer_au_controle_de_legalite-16",
553     ),
554     "view" => "formulaire",
555     "method" => "envoyer_au_controle_de_legalite",
556     "condition" => array(
557     "can_be_sended_to_cl"
558     ),
559     "permission_suffix" => "envoyer_au_controle_de_legalite",
560     );
561    
562     //
563 softime 10573 $this->class_actions[998] = array(
564     "identifier" => "json_data",
565     "view" => "view_json_data",
566     "permission_suffix" => "consulter",
567     );
568 mbroquet 3730 }
569    
570 softime 8593 /**
571 softime 8989 * Clause select pour la requête de sélection des données de l'enregistrement.
572     *
573     * @return array
574     */
575     function get_var_sql_forminc__champs() {
576     return array(
577     "instruction",
578     "destinataire",
579     "instruction.evenement",
580 softime 10573 "instruction.commentaire",
581 softime 8989 "date_evenement",
582     "instruction.lettretype",
583     "signataire_arrete",
584     "flag_edition_integrale",
585     "om_final_instruction_utilisateur",
586     "date_finalisation_courrier",
587     "date_envoi_signature",
588 softime 15973 "date_retour_signature",
589 softime 8989 "date_envoi_rar",
590    
591     "date_retour_rar",
592 softime 15973 "date_envoi_controle_legalite",
593 softime 8989 "date_retour_controle_legalite",
594    
595     "numero_arrete",
596    
597     "complement_om_html",
598     "'' as bible_auto",
599     "'' as bible",
600     "complement2_om_html",
601     "'' as bible2",
602     "complement3_om_html",
603     "'' as bible3",
604     "complement4_om_html",
605     "'' as bible4",
606    
607     "titre_om_htmletat",
608     "corps_om_htmletatex",
609    
610     "'' as btn_preview",
611     "'' as btn_redaction",
612    
613     "'' as btn_refresh",
614     "'' as live_preview",
615    
616     "dossier",
617     "instruction.action",
618     "instruction.delai",
619     "instruction.etat",
620     "instruction.autorite_competente",
621     "instruction.accord_tacite",
622     "instruction.delai_notification",
623     "instruction.avis_decision",
624     "archive_delai",
625     "archive_accord_tacite",
626     "archive_etat",
627     "archive_avis",
628     "archive_date_complet",
629     "archive_date_rejet",
630     "archive_date_limite",
631     "archive_date_notification_delai",
632     "archive_date_decision",
633     "archive_date_validite",
634     "archive_date_achevement",
635     "archive_date_conformite",
636     "archive_date_chantier",
637     "archive_date_dernier_depot",
638     "date_depot",
639 softime 10573 "date_depot_mairie",
640 softime 8989 "complement5_om_html",
641     "'' as bible5",
642     "complement6_om_html",
643     "'' as bible6",
644     "complement7_om_html",
645     "'' as bible7",
646     "complement8_om_html",
647     "'' as bible8",
648     "complement9_om_html",
649     "'' as bible9",
650     "complement10_om_html",
651     "'' as bible10",
652     "complement11_om_html",
653     "'' as bible11",
654     "complement12_om_html",
655     "complement13_om_html",
656     "complement14_om_html",
657     "complement15_om_html",
658     "archive_incompletude",
659     "archive_incomplet_notifie",
660     "archive_evenement_suivant_tacite",
661     "archive_evenement_suivant_tacite_incompletude",
662     "archive_etat_pendant_incompletude",
663     "archive_date_limite_incompletude",
664     "archive_delai_incompletude",
665     "archive_autorite_competente",
666     "code_barres",
667     "om_fichier_instruction",
668     "om_final_instruction",
669     "om_fichier_instruction_dossier_final",
670     "document_numerise",
671     "duree_validite_parametrage",
672     "duree_validite",
673     "created_by_commune",
674     "archive_date_cloture_instruction",
675     "archive_date_premiere_visite",
676     "archive_date_derniere_visite",
677     "archive_date_contradictoire",
678     "archive_date_retour_contradictoire",
679     "archive_date_ait",
680     "archive_date_transmission_parquet",
681     "archive_dossier_instruction_type",
682     "archive_date_affichage",
683 softime 10573 "pec_metier",
684     "archive_pec_metier",
685     "archive_a_qualifier",
686     "id_parapheur_signature",
687     "statut_signature",
688     "commentaire_signature",
689     "historique_signature",
690 softime 10808 "'' as suivi_notification",
691 softime 11585 "'' as suivi_notification_service",
692     "'' as suivi_notification_tiers",
693 softime 12654 "'' as suivi_notification_commune",
694 softime 10573
695     "'' as preview_edition",
696 softime 11418 "envoye_cl_platau",
697 softime 15037 "'' as log_instruction",
698     "parapheur_lien_page_signature"
699 softime 8989 );
700     }
701    
702     /**
703 softime 8593 * CONDITION - is_edition_integrale_enabled
704     *
705     * Vérifie que la rédaction libre est activée sur l'instruction en cours.
706     *
707     * @return boolean
708     */
709     function is_edition_integrale_enabled() {
710     if ($this->getVal("flag_edition_integrale") == 't') {
711     return true;
712     }
713     return false;
714     }
715 mbroquet 3730
716     /**
717 softime 8593 * CONDITION - is_edition_integrale_not_enabled
718     *
719     * Vérifie que la rédaction libre est désactivée sur l'instruction en cours.
720     *
721     * @return boolean
722     */
723     function is_edition_integrale_not_enabled() {
724     return !$this->is_edition_integrale_enabled();
725     }
726    
727     /**
728     * CONDITION - is_option_redaction_libre_enabled
729     *
730     * Vérifie que l'option de rédaction libre est activée.
731     *
732     * @return boolean
733     */
734     function is_option_redaction_libre_enabled() {
735     $collectivite_di = $this->get_dossier_instruction_om_collectivite();
736     return $this->f->is_option_redaction_libre_enabled($collectivite_di);
737     }
738    
739     /**
740 softime 10713 * CONDITION - is_option_parapheur_relecture_enabled
741     *
742     * Vérifie que l'option de relecture lors de l'envoi en signature est activée.
743     *
744     * @return boolean
745     */
746 softime 10808 function is_parapheur_relecture_parameter_enabled() {
747     //Instanciation de la classe electronicsignature
748     $inst_es = $this->get_electronicsignature_instance();
749     if ($inst_es === false) {
750     return false;
751     }
752    
753     if ($inst_es->get_conf('is_forced_view_files') !== 'true' && $inst_es->get_conf('is_forced_view_files') !== true) {
754     return false;
755     }
756    
757     return true;
758 softime 10713 }
759    
760 softime 11876 /**
761     * CONDITION - is_parapheur_annulation_parameter_enabled
762     *
763     * Vérifie que l'option d'annulation de l'envoi en signature est activée.
764     *
765     * @return boolean
766     */
767     function is_parapheur_annulation_parameter_enabled() {
768     //Instanciation de la classe electronicsignature
769     $inst_es = $this->get_electronicsignature_instance();
770     if ($inst_es === false) {
771     return false;
772     }
773 softime 10713
774 softime 11876 if ($inst_es->get_conf('cancel_send') !== 'true' && $inst_es->get_conf('cancel_send') !== true) {
775     return false;
776     }
777    
778     return true;
779     }
780    
781    
782 softime 10713 /**
783 softime 10573 * CONDITION - is_sent_for_signature
784     *
785     * Vérifie que l'instruction a été envoyé à signature
786     *
787     * @return boolean
788     */
789     function is_sent_for_signature() {
790     // Si un parapheur a été configuré
791     // et que le champ id_parapheur_signature n'est pas vide
792     // que le status est différent de "canceled" ou "expired"
793     // alors l'évènement a été envoyé en signature
794     if ($this->has_connector_electronicsignature() === true
795     && empty($this->getVal("id_parapheur_signature")) === false
796     && ($this->getVal("statut_signature") != "canceled"
797 softime 12124 && $this->getVal("statut_signature") != "expired"
798     && $this->getVal("statut_signature") != "finished")) {
799 softime 10573 //
800     return true;
801     }
802    
803     return false;
804     }
805    
806     /**
807     * CONDITION - is_not_sent_for_signature
808     *
809     * Vérifie que l'instruction n'a pas été envoyé à signature
810     *
811     * @return boolean
812     */
813     function is_not_sent_for_signature() {
814 softime 10968 // Contrôle si l'utilisateur possède un bypass
815     $bypass = $this->f->isAccredited($this->get_absolute_class_name()."_definaliser_bypass");
816     if ($bypass == true) {
817     return true;
818     }
819    
820 softime 10573 return !$this->is_sent_for_signature();
821     }
822    
823    
824     /**
825     * CONDITION - is_signed
826     *
827     * Vérifie que l'instruction a été signé
828     *
829     * @return boolean
830     */
831     function is_signed() {
832     // Si un parapheur a été configuré
833     // et que le champ id_parapheur_signature n'est pas vide
834     // et que le statut est égal à "finished"
835     // alors le document de l'instruciton à été signé
836     if ($this->has_connector_electronicsignature() === true
837     && empty($this->getVal("id_parapheur_signature")) === false
838     && $this->getVal("statut_signature") == "finished") {
839     //
840     return true;
841     }
842    
843     return false;
844     }
845    
846 softime 15973 /**
847     * CONDITION - is_signed
848     *
849     * Vérifie que l'instruction n'a pas été signée
850     *
851     * @return boolean
852     */
853     function is_not_signed() {
854     // Contrôle si l'utilisateur possède un bypass
855     $bypass = $this->f->isAccredited($this->get_absolute_class_name()."_definaliser_apres_signature");
856     if ($bypass == true) {
857     return true;
858     }
859 softime 11876
860 softime 15973 return !$this->is_signed();
861     }
862    
863    
864 softime 12433 /**
865     * is_sent_to_cl
866     *
867     * Vérifie que l'instruction a été envoyé au contrôle de légalité
868     *
869     * @return boolean
870     */
871 softime 11418 function is_sent_to_cl() {
872 softime 12433 // Si la case à cocher de l'instruction envoye_cl_platau est à "t"
873     if ($this->getVal('envoye_cl_platau') === 't') {
874     //
875     return true;
876 softime 11418 }
877     //
878     return false;
879     }
880    
881 softime 10808 /**
882     * CONDITION - is_portail_notification
883     *
884     * Vérifie si la notification est une notification de catégorie portail
885     *
886     * @return boolean
887     */
888 softime 10869 function is_portail_notification_sans_annexe() {
889 softime 10808 $collectiviteDi = $this->get_dossier_instruction_om_collectivite();
890 softime 10869 $ev = $this->get_inst_evenement($this->getVal('evenement'));
891 softime 14064 if ($this->f->get_param_option_notification($collectiviteDi) === PORTAL
892 softime 10869 && $ev->getVal('notification') != 'notification_manuelle_annexe'
893     && $ev->getVal('notification') != 'notification_manuelle_annexe_signature_requise'
894     ) {
895 softime 10808 return true;
896     }
897     return false;
898     }
899 softime 10573
900     /**
901 softime 10808 * CONDITION - is_not_portail_notification
902     *
903     * Vérifie si la notification n'est pas une notification de catégorie portail
904     *
905     * @return boolean
906     */
907 softime 10869 function is_not_portail_notification_sans_annexe() {
908     return (! $this->is_portail_notification_sans_annexe());
909 softime 10808 }
910    
911     /**
912 softime 10573 * CONDITION - can_be_signed
913     *
914     * Vérifie que le document de l'instruction peut être envoyé au parapheur pour signature
915     *
916     * @return boolean
917     */
918     function can_be_signed() {
919     // Instanciation de l'objet signataire_arrete
920     $inst_signataire_arrete = $this->f->get_inst__om_dbform(array(
921     "obj" => "signataire_arrete",
922     "idx" => $this->getVal("signataire_arrete"),
923     ));
924     // Si un parapheur a été configuré, que le document est finalisé, que le signataire
925     // possède une adresse email, on vérifie le champ id_parapheur_signature
926     // S'il est vide l'évènement peut être envoyé en signature
927     // S'il ne l'est pas, alors on vérifie le champ statut_signature
928     // Si la valeur de ce champ est égal à "canceled" ou "expired"
929     // alors l'évènement peut être envoyé en signature
930     if ($this->has_connector_electronicsignature() === true
931     && $this->getVal("om_final_instruction") == 't'
932     && empty($inst_signataire_arrete->getVal('email')) === false) {
933     //
934     if (empty($this->getVal("id_parapheur_signature")) === true
935     || $this->getVal("statut_signature") == "canceled"
936     || $this->getVal("statut_signature") == "expired") {
937     //
938     return true;
939     }
940     }
941    
942     $this->addToLog(__METHOD__."() has_connector_electronicsignature: ".var_export($this->has_connector_electronicsignature(), true), EXTRA_VERBOSE_MODE);
943     $this->addToLog(__METHOD__."() om_final_instruction: ".var_export($this->getVal("om_final_instruction"), true), EXTRA_VERBOSE_MODE);
944     $this->addToLog(__METHOD__."() email: ".var_export($inst_signataire_arrete->getVal('email'), true), EXTRA_VERBOSE_MODE);
945     $this->addToLog(__METHOD__."() id_parapheur_signature: ".var_export($this->getVal("id_parapheur_signature"), true), EXTRA_VERBOSE_MODE);
946     $this->addToLog(__METHOD__."() statut_signature: ".var_export($this->getVal("statut_signature"), true), EXTRA_VERBOSE_MODE);
947    
948     return false;
949     }
950    
951     /**
952     * CONDITION - has_connector_electronicsignature
953     *
954     * Vérifie qu'un parapheur est paramétré
955     *
956     * @return boolean
957     */
958     function has_connector_electronicsignature() {
959     $inst_es = $this->get_electronicsignature_instance(false);
960     if ($inst_es === false) {
961     return false;
962     }
963     return true;
964     }
965    
966     /**
967     * CONDITION - can_display_parapheur
968     *
969     * Vérifie que le fieldset "Suivi Parapheur" soit affichable
970     *
971     * @return boolean
972     */
973     function can_display_parapheur() {
974     $evenement_id = $this->getVal("evenement");
975     $inst_evenement = $this->get_inst_evenement($evenement_id);
976     if ($this->has_connector_electronicsignature() === true
977     && $inst_evenement->getVal('lettretype') !== ''
978     && $inst_evenement->getVal('lettretype') !== null
979     && (empty($this->getVal("id_parapheur_signature")) === false
980     || empty($this->getVal("historique_signature")) === false)) {
981     //
982     return true;
983     }
984    
985     return false;
986     }
987    
988     /**
989 softime 10808 * CONDITION - can_display_notification
990     *
991 softime 11585 * Vérifie que le champs "Suivi notification" est affichable
992 softime 10808 *
993     * @return boolean
994     */
995 softime 11585 function can_display_notification_demandeur() {
996 softime 10808 // Le suivi des notification est affiché si l'événement est notifiable
997     // et si des notifications ont été envoyées
998     $evenement_id = $this->getVal("evenement");
999     $inst_evenement = $this->get_inst_evenement($evenement_id);
1000     if ($inst_evenement->getVal('notification') != null &&
1001     $inst_evenement->getVal('notification') != '') {
1002     // Des notifications ont été envoyé si il existe au moins une notification
1003     // liées à l'instruction
1004 softime 11585 $idsNotifs = $this->get_instruction_notification(
1005     $this->getVal($this->clePrimaire),
1006     array(
1007     'notification_recepisse',
1008     'notification_instruction',
1009     'notification_decision',
1010 softime 12124 ),
1011     true
1012 softime 11585 );
1013 softime 10808 if (isset($idsNotifs) && $idsNotifs !== array()) {
1014     return true;
1015     }
1016     }
1017     return false;
1018     }
1019    
1020     /**
1021 softime 11585 * CONDITION - can_display_notification
1022     *
1023     * Vérifie que le champs "suivi_notification_service" est affichable
1024     *
1025     * @return boolean
1026     */
1027     function can_display_notification_service() {
1028     // Le suivi des notification est affiché si l'événement est notifiable
1029     // et si des notifications ont été envoyées
1030     $evenement_id = $this->getVal("evenement");
1031     $inst_evenement = $this->get_inst_evenement($evenement_id);
1032     if ($this->get_boolean_from_pgsql_value($inst_evenement->getVal('notification_service')) == true) {
1033     // Des notifications ont été envoyé si il existe au moins une notification
1034     // de type notification_service_consulte liées à l'instruction
1035     $idsNotifs = $this->get_instruction_notification(
1036     $this->getVal($this->clePrimaire),
1037     'notification_service_consulte'
1038     );
1039     if (isset($idsNotifs) && $idsNotifs !== array()) {
1040     return true;
1041     }
1042     }
1043     return false;
1044     }
1045    
1046    
1047     /**
1048     * CONDITION - can_display_notification_tiers
1049     *
1050     * Vérifie que le champs "suivi_notification_tiers" est affichable
1051     *
1052     * @return boolean
1053     */
1054     function can_display_notification_tiers() {
1055     // Le suivi des notification est affiché si l'événement est notifiable
1056     // et si des notifications ont été envoyées
1057     $evenement_id = $this->getVal("evenement");
1058     $inst_evenement = $this->get_inst_evenement($evenement_id);
1059 softime 13137 if (! empty($inst_evenement->getVal('notification_tiers'))) {
1060 softime 11585 // Des notifications ont été envoyé si il existe au moins une notification
1061     // de type notification_tiers_consulte liées à l'instruction
1062     $idsNotifs = $this->get_instruction_notification(
1063     $this->getVal($this->clePrimaire),
1064     'notification_tiers_consulte'
1065     );
1066     if (isset($idsNotifs) && $idsNotifs !== array()) {
1067     return true;
1068     }
1069     }
1070     return false;
1071     }
1072    
1073     /**
1074 softime 12654 * CONDITION - can_display_notification_commune
1075     *
1076     * Vérifie que le champs "suivi_notification_commune" est affichable
1077     *
1078     * @return boolean
1079     */
1080     function can_display_notification_commune() {
1081     // Le suivi des notification si il existe au moins une notification
1082     // de type notification_depot_demat liées à l'instruction
1083     $idsNotifs = $this->get_instruction_notification(
1084     $this->getVal($this->clePrimaire),
1085     array('notification_depot_demat', 'notification_commune')
1086     );
1087     if (isset($idsNotifs) && $idsNotifs !== array()) {
1088     return true;
1089     }
1090     return false;
1091     }
1092    
1093     /**
1094 softime 8593 * TREATMENT - disable_edition_integrale.
1095     *
1096     * Cette methode permet de passer la consultation en "lu"
1097     *
1098     * @return boolean true si maj effectué false sinon
1099     */
1100     function disable_edition_integrale() {
1101     // Cette méthode permet d'exécuter une routine en début des méthodes
1102     // dites de TREATMENT.
1103     $this->begin_treatment(__METHOD__);
1104     $this->correct = true;
1105     $valF = array(
1106     "flag_edition_integrale" => false,
1107     "titre_om_htmletat" => null,
1108     "corps_om_htmletatex" => null,
1109     );
1110     $res = $this->f->db->autoExecute(
1111     DB_PREFIXE.$this->table,
1112     $valF,
1113     DB_AUTOQUERY_UPDATE,
1114     $this->clePrimaire."=".$this->getVal($this->clePrimaire)
1115     );
1116     if ($this->f->isDatabaseError($res, true)) {
1117     // Appel de la methode de recuperation des erreurs
1118     $this->erreur_db($res->getDebugInfo(), $res->getMessage(), '');
1119     $this->correct = false;
1120     // Termine le traitement
1121     return $this->end_treatment(__METHOD__, false);
1122     } else {
1123     $this->addToMessage(_("Rédaction par compléments activé."));
1124     return $this->end_treatment(__METHOD__, true);
1125     }
1126    
1127     // Termine le traitement
1128     return $this->end_treatment(__METHOD__, false);
1129     }
1130    
1131     /**
1132     * TREATMENT - enable_edition_integrale.
1133     *
1134     * Cette methode permet de passer la consultation en "lu"
1135     *
1136     * @return boolean true si maj effectué false sinon
1137     */
1138     function enable_edition_integrale() {
1139     // Cette méthode permet d'exécuter une routine en début des méthodes
1140     // dites de TREATMENT.
1141     $this->begin_treatment(__METHOD__);
1142     $this->correct = true;
1143    
1144     // Récupère la collectivite du dossier d'instruction
1145     $dossier_instruction_om_collectivite = $this->get_dossier_instruction_om_collectivite();
1146     $collectivite = $this->f->getCollectivite($dossier_instruction_om_collectivite);
1147     //
1148     $params = array(
1149     "specific" => array(
1150     "corps" => array(
1151     "mode" => "get",
1152     )
1153     ),
1154     );
1155     $result = $this->compute_pdf_output('lettretype', $this->getVal('lettretype'), $collectivite, null, $params);
1156     $corps = $result['pdf_output'];
1157     //
1158     $params = array(
1159     "specific" => array(
1160     "titre" => array(
1161     "mode" => "get",
1162     )
1163     ),
1164     );
1165     $result = $this->compute_pdf_output('lettretype', $this->getVal('lettretype'), $collectivite, null, $params);
1166     $titre = $result['pdf_output'];
1167     //
1168     $valF = array(
1169     "flag_edition_integrale" => true,
1170     "titre_om_htmletat" => $titre,
1171     "corps_om_htmletatex" => $corps,
1172     );
1173     $res = $this->f->db->autoExecute(
1174     DB_PREFIXE.$this->table,
1175     $valF,
1176     DB_AUTOQUERY_UPDATE,
1177     $this->clePrimaire."=".$this->getVal($this->clePrimaire)
1178     );
1179     if ($this->f->isDatabaseError($res, true)) {
1180     // Appel de la methode de recuperation des erreurs
1181     $this->erreur_db($res->getDebugInfo(), $res->getMessage(), '');
1182     $this->correct = false;
1183     // Termine le traitement
1184     return $this->end_treatment(__METHOD__, false);
1185     } else {
1186     $this->addToMessage(_("Rédaction libre activé."));
1187     return $this->end_treatment(__METHOD__, true);
1188     }
1189    
1190     // Termine le traitement
1191     return $this->end_treatment(__METHOD__, false);
1192     }
1193    
1194     /**
1195 softime 14064 * Cette méthode instancie le dossier à partir de l'identifiant passé
1196     * en paramètre et renvoie l'identifiant du dossier d'autorisation (DA)
1197     * associé au dossier.
1198     * Si l'identifiant du dossier n'est pas fourni alors cette méthode
1199     * renverra NULL
1200     *
1201     * @param string identifiant du dossier
1202     * @return null|string null ou identifiant du DA
1203 mbroquet 3730 */
1204     function getNumDemandeAutorFromDossier($id) {
1205     if (!isset($id)) {
1206     return NULL;
1207     }
1208 softime 14064
1209     $dossier = $this->f->get_inst__om_dbform(array(
1210     'obj' => 'dossier',
1211     'idx' => $id,
1212     ));
1213    
1214     return $dossier->getVal('dossier_autorisation');
1215 mbroquet 3730 }
1216    
1217 softime 14064
1218 mbroquet 3730 function setType(&$form, $maj) {
1219 softime 8593 // Récupération du mode de l'action
1220     $crud = $this->get_action_crud($maj);
1221     // Récupère la collectivité du dossier d'instruction
1222     $collectivite_di = $this->get_dossier_instruction_om_collectivite();
1223 mbroquet 3730
1224 softime 8593 // Cache tous les champs
1225     foreach ($this->champs as $value) {
1226     $form->setType($value, 'hidden');
1227     }
1228 softime 6565
1229 softime 10573 // Les champs historique_signature et statut_signature ne sont pas saisissable dans tous les cas
1230 softime 11228 if ($this->can_display_parapheur() === true && $maj == 3) {
1231 softime 10573 $form->setType('statut_signature', 'selectstatic');
1232     $form->setType('historique_signature', 'jsontotab');
1233     if ($this->getVal('commentaire_signature') == null) {
1234     $form->setType('commentaire_signature', 'hidden');
1235     } else {
1236     $form->setType('commentaire_signature', 'hiddenstatic');
1237     }
1238     }
1239    
1240 softime 11585 // Le champ de suivi des notifications des demandeurs n'est pas affichable dans tous les cas
1241 softime 12654 if ($maj == 3 && $this->can_display_notification_demandeur() === true) {
1242 softime 10808 $form->setType('suivi_notification', 'jsontotab');
1243     }
1244 softime 11585 // Le champ de suivi des notifications des services n'est pas affichable dans tous les cas
1245 softime 12654 if ($maj == 3 && $this->can_display_notification_service() === true) {
1246 softime 11585 $form->setType('suivi_notification_service', 'jsontotab');
1247     }
1248     // Le champ de suivi des notifications des tiers n'est pas affichable dans tous les cas
1249 softime 12654 if ($maj == 3 && $this->can_display_notification_tiers() === true) {
1250 softime 11585 $form->setType('suivi_notification_tiers', 'jsontotab');
1251     }
1252 softime 12654 // Le champ de suivi des notifications des communes n'est pas affichable dans tous les cas
1253     if ($maj == 3 && $this->can_display_notification_commune() === true) {
1254     $form->setType('suivi_notification_commune', 'jsontotab');
1255     }
1256 softime 10808
1257 softime 8593 // MODE AJOUTER
1258     if ($this->getParameter('maj') == 0) {
1259 softime 10573 $form->setType('commentaire', 'textareahidden');
1260     // Si l'option est active passage du champ date en lecture seule
1261     if ($this->f->is_option_date_evenement_instruction_lecture_seule($collectivite_di) === true) {
1262     $form->setType("date_evenement", "hiddenstaticdate");
1263     } else {
1264     $form->setType("date_evenement", "date");
1265     }
1266 softime 8989 if ($this->is_in_context_of_foreign_key("evenement", $this->getParameter("retourformulaire"))) {
1267 softime 8593 $form->setType("evenement", "selecthiddenstatic");
1268     } else {
1269     $form->setType("evenement", "select");
1270     }
1271 softime 8989 if ($this->is_in_context_of_foreign_key("signataire_arrete", $this->getParameter("retourformulaire"))) {
1272 softime 8593 $form->setType("signataire_arrete", "selecthiddenstatic");
1273     } else {
1274     $form->setType("signataire_arrete", "select");
1275     }
1276     if ($this->is_option_redaction_libre_enabled() === true) {
1277     $form->setType("flag_edition_integrale", "select");
1278     }
1279 mbroquet 3730 }
1280    
1281 softime 8593 // MODE MODIFIER
1282     if ($this->getParameter('maj') == 1) {
1283 softime 10573 // Si l'option est active passage du champ date en lecture seule
1284     if ($this->f->is_option_date_evenement_instruction_lecture_seule($collectivite_di) === true) {
1285     $form->setType("date_evenement", "hiddenstaticdate");
1286     } else {
1287     $form->setType("date_evenement", "date");
1288     }
1289 softime 8593 $form->setType("evenement", "selecthiddenstatic");
1290     if ($this->has_an_edition() === true) {
1291     $form->setType('lettretype', 'hiddenstatic');
1292 softime 8989 if ($this->is_in_context_of_foreign_key("signataire_arrete", $this->getParameter("retourformulaire"))) {
1293 softime 8593 $form->setType("signataire_arrete", "selecthiddenstatic");
1294     } else {
1295     $form->setType("signataire_arrete", "select");
1296     }
1297     if ($this->getVal("flag_edition_integrale") == "t") {
1298     $form->setType("titre_om_htmletat", "htmlEtat");
1299     $form->setType("corps_om_htmletatex", "htmlEtatEx");
1300     } else {
1301     $form->setType("complement_om_html", "html");
1302     $form->setType("complement2_om_html", "html");
1303     $form->setType("complement3_om_html", "html");
1304     $form->setType("complement4_om_html", "html");
1305     $form->setType('bible_auto', 'httpclick');
1306     $form->setType('bible', 'httpclick');
1307     $form->setType('bible2', 'httpclick');
1308     $form->setType('bible3', 'httpclick');
1309     $form->setType('bible4', 'httpclick');
1310     }
1311     if ($this->f->is_option_preview_pdf_enabled($collectivite_di) === true) {
1312     //
1313     $form->setType('btn_refresh', 'httpclickbutton');
1314     $form->setType('btn_preview', 'httpclickbutton');
1315     $form->setType('btn_redaction', 'httpclickbutton');
1316 softime 11876 // /!\ le type du champs est utilisé dans un selecteur dans le jscript.js
1317     // pour identifiant le champ de prévisualisation et régler sa taille à
1318     // l'affichage du champ. En cas de modification, le selecteur doit également
1319     // être mis à jour
1320 softime 11418 $form->setType('live_preview', 'previsualiser_pdf');
1321 softime 7521 }
1322 softime 8593
1323 mbroquet 3730 // necessaire pour calcul de date en modification
1324     //$form->setType('delai', 'hiddenstatic');
1325     // les administrateurs technique et fonctionnel peuvent
1326     // modifier tous les champs de date
1327     // si l'instruction a déjà été finalisée au moins une fois
1328 softime 7996 if (($this->f->isAccredited(array($this->get_absolute_class_name(), $this->get_absolute_class_name()."modification_dates"), "OR")
1329 softime 6565 || $this->f->isAccredited(array('instruction', 'instruction_modification_dates'), "OR"))
1330 mbroquet 3730 && $this->getVal("date_finalisation_courrier") != '') {
1331 softime 8593 //
1332 mbroquet 3730 $form->setType('date_envoi_signature', 'date');
1333     $form->setType('date_retour_signature', 'date');
1334 softime 10573 if ($this->is_sent_for_signature() === true
1335     && $this->is_signed() === true) {
1336     //
1337     $form->setType("date_envoi_signature", "datereadonly");
1338     $form->setType("date_retour_signature", "datereadonly");
1339     }
1340 mbroquet 3730 $form->setType('date_envoi_rar', 'date');
1341     $form->setType('date_retour_rar', 'date');
1342     $form->setType('date_envoi_controle_legalite', 'date');
1343 softime 11418 if ($this->is_sent_to_cl() === true) {
1344 softime 12124 $form->setType("date_envoi_controle_legalite", "datedisabled");
1345 softime 11418 }
1346 mbroquet 3730 $form->setType('date_retour_controle_legalite', 'date');
1347     $form->setType('date_finalisation_courrier', 'date');
1348     }
1349     }
1350     }
1351    
1352 softime 10808 // MODE CONSULTER + SUPPRIMER + SUIVI DES DATES 125 + NOTIFICATION MANUELLE
1353 softime 8593 if ($this->getParameter('maj') == 3
1354     || $this->getParameter('maj') == 2
1355 softime 10808 || $this->getParameter('maj') == 125
1356     || $this->getParameter('maj') == 410) {
1357 softime 8593 //
1358     $form->setType("date_evenement", "datestatic");
1359     $form->setType("evenement", "selecthiddenstatic");
1360     if ($this->has_an_edition() === true) {
1361     $form->setType('lettretype', 'hiddenstatic');
1362     $form->setType("signataire_arrete", "selecthiddenstatic");
1363     if ($this->getVal("om_final_instruction") == 't') {
1364     $form->setType('om_final_instruction_utilisateur', 'textareastatic');
1365     } else {
1366     $form->setType('om_final_instruction_utilisateur', 'hidden');
1367     }
1368     }
1369 softime 10573 if ($this->evenement_has_a_commentaire($this->getVal('evenement')) === true ) {
1370     $form->setType('commentaire', 'textareastatic');
1371     }
1372 mbroquet 3730 }
1373    
1374 softime 10808 // MODE CONSULTER + SUPPRIMER + NOTIFICATION MANUELLE
1375     if ($this->getParameter('maj') == 3
1376     || $this->getParameter('maj') == 2
1377     || $this->getParameter('maj') == 410) {
1378 softime 10573 // Si il n'y a pas de lettre type (edition) associé à l'événement
1379     // les dates de suivi ne sont pas affichée
1380 softime 8593 if ($this->has_an_edition() === true) {
1381 softime 10573 $form->setType('date_envoi_signature', 'datestatic');
1382     $form->setType('date_retour_signature', 'datestatic');
1383     $form->setType('date_envoi_rar', 'datestatic');
1384     $form->setType('date_retour_rar', 'datestatic');
1385     $form->setType('date_envoi_controle_legalite', 'datestatic');
1386     $form->setType('date_retour_controle_legalite', 'datestatic');
1387     $form->setType('date_finalisation_courrier', 'datestatic');
1388 softime 8593 if ($this->getVal("flag_edition_integrale") == "t") {
1389     $form->setType("titre_om_htmletat", "htmlstatic");
1390     $form->setType("corps_om_htmletatex", "htmlstatic");
1391     } else {
1392     $form->setType("complement_om_html", "htmlstatic");
1393     $form->setType("complement2_om_html", "htmlstatic");
1394     $form->setType("complement3_om_html", "htmlstatic");
1395     $form->setType("complement4_om_html", "htmlstatic");
1396     }
1397 mbroquet 3730 }
1398     }
1399 softime 8593
1400     // MODE SUIVI DES DATES 125
1401     if ($this->getParameter('maj') == 125) {
1402     $form->setType("date_evenement", "hiddenstaticdate");
1403     $form->setType('om_final_instruction_utilisateur', 'hiddenstatic');
1404     $form->setType('date_envoi_signature', 'date');
1405     $form->setType('date_retour_signature', 'date');
1406 softime 10573 if ($this->is_sent_for_signature() === true
1407     || $this->is_signed() === true) {
1408     //
1409     $form->setType("date_envoi_signature", "datereadonly");
1410     $form->setType("date_retour_signature", "datereadonly");
1411     }
1412 softime 8593 $form->setType('date_envoi_rar', 'date');
1413     $form->setType('date_retour_rar', 'date');
1414     $form->setType('date_envoi_controle_legalite', 'date');
1415 softime 11418 if ($this->is_sent_to_cl() === true) {
1416 softime 12124 $form->setType("date_envoi_controle_legalite", "datedisabled");
1417 softime 11418 }
1418 softime 8593 $form->setType('date_retour_controle_legalite', 'date');
1419     $form->setType('date_finalisation_courrier', 'date');
1420     }
1421 softime 10573
1422     if ($maj == 401) {
1423     foreach ($this->champs as $champ) {
1424     $form->setType($champ, 'hidden');
1425     }
1426 softime 11418 $form->setType('preview_edition', 'previsualiser');
1427 softime 10573 }
1428 softime 12124
1429     // Si l'instruction a été envoyé au contrôle de légalité et que la
1430     // tâche envoi_cl lié n'a pas encore été traité il faut indiquer à
1431     // l'utilisateur que l'envoi au cl est en cours de traitement.
1432     if ($this->is_sent_to_cl() === true
1433     && empty($this->getVal('date_envoi_controle_legalite'))
1434     && $maj == 3) {
1435     $form->setType("date_envoi_controle_legalite", "hiddenstatic");
1436     }
1437 mbroquet 3730 }
1438    
1439 softime 8593 function setOnchange(&$form,$maj){
1440     parent::setOnchange($form,$maj);
1441    
1442     // MODE AJOUTER
1443     if ($this->getParameter('maj') == 0) {
1444 softime 10573 $form->setOnchange(
1445     "evenement",
1446     "manage_instruction_evenement_lettretype(this.value, '".addslashes($this->getParameter('idxformulaire'))."');
1447     manage_instruction_evenement_commentaire(this.value, '".addslashes($this->getParameter('idxformulaire'))."');"
1448     );
1449 softime 8593 }
1450     }
1451    
1452     function evenement_has_an_edition($evenement_id) {
1453     $evenement = $this->get_inst_evenement($evenement_id);
1454     $lettretype = $evenement->getVal('lettretype');
1455     if ($lettretype !== '' && $lettretype !== null) {
1456     return true;
1457     }
1458     return false;
1459     }
1460    
1461     function view_evenement_has_an_edition_json() {
1462     $json_return = array(
1463     "lettretype" => $this->evenement_has_an_edition($this->f->get_submitted_get_value('evenement_id')),
1464     "option_redaction_libre_enabled" => $this->is_option_redaction_libre_enabled(),
1465     );
1466     echo json_encode($json_return);
1467     }
1468    
1469 softime 10573 function evenement_has_a_commentaire($evenement_id) {
1470     $evenement = $this->get_inst_evenement($evenement_id);
1471     return $this->get_boolean_from_pgsql_value($evenement->getVal('commentaire'));
1472     }
1473    
1474     function view_evenement_has_a_commentaire_json() {
1475     $json_return = array(
1476     "commentaire" => $this->evenement_has_a_commentaire($this->f->get_submitted_get_value('evenement_id'))
1477     );
1478     echo json_encode($json_return);
1479     }
1480    
1481 softime 11418
1482 softime 8989 /**
1483 softime 11418 * CONDITION - can_be_sended_to_cl
1484 softime 8989 *
1485 softime 11418 * Vérifie que le contrôle de légalité est disponible
1486     *
1487     * @return boolean
1488     */
1489     function can_be_sended_to_cl() {
1490     // Si l'instruction a une édition
1491     // et que l'événement est paramétré pour envoyer le contrôle de légalité
1492     // par Plat'AU
1493     // et que la date de retour signature est renseignée
1494     // et que la date d'envoi au contrôle légalité n'est pas renseignée
1495     // et qu'il n'existe pas de task envoi_CL en cours (!= done ou canceled)
1496     if ($this->has_an_edition() === true) {
1497     $inst_di = $this->get_inst_dossier($this->getVal('dossier'));
1498     $inst_evenement = $this->get_inst_evenement($this->getVal('evenement'));
1499     if ($inst_evenement->getVal('envoi_cl_platau') === 't'
1500     && empty($this->getVal('date_retour_signature')) === false
1501     && empty($this->getVal('date_envoi_controle_legalite')) === true
1502     && $this->getVal('envoye_cl_platau') === 'f'
1503     && $this->f->is_type_dossier_platau($inst_di->getVal('dossier_autorisation')) === true
1504     && $inst_di->getVal('etat_transmission_platau') !== 'jamais_transmissible') {
1505     //
1506     return true;
1507     }
1508     }
1509     //
1510     return false;
1511     }
1512    
1513     /**
1514     *
1515 softime 8989 * @return string
1516     */
1517     function get_var_sql_forminc__sql_signataire_arrete() {
1518 softime 11585 return sprintf(
1519     "SELECT
1520     signataire_arrete.signataire_arrete,
1521     CONCAT_WS(
1522     ' - ',
1523     CONCAT_WS(' ', signataire_arrete.prenom, signataire_arrete.nom),
1524     signataire_habilitation.libelle,
1525     signataire_arrete.description
1526     )
1527     FROM
1528     %1\$ssignataire_arrete
1529     LEFT JOIN %1\$ssignataire_habilitation
1530     ON signataire_arrete.signataire_habilitation = signataire_habilitation.signataire_habilitation
1531     WHERE
1532     ((signataire_arrete.om_validite_debut IS NULL
1533     AND (signataire_arrete.om_validite_fin IS NULL
1534     OR signataire_arrete.om_validite_fin > CURRENT_DATE))
1535     OR (signataire_arrete.om_validite_debut <= CURRENT_DATE
1536     AND (signataire_arrete.om_validite_fin IS NULL
1537     OR signataire_arrete.om_validite_fin > CURRENT_DATE)))
1538     ORDER BY
1539     signataire_arrete.prenom,
1540     signataire_arrete.nom",
1541     DB_PREFIXE
1542     );
1543 softime 8989 }
1544    
1545     /**
1546     *
1547     * @return string
1548     */
1549     function get_var_sql_forminc__sql_signataire_arrete_by_id() {
1550 softime 11585 return sprintf(
1551     "SELECT
1552     signataire_arrete.signataire_arrete,
1553     CONCAT_WS(
1554     ' - ',
1555     CONCAT_WS(' ', signataire_arrete.prenom, signataire_arrete.nom),
1556     signataire_habilitation.libelle,
1557     signataire_arrete.description
1558     )
1559     FROM
1560     %1\$ssignataire_arrete
1561     LEFT JOIN %1\$ssignataire_habilitation
1562     ON signataire_arrete.signataire_habilitation = signataire_habilitation.signataire_habilitation
1563     WHERE
1564     signataire_arrete.signataire_arrete = <idx>",
1565     DB_PREFIXE
1566     );
1567 softime 8989 }
1568    
1569     /**
1570     *
1571     * @return string
1572     */
1573     function get_var_sql_forminc__sql_signataire_arrete_by_di() {
1574 softime 11585 return sprintf(
1575     "SELECT
1576     signataire_arrete.signataire_arrete,
1577     CONCAT_WS(
1578     ' - ',
1579     CONCAT_WS(' ', signataire_arrete.prenom, signataire_arrete.nom),
1580     signataire_habilitation.libelle,
1581     signataire_arrete.description
1582     )
1583     FROM
1584     %1\$ssignataire_arrete
1585     LEFT JOIN %1\$som_collectivite
1586     ON signataire_arrete.om_collectivite = om_collectivite.om_collectivite
1587     LEFT JOIN %1\$ssignataire_habilitation
1588     ON signataire_arrete.signataire_habilitation = signataire_habilitation.signataire_habilitation
1589     WHERE
1590     ((signataire_arrete.om_validite_debut IS NULL
1591     AND (signataire_arrete.om_validite_fin IS NULL
1592     OR signataire_arrete.om_validite_fin > CURRENT_DATE))
1593     OR (signataire_arrete.om_validite_debut <= CURRENT_DATE
1594     AND (signataire_arrete.om_validite_fin IS NULL
1595     OR signataire_arrete.om_validite_fin > CURRENT_DATE)))
1596     AND (om_collectivite.niveau = '2'
1597     OR signataire_arrete.om_collectivite = <collectivite_di>)
1598     ORDER BY
1599     signataire_arrete.prenom, signataire_arrete.nom",
1600     DB_PREFIXE
1601     );
1602 softime 8989 }
1603    
1604     /**
1605     *
1606     * @return string
1607     */
1608     function get_var_sql_forminc__sql_signataire_arrete_defaut() {
1609 softime 11585 return sprintf(
1610     "SELECT
1611     signataire_arrete.signataire_arrete,
1612     CONCAT_WS(
1613     ' - ',
1614     CONCAT_WS(' ', signataire_arrete.prenom, signataire_arrete.nom),
1615     signataire_habilitation.libelle,
1616     signataire_arrete.description
1617     )
1618     FROM
1619     %1\$ssignataire_arrete
1620     LEFT JOIN %1\$ssignataire_habilitation
1621     ON signataire_arrete.signataire_habilitation = signataire_habilitation.signataire_habilitation
1622     WHERE
1623     ((signataire_arrete.om_validite_debut IS NULL
1624     AND (signataire_arrete.om_validite_fin IS NULL
1625     OR signataire_arrete.om_validite_fin > CURRENT_DATE))
1626     OR (signataire_arrete.om_validite_debut <= CURRENT_DATE
1627     AND (signataire_arrete.om_validite_fin IS NULL
1628     OR signataire_arrete.om_validite_fin > CURRENT_DATE)))
1629     AND signataire_arrete.defaut IS TRUE
1630     ORDER BY
1631     signataire_arrete.prenom, signataire_arrete.nom",
1632     DB_PREFIXE
1633     );
1634 softime 8989 }
1635    
1636     /**
1637     *
1638     * @return string
1639     */
1640     function get_var_sql_forminc__sql_signataire_arrete_defaut_by_di() {
1641 softime 11585 return sprintf(
1642     "SELECT
1643     signataire_arrete.signataire_arrete,
1644     CONCAT_WS(
1645     ' - ',
1646     CONCAT_WS(' ', signataire_arrete.prenom, signataire_arrete.nom),
1647     signataire_habilitation.libelle,
1648     signataire_arrete.description
1649     )
1650     FROM
1651     %1\$ssignataire_arrete
1652     LEFT JOIN %1\$ssignataire_habilitation
1653     ON signataire_arrete.signataire_habilitation = signataire_habilitation.signataire_habilitation
1654     LEFT JOIN %1\$som_collectivite
1655     ON signataire_arrete.om_collectivite = om_collectivite.om_collectivite
1656     WHERE
1657     ((signataire_arrete.om_validite_debut IS NULL
1658     AND (signataire_arrete.om_validite_fin IS NULL
1659     OR signataire_arrete.om_validite_fin > CURRENT_DATE))
1660     OR (signataire_arrete.om_validite_debut <= CURRENT_DATE
1661     AND (signataire_arrete.om_validite_fin IS NULL
1662     OR signataire_arrete.om_validite_fin > CURRENT_DATE)))
1663     AND signataire_arrete.defaut IS TRUE
1664     AND (om_collectivite.niveau = '2'
1665     OR signataire_arrete.om_collectivite = <collectivite_di>)
1666     ORDER BY
1667     signataire_arrete.prenom,
1668     signataire_arrete.nom",
1669     DB_PREFIXE
1670     );
1671 softime 8989 }
1672    
1673     /**
1674 softime 14542 * Renvoie sous la forme d'un tableau la liste des événements pouvant être ajoutés au dossier
1675     * dont l'identifiant a été passé en paramètre dans l'url.
1676     *
1677     * @return array
1678     */
1679     function get_var_sql_forminc__sql_evenement() {
1680     // Récupération du numéro de dossier
1681     $dossier = $this->getParameter("idxformulaire");
1682     // Si changement de décision par instructeur commune
1683     $filter = '';
1684     if ($this->f->isUserInstructeur() === true
1685     && $this->getDivisionFromDossier($dossier) != $_SESSION["division"]
1686     && $this->isInstrCanChangeDecision($dossier) === true) {
1687     $filter = "AND evenement.type IN ('arrete', 'changement_decision')";
1688     }
1689     // Récupération du libellé, de l'identifiant des évènement et d'un booléen permettant
1690     // de déterminer si il s'agit d'évènements suggérés.
1691     $qres = $this->f->get_all_results_from_db_query(
1692     sprintf(
1693     'SELECT
1694     DISTINCT(evenement.evenement),
1695     evenement.libelle,
1696     -- Si l evenement est suggérés alors il sera lié à la table des événements suggérés du dossier
1697     CASE WHEN evenement_suggere_dossier.evenement IS NULL
1698     THEN FALSE
1699     ELSE TRUE
1700     END AS is_suggested
1701     FROM
1702     -- Jointures permettant de récupérer la liste des évènements compatibles avec le dossier
1703     -- selon le type de dossier et l état du dossier.
1704     %1$sevenement
1705     JOIN %1$slien_dossier_instruction_type_evenement
1706     ON evenement.evenement = lien_dossier_instruction_type_evenement.evenement
1707     JOIN %1$stransition
1708     ON evenement.evenement = transition.evenement
1709     JOIN %1$sdossier
1710     ON lien_dossier_instruction_type_evenement.dossier_instruction_type = dossier.dossier_instruction_type
1711     AND transition.etat = dossier.etat
1712     -- Jointures avec une sous requêtes servant à récupérer la liste des évènements suggérés du dossier.
1713     LEFT JOIN (
1714     SELECT
1715     lien_sig_contrainte_evenement.evenement,
1716     dossier.dossier
1717     FROM
1718     %1$slien_sig_contrainte_evenement
1719     JOIN %1$ssig_contrainte
1720     ON lien_sig_contrainte_evenement.sig_contrainte = sig_contrainte.sig_contrainte
1721     JOIN %1$slien_sig_contrainte_dossier_instruction_type
1722     ON sig_contrainte.sig_contrainte = lien_sig_contrainte_dossier_instruction_type.sig_contrainte
1723     JOIN %1$slien_sig_contrainte_om_collectivite
1724     ON sig_contrainte.sig_contrainte = lien_sig_contrainte_om_collectivite.sig_contrainte
1725     JOIN %1$scontrainte
1726     ON sig_contrainte.libelle = contrainte.libelle
1727     JOIN %1$sdossier_contrainte
1728     ON contrainte.contrainte = dossier_contrainte.contrainte
1729     JOIN %1$sdossier
1730     ON dossier_contrainte.dossier = dossier.dossier
1731     AND lien_sig_contrainte_dossier_instruction_type.dossier_instruction_type = dossier.dossier_instruction_type
1732     JOIN %1$som_collectivite
1733     ON lien_sig_contrainte_om_collectivite.om_collectivite = om_collectivite.om_collectivite
1734     AND (dossier.om_collectivite = om_collectivite.om_collectivite
1735     OR om_collectivite.niveau = \'2\')
1736     ) AS evenement_suggere_dossier
1737     ON evenement.evenement = evenement_suggere_dossier.evenement
1738     AND dossier.dossier = evenement_suggere_dossier.dossier
1739     WHERE
1740     dossier.dossier = \'%2$s\'
1741     %3$s
1742     ORDER BY
1743     is_suggested DESC,
1744     evenement.libelle',
1745     DB_PREFIXE,
1746     $this->f->db->escapeSimple($dossier),
1747     $filter
1748     ),
1749     array(
1750     "origin" => __METHOD__
1751     )
1752     );
1753     return $qres['result'];
1754     }
1755    
1756     /**
1757     * Récupère un tableau contenant des évènements de la forme :
1758     * $events = array(
1759     * 1 => array(
1760     * 'libelle' => 'evenement_libelle',
1761     * 'evenement' => 'identifiant_evenement',
1762     * 'is_suggested' => true/false -> booleen indiquant si c'est un événement suggéré
1763     * ))
1764     * Et le transforme pour pouvoir l'utiliser pour le remplissage d'un select de formulaire.
1765     *
1766     * Le format de sorti est le suivant :
1767     * $select = array(
1768     * 0 => array( -> liste des id des événements
1769     * '0' => '',
1770     * '1' => array(
1771     * '0' => array(), -> liste des id des événements suggérés
1772     * '1' => array(), -> liste des libelles des événements suggérés
1773     * ),
1774     * ...,
1775     * n => 'id_evenement_n'
1776     * ),
1777     * 1 => array(
1778     * '0' => '__('choisir')." ".__('evenement')',
1779     * '1' => '💡 Suggestions',
1780     * ...,
1781     * 'n' => 'libelle_evenement_n',
1782     * )
1783     * )
1784     *
1785     * @param array tableau des événements
1786     * @return array
1787     */
1788     protected function convert_events_array_to_select_format($events) {
1789     // Remplissage du tableau du select en incluant le groupe des instructions suggérées.
1790     $contenu = array(
1791     0 => array("",),
1792     1 => array(__('choisir')." ".__('evenement'),)
1793     );
1794    
1795     if (! empty($events)) {
1796     // S'il y a des évènements suggérés extraction de ces événements et mise en place du groupe
1797     $suggested_event_group = array_filter($events, function($a) {
1798     return $a['is_suggested'] === 't';
1799     });
1800     if (! empty($suggested_event_group)) {
1801     // Prépare les données qui permettront d'afficher le groupe des événements
1802     // suggérés.
1803     $values = array();
1804     $labels = array();
1805     foreach ($suggested_event_group as $index => $suggested_event) {
1806     $values[] = $suggested_event['evenement'];
1807     $labels[] = $suggested_event['libelle'];
1808     // Supprime les évènements suggérés de la liste des évènements
1809     unset($events[$index]);
1810     }
1811     // Remplissage du select pour le groupe
1812     $contenu[0][] = array($values, $labels);
1813     $contenu[1][] = __('💡 Suggestions');
1814     }
1815    
1816     // Remplissage du select
1817     foreach ($events as $event) {
1818     $contenu[0][] = $event['evenement'];
1819     $contenu[1][] = $event['libelle'];
1820     }
1821     }
1822     return $contenu;
1823     }
1824    
1825     /**
1826 softime 8989 * SETTER_FORM - setSelect.
1827     *
1828     * @return void
1829     */
1830     function setSelect(&$form, $maj, &$dnu1 = null, $dnu2 = null) {
1831     //parent::setSelect($form, $maj);
1832 mbroquet 3730 /**
1833     * On ne surcharge pas la méthode parent car une requête sur la table
1834     * dossier est mauvaise pour les performances, car la requête qui
1835     * concerne evenement est plus complexe que celle générée et car les
1836     * champs action, avis_decision et etat ne sont pas utilisés comme des
1837     * select
1838     */
1839     //// action
1840 softime 8989 //$this->init_select($form, $this->f->db, $maj, null, "action",
1841 mbroquet 3730 // $sql_action, $sql_action_by_id, false);
1842    
1843     //// avis_decision
1844 softime 8989 //$this->init_select($form, $this->f->db, $maj, null, "avis_decision",
1845 mbroquet 3730 // $sql_avis_decision, $sql_avis_decision_by_id, false);
1846    
1847     //// dossier
1848 softime 8989 //$this->init_select($form, $this->f->db, $maj, null, "dossier",
1849 mbroquet 3730 // $sql_dossier, $sql_dossier_by_id, false);
1850    
1851     //// etat
1852 softime 8989 //$this->init_select($form, $this->f->db, $maj, null, "etat",
1853 mbroquet 3730 // $sql_etat, $sql_etat_by_id, false);
1854    
1855     //// evenement
1856 softime 8989 //$this->init_select($form, $this->f->db, $maj, null, "evenement",
1857 mbroquet 3730 // $sql_evenement, $sql_evenement_by_id, false);
1858    
1859     // signataire_arrete
1860     // si contexte DI
1861     if ($this->getParameter("retourformulaire") == "dossier"
1862 softime 12847 || $this->f->contexte_dossier_instruction()) {
1863 mbroquet 3730 // on recupère les signataires de la multicollectivité et de celle du DI
1864 softime 7996 $di = $this->f->get_inst__om_dbform(array(
1865     "obj" => "dossier_instruction",
1866     "idx" => $this->getParameter('idxformulaire'),
1867     ));
1868 softime 8989 $sql_signataire_arrete_by_di = str_replace(
1869     '<collectivite_di>',
1870     $di->getVal("om_collectivite"),
1871     $this->get_var_sql_forminc__sql("signataire_arrete_by_di")
1872     );
1873     $this->init_select(
1874     $form,
1875     $this->f->db,
1876     $maj,
1877     null,
1878     "signataire_arrete",
1879     $sql_signataire_arrete_by_di,
1880     $this->get_var_sql_forminc__sql("signataire_arrete_by_id"),
1881     true
1882     );
1883 mbroquet 3730 } else {
1884 softime 8989 $this->init_select(
1885     $form,
1886     $this->f->db,
1887     $maj,
1888     null,
1889     "signataire_arrete",
1890     $this->get_var_sql_forminc__sql("signataire_arrete"),
1891     $this->get_var_sql_forminc__sql("signataire_arrete_by_id"),
1892     true
1893     );
1894 mbroquet 3730 }
1895    
1896     /**
1897     * Gestion du filtre sur les événements de workflow disponibles
1898     * On récupère ici en fonction de l'état du dossier d'instruction en
1899     * cours et du type du dossier d'instruction en cours la liste
1900     * événements disponibles.
1901     */
1902     if ($maj == 0) {
1903 softime 14542 $evenements = $this->get_var_sql_forminc__sql_evenement();
1904     $form->setSelect("evenement", $this->convert_events_array_to_select_format($evenements));
1905 mbroquet 3730 } else {
1906 softime 14064 // Instanciation de l'événement pour récupérer son libellé
1907     $evenement = $this->f->get_inst__om_dbform(array(
1908     "obj" => "evenement",
1909     "idx" => $this->getVal("evenement"),
1910     ));
1911    
1912 mbroquet 3730 $contenu = array(
1913     0 => array($this->getVal("evenement"),),
1914 softime 14064 1 => array($evenement->getVal('libelle'),)
1915 mbroquet 3730 );
1916     $form->setSelect("evenement", $contenu);
1917     }
1918    
1919     /**
1920     * Gesion des liens vers la bible
1921     */
1922     // lien bible_auto
1923     $contenu = array(_("automatique"));
1924     $form->setSelect("bible_auto",$contenu);
1925     // lien bible1
1926     $contenu = array(_("bible"));
1927     $form->setSelect("bible",$contenu);
1928     // lien bible2
1929     $contenu = array(_("bible"));
1930     $form->setSelect("bible2",$contenu);
1931     // lien bible3
1932     $contenu = array(_("bible"));
1933     $form->setSelect("bible3",$contenu);
1934     // lien bible4
1935     $contenu = array(_("bible"));
1936     $form->setSelect("bible4",$contenu);
1937 softime 7521
1938     if ($maj == 1) {
1939     $base64 = $this->init_pdf_temp();
1940     $form->setSelect('live_preview', array('base64'=>$base64));
1941 softime 8593 $form->setSelect("btn_refresh", array(_('Prévisualiser')));
1942     $form->setSelect("btn_preview", array(_('Prévisualiser >>')));
1943     $form->setSelect("btn_redaction", array(_('<< Rédiger')));
1944 softime 7521 }
1945 softime 8593
1946     // Selection du type de rédaction à l'ajout
1947     $content = array(
1948     0 => array('f', 't', ),
1949     1 => array(_('Rédaction par compléments'), _('Rédaction libre'), ),
1950     );
1951     $form->setSelect('flag_edition_integrale', $content);
1952 softime 10573
1953     $contenu = array();
1954     foreach(array('waiting', 'in_progress', 'canceled', 'expired', 'finished') as $value) {
1955     $contenu[0][] = $value;
1956     $contenu[1][] = $this->get_trad_for_statut($value);
1957     }
1958     $form->setSelect('statut_signature', $contenu);
1959    
1960    
1961     if ($maj == 401) {
1962 softime 17036 $idx = $this->getParameter("idx");
1963     $dossier = $this->getParameter("idxformulaire");
1964     if ( strpos($idx, 'STORAGE_') !== FALSE) {
1965     $idx = substr($idx, 8);
1966     $model = 'storage';
1967     $champ = 'uid';
1968     $object = $this->f->get_inst__om_dbform(array(
1969     "obj" => $model,
1970     "idx" => $idx,
1971     ));
1972    
1973     $file = $this->f->storage->get($object->getVal($champ));
1974     $label = $file['metadata']['filename'];
1975     $href =sprintf(
1976     '../app/index.php?module=form&snippet=file&obj=storage&champ=uid&id=%1$s',
1977     $idx
1978     );
1979     $this->addToLog(__METHOD__."(): file['metadata']['filename'] = ".$file['metadata']['filename']." ", DEBUG_MODE);
1980     $this->val['preview_edition'] = '';
1981     }else{
1982     $label ='instruction_'.$this->getVal($this->clePrimaire);
1983     $href =sprintf(
1984     '../app/index.php?module=form&snippet=file&obj=instruction&champ=om_fichier_instruction&id=%1$s',
1985     $this->getVal($this->clePrimaire)
1986     );
1987     $file = $this->f->storage->get($this->getVal('om_fichier_instruction'));
1988     }
1989    
1990 softime 11418 $form->setSelect('preview_edition', array(
1991     'base64' => base64_encode($file['file_content']),
1992     'mimetype' => $file['metadata']['mimetype'],
1993 softime 17036 'label' => $label,
1994     'href' => $href
1995 softime 11418 ));
1996 softime 10573 }
1997 mbroquet 3730 }
1998    
1999 softime 8989 function cleSecondaire($id, &$dnu1 = null, $val = array(), $dnu2 = null) {
2000 mbroquet 3730 //
2001 softime 11228 // Vérifie uniquementla cle secondaire : demande
2002     $this->rechercheTable($this->f->db, "demande", "instruction_recepisse", $id);
2003 mbroquet 3730
2004     $id = $this->getVal($this->clePrimaire);
2005    
2006     //Requête de vérification que cet événement d'instruction n'est pas lié
2007     //à la création d'un dossier d'instruction
2008 softime 14064 $qres = $this->f->get_one_result_from_db_query(
2009     sprintf(
2010     'SELECT
2011     demande_type.dossier_instruction_type
2012     FROM
2013     %1$sdemande_type
2014     LEFT JOIN %1$sdemande
2015     ON demande.demande_type = demande_type.demande_type
2016     WHERE
2017     demande.instruction_recepisse = \'%2$d\'',
2018     DB_PREFIXE,
2019     intval($id)
2020     ),
2021     array(
2022     "origin" => __METHOD__,
2023     )
2024     );
2025 mbroquet 3730
2026     // Aucune clé secondaire n'a été trouvée ou c'est un événement sans
2027     //création de dossier d'instruction, l'événement d'instruction peut être
2028     //supprimé
2029 softime 14064 if ( $this->correct !== false || $qres['result'] == null || $qres['result'] == ""){
2030 mbroquet 3730 // Requête de vérification que cet événement d'instruction est lié
2031     // à une demande
2032 softime 14064 $qres = $this->f->get_one_result_from_db_query(
2033     sprintf(
2034     'SELECT
2035     demande
2036     FROM
2037     %1$sdemande
2038     WHERE
2039     instruction_recepisse = \'%2$d\'',
2040     DB_PREFIXE,
2041     intval($id)
2042     ),
2043     array(
2044     "origin" => __METHOD__,
2045     )
2046     );
2047 mbroquet 3730
2048     //Si c'est un événement d'instruction lié à une demande
2049 softime 14064 if ($qres['result'] != null || $qres['result'] != ""){
2050 softime 7996 $demande = $this->f->get_inst__om_dbform(array(
2051     "obj" => "demande",
2052 softime 14064 "idx" => $qres['result'],
2053 softime 7996 ));
2054 mbroquet 3730
2055 softime 14064 //On met à jour la demande en supprimant la liaison vers
2056 mbroquet 3730 //l'événement d'instruction
2057     $demande->setParameter("maj", 1);
2058     $valF = array();
2059     foreach($demande->champs as $identifiant => $champ) {
2060     $valF[$champ] = $demande->val[$identifiant];
2061     }
2062     $valF['date_demande']=$demande->dateDBToForm($valF['date_demande']);
2063     $valF['instruction_recepisse']=NULL;
2064 softime 8989 $ret = $demande->modifier($valF);
2065 mbroquet 3730 }
2066    
2067     /**
2068     * Vérification que l'élément supprimé est le dernier pour pouvoir
2069     * remodifier les données de manière itérative.
2070     */
2071 softime 14064 $qres = $this->f->get_one_result_from_db_query(
2072     sprintf(
2073     'SELECT
2074     max(instruction)
2075     FROM
2076     %1$sinstruction
2077     WHERE
2078     dossier = \'%2$s\'',
2079     DB_PREFIXE,
2080     $this->f->db->escapeSimple($this->getParameter("idxformulaire"))
2081     ),
2082     array(
2083     "origin" => __METHOD__,
2084     )
2085     );
2086    
2087 mbroquet 3730 // Si on se trouve effectivement sur le dernier evenement d'instruction
2088 softime 14064 // alors on valide la suppression sinon on l'annule
2089     $this->correct = false;
2090     $message = __("Seul le dernier evenement d'instruction peut etre supprime.");
2091     if ($qres['result'] == $id) {
2092 mbroquet 3730 // Alors on valide la suppression
2093     $this->correct = true;
2094 softime 14064 $message = __('Destruction_chronologique');
2095 mbroquet 3730 }
2096 softime 14064 $this->addToMessage($message);
2097 mbroquet 3730 }
2098     }
2099    
2100     /**
2101     * Vérification de la possibilité ou non de modifier des dates de suivi
2102     * @param string $champ champ date à vérifier
2103     */
2104     function updateDate($champ) {
2105    
2106     //Si le retourformulaire est "dossier_instruction"
2107     if ($this->getParameter("retourformulaire") == "dossier"
2108 softime 12847 || $this->f->contexte_dossier_instruction()) {
2109 mbroquet 3730
2110     // Vérification de la possibilité de modifier les dates si déjà éditées
2111     if($this->valF[$champ] != "" AND !$this->f->user_is_admin) {
2112     // si l'utilisateur n'est pas un admin
2113     if($this->getVal($champ) != "" AND $this->getVal($champ) != $this->valF[$champ]) {
2114 softime 15650
2115     // si le champ concerné est 'date_envoi_signature'
2116     // et que le statut du parapheur est 'expired'
2117     // alors on autorise le changement de la date
2118     // pour tous les autres cas, on ne peut modifier la date
2119     if ($champ !== 'date_envoi_signature' || $this->getVal('statut_signature') !== 'expired') {
2120     $this->correct = false;
2121     $this->addToMessage(_("Les dates de suivis ne peuvent etre modifiees"));
2122     }
2123 mbroquet 3730 }
2124     }
2125     }
2126    
2127     //
2128     return true;
2129     }
2130    
2131 softime 8989 /**
2132     * SETTER_FORM - setValsousformulaire (setVal).
2133     *
2134     * @return void
2135     */
2136     function setValsousformulaire(&$form, $maj, $validation, $idxformulaire, $retourformulaire, $typeformulaire, &$dnu1 = null, $dnu2 = null) {
2137     // parent::setValsousformulaire($form, $maj, $validation, $idxformulaire, $retourformulaire, $typeformulaire);
2138 mbroquet 3730 //
2139 softime 8989 $this->retourformulaire = $retourformulaire;
2140     //
2141 mbroquet 3730 if ($maj == 0) {
2142 softime 8989 $form->setVal("destinataire", $this->getParameter("idxformulaire"));
2143     $form->setVal("dossier", $this->getParameter("idxformulaire"));
2144 mbroquet 3730 }
2145 softime 12124
2146     // Si l'instruction a été envoyé au contrôle de légalité et que la
2147     // tâche envoi_cl lié n'a pas encore été traité il faut indiquer à
2148     // l'utilisateur que l'envoi au cl est en cours de traitement.
2149     if ($this->is_sent_to_cl() === true
2150     && empty($this->getVal('date_envoi_controle_legalite'))
2151     && $maj == 3) {
2152     $form->setVal("date_envoi_controle_legalite", __("En cours de traitement."));
2153     }
2154 mbroquet 3730 //
2155     $this->set_form_default_values($form, $maj, $validation);
2156     }
2157    
2158     /**
2159 softime 8989 * SETTER_FORM - set_form_default_values (setVal).
2160     *
2161     * @return void
2162 mbroquet 3730 */
2163     function set_form_default_values(&$form, $maj, $validation) {
2164 softime 8989 //
2165 mbroquet 3730 if ($maj == 0) {
2166     // si contexte DI
2167     if ($this->getParameter("retourformulaire") == "dossier"
2168 softime 12847 || $this->f->contexte_dossier_instruction()) {
2169 mbroquet 3730 // on recupère les signataires de la multicollectivité et de celle du DI
2170 softime 7996 $di = $this->f->get_inst__om_dbform(array(
2171     "obj" => "dossier_instruction",
2172 softime 8989 "idx" => $this->getParameter("idxformulaire"),
2173 softime 7996 ));
2174 softime 8989 $sql = str_replace(
2175     "<collectivite_di>",
2176     $di->getVal("om_collectivite"),
2177     $this->get_var_sql_forminc__sql("signataire_arrete_defaut_by_di")
2178     );
2179 mbroquet 3730 } else {
2180 softime 8989 $sql = $this->get_var_sql_forminc__sql("signataire_arrete_defaut");
2181 mbroquet 3730 }
2182 softime 14542
2183     $qres = $this->f->get_all_results_from_db_query($sql, array(
2184     "origin" => __METHOD__));
2185     $row = array_shift($qres['result']);
2186 softime 8989 if (isset($row["signataire_arrete"])
2187     && is_numeric($row["signataire_arrete"])) {
2188     //
2189     $form->setVal("signataire_arrete", $row["signataire_arrete"]);
2190 mbroquet 3730 }
2191 softime 8989 // Date du jour
2192     $form->setVal("date_evenement", date("Y-m-d"));
2193 mbroquet 3730 }
2194 softime 8989 //
2195 mbroquet 3730 if ($maj == 0 || $maj == 1 || $maj == 125) {
2196 softime 8989 $form->setVal("bible_auto", "bible_auto()");
2197     $form->setVal("bible", "bible(1)");
2198     $form->setVal("bible2", "bible(2)");
2199     $form->setVal("bible3", "bible(3)");
2200     $form->setVal("bible4", "bible(4)");
2201 mbroquet 3730 }
2202 softime 8989 //
2203 softime 7521 $collectivite_di = $this->get_dossier_instruction_om_collectivite();
2204 softime 8989 if ($maj == 1
2205     && $this->f->is_option_preview_pdf_enabled($collectivite_di) === true
2206 softime 7521 && $this->has_an_edition() === true) {
2207 softime 8989 //
2208     $form->setVal("live_preview", $this->getVal($this->clePrimaire));
2209     $form->setVal("btn_refresh", "reload_pdf_viewer()");
2210     $form->setVal("btn_preview", "show_instr_preview()");
2211     $form->setVal("btn_redaction", "show_instr_redaction()");
2212 softime 7521 }
2213 softime 10808
2214 softime 12654 // Gestion de l'affichage des suivis de notification des demandeurs, des services, des tiers et
2215     // des communes
2216     if ($maj == 3) {
2217     if ($this->can_display_notification_demandeur()) {
2218     $typeNotification = array(
2219     'notification_recepisse',
2220     'notification_instruction',
2221     'notification_decision',
2222     );
2223     $form->setVal("suivi_notification", $this->get_json_suivi_notification($typeNotification, true));
2224     }
2225     if ($this->can_display_notification_service()) {
2226     $form->setVal("suivi_notification_service", $this->get_json_suivi_notification(array('notification_service_consulte')));
2227     }
2228     if ($this->can_display_notification_tiers()) {
2229     $form->setVal("suivi_notification_tiers", $this->get_json_suivi_notification(array('notification_tiers_consulte')));
2230     }
2231     if ($this->can_display_notification_commune()) {
2232     $form->setVal("suivi_notification_commune", $this->get_json_suivi_notification(array('notification_depot_demat', 'notification_commune')));
2233     }
2234 softime 15835 if ($this->getVal('flag_edition_integrale') == 't') {
2235     $message = __("Aucun contenu à afficher.");
2236     if (empty($this->getVal('titre_om_htmletat'))) {
2237     $form->setVal("titre_om_htmletat", $message);
2238     }
2239     if (empty($this->getVal('corps_om_htmletatex'))) {
2240     $form->setVal("corps_om_htmletatex", $message);
2241     }
2242     }
2243 softime 10808 }
2244 mbroquet 3730 }
2245    
2246     function setLayout(&$form, $maj){
2247 softime 8593 $form->setBloc('evenement','D',"","sousform-instruction-action-".$maj);
2248 mbroquet 3730
2249 softime 8593 $form->setFieldset('evenement','D',_('Evenement'));
2250     $form->setFieldset('om_final_instruction_utilisateur','F','');
2251    
2252     $form->setBloc('om_final_instruction_utilisateur','F');
2253 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
2254     // afin de bypasser le fait de ne pas avoir le form-content et le portlet dans le meme container
2255     $form->setBloc('om_final_instruction_utilisateur','F');
2256     $form->setBloc('parapheur_lien_page_signature','D');
2257 mbroquet 3730
2258 softime 8593 $form->setBloc('date_finalisation_courrier','D',"","");
2259 mbroquet 3730
2260 softime 15973 $form->setFieldset('date_finalisation_courrier','D',_('Dates'),"instruction--suivi-dates");
2261     $form->setBloc('date_finalisation_courrier','D');
2262     $form->setBloc('date_envoi_rar','F');
2263 mbroquet 3730
2264 softime 15973 $form->setBloc('date_retour_rar','D');
2265 softime 8593 $form->setBloc('date_retour_controle_legalite','F');
2266     $form->setFieldset('date_retour_controle_legalite','F','');
2267    
2268     $form->setBloc('date_retour_controle_legalite','F');
2269 mbroquet 3730
2270 softime 10573 $form->setBloc('statut_signature','D');
2271     $form->setFieldset('statut_signature','D','Suivi Parapheur');
2272     $form->setBloc('commentaire_signature','F');
2273     $form->setBloc('historique_signature','D');
2274     $form->setFieldset('historique_signature', 'DF', __("Historique"), "collapsible, startClosed");
2275     $form->setBloc('historique_signature','F');
2276     $form->setFieldset('historique_signature','F');
2277    
2278 softime 10808 $form->setFieldset('suivi_notification', 'D', __("Suivi notification"), "collapsible");
2279     $form->setFieldset('suivi_notification','F');
2280 softime 11585 $form->setFieldset('suivi_notification_service', 'D', __("Suivi notification service"), "collapsible");
2281     $form->setFieldset('suivi_notification_service','F');
2282     $form->setFieldset('suivi_notification_tiers', 'D', __("Suivi notification tiers"), "collapsible");
2283     $form->setFieldset('suivi_notification_tiers','F');
2284 softime 12654 $form->setFieldset('suivi_notification_commune', 'D', __("Suivi notification commune"), "collapsible");
2285     $form->setFieldset('suivi_notification_commune','F');
2286 softime 10808
2287 softime 8593 if ($maj == 1) {
2288     // Récupère la collectivité du dossier d'instruction
2289     $collectivite_di = $this->get_dossier_instruction_om_collectivite();
2290 mbroquet 3730
2291 softime 8593 //
2292     if ($this->f->is_option_preview_pdf_enabled($collectivite_di) === true
2293     && $this->has_an_edition() === true) {
2294 softime 7521 //
2295 softime 8593 $form->setBloc('complement_om_html','D',"","container_instr_edition");
2296     $form->setBloc('complement_om_html','D',"","hidelabel box_instr_edition redaction_instr_edition");
2297     $form->setBloc('complement_om_html','D',"","box_instr_edition_main");
2298     $form->setFieldset('complement_om_html','D',_('Complement'));
2299     $form->setFieldset('bible','F','');
2300     $form->setFieldset('complement2_om_html','D',_('Complement 2'));
2301     $form->setFieldset('bible2','F','');
2302     $form->setFieldset('complement3_om_html','D',_('Complement 3'));
2303     $form->setFieldset('bible3','F','');
2304     $form->setFieldset('complement4_om_html','D',_('Complement 4'));
2305     $form->setFieldset('bible4','F','');
2306     $form->setFieldset('titre_om_htmletat','DF',_('Titre'), 'startClosed');
2307     $form->setFieldset('corps_om_htmletatex','DF',_('Corps'));
2308     $form->setBloc('corps_om_htmletatex','F');
2309     $form->setBloc('btn_preview','DF',"","box_instr_edition_btn");
2310     $form->setBloc('btn_preview','F');
2311     $form->setBloc('btn_redaction','D', '',"hidelabel box_instr_edition preview_instr_edition");
2312     $form->setBloc('btn_redaction','DF',"","box_instr_edition_btn");
2313     $form->setFieldset('btn_refresh','D',_('Prévisualisation'), "box_instr_edition_main");
2314     $form->setFieldset('live_preview','F');
2315     $form->setBloc('live_preview','F');
2316     $form->setBloc('live_preview','F');
2317 softime 7521 } else {
2318 softime 8593 $form->setBloc('complement_om_html','D',"","hidelabel");
2319 softime 7521 $form->setFieldset('complement_om_html','D',_('Complement'));
2320     $form->setFieldset('bible','F','');
2321     $form->setFieldset('complement2_om_html','D',_('Complement 2'));
2322     $form->setFieldset('bible2','F','');
2323     $form->setFieldset('complement3_om_html','D',_('Complement 3'));
2324     $form->setFieldset('bible3','F','');
2325     $form->setFieldset('complement4_om_html','D',_('Complement 4'));
2326     $form->setFieldset('bible4','F','');
2327 softime 8593 $form->setFieldset('titre_om_htmletat','DF',_('Titre'), 'startClosed');
2328     $form->setFieldset('corps_om_htmletatex','DF',_('Corps'));
2329     $form->setBloc('corps_om_htmletatex','F');
2330 softime 7521 }
2331 softime 8593 } else {
2332     $form->setBloc('complement_om_html','D',"","hidelabel");
2333     $form->setFieldset('complement_om_html','D',_('Complement'));
2334     $form->setFieldset('bible','F','');
2335     $form->setFieldset('complement2_om_html','D',_('Complement 2'));
2336     $form->setFieldset('bible2','F','');
2337     $form->setFieldset('complement3_om_html','D',_('Complement 3'));
2338     $form->setFieldset('bible3','F','');
2339     $form->setFieldset('complement4_om_html','D',_('Complement 4'));
2340     $form->setFieldset('bible4','F','');
2341     $form->setFieldset('titre_om_htmletat','DF',_('Titre'), 'startClosed');
2342     $form->setFieldset('corps_om_htmletatex','DF',_('Corps'));
2343     $form->setBloc('corps_om_htmletatex','F');
2344 mbroquet 3730 }
2345     }
2346    
2347     function setLib(&$form, $maj) {
2348     //
2349     parent::setLib($form, $maj);
2350     //
2351     $form->setLib('bible_auto', "");
2352     $form->setLib('bible', "");
2353     $form->setLib('bible2', "");
2354     $form->setLib('bible3', "");
2355     $form->setLib('bible4', "");
2356 softime 7521 $form->setLib('btn_refresh', "");
2357 softime 8593 $form->setLib('btn_preview', "");
2358     $form->setLib('btn_redaction', "");
2359 softime 7521 $form->setLib('live_preview', "");
2360 mbroquet 3730 $form->setLib('om_final_instruction_utilisateur', _("finalise par"));
2361 softime 8989 $form->setLib('date_envoi_rar', __("date_envoi_ar"));
2362     $form->setLib('date_retour_rar', __("date_notification"));
2363 softime 10573 $form->setLib('statut_signature', __("statut"));
2364     $form->setLib('commentaire_signature', __("commentaire"));
2365     $form->setLib('historique_signature', '');
2366 softime 10808 $form->setLib('suivi_notification', '');
2367 softime 11585 $form->setLib('suivi_notification_service', '');
2368     $form->setLib('suivi_notification_tiers', '');
2369 softime 12654 $form->setLib('suivi_notification_commune', '');
2370 softime 10573 $form->setLib('preview_edition', "");
2371 softime 8593
2372     // Ajout d'une infobulle d'aide lorsque le formulaire est en mode
2373     // ajout et que l'option de rédaction libre est activée sur la
2374     // collectivité du dossier
2375     if ($maj === '0' && $this->is_option_redaction_libre_enabled() === true) {
2376     //
2377     $help_text_template = '%s <span class="info-16" title="%s"></span>';
2378     $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.");
2379     $form->setLib('flag_edition_integrale', sprintf($help_text_template, _("Type de rédaction"), $help_text));
2380     }
2381     else {
2382     $form->setLib('flag_edition_integrale', _("Type de rédaction"));
2383     }
2384    
2385     // Ajout d'une infobulle d'aide lorsque le formulaire est en mode
2386     // modification et que l'option de prévisualisation de l'édition est
2387     // activée sur la collectivité du dossier
2388     if ($maj === '1'
2389     && $this->f->is_option_preview_pdf_enabled($this->get_dossier_instruction_om_collectivite()) === true) {
2390     //
2391     $help_text_template = '%s <span class="info-16" title="%s"></span>';
2392     $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.");
2393     $form->setLib('date_evenement', sprintf($help_text_template, _('date_evenement'), $help_text));
2394     $form->setLib('signataire_arrete', sprintf($help_text_template, _('signataire_arrete'), $help_text));
2395     }
2396 mbroquet 3730 }
2397    
2398 softime 8989 /**
2399 softime 15835 * Surcharge om_dbform::set_form_specificity()
2400     *
2401     * Traitements spécifiques lié à l'affichage des formulaires.
2402     * Les traitements gérés ici sont les suivants :
2403     * - Affichage d'un message d'erreur si la lettretype de l'évènement n'a pas
2404     * pu être récupérée.
2405     * - Affichage d'un message d'information à l'attention de l'utilisateur si
2406     * la notification est activée mais qu'elle n'est pas possible à cause du
2407     * paramètrage.
2408     *
2409     * @param formulaire $form Instance formulaire.
2410     * @param string $maj
2411     *
2412     * @return void
2413     */
2414     function set_form_specificity(&$form, $maj) {
2415     parent::set_form_specificity($form, $maj);
2416    
2417     // En consultation, vérifie si une lettretype est associée à l'instruction et a pu être récupérée.
2418     // Si ce n'est pas le cas affiche un message d'erreur.
2419     if ((! empty($maj) && $maj == 3)) {
2420     if (! empty($this->getVal('lettretype'))) {
2421    
2422     $om_edition = $this->f->get_inst__om_edition();
2423     $dossier_instruction_om_collectivite = $this->get_dossier_instruction_om_collectivite();
2424     $collectivite = $this->f->getCollectivite($dossier_instruction_om_collectivite);
2425     $edition = $om_edition->get_edition_from_collectivite('om_lettretype', $this->getVal("lettretype"), $collectivite['om_collectivite_idx']);
2426    
2427     if (empty($edition)) {
2428     $this->display_error_message(__("Erreur de paramétrage, le modèle de document n'a pas pu être récupéré. Contactez votre administrateur."));
2429     }
2430     }
2431     }
2432    
2433     $this->display_notification_info($maj);
2434     }
2435    
2436     /**
2437     * En consultation, pour les dossiers qui n'ont pas été transmis par le portail
2438     * citoyen, si la notification des demandeurs est activée sur l'évenement
2439     * d'instruction et que le paramétrage du demandeur principal n'est pas
2440     * correct alors un message a destination de l'instructeur est affiché.
2441     *
2442     * @param string $maj
2443     *
2444     * @return void
2445     */
2446     public function display_notification_info($maj) {
2447     if ((! empty($maj) && $maj == 3)) {
2448     // Si le dossier n'a pas été déposé sur le portail citoyen (ou si
2449     // la requête permettant de savoir le type de demande à échouée) et si
2450     // la notification se fait par mail vérifie si il y a des erreurs de
2451     // paramétrage et si c'est le cas on affiche un message d'information
2452     if ($this->dossier_depose_sur_portail() == null || ! $this->dossier_depose_sur_portail()) {
2453     $erreurParam = $this->get_info_notification_fail();
2454     // Récupération de l'évenement d'instruction
2455     $instEV = $this->get_inst_evenement();
2456     if (! empty($instEV->getVal('notification')) && $erreurParam != array()) {
2457     $class = 'text-info ui-state-highlight ui-state-info';
2458     $message = __("La notification n'est pas possible.");
2459     $this->f->display_panel_information(
2460     $class,
2461     $message,
2462     $erreurParam,
2463     __('Les données suivantes doivent être modifiées'),
2464     'erreur_param_notif'
2465     );
2466     }
2467     }
2468     }
2469     }
2470    
2471     /**
2472     * Méthode permettant d'afficher des messages d'erreur sur les formulaires.
2473     */
2474     public function display_error_message($msg) {
2475     $this->correct = false;
2476     $this->msg = $msg;
2477     }
2478    
2479     /**
2480 softime 8989 * TRIGGER - triggerajouter.
2481 softime 17036 * Réalise différents traitements avant d'ajouter l'instruction en base.
2482 softime 8989 *
2483 softime 17036 * Les traitements réalisés sont les suivant :
2484     * - TODO : documenter les traietements existant
2485     * - Intégre les bibles pré-chargé aux compléments de l'instruction.
2486     * Ce traitement n'est déclenché que si l'on est pas en rédaction libre, et que l'évènement a une lettretype.
2487     *
2488 softime 8989 * @return boolean
2489     */
2490     function triggerajouter($id, &$dnu1 = null, $val = array(), $dnu2 = null) {
2491     $this->addToLog(__METHOD__."(): start", EXTRA_VERBOSE_MODE);
2492 mbroquet 3730 /**
2493     * Le code suivant permet de récupérer des valeurs des tables evenement
2494     * et dossier pour les stocker dans l'instruction :
2495     * DEPUIS L'EVENEMENT
2496     * - action
2497     * - delai
2498     * - accord_tacite
2499     * - etat
2500     * - avis_decision
2501     * - delai_notification
2502     * - lettretype
2503     * - autorite_competente
2504 softime 10573 * - pec_metier
2505 softime 6565 * - complement_om_html
2506     * - complement2_om_html
2507     * - complement3_om_html
2508     * - complement4_om_html
2509     * - complement5_om_html
2510 mbroquet 3730 * DEPUIS LE DOSSIER D'INSTRUCTION
2511     * - archive_delai
2512     * - archive_accord_tacite
2513     * - archive_etat
2514     * - archive_avis
2515     * - date_complet
2516     * - date_rejet
2517     * - date_limite
2518     * - date_notification_delai
2519     * - date_decision
2520     * - date_validite
2521     * - date_achevement
2522     * - date_chantier
2523     * - date_conformite
2524     * - avis_decision
2525     */
2526     // Récupération de tous les paramètres de l'événement sélectionné
2527 softime 14542 // TODO : remplacer cette requête par l'instanciation de l'événement
2528     $qres = $this->f->get_all_results_from_db_query(
2529     sprintf(
2530     'SELECT
2531     *
2532     FROM
2533     %1$sevenement
2534     WHERE
2535     evenement = %2$d',
2536     DB_PREFIXE,
2537     intval($this->valF['evenement'])
2538     ),
2539     array(
2540     "origin" => __METHOD__,
2541     )
2542     );
2543     foreach ($qres['result'] as $row) {
2544 mbroquet 3730 // Récupération de l'identifiant de l'action
2545     // si une action est paramétrée dans l'événement
2546     $this->valF['action'] = NULL;
2547     if (isset($row['action']) and !empty($row['action'])) {
2548     $this->valF['action']=$row['action'];
2549     }
2550     // Récupération de la valeur du délai
2551     $this->valF['delai'] = $row['delai'];
2552     // Récupération de l'identifiant de l'état
2553     // si un état est paramétré dans l'événement
2554     $this->valF['etat']=NULL;
2555     if (isset($row['etat']) and !empty($row['etat'])) {
2556     $this->valF['etat']=$row['etat'];
2557     }
2558     // Récupération de la valeur d'accord tacite
2559     $this->valF['accord_tacite']=$row['accord_tacite'];
2560     // Récupération de la valeur du délai de notification
2561     $this->valF['delai_notification']=$row['delai_notification'];
2562     // Récupération de l'identifiant de l'avis
2563     // si un avis est paramétré dans l'événement
2564     $this->valF['avis_decision'] = NULL;
2565     if(isset($row['avis_decision']) and !empty($row['avis_decision'])) {
2566     $this->valF['avis_decision']=$row['avis_decision'];
2567     }
2568     // Récupération de la valeur de l'autorité compétente
2569     // si l'autorité compétente est paramétré dans l'événement
2570     $this->valF['autorite_competente'] = NULL;
2571     if(isset($row['autorite_competente']) and !empty($row['autorite_competente'])) {
2572     $this->valF['autorite_competente']=$row['autorite_competente'];
2573     }
2574     // Récupération de la valeur de la lettre type
2575     $this->valF['lettretype']=$row['lettretype'];
2576 softime 10573 // Récupération de la valeur de la prise en compte métier
2577     // si la prise en compte métier est paramétrée dans l'événement
2578     $this->valF['pec_metier'] = NULL;
2579     if(isset($row['pec_metier']) === true and empty($row['pec_metier']) === false) {
2580     $this->valF['pec_metier'] = $row['pec_metier'];
2581     }
2582 mbroquet 3730 }
2583     // Récupération de toutes les valeurs du dossier d'instruction en cours
2584 softime 14542 // TODO : remplacer cette requête par l'instanciation de l'objet
2585     $qres = $this->f->get_all_results_from_db_query(
2586     sprintf(
2587     'SELECT
2588     *
2589     FROM
2590     %1$sdossier
2591     WHERE
2592     dossier = \'%2$s\'',
2593     DB_PREFIXE,
2594     $this->f->db->escapeSimple($this->valF['dossier'])
2595     ),
2596     array(
2597     "origin" => __METHOD__,
2598     )
2599     );
2600     $row = array_shift($qres['result']);
2601 mbroquet 3730 $this->updateArchiveData($row);
2602    
2603     // Récupération de la duree de validite du dossier d'autorisation
2604 softime 14064 $qres = $this->f->get_one_result_from_db_query(
2605     sprintf(
2606     'SELECT
2607     duree_validite_parametrage
2608     FROM
2609     %1$sdossier_autorisation_type_detaille
2610     LEFT JOIN %1$sdossier_autorisation
2611     ON dossier_autorisation.dossier_autorisation_type_detaille = dossier_autorisation_type_detaille.dossier_autorisation_type_detaille
2612     LEFT JOIN %1$sdossier
2613     ON dossier.dossier_autorisation = dossier_autorisation.dossier_autorisation
2614     WHERE
2615     dossier.dossier = \'%2$s\'',
2616     DB_PREFIXE,
2617     $this->f->db->escapeSimple($this->valF['dossier'])
2618     ),
2619     array(
2620     "origin" => __METHOD__,
2621     )
2622     );
2623    
2624     if ($qres['result'] != '') {
2625     $this->valF['duree_validite_parametrage'] = $qres['result'];
2626 mbroquet 3730 }
2627    
2628     // Identifiant du type de courrier
2629     $idTypeCourrier = '11';
2630     $idCourrier = str_pad($this->valF["instruction"], 10, "0", STR_PAD_LEFT);
2631     // Code barres
2632     $this->valF["code_barres"] = $idTypeCourrier . $idCourrier;
2633 softime 17036
2634     // Set dans la propriété valF les valeurs des compléments pour qu'ils soient enregistrés
2635     // à l'ajout de l'instruction.
2636     // Le traitement n'est réalisé que si il y a une lettretype et qu'on est pas en rédaction libre
2637     if (! empty($this->valF['lettretype'])) {
2638     $this->set_precharge_complement($this->valF['evenement'], $this->valF['dossier']);
2639     }
2640 mbroquet 3730 }
2641 softime 17036
2642     /**
2643     * Récupère pour chaque champ complementX_om_html le complément correspondant
2644     * et set l'entrée correspondante de valF avec.
2645     *
2646     * Problème potentiel : Le nombre de complément se base sur le champs complement ayant
2647     * l'indice le plus grand visible dans get_var_sql_forminc__champs().
2648     * Dans cette fonction on fait donc 15 itérations. Changer le nombre de complément
2649     * aura donc un impact sur cette méthode.
2650     *
2651     * @param string dossier : identifiant du dossier de l'instruction
2652     * @param int evenement : identifiant de l'évènement d'instruction
2653     *
2654     * @return void
2655     */
2656     public function set_precharge_complement($evenement, $dossier) {
2657     // Récupération des bibles et chargement dans les compléments
2658     for ($i = 1; $i <= 15; $i++) {
2659     // Constitution de l'id du champs.
2660     // Pour l'indice 1, l'id est complement_om_html, l'indice n'est pas visible dans ce cas.
2661     $field = "complement".($i === 1 ? '' : $i)."_om_html";
2662     // Récupération des compléments correspondant en fonction de l'évènement
2663     // et du dossier puis insertion dans la champs voulu
2664     $this->valF[$field] = $this->getBible($evenement, $dossier, $i, 'precharge');
2665     }
2666     }
2667    
2668    
2669 mbroquet 3730
2670 softime 12124 /**
2671     * Test si une restriction est valide.
2672     *
2673     * @return boolean
2674     */
2675 mbroquet 3730 function restrictionIsValid($restriction){
2676     if($this->restriction_valid != null) {
2677     return $this->restriction_valid;
2678     }
2679     if(empty($restriction)) {
2680     $this->restriction_valid = true;
2681     return $this->restriction_valid;
2682     }
2683 nmeucci 3873 // Liste des opérateurs possibles sans espace
2684     $operateurs = array(">=", "<=", "+", "-", "&&", "||", "==", "!=");
2685     // Liste identique mais avec le marqueur §
2686     $mark = "§";
2687     $operateurs_marked = array();
2688     foreach ($operateurs as $operateur) {
2689     $operateurs_marked[] = $mark.$operateur.$mark;
2690     }
2691 mbroquet 3730
2692     // Supprime tous les espaces de la chaîne de caractère
2693 nmeucci 3873 $restriction = preg_replace('/\s+/', '', $restriction);
2694 mbroquet 3730
2695 nmeucci 3873 // Met un marqueur avant et après les opérateurs
2696     // puis transforme la chaine en un tableau
2697     $restriction = str_replace($operateurs, $operateurs_marked,
2698 mbroquet 3730 $restriction);
2699    
2700 nmeucci 3873 // Pour chaque opérateur logique
2701     foreach (array('&&', '||') as $operator) {
2702    
2703     // S'il est absent on ne fait aucun traitement
2704     if (strpos($restriction, $mark.$operator.$mark) === false) {
2705     continue;
2706     }
2707     // Sinon on vérifie les deux conditions avec le OU/ET logique
2708     $restrictions = explode($mark.$operator.$mark, $restriction);
2709     $restrictions[0] = explode($mark, $restrictions[0]);
2710     $restrictions[1] = explode($mark, $restrictions[1]);
2711     $res_bool = false;
2712     if ($operator == '&&') {
2713     if ($this->is_restriction_satisfied($restrictions[0], $operateurs)
2714     && $this->is_restriction_satisfied($restrictions[1], $operateurs)) {
2715     $res_bool = true;
2716     }
2717     }
2718     if ($operator == '||') {
2719     if ($this->is_restriction_satisfied($restrictions[0], $operateurs)
2720     || $this->is_restriction_satisfied($restrictions[1], $operateurs)) {
2721     $res_bool = true;
2722     }
2723     }
2724     return $res_bool;
2725     }
2726     $tabRestriction = explode($mark, $restriction);
2727     return $this->is_restriction_satisfied($tabRestriction, $operateurs);
2728    
2729     }
2730    
2731     function is_restriction_satisfied($restriction, $operateurs) {
2732 mbroquet 3730 // Tableau comprenant les résultat
2733     $res = array();
2734     // Compteur pour les résultat
2735     // commence à 1 car le 0 doit rester inchangé tout au long du traitement
2736     $j = 1;
2737     // Comparateur du calcul
2738     $comparateur = '';
2739     // Booléen retourné
2740     $res_bool = true;
2741    
2742     // S'il y a un comparateur
2743 nmeucci 3873 if (in_array(">=", $restriction)
2744     || in_array("<=", $restriction)
2745     || in_array("==", $restriction)
2746     || in_array("!=", $restriction)) {
2747 mbroquet 3730
2748     // Si le tableau n'est pas vide
2749 nmeucci 3873 if (count($restriction) > 0) {
2750 mbroquet 3730
2751     // Boucle dans le tableau pour récupérer seulement les valeurs
2752 nmeucci 3873 foreach ($restriction as $key => $value) {
2753 mbroquet 3730 //
2754     if (!in_array($value, $operateurs)) {
2755     if ($this->getRestrictionValue($value) != false) {
2756     $res[] = $this->getRestrictionValue($value);
2757     } else {
2758     // Message d'erreur
2759     $error_message = sprintf(_("Le champ %s de l'instruction %s est vide"), "<span class='bold'>".$value."</span>", "<span class='bold'>".$this->valF["instruction"]."</span>");
2760     $this->addToMessage($error_message);
2761     // Arrête le traitement
2762     return false;
2763     }
2764     }
2765     }
2766    
2767     // Boucle dans le tableau
2768     // commence à 1 car le 0 doit rester inchangé tout au long du
2769     // traitement
2770 nmeucci 3873 for ($i = 1; $i<count($restriction); $i++) {
2771 mbroquet 3730
2772     // Récupère le comparateur
2773 nmeucci 3873 if ($restriction[$i] === ">="
2774     || $restriction[$i] === "<="
2775     || $restriction[$i] === "=="
2776     || $restriction[$i] === "!=") {
2777     $comparateur = $restriction[$i];
2778 mbroquet 3730 }
2779    
2780     // Si l'opérateur qui suit est un "+"
2781 nmeucci 3873 if ($restriction[$i] === "+") {
2782 mbroquet 3730 $dateDep = $res[$j];
2783     unset($res[$j]);$j++;
2784     $duree = $res[$j];
2785     unset($res[$j]);
2786     $res[$j] = $this->f->mois_date($dateDep, $duree, "+");
2787     }
2788    
2789     // Si l'opérateur qui suit est un "-"
2790 nmeucci 3873 if ($restriction[$i] === "-") {
2791 mbroquet 3730 $dateDep = $res[$j];
2792     unset($res[$j]);$j++;
2793     $duree = $res[$j];
2794     unset($res[$j]);
2795     $res[$j] = $this->f->mois_date($dateDep, $duree, "-");
2796     }
2797     }
2798    
2799     }
2800    
2801     // Si les tableau des résultats n'est pas vide
2802     if (count($res) > 0) {
2803     //
2804     $res_bool = false;
2805     // Effectue le test
2806     if ($comparateur === ">=") {
2807     //
2808     if (strtotime($res[0]) >= strtotime($res[$j])) {
2809     $res_bool = true;
2810     }
2811     }
2812     if ($comparateur === "<=") {
2813 nmeucci 3873 //
2814 mbroquet 3730 if (strtotime($res[0]) <= strtotime($res[$j])) {
2815     $res_bool = true;
2816     }
2817     }
2818 nmeucci 3873 if ($comparateur === "==") {
2819     //
2820     if (strtotime($res[0]) == strtotime($res[$j])) {
2821     $res_bool = true;
2822     }
2823     }
2824     if ($comparateur === "!=") {
2825     //
2826     if (strtotime($res[0]) != strtotime($res[$j])) {
2827     $res_bool = true;
2828     }
2829     }
2830 mbroquet 3730 }
2831     // Sinon une erreur s'affiche
2832     } else {
2833    
2834     // Message d'erreur
2835     $error_message = _("Mauvais parametrage de la restriction.")." ".
2836     _("Contactez votre administrateur");
2837     $this->addToMessage($error_message);
2838     // Arrête le traitement
2839     return false;
2840     }
2841    
2842     return $res_bool;
2843    
2844     }
2845    
2846     /**
2847     * Permet de définir si l'événement passé en paramètre est un événement retour.
2848     * @param integer $evenement événement à tester
2849     *
2850     * @return boolean retourne true si événement retour sinon false
2851     */
2852     function is_evenement_retour($evenement) {
2853     if(empty($evenement) || !is_numeric($evenement)) {
2854     return "";
2855     }
2856 softime 14064
2857     $evenement = $this->f->get_inst__om_dbform(array(
2858     "obj" => "evenement",
2859     "idx" => $evenement,
2860     ));
2861    
2862     return $evenement->getVal('retour') == 't';
2863 mbroquet 3730 }
2864    
2865     /**
2866     * Retourne le champ restriction de l'événement passé en paramètre.
2867     *
2868     * @param integer $evenement id de l'événement sur lequel récupérer la restriction
2869     *
2870     * @return string contenu du champ restriction
2871     */
2872     function get_restriction($evenement) {
2873     if(empty($evenement) || !is_numeric($evenement)) {
2874     return "";
2875     }
2876     //Récupère la restriction
2877 softime 14064 $evenement = $this->f->get_inst__om_dbform(array(
2878     "obj" => "evenement",
2879     "idx" => $evenement,
2880     ));
2881    
2882     return $evenement->getVal('restriction');
2883 mbroquet 3730 }
2884    
2885     /**
2886     * Récupère la valeur du champ dans la restriction
2887     * @param string $restrictionValue Nom du champ
2888     * @return mixed Valeur du champ
2889     */
2890     function getRestrictionValue($restrictionValue){
2891    
2892     // Initialisation de la valeur de retour
2893     $return = false;
2894    
2895     // Récupére les valeurs du dossier
2896     $value_dossier = $this->get_dossier_actual();
2897    
2898     //
2899     if (is_numeric($restrictionValue)) {
2900     $return = $restrictionValue;
2901     }elseif (isset($value_dossier[$restrictionValue])) {
2902     $return = $value_dossier[$restrictionValue];
2903     }elseif (isset($this->valF[$restrictionValue])) {
2904     $return = $this->valF[$restrictionValue];
2905     }
2906    
2907     // Retourne la valeur du champ
2908     return $return;
2909     }
2910    
2911 softime 6565
2912 mbroquet 3730 /**
2913 softime 6565 * Calcul des règle d'action selon leur type.
2914     *
2915     * Types de règle :
2916     * - date
2917     * - numeric
2918     * - text
2919     * - bool
2920     * - specific
2921     * - technical_data
2922 mbroquet 3730 *
2923 softime 6565 * @param string $rule Règle d'action.
2924     * @param string $rule_name Nom de la règle.
2925     * @param string $type Type de la règle.
2926     *
2927 mbroquet 3730 * @return mixed Résultat de la règle
2928     */
2929 softime 6565 public function regle($rule, $rule_name, $type = null) {
2930 mbroquet 3730
2931     // Supprime tous les espaces de la chaîne de caractère
2932     $rule = str_replace(' ', '', $rule);
2933     // Coupe la chaîne au niveau de l'opérateur
2934     $operands = explode ("+", $rule);
2935     // Nombre d'opérande
2936     $nb_operands = count($operands);
2937    
2938     // Règle à null
2939     if ($rule == "null") {
2940     return null;
2941     }
2942    
2943     // Tableau des champs de type date
2944     $rule_type_date = array(
2945     "regle_date_limite",
2946     "regle_date_notification_delai",
2947     "regle_date_complet",
2948     "regle_date_validite",
2949     "regle_date_decision",
2950     "regle_date_chantier",
2951     "regle_date_achevement",
2952     "regle_date_conformite",
2953     "regle_date_rejet",
2954     "regle_date_dernier_depot",
2955     "regle_date_limite_incompletude",
2956 softime 6565 "regle_date_cloture_instruction",
2957     "regle_date_premiere_visite",
2958     "regle_date_derniere_visite",
2959     "regle_date_contradictoire",
2960     "regle_date_retour_contradictoire",
2961     "regle_date_ait",
2962     "regle_date_transmission_parquet",
2963 softime 8989 "regle_date_affichage",
2964 mbroquet 3730 );
2965     // Tableau des champs de type numérique
2966     $rule_type_numeric = array(
2967     "regle_delai",
2968     "regle_delai_incompletude",
2969     );
2970 softime 6565 // Tableau des champs de type text
2971     $rule_type_text = array(
2972     );
2973     // Tableau des champs de type booléen
2974     $rule_type_bool = array(
2975 softime 10573 "regle_a_qualifier",
2976     "regle_incompletude",
2977     "regle_incomplet_notifie",
2978     "regle_evenement_suivant_tacite_incompletude",
2979 softime 6565 );
2980     // Tableau des champs spécifiques
2981     $rule_type_specific = array(
2982     "regle_autorite_competente",
2983     "regle_etat",
2984     "regle_accord_tacite",
2985     "regle_avis",
2986 softime 10573 "regle_pec_metier",
2987     "regle_etat_pendant_incompletude",
2988 softime 6565 );
2989     // Tableau des champs de données techniques
2990     $rule_type_technical_data = array(
2991     'regle_donnees_techniques1',
2992     'regle_donnees_techniques2',
2993     'regle_donnees_techniques3',
2994     'regle_donnees_techniques4',
2995     'regle_donnees_techniques5',
2996     );
2997 softime 8593 // Tableau des champs simple
2998     $rule_type_simple = array(
2999     "regle_dossier_instruction_type",
3000     );
3001 mbroquet 3730
3002     // Définit le type du champ
3003     if (in_array($rule_name, $rule_type_date) == true) {
3004     $type = "date";
3005     }
3006     if (in_array($rule_name, $rule_type_numeric) == true) {
3007     $type = "numeric";
3008     }
3009 softime 6565 if (in_array($rule_name, $rule_type_text) === true) {
3010     $type = "text";
3011     }
3012     if (in_array($rule_name, $rule_type_bool) === true) {
3013     $type = "bool";
3014     }
3015     if (in_array($rule_name, $rule_type_specific) === true) {
3016     $type = "specific";
3017     }
3018     if (in_array($rule_name, $rule_type_technical_data) === true) {
3019     $type = 'text';
3020     }
3021 softime 8593 if (in_array($rule_name, $rule_type_simple) === true) {
3022     $type = 'simple';
3023     }
3024 mbroquet 3730
3025 softime 6565 // Si c'est un type spécifique ou booléen alors il n'a qu'un opérande
3026     // Récupère directement la valeur de l'opérande
3027 softime 10573 if ($type === 'specific') {
3028 softime 6565 //
3029     return $this->get_value_for_rule($rule);
3030     }
3031    
3032 mbroquet 3730 // Initialisation des variables
3033     $key_date = 0;
3034     $total_numeric = 0;
3035 softime 6565 $res_text = '';
3036 mbroquet 3730
3037     // Pour chaque opérande
3038     foreach ($operands as $key => $operand) {
3039    
3040     // Si c'est une règle de type date
3041     if ($type == 'date') {
3042     // Vérifie si au moins une des opérandes est une date
3043 softime 6565 if (is_numeric($operand) === false
3044     && $this->get_value_for_rule($operand) !== null
3045     && $this->f->check_date($this->get_value_for_rule($operand)) == true) {
3046 mbroquet 3730 // Récupère la position de la date
3047     $key_date = $key;
3048     }
3049     // Les autres opérandes doivent être que des numériques
3050     if (is_numeric($operand) == true) {
3051     // Ajoute l'opérande au total
3052     $total_numeric += $operand;
3053     }
3054 softime 6565 if (is_numeric($operand) === false
3055     && $this->get_value_for_rule($operand) !== null
3056     && is_numeric($this->get_value_for_rule($operand)) == true) {
3057 mbroquet 3730 // Ajoute l'opérande au total
3058 softime 6565 $total_numeric += $this->get_value_for_rule($operand);
3059 mbroquet 3730 }
3060     }
3061    
3062     // Si c'est une règle de type numérique
3063     if ($type == 'numeric') {
3064     // Les opérandes doivent être que des numériques
3065     if (is_numeric($operand) == true) {
3066     // Ajoute l'opérande au total
3067     $total_numeric += $operand;
3068     }
3069 softime 6565 if (is_numeric($operand) === false
3070     && $this->get_value_for_rule($operand) !== null
3071     && is_numeric($this->get_value_for_rule($operand)) == true) {
3072 mbroquet 3730 // Ajoute l'opérande au total
3073 softime 6565 $total_numeric += $this->get_value_for_rule($operand);
3074 mbroquet 3730 }
3075     }
3076 softime 6565
3077     // Si c'est une règle de type text
3078     if ($type === 'text') {
3079     // Concatène toutes les chaînes de caractère
3080     $res_text .= $this->get_value_for_rule($operand);
3081     }
3082 mbroquet 3730 }
3083    
3084     // Résultat pour une règle de type date
3085     if ($type == 'date') {
3086     // Retourne le calcul de la date
3087     return $this->f->mois_date($this->valF[$operands[$key_date]],
3088     $total_numeric, "+");
3089     }
3090    
3091     // Résultat pour une règle de type numérique
3092     if ($type == 'numeric') {
3093     // Retourne le calcul
3094     return $total_numeric;
3095     }
3096 softime 6565
3097     // Résultat pour une règle de type text
3098     if ($type === 'text') {
3099     // Retourne la chaîne de caractère
3100     return $res_text;
3101     }
3102 softime 10573 if ($type === 'simple' || $type === 'bool') {
3103 softime 8593 // Retourne la valeur du champs rule
3104     return $rule;
3105     }
3106 softime 6565 }
3107    
3108    
3109     /**
3110     * Récupère la valeur du champs dans l'instruction ou dans les données
3111     * techniques.
3112     * Spécifique au calcul des règles.
3113     *
3114     * @param string $field Champ
3115     *
3116     * @return mixed Valeur du champ
3117     */
3118     private function get_value_for_rule($field) {
3119     // Si le champ n'existe pas dans la table instruction
3120     if (array_key_exists($field, $this->valF) === false) {
3121     // Récupère l'instance de la classe donnees_techniques
3122     $inst_donnees_techniques = $this->get_inst_donnees_techniques();
3123     // Retourne la valeur de la donnée technique
3124     return $inst_donnees_techniques->getVal($field);
3125     }
3126    
3127     //
3128     return $this->valF[$field];
3129     }
3130    
3131    
3132     /**
3133     * [get_inst_donnees_techniques description]
3134     *
3135     * @param [type] $donnees_techniques [description]
3136     *
3137     * @return [type] [description]
3138     */
3139     function get_inst_donnees_techniques($donnees_techniques = null) {
3140     //
3141     if (isset($this->inst_donnees_techniques) === false or
3142     $this->inst_donnees_techniques === null) {
3143     //
3144     if (is_null($donnees_techniques)) {
3145     $donnees_techniques = $this->getDonneesTechniques();
3146     }
3147     //
3148 softime 7996 $this->inst_donnees_techniques = $this->f->get_inst__om_dbform(array(
3149     "obj" => "donnees_techniques",
3150     "idx" => $donnees_techniques,
3151     ));
3152 softime 6565 }
3153     //
3154     return $this->inst_donnees_techniques;
3155     }
3156    
3157    
3158     /**
3159     * Retourne l'identifiant des données techniques liées du dossier
3160     * @return string L'identifiant des données techniques liées du dossier
3161     */
3162     function getDonneesTechniques() {
3163 softime 14064
3164     $qres = $this->f->get_one_result_from_db_query(
3165     sprintf(
3166     'SELECT
3167     donnees_techniques
3168     FROM
3169     %1$sdonnees_techniques
3170     WHERE
3171     dossier_instruction = \'%2$s\'',
3172     DB_PREFIXE,
3173     $this->f->db->escapeSimple($this->valF["dossier"])
3174     ),
3175     array(
3176     "origin" => __METHOD__,
3177     )
3178     );
3179 mbroquet 3730
3180 softime 14064 return $qres['result'];
3181 mbroquet 3730 }
3182    
3183 fmichon 4708 /**
3184     * TRIGGER - triggerajouterapres.
3185     *
3186     * - Mise à jour des informations liées au workflow sur le dossier
3187     * - Interface avec le référentiel ERP [105][111]
3188     * - Mise à jour du DA
3189     * - Historisation de la vie du DI
3190     *
3191     * @return boolean
3192     */
3193 softime 8989 function triggerajouterapres($id, &$dnu1 = null, $val = array(), $dnu2 = null) {
3194     $this->addToLog(__METHOD__."(): start", EXTRA_VERBOSE_MODE);
3195 fmichon 4708
3196     // On a besoin de l'instance du dossier lié à l'événement d'instruction
3197     $inst_di = $this->get_inst_dossier($this->valF['dossier']);
3198     // Instance de la classe evenement
3199     $inst_evenement = $this->get_inst_evenement($this->valF['evenement']);
3200 softime 9245 // Instance de l'état courant du dossier d'instruction
3201     $inst_current_etat = $this->f->get_inst__om_dbform(array(
3202     "obj" => "etat",
3203     "idx" => $inst_di->get_id_etat(),
3204     ));
3205 fmichon 4708
3206 mbroquet 3730 /**
3207     * Mise à jour des valeurs du dossier en fonction des valeurs calculées
3208     * par l'action
3209     */
3210 fmichon 4708 // état de complétude actuel du dossier
3211     $incompletude = ($inst_di->getVal('incompletude') == 't' ? true : false);
3212 softime 10573 // L'événement suivant tacite paramétré est destiné à la gestion de l'incomplétude
3213     $ev_suiv_tacite_incompletude = false;
3214 mbroquet 3730 // Initialisation
3215 softime 9245 $valF = array();
3216     $valF_dt = array();
3217 fmichon 4708 //
3218 mbroquet 3730 // Récupération des paramètres de l'action
3219 softime 14542 // TODO : remplacer cette requête par l'instanciation de l'action
3220     $qres = $this->f->get_all_results_from_db_query(
3221     sprintf(
3222     'SELECT
3223     *
3224     FROM
3225     %1$saction
3226     WHERE
3227     action = \'%2$s\'',
3228     DB_PREFIXE,
3229     $this->f->db->escapeSimple($this->valF['action'])
3230     ),
3231     array(
3232     "origin" => __METHOD__
3233     )
3234     );
3235     foreach ($qres['result'] as $row) {
3236 mbroquet 3730
3237     // pour chacune des regles, on applique la regle
3238 softime 6565 if ($row['regle_delai'] != '') {
3239 mbroquet 3730 $valF['delai'] = $this->regle($row['regle_delai'], 'regle_delai');
3240     }
3241 softime 6565 if ($row['regle_accord_tacite'] != '') {
3242 mbroquet 3730 $valF['accord_tacite'] = $this->regle($row['regle_accord_tacite'], 'regle_accord_tacite');
3243     }
3244 softime 6565 if ($row['regle_avis'] != '') {
3245 mbroquet 3730 $valF['avis_decision'] = $this->regle($row['regle_avis'], 'regle_avis');
3246     }
3247 softime 6565 if ($row['regle_date_limite'] != '') {
3248     $valF['date_limite'] = $this->regle($row['regle_date_limite'], 'regle_date_limite');
3249 mbroquet 3730 }
3250 softime 6565 if ($row['regle_date_complet'] != '') {
3251     $valF['date_complet'] = $this->regle($row['regle_date_complet'], 'regle_date_complet');
3252 mbroquet 3730 }
3253 softime 6565 if ($row['regle_date_dernier_depot'] != '') {
3254     $valF['date_dernier_depot'] = $this->regle($row['regle_date_dernier_depot'], 'regle_date_dernier_depot');
3255 mbroquet 3730 }
3256 softime 6565 if ($row['regle_date_notification_delai'] != '') {
3257     $valF['date_notification_delai'] = $this->regle($row['regle_date_notification_delai'], 'regle_date_notification_delai');
3258 mbroquet 3730 }
3259 softime 6565 if ($row['regle_date_decision'] != '') {
3260     $valF['date_decision'] = $this->regle($row['regle_date_decision'], 'regle_date_decision');
3261 mbroquet 3730 }
3262 softime 6565 if ($row['regle_date_rejet'] != '') {
3263     $valF['date_rejet'] = $this->regle($row['regle_date_rejet'], 'regle_date_rejet');
3264 mbroquet 3730 }
3265 softime 6565 if ($row['regle_date_validite'] != '') {
3266     $valF['date_validite'] = $this->regle($row['regle_date_validite'], 'regle_date_validite');
3267 mbroquet 3730 }
3268 softime 6565 if ($row['regle_date_chantier'] != '') {
3269     $valF['date_chantier'] = $this->regle($row['regle_date_chantier'], 'regle_date_chantier');
3270 mbroquet 3730 }
3271 softime 6565 if ($row['regle_date_achevement'] != '') {
3272     $valF['date_achevement'] = $this->regle($row['regle_date_achevement'], 'regle_date_achevement');
3273 mbroquet 3730 }
3274 softime 6565 if ($row['regle_date_conformite'] != '') {
3275     $valF['date_conformite'] = $this->regle($row['regle_date_conformite'], 'regle_date_conformite');
3276 mbroquet 3730 }
3277 softime 6565 if ($row['regle_date_limite_incompletude'] != '') {
3278     $valF['date_limite_incompletude'] = $this->regle($row['regle_date_limite_incompletude'], 'regle_date_limite_incompletude');
3279 mbroquet 3730 }
3280 softime 6565 if ($row['regle_delai_incompletude'] != '') {
3281     $valF['delai_incompletude'] = $this->regle($row['regle_delai_incompletude'], 'regle_delai_incompletude');
3282 mbroquet 3730 }
3283 softime 6565 if ($row['regle_autorite_competente'] != '') {
3284     $valF['autorite_competente'] = $this->regle($row['regle_autorite_competente'], 'regle_autorite_competente');
3285 mbroquet 3730 }
3286 softime 6565 if ($row['regle_etat'] != '') {
3287 softime 10573 $valF['etat'] = $this->regle($row['regle_etat'], 'regle_etat');
3288 mbroquet 3730 }
3289 softime 6565 if ($row['regle_date_cloture_instruction'] !== '') {
3290     $valF['date_cloture_instruction'] = $this->regle($row['regle_date_cloture_instruction'], 'regle_date_cloture_instruction');
3291     }
3292     if ($row['regle_date_premiere_visite'] !== '') {
3293     $valF['date_premiere_visite'] = $this->regle($row['regle_date_premiere_visite'], 'regle_date_premiere_visite');
3294     }
3295     if ($row['regle_date_derniere_visite'] !== '') {
3296     $valF['date_derniere_visite'] = $this->regle($row['regle_date_derniere_visite'], 'regle_date_derniere_visite');
3297     }
3298     if ($row['regle_date_contradictoire'] !== '') {
3299     $valF['date_contradictoire'] = $this->regle($row['regle_date_contradictoire'], 'regle_date_contradictoire');
3300     }
3301     if ($row['regle_date_retour_contradictoire'] !== '') {
3302     $valF['date_retour_contradictoire'] = $this->regle($row['regle_date_retour_contradictoire'], 'regle_date_retour_contradictoire');
3303     }
3304     if ($row['regle_date_ait'] !== '') {
3305     $valF['date_ait'] = $this->regle($row['regle_date_ait'], 'regle_date_ait');
3306     }
3307     if ($row['regle_donnees_techniques1'] !== '') {
3308     $valF_dt[$row['cible_regle_donnees_techniques1']] = $this->regle($row['regle_donnees_techniques1'], 'regle_donnees_techniques1');
3309     }
3310     if ($row['regle_donnees_techniques2'] !== '') {
3311     $valF_dt[$row['cible_regle_donnees_techniques2']] = $this->regle($row['regle_donnees_techniques2'], 'regle_donnees_techniques2');
3312     }
3313     if ($row['regle_donnees_techniques3'] !== '') {
3314     $valF_dt[$row['cible_regle_donnees_techniques3']] = $this->regle($row['regle_donnees_techniques3'], 'regle_donnees_techniques3');
3315     }
3316     if ($row['regle_donnees_techniques4'] !== '') {
3317     $valF_dt[$row['cible_regle_donnees_techniques4']] = $this->regle($row['regle_donnees_techniques4'], 'regle_donnees_techniques4');
3318     }
3319     if ($row['regle_donnees_techniques5'] !== '') {
3320     $valF_dt[$row['cible_regle_donnees_techniques5']] = $this->regle($row['regle_donnees_techniques5'], 'regle_donnees_techniques5');
3321     }
3322     if ($row['regle_date_transmission_parquet'] !== '') {
3323     $valF['date_transmission_parquet'] = $this->regle($row['regle_date_transmission_parquet'], 'regle_date_transmission_parquet');
3324     }
3325 softime 8593 if ($row['regle_dossier_instruction_type'] !== '') {
3326     $valF['dossier_instruction_type'] = $this->regle($row['regle_dossier_instruction_type'], 'regle_dossier_instruction_type');
3327     }
3328 softime 8989 // La date d'affichage est modifiée seulement si le champ n'est pas
3329     // renseigné
3330     if ($row['regle_date_affichage'] !== ''
3331     && ($inst_di->getVal('date_affichage') === ''
3332     || $inst_di->getVal('date_affichage') === null)) {
3333     //
3334     $valF['date_affichage'] = $this->regle($row['regle_date_affichage'], 'regle_date_affichage');
3335     }
3336 softime 10573 //
3337     if ($row['regle_pec_metier'] != '') {
3338     $valF['pec_metier'] = $this->regle($row['regle_pec_metier'], 'regle_pec_metier');
3339     }
3340     if ($row['regle_a_qualifier'] != '') {
3341     $valF['a_qualifier'] = $this->regle($row['regle_a_qualifier'], 'regle_a_qualifier');
3342     }
3343     //
3344     if ($row['regle_incompletude'] != '') {
3345     $valF['incompletude'] = $this->regle($row['regle_incompletude'], 'regle_incompletude');
3346     }
3347     if ($row['regle_incomplet_notifie'] != '') {
3348     $valF['incomplet_notifie'] = $this->regle($row['regle_incomplet_notifie'], 'regle_incomplet_notifie');
3349     }
3350     if ($row['regle_etat_pendant_incompletude'] != '') {
3351     $valF['etat_pendant_incompletude'] = $this->regle($row['regle_etat_pendant_incompletude'], 'regle_etat_pendant_incompletude');
3352     }
3353     if ($row['regle_evenement_suivant_tacite_incompletude'] != '') {
3354     $resti = $this->regle($row['regle_evenement_suivant_tacite_incompletude'], 'regle_evenement_suivant_tacite_incompletude');
3355     if (strtolower($resti) === 't' || strtolower($resti) === 'true') {
3356     $ev_suiv_tacite_incompletude = true;
3357     }
3358     }
3359 mbroquet 3730 }
3360 softime 6063
3361     // Si l'événement a un événement suivant tacite
3362     if($inst_evenement->getVal('evenement_suivant_tacite') != '') {
3363 softime 10573 // En fonction de l'action de l'événement, l'événement suivant tacite ne sera
3364     // pas associé de le même façon au dossier d'instruction
3365     if ($ev_suiv_tacite_incompletude === false) {
3366 softime 6063 $valF['evenement_suivant_tacite'] = $inst_evenement->getVal('evenement_suivant_tacite');
3367 softime 10573 }
3368     if ($ev_suiv_tacite_incompletude === true) {
3369 softime 6063 $valF['evenement_suivant_tacite_incompletude'] = $inst_evenement->getVal('evenement_suivant_tacite');
3370 nhaye 5254 }
3371 mbroquet 3730 }
3372 softime 6565 // Si des valeurs de données techniques ont été calculées alors on met à jour l'enregistrement
3373 softime 9245 if (count($valF_dt) > 0) {
3374 softime 6565 $dt_id = $this->getDonneesTechniques();
3375     // On met à jour le dossier
3376     $cle = " donnees_techniques='".$dt_id."'";
3377 softime 12847 $res1 = $this->f->db->autoexecute(DB_PREFIXE.'donnees_techniques', $valF_dt, DB_AUTOQUERY_UPDATE, $cle);
3378     $this->addToLog(
3379     __METHOD__."(): db->autoexecute(\"".DB_PREFIXE."donnees_techniques\", ".print_r($valF_dt, true).", DB_AUTOQUERY_UPDATE, \"".$cle."\");",
3380     VERBOSE_MODE
3381     );
3382     $this->f->isDatabaseError($res1);
3383 softime 6565 // Affichage d'informations à l'utilisateur
3384 softime 8989 $this->addToMessage(_('enregistrement')." ".$this->valF['dossier']." "._('table')." dossier [".$this->f->db->affectedRows()." "._('enregistrement')." "._('mis_a_jour')."]");
3385 softime 6565 }
3386 mbroquet 3730 // Si des valeurs ont été calculées alors on met à jour l'enregistrement
3387 softime 9245 if (count($valF) > 0) {
3388 softime 10573 //
3389     $inst_dossier = $this->f->get_inst__om_dbform(array(
3390     "obj" => "dossier",
3391     "idx" => $this->valF['dossier'],
3392     ));
3393     $valF['instruction'] = $id;
3394 softime 10968 $valF['crud'] = 'create';
3395 softime 10573 $update_by_instruction = $inst_dossier->update_by_instruction($valF);
3396     if ($update_by_instruction === false) {
3397     $this->cleanMessage();
3398     $this->addToMessage(sprintf('%s %s', __("Une erreur s'est produite lors de la mise à jour du dossier d'instruction."), __("Veuillez contacter votre administrateur.")));
3399     return false;
3400 mbroquet 3730 }
3401     // Affichage d'informations à l'utilisateur
3402 softime 8989 $this->addToMessage(_('enregistrement')." ".$this->valF['dossier']." "._('table')." dossier [".$this->f->db->affectedRows()." "._('enregistrement')." "._('mis_a_jour')."]");
3403 mbroquet 3730 }
3404    
3405     /**
3406 fmichon 4708 * Interface avec le référentiel ERP.
3407     *
3408     * (WS->ERP)[105] Arrêté d'un dossier PC effectué -> PC qui concerne un ERP
3409     * (WS->ERP)[111] Décision de conformité effectuée -> PC qui concerne un ERP
3410     * Déclencheur :
3411     * - L'option ERP est activée
3412     * - Le dossier est marqué comme "connecté au référentiel ERP"
3413     * - Le dossier est de type PC
3414     * - Le formulaire d'ajout d'un événement d'instruction est validé
3415     * avec un événement pour lequel les services ERP doivent être
3416     * informé
3417 mbroquet 3730 */
3418 fmichon 4708 //
3419 softime 7521 if ($this->f->is_option_referentiel_erp_enabled() === true
3420 fmichon 4708 && $inst_di->is_connected_to_referentiel_erp() === true
3421     && $this->f->getDATCode($this->valF['dossier']) == $this->f->getParameter('erp__dossier__nature__pc')
3422     && in_array($inst_evenement->getVal($inst_evenement->clePrimaire), explode(";", $this->f->getParameter('erp__evenements__decision__pc')))) {
3423 mbroquet 3730 //
3424 fmichon 4708 $infos = array(
3425     "dossier_instruction" => $this->valF['dossier'],
3426     "decision" => $inst_evenement->getVal("libelle"),
3427     );
3428 mbroquet 3730 //
3429 fmichon 4708 $ret = $this->f->send_message_to_referentiel_erp(105, $infos);
3430     if ($ret !== true) {
3431     $this->cleanMessage();
3432     $this->addToMessage(_("Une erreur s'est produite lors de la notification (105) du référentiel ERP. Contactez votre administrateur."));
3433     return false;
3434 mbroquet 3730 }
3435 fmichon 4708 $this->addToMessage(_("Notification (105) du référentiel ERP OK."));
3436     }
3437 mbroquet 3730
3438 softime 8989 // Si le mode en rédaction intégrale est activé
3439     if (isset($this->valF['flag_edition_integrale']) === true
3440     && $this->valF['flag_edition_integrale'] === true) {
3441     $redactionIntegraleValF = array();
3442    
3443     // Récupère la collectivite du dossier d'instruction
3444     $dossier_instruction_om_collectivite = $this->get_dossier_instruction_om_collectivite();
3445     $collectivite = $this->f->getCollectivite($dossier_instruction_om_collectivite);
3446     // Récupère le corps de la lettre type
3447     $params = array(
3448     "specific" => array(
3449     "corps" => array(
3450     "mode" => "get",
3451     )
3452     ),
3453     );
3454     $result = $this->compute_pdf_output('lettretype', $this->valF['lettretype'], $collectivite, $id, $params);
3455     $redactionIntegraleValF['corps_om_htmletatex'] = $result['pdf_output'];
3456     // Récupère le titre de la lettre type
3457     $params = array(
3458     "specific" => array(
3459     "titre" => array(
3460     "mode" => "get",
3461     )
3462     ),
3463     );
3464     $result = $this->compute_pdf_output('lettretype', $this->valF['lettretype'], $collectivite, $id, $params);
3465     $redactionIntegraleValF['titre_om_htmletat'] = $result['pdf_output'];
3466    
3467     // mise à jour en base de données
3468     $res = $this->f->db->autoExecute(
3469     DB_PREFIXE.$this->table,
3470     $redactionIntegraleValF,
3471     DB_AUTOQUERY_UPDATE,
3472     $this->clePrimaire."=".$id
3473     );
3474     $this->addToLog(__METHOD__."(): db->autoexecute(\"".DB_PREFIXE.'.'.$this->table."\", ".print_r($redactionIntegraleValF, true).", DB_AUTOQUERY_UPDATE, \"".$this->clePrimaire."=".$id."\");", VERBOSE_MODE);
3475     if ($this->f->isDatabaseError($res, true) === true) {
3476     return false;
3477     }
3478     }
3479    
3480 fmichon 4708 /**
3481 softime 7996 * Finalisation automatique de l'instruction si le paramétrage de l'événement l'autorise
3482     */
3483     // Si la finalisation automatique de l'événement est activée
3484     // ET si l'instruction n'a pas déjà été finalisée
3485     // ET s'il existe une lettre type associée
3486     if ($inst_evenement->getVal('finaliser_automatiquement') === 't'
3487     && $inst_evenement->getVal('om_final_instruction') !== 't'
3488     && $inst_evenement->getVal('lettretype') !== ''
3489     && $inst_evenement->getVal('lettretype') !== null) {
3490    
3491     // On instancie l'instruction
3492     $inst_instruction = $this->f->get_inst__om_dbform(array(
3493     "obj" => "instruction",
3494     "idx" => $this->valF[$this->clePrimaire],
3495     ));
3496    
3497     // On finalise l'instruction dans le contexte de finalisation : action 100
3498     $inst_instruction->setParameter('maj', 100);
3499     $finalize = $inst_instruction->finalize($inst_instruction->valF);
3500    
3501     // Une erreur de finalisation renvoie 'false' : ajout dans les logs
3502     // et dans le message d'erreur
3503     if ($finalize === false) {
3504     $this->f->addToLog(__METHOD__."() : ERROR - Impossible de finaliser l'instruction.", DEBUG_MODE);
3505     $this->addToMessage(_("Erreur lors de la finalisation de l'instruction. Contactez votre administrateur."));
3506     return false;
3507     }
3508     }
3509    
3510     /**
3511 softime 7521 * Finalisation automatique des instructions tacites ou retours.
3512     */
3513 softime 7685 // Si l'option de finalisation automatique des instructions tacites ou
3514     // retours est activée et l'événement d'instruction a une lettre type
3515     // associée
3516     $collectivite_di = $this->get_dossier_instruction_om_collectivite($val['dossier']);
3517     if ($this->f->is_option_finalisation_auto_enabled($collectivite_di) === true
3518     && $inst_evenement->getVal('lettretype') !== ''
3519 softime 7521 && $inst_evenement->getVal('lettretype') !== null) {
3520    
3521     // Rècupère l'identifiant de l'événement
3522     $evenement_id = $inst_evenement->getVal($inst_evenement->clePrimaire);
3523    
3524     // Si l'événement d'instruction est identifié comme un événement
3525     // retour
3526     // OU l'événement d'instruction est l'événement suivant tacite du
3527     // dossier d'instruction (incomplétude prise en compte)
3528 softime 7996 // ET l'événement d'instruction n'a pas déjà été finalisé
3529     if (($inst_evenement->getVal("retour") === 't'
3530 softime 7521 || ($inst_di->getVal('evenement_suivant_tacite_incompletude') === $evenement_id
3531 softime 7996 || $inst_di->getVal('evenement_suivant_tacite') === $evenement_id))
3532     && ($inst_evenement->getVal('om_final_instruction') !== 't')) {
3533 softime 7521
3534     // Finalise l'instruction
3535 softime 7996 $inst_instruction = $this->f->get_inst__om_dbform(array(
3536     "obj" => "instruction",
3537     "idx" => $this->valF[$this->clePrimaire],
3538     ));
3539 softime 7521 $inst_instruction->setParameter('maj', 100);
3540     $finalize = $inst_instruction->finalize($inst_instruction->valF);
3541     if ($finalize === false) {
3542     //
3543     return false;
3544     }
3545     }
3546     }
3547    
3548     /**
3549 softime 9245 * Mise à jour de la version de clôture *version_clos* du dossier si et
3550     * seulement si l'instruction met à jour l'état du dossier.
3551     */
3552     if (isset($valF['etat']) === true
3553     && $valF['etat'] !== null
3554     && $valF['etat'] !== '') {
3555     // Instanciation de l'état appliqué sur le dossier par l'instruction
3556     $inst_etat = $this->f->get_inst__om_dbform(array(
3557     "obj" => "etat",
3558     "idx" => $valF['etat'],
3559     ));
3560     //
3561     $update_version_clos = null;
3562     // En cas d'instruction qui clôture le dossier
3563     if ($inst_etat->getVal('statut') === 'cloture') {
3564     $update_version_clos = $inst_di->update_version_clos('up');
3565     }
3566     // En cas d'instruction qui rouvre le dossier
3567     if ($inst_current_etat->getVal('statut') === 'cloture'
3568     && $inst_etat->getVal('statut') !== 'cloture') {
3569     //
3570     $update_version_clos = $inst_di->update_version_clos('down');
3571     //
3572     $params = array(
3573     'di_reopened' => true,
3574     );
3575     }
3576     //
3577     if ($update_version_clos === false) {
3578     $this->f->addToLog(sprintf(
3579     "%s() : ERREUR - %s %s",
3580     __METHOD__,
3581     sprintf(
3582     __("Impossible de mettre à jour la version de clôture du dossier d'instruction %s."),
3583     $inst_di->getVal($inst_di->clePrimaire)
3584     ),
3585     sprintf(
3586     __("L'instruction tente d'appliquer l'état %s."),
3587     $inst_etat->getVal($inst_etat->clePrimaire)
3588     )
3589     ));
3590     $this->addToMessage(sprintf(
3591     "%s %s",
3592     __("Erreur lors de la mise à jour de la version de clôture du dossier d'instruction."),
3593     __("Veuillez contacter votre administrateur.")
3594     ));
3595     return false;
3596     }
3597     }
3598    
3599     /**
3600 softime 10808 * Notification automatique
3601     */
3602     // Notification automatique à l'ajout de l'instruction si la notification
3603     // automatique est choisie et qu'il n'y a pas de lettretype associée à l'événement
3604     if ($inst_evenement->getVal('notification') === 'notification_automatique' &&
3605     ($inst_evenement->getVal('lettretype') === null ||
3606     $inst_evenement->getVal('lettretype') === '')) {
3607 softime 13137 // Message à afficher dans les logs pour indiquer quelle notification a échouée
3608 softime 13528 $msgLog = sprintf(
3609     '%s %s : %d',
3610     __('Erreur lors de la notification automatique du(des) pétitionnaire(s).'),
3611     __('Instruction notifiée'),
3612     $id
3613     );
3614 softime 13137
3615 softime 10808 // Récupération de la liste des demandeurs à notifier et de la catégorie
3616     $categorie = $this->f->get_param_option_notification($collectivite_di);
3617 softime 14064 $isPortal = $categorie === PORTAL;
3618 softime 10869 $demandeursANotifie = $this->get_demandeurs_notifiable(
3619     $this->valF['dossier'],
3620     $isPortal
3621     );
3622 softime 10808
3623     // Création d'une notification et d'une tâche pour chaque demandeur à notifier
3624 softime 12124 $demandeurPrincipalNotifie = false;
3625 softime 10808 foreach ($demandeursANotifie as $demandeur) {
3626 softime 12124 // Identifie si le demandeur principal a été notifié ou pas
3627     // et récupère ses informations
3628     if ($demandeur['petitionnaire_principal'] == 't') {
3629     $demandeurPrincipalNotifie = true;
3630     // Si le demandeur principal est notifiable mais qu'il y a des erreurs dans
3631     // son paramétrage, on effectue pas le traitement et on passe à l'itération
3632     // suivante. On le considère également comme non notifié pour gérer l'envoie
3633     // des messages d'erreurs
3634     // Si la demande a été déposée via le portail alors le paramétrage n'a pas
3635     // d'impact sur la notification
3636     $erreursParam = $this->get_info_notification_fail($val['dossier']);
3637     if (! $this->dossier_depose_sur_portail($val['dossier']) && $erreursParam != array()) {
3638     $demandeurPrincipalNotifie = false;
3639     continue;
3640     }
3641     }
3642 softime 10808 // Ajout de la notif et récupération de son id
3643     $idNotif = $this->ajouter_notification(
3644     $this->valF[$this->clePrimaire],
3645     $this->f->get_connected_user_login_name(),
3646 softime 10968 $demandeur,
3647     $collectivite_di,
3648 softime 12433 array(),
3649 softime 10968 true
3650 softime 10808 );
3651     if ($idNotif === false) {
3652 softime 13528 $this->addToLog(
3653     sprintf('%s() : %s', __METHOD__, $msgLog),
3654     DEBUG_MODE
3655     );
3656 softime 10808 return false;
3657     }
3658     // Création de la tache en lui donnant l'id de la notification
3659     $notification_by_task = $this->notification_by_task(
3660     $idNotif,
3661     $this->valF['dossier'],
3662     $categorie
3663     );
3664     if ($notification_by_task === false) {
3665 softime 13528 $this->addToLog(
3666     sprintf('%s() : %s', __METHOD__, $msgLog),
3667     DEBUG_MODE
3668     );
3669 softime 10808 $this->addToMessage(
3670     __("Erreur lors de la génération de la notification au(x) pétitionnaire(s).")
3671     );
3672     return false;
3673     }
3674     }
3675 softime 12847 // Pour la notification par mail ou la notification via portal si le dossier a
3676     // été déposés via portal, si le demandeur principal n'est pas notifiable,
3677     // on créé une nouvelle notification en erreur avec en commentaire la raison pour
3678     // laquelle le demandeur principal n'a pas pu être notifié
3679     $depotPortal = $this->dossier_depose_sur_portail();
3680     if (! $demandeurPrincipalNotifie && ($isPortal === false || $depotPortal === true)) {
3681 softime 13137 // Précision dans les logs que le pétitionnaire principal n'est pas notifiable.
3682     // ' ' permet de mettre un espace entre les 2 msg de log.
3683 softime 13528 $msgLog .= sprintf(' %s', __('Le pétitionnaire principale n\'est pas notifiable.'));
3684 softime 12124 // Analyse pour savoir pourquoi le demandeur principal n'est pas notifiable
3685     $erreursParam = $this->get_info_notification_fail($val['dossier']);
3686     $demandeurPrincipal = $this->get_info_petitionnaire_principal_dossier($val['dossier']);
3687     // Ajout de la notif et récupération de son id
3688     $idNotif = $this->ajouter_notification(
3689     $this->valF[$this->clePrimaire],
3690     $this->f->get_connected_user_login_name(),
3691     $demandeurPrincipal,
3692     $collectivite_di,
3693 softime 12433 array(),
3694 softime 12124 true,
3695     'Echec',
3696     implode(' ', $erreursParam)
3697     );
3698     if ($idNotif === false) {
3699 softime 13528 $this->addToLog(
3700     sprintf('%s() : %s', __METHOD__, $msgLog),
3701     DEBUG_MODE
3702     );
3703 softime 12124 $this->addToMessage(
3704     __('Erreur : la création de la notification a échouée.').
3705     __("Veuillez contacter votre administrateur.")
3706     );
3707     return false;
3708     }
3709     // Prépare un message d'alerte à destination de l'instructeur pour l'informer
3710     // de l'échec de la notification
3711     $dossier_message = $this->get_inst_dossier_message(0);
3712     $dossier_message_val = array(
3713     'dossier' => $val['dossier'],
3714     'type' => _('erreur expedition'),
3715     'emetteur' => $this->f->get_connected_user_login_name().' (automatique)',
3716     'login' => $_SESSION['login'],
3717     'date_emission' => date('Y-m-d H:i:s'),
3718     'contenu' => _('Échec lors de la notification de l\'instruction ').
3719     $inst_evenement->getVal('libelle').
3720     '.<br>'.
3721     implode("\n", $erreursParam).
3722     '<br>'.
3723     _('Veuillez corriger ces informations avant de renvoyer la notification.')
3724     );
3725     $add = $dossier_message->add_notification_message($dossier_message_val, true);
3726     // Si une erreur se produit pendant l'ajout
3727     if ($add !== true) {
3728     $this->addToLog(__METHOD__."(): Le message d'alerte concernant l'echec de l'envoi de la notification n'a pas pu être envoyé.", DEBUG_MODE);
3729     return false;
3730     }
3731     }
3732 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.")));
3733     }
3734    
3735 softime 12654 // Notification automatique en cas de dépôt de dossier dématérialisé
3736     // Vérifie si l'option de notification est active et si il s'agit bien d'une
3737     // instruction de récépissé
3738     if (
3739     $this->f->is_option_notification_depot_demat_enabled($collectivite_di)
3740     && $this->is_instruction_recepisse()
3741     ) {
3742 softime 13137 // Message à afficher dans les logs pour indiquer quelle notification a échouée
3743 softime 13528 $msgLog = sprintf(
3744     __('Erreur lors de la notification de dépôt du dossier dématérialisé : %s.'),
3745     $val['dossier']
3746     );
3747 softime 12654 // Récupère l'instance de la demande
3748     $demande = $inst_di->get_inst_demande();
3749 softime 13137 // Vérifie que le dossier a été déposé via platau ou portal
3750 softime 12654 if (
3751 softime 13137 ($demande->getVal('source_depot') == PLATAU ||
3752     $demande->getVal('source_depot') == PORTAL)
3753 softime 12654 ) {
3754 softime 13137 // Récupère la liste des mails fournis en paramètre. Si aucun adresse n'a été récupéré
3755     // l'envoi de la notification n'est pas effectué et un message d'erreur est affiché.
3756     $listeEmails = $this->f->get_param_courriel_de_notification_commune($collectivite_di);
3757     if (empty($listeEmails)) {
3758     $this->addToLog(
3759 softime 13528 sprintf(
3760     '%s(): %s %s',
3761     __METHOD__,
3762     $msgLog,
3763     __('Aucun courriel paramétré.')
3764     ),
3765 softime 13137 DEBUG_MODE
3766 softime 12654 );
3767 softime 13137 } else {
3768     foreach ($listeEmails as $email) {
3769     // Ajout de la notif et récupération de son id
3770     $destinataire = array(
3771     'destinataire' => $email,
3772     'courriel' => $email
3773 softime 12654 );
3774 softime 13137 $idNotif = $this->ajouter_notification(
3775     $this->valF[$this->clePrimaire],
3776     $this->f->get_connected_user_login_name(),
3777     $destinataire,
3778     $collectivite_di,
3779     array(),
3780     true
3781     );
3782     if ($idNotif === false) {
3783 softime 13528 $this->addToLog(
3784     sprintf('%s(): %s', __METHOD__, $msgLog),
3785     DEBUG_MODE
3786     );
3787 softime 13137 return false;
3788     }
3789     // Création de la tache en lui donnant l'id de la notification
3790     $notification_by_task = $this->notification_by_task(
3791     $idNotif,
3792     $this->valF['dossier'],
3793     'mail',
3794     'notification_depot_demat'
3795     );
3796     if ($notification_by_task === false) {
3797     $this->addToMessage(
3798     __("Erreur lors de la génération de la notification de dépot de dossier par voie dématérialisée.")
3799     );
3800 softime 13528 $this->addToLog(
3801     sprintf('%s(): %s', __METHOD__, $msgLog),
3802     DEBUG_MODE
3803     );
3804 softime 13137 return false;
3805     }
3806 softime 12654 }
3807     }
3808     }
3809     }
3810    
3811 softime 10808 /**
3812 softime 7996 * Mise à jour de la date de dernière modification du dossier
3813     */
3814     $inst_di->update_last_modification_date();
3815    
3816     /**
3817 softime 8640 * Mise à jour des données du DA.
3818     */
3819     $inst_da = $inst_di->get_inst_dossier_autorisation();
3820 softime 9245 $params['di_id'] = $this->valF['dossier'];
3821 softime 8640 if ($inst_da->majDossierAutorisation($params) === false) {
3822     $this->addToMessage(_("Erreur lors de la mise a jour des donnees du dossier d'autorisation. Contactez votre administrateur."));
3823     $this->correct = false;
3824     return false;
3825     }
3826    
3827     /**
3828 fmichon 4708 * Historisation de la vie du DI.
3829     */
3830     //
3831 nmeucci 3963 return $this->add_log_to_dossier($id, array_merge($val, $this->valF));
3832 nmeucci 3876 }
3833 mbroquet 3730
3834 softime 12124 /**
3835     * Cette méthode vérifie si toutes les conditions de l'envoi de la notification
3836     * sont remplies.
3837     * Les conditions vérifiées sont les suivantes :
3838 softime 14064 * - L'option de notification *option_notification* doit être définie
3839 softime 12124 * - Le petitionnaire principal doit accepter les notifications
3840     * - Le pétitionnaire principal doit avoir une adresse mail renseignée
3841     * - Le pétitionnaire principal doit avoir une adresse mail correcte
3842     * Pour chaque vérification effectué un message d'erreur est ajouté si la
3843     * condition n'est pas remplie.
3844     * Renvoie le message d'erreur en sortie.
3845     *
3846     * @param string identifiant du dossier sur lequel les notifications ont échouée
3847     * @return string
3848     */
3849     protected function get_info_notification_fail($dossier = null) {
3850     // Utilise l'identifiant du dossier passé en paramètre et si aucun dossier n'a été récupéré
3851     // utilise celui associé à l'instruction
3852     if ($dossier == null) {
3853     $dossier = $this->getVal('dossier');
3854     }
3855     // Tableau contenant la liste des messages d'erreur
3856     $errorMessage = array();
3857 softime 14064 // Récupère l'option de notification
3858     $collectivite_di = $this->get_dossier_instruction_om_collectivite($dossier);
3859     $option_notification = $this->f->get_param_option_notification($collectivite_di);
3860     if ($option_notification !== PORTAL && $option_notification !== 'mail') {
3861     $errorMessage[] = __("L'option de notification option_notification doit obligatoirement être définie.");
3862     }
3863 softime 12124 // Récupère les informations du demandeurs principal
3864     $infoPetitionnaire = $this->get_info_petitionnaire_principal_dossier($dossier);
3865     // Vérifie si le pétitionnaire principal à bien la case "accepte les notification" cochée
3866     if (isset($infoPetitionnaire['notification']) && $infoPetitionnaire['notification'] != 't') {
3867     $errorMessage[] = __('Le pétitionnaire principal n\'accepte pas les notifications.');
3868     }
3869     // Vérifie si l'adresse mail du pétitionnaire principale est renseignée
3870     if (isset($infoPetitionnaire['courriel']) && ! empty($infoPetitionnaire['courriel'])) {
3871     // Vérifie si le format de l'adresse mail est pas correct et, si ce n'est pas le cas, informe l'utilisateur
3872     // qu'il doit le corriger avant de pouvoir ajouter l'nstruction
3873     if (! $this->f->checkValidEmailAddress($infoPetitionnaire['courriel'])) {
3874     $errorMessage[] = __('Le courriel du pétitionnaire principal n\'est pas correct : ').
3875     $infoPetitionnaire['courriel'].
3876     '.';
3877     }
3878     } else {
3879     // Si le courriel du pétitionnaire principal
3880     $errorMessage[] = __('Le courriel du pétitionnaire principal n\'est pas renseigné.');
3881     }
3882 softime 11585
3883 softime 12124 return $errorMessage;
3884     }
3885    
3886     /**
3887     * Méthode servant à vérifier si un dossier a été déposé sur
3888     * le portail citoyen ou pas.
3889     * La verification se fait via une requête sql dans laquelle
3890     * on va chercher un dossier ayant pour id l'identifiant de
3891     * dossier associé à l'instruction et pour lequel la demande
3892     * associée la plus ancienne est une demande de création de
3893     * dossier via portail
3894     *
3895     * @param string identifiant du dossier. Si non renseigné c'est le dossier
3896     * associé à l'instruction qui est utilisé
3897     * @return boolean|void true : dossier déposé via portail, false : dossier
3898     * non déposé via portail et null : erreur de base de données.
3899     */
3900     protected function dossier_depose_sur_portail($dossier = null) {
3901     if (empty($dossier)) {
3902     $dossier = $this->getVal('dossier');
3903     }
3904 softime 13137 $qres = $this->f->get_one_result_from_db_query(
3905     sprintf(
3906     'SELECT
3907     dossier
3908     FROM
3909     %1$sdossier
3910     -- Récuperation de la première demande associée au dossier
3911     LEFT JOIN (
3912     SELECT
3913     demande,
3914     dossier_instruction,
3915     source_depot
3916     FROM
3917     %1$sdemande
3918     WHERE
3919     dossier_instruction = \'%2$s\'
3920     ORDER BY
3921     demande ASC
3922     LIMIT 1
3923 softime 14064 ) AS demande
3924     ON dossier.dossier = demande.dossier_instruction
3925 softime 13137 WHERE
3926     dossier.dossier = \'%2$s\'
3927     AND demande.source_depot = \'portal\'',
3928     DB_PREFIXE,
3929     $this->f->db->escapeSimple($dossier)
3930     ),
3931     array(
3932     "origin" => __METHOD__,
3933     "force_return" => true,
3934     )
3935 softime 12124 );
3936 softime 13137 if ($qres["code"] !== "OK") {
3937 softime 12124 $this->addToMessage(__('Erreur : La vérification du mode de dépôt du dossier à échoué'));
3938     return;
3939     }
3940     // Si on a un résultat c'est que le dossier a été déposé via le portail
3941 softime 13137 return ! empty($qres["result"]);
3942 softime 12124 }
3943    
3944 softime 11585 public function is_service_notifiable() {
3945     $evenement = $this->get_inst_evenement($this->getVal('evenement'));
3946    
3947     // Si l'instruction a une édition non finalisé quel que soit
3948     // le type de notification, il n'est pas notifiable
3949     if ($this->has_an_edition() === true) {
3950     if ($this->is_unfinalizable_without_bypass() === false) {
3951     return false;
3952     }
3953     }
3954     // Vérifie si la notification des tiers est active pour l'évènement
3955     return $this->get_boolean_from_pgsql_value($evenement->getVal('notification_service'));
3956     }
3957    
3958     public function is_tiers_notifiable() {
3959     $evenement = $this->get_inst_evenement($this->getVal('evenement'));
3960    
3961     // Si l'instruction a une édition non finalisé quel que soit
3962     // le type de notification, il n'est pas notifiable
3963     if ($this->has_an_edition() === true) {
3964     if ($this->is_unfinalizable_without_bypass() === false) {
3965     return false;
3966     }
3967     }
3968     // Vérifie si la notification des tiers est active pour l'évènement
3969 softime 13137 return ! empty($evenement->getVal('notification_tiers'));
3970 softime 11585 }
3971    
3972 softime 12124 /**
3973     * Méthode permettant de savoir si une instruction peut
3974     * être notifiée manuellement selon les différents types
3975     * de notification.
3976     *
3977     * Si l'instruction a une édition non finalisée alors elle n'est pas
3978     * manuellement notifiable.
3979     * Si l'instruction est associé à un événement de notification pour
3980     * lequel un retour signature est recquis, elle n'est notifiable que
3981     * si la date de retour de signature est remplie.
3982     * Par défaut si le type de notification n'est pas connu alors l'instruction
3983     * n'est pas notifiable.
3984     * Pour tous les autres cas l'instruction est manuellement notifiable.
3985     *
3986     * @return boolean true : notifiable | false : non notifiable
3987     */
3988 softime 10808 public function is_notifiable_by_task_manual() {
3989     $ev = $this->get_inst_evenement($this->getVal('evenement'));
3990    
3991     // Si l'instruction a une édition non finalisé quel que soit
3992     // le type de notification, il n'est pas notifiable
3993     if ($this->has_an_edition() === true) {
3994     if ($this->is_unfinalizable_without_bypass() === false) {
3995     return false;
3996     }
3997     }
3998    
3999     // Gestion des différents cas selon la valeur du champs notification
4000 softime 12124 if ($ev->getVal('notification') == 'notification_manuelle' ||
4001     $ev->getVal('notification') == 'notification_manuelle_annexe' ||
4002     $ev->getVal('notification') == 'notification_automatique'
4003     ) {
4004     return true;
4005     } elseif (($ev->getVal('notification') == 'notification_auto_signature_requise' ||
4006     $ev->getVal('notification') == 'notification_manuelle_signature_requise' ||
4007     $ev->getVal('notification') == 'notification_manuelle_annexe_signature_requise') &&
4008     $this->getVal('date_retour_signature') != null &&
4009     $this->getVal('date_retour_signature') != ''
4010     ) {
4011     return true ;
4012 softime 10808 }
4013 softime 12124 return false;
4014 softime 10808 }
4015    
4016 softime 8989 /**
4017 softime 14542 * Crée une instance de notification et une tache notification_instruction de catégorie portal
4018     * pour le demandeur principal.
4019 softime 10808 *
4020     * @return boolean true si le traitement à réussi
4021     */
4022 softime 14542 protected function notifier_demandeur_principal_via_portal() {
4023 softime 10808 $this->begin_treatment(__METHOD__);
4024     $message = '';
4025     // Récupération des informations concernant le demandeur
4026     $dossier = $this->getVal('dossier');
4027 softime 10968 $collectivite_di = $this->get_dossier_instruction_om_collectivite($dossier);
4028 softime 10808 $demandeur = $this->get_demandeurs_notifiable(
4029     $dossier,
4030     true
4031     );
4032     if ($demandeur !== array()) {
4033 softime 10869 $destinataire = array_values($demandeur);
4034 softime 10808 // Ajout de la notif et récupération de son id
4035     $idNotification = $this->ajouter_notification(
4036     $this->getVal($this->clePrimaire),
4037     $this->f->get_connected_user_login_name(),
4038 softime 10968 $destinataire[0],
4039     $collectivite_di,
4040 softime 12433 array(),
4041 softime 10968 true
4042 softime 10808 );
4043     if ($idNotification === false) {
4044     return $this->end_treatment(__METHOD__, false);
4045     }
4046     // Création de la tâche en lui donnant l'id de la notification
4047 softime 14542 $notification_by_task = $this->notification_by_task($idNotification, $dossier, PORTAL);
4048 softime 10808 if ($notification_by_task === false) {
4049     $this->addToMessage(
4050     __("Erreur lors de la génération de la notification au(x) pétitionnaire(s).")
4051     );
4052     return $this->end_treatment(__METHOD__, false);
4053     }
4054     $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.")));
4055     return $this->end_treatment(__METHOD__, true);
4056     }
4057     $this->addToMessage( __("Le demandeur principal n'est pas notifiable."));
4058 softime 12124 return $this->end_treatment(__METHOD__, false);
4059 softime 10808 }
4060    
4061     public function notification_by_task($object_id, $dossier, $category = null, $type = null) {
4062     // Si le type n'est pas correctement spécifié, alors il est calculé
4063 softime 11585 if ($type !== 'notification_recepisse'
4064     && $type !== 'notification_instruction'
4065     && $type !== 'notification_decision'
4066     && $type !== 'notification_service_consulte'
4067 softime 12654 && $type !== 'notification_tiers_consulte'
4068     && $type !== 'notification_depot_demat'
4069 softime 15037 && $type !== 'notification_commune'
4070     && $type !== 'notification_signataire') {
4071 softime 10808 //
4072     $type = 'notification_instruction';
4073     // Vérifie si l'instruction est un récépissé
4074 softime 12654 if ($this->is_instruction_recepisse()) {
4075     $type = 'notification_recepisse';
4076    
4077 softime 10808 }
4078     // Vérifie si l'instruction est une décision
4079     if ($type !== 'notification_recepisse') {
4080     $avis_decision = $this->getVal('avis_decision') !== null ? $this->getVal('avis_decision') : $this->valF['avis_decision'];
4081     if ($avis_decision !== null && $avis_decision !== '') {
4082     $type = 'notification_decision';
4083     }
4084     }
4085     }
4086 softime 14064 // Préparation des valeurs de la tâche
4087 softime 10808 $task_val = array(
4088     'type' => $type,
4089     'object_id' => $object_id,
4090     'dossier' => $dossier,
4091     'category' => $category,
4092     );
4093 softime 14064 // Préparation de la tache de notification
4094     $inst_task = $this->f->get_inst__om_dbform(array(
4095     "obj" => "task",
4096     "idx" => 0,
4097     ));
4098 softime 10808
4099     $add_task = $inst_task->add_task(array('val' => $task_val));
4100     if ($add_task === false) {
4101 softime 13528 $this->addToLog(
4102     sprintf(
4103     '%s(): %s %s : %s',
4104     __METHOD__,
4105     __('Echec de l\'ajout de la tâche de notification.'),
4106     __('Paramétrage de la tâche'),
4107     var_export($task_val, true)
4108     ),
4109     DEBUG_MODE
4110     );
4111 softime 10808 return false;
4112     }
4113    
4114     return true;
4115     }
4116    
4117 softime 10968 /**
4118 softime 12654 * Cette méthode permet de savoir si l'instruction est une instruction
4119     * de recepisse (instruction lié à l'ajout du dossier).
4120     *
4121     * Pour cela, on récupère la liste des actions qui ont menées à la création
4122     * de l'instruction. Si une de ces actions est lié à un objet "demande" on
4123     * en deduis que c'est l'ajout d'une demande qui a déclenché la création de
4124     * l'instruction et donc qu'il s'agit d'un recepisse.
4125     *
4126     * @return boolean
4127     */
4128     protected function is_instruction_recepisse() {
4129     // Récupère la liste des actions qui ont mené à la création de
4130     // l'instruction
4131     $trace = debug_backtrace();
4132     // Parcours la liste des actions et si une de ces actions est lié
4133     // à la classe demande on cosidère que l'instruction est un recepisse
4134     foreach ($trace as $key => $value) {
4135     if (isset($trace[$key]['class']) === true
4136     && empty($trace[$key]['class']) === false) {
4137     if (strtolower($trace[$key]['class']) === 'demande') {
4138     return true;
4139     }
4140     }
4141     }
4142     return false;
4143     }
4144    
4145     /**
4146 softime 10968 * A partir des informations passée en argument ajoute un nouvel élément
4147     * dans la table instruction_notification.
4148     * Avant l'ajout vérifie en utilisant l'id de la collectivité passée en
4149     * paramètre si le paramétrage attendus est ok.
4150     * Ajoute également un nouvel élement dans instruction_notification_document
4151     * si l'instruction possède une lettretype.
4152     * Si un identifiant d'une instruction annexe est donnée ajoute un deuxième
4153     * élement dans la table instruction_notification_document qui correspondra
4154     * à l'annexe de la notification.
4155     *
4156     * @param integer identifiant de l'instruction notifiée
4157     * @param string information concernant l'emetteur
4158     * @param array tableau contenant 2 entrées
4159     * - destinatire : nom, prenom ou raison sociale, dénomination et courriel
4160     * - courriel : adresse mail de la personne à notifier
4161     * @param integer identifiant de la collectivité permettant de récupèrer les
4162     * paramètres à valider
4163     * @param boolean indique si la notification est automatique ou manuelle
4164     * @param integer identifiant d'une instruction dont l'édition sera annexé
4165     * à la notification
4166     *
4167     * @return integer|boolean identifiant de la notification créée si le traitement
4168     * a réussie, false sinon.
4169     */
4170 softime 10869 protected function ajouter_notification(
4171     $idInstruction,
4172     $emetteur,
4173     $destinataire,
4174 softime 10968 $collectiviteId,
4175 softime 12433 $annexes = array(),
4176 softime 10968 $demandeAuto = false,
4177 softime 12124 $statut = 'en cours d\'envoi',
4178 softime 12433 $commentaire = 'Notification en cours de traitement'
4179 softime 10869 ) {
4180 softime 10968 // Vérification que les paramètres nécessaires à l'envoi de la notification existe avant
4181     // de créer la notification
4182     if (! $this->is_parametrage_notification_correct($collectiviteId)) {
4183 softime 13137 $msgErreur = __("Erreur de paramétrage. L'url d'accès au(x) document(s) notifié(s) n'est pas paramétrée.");
4184     $this->addToMessage($msgErreur);
4185 softime 13528 $this->addToLog(
4186     sprintf('%s() : %s', __METHOD__, $msgErreur),
4187     DEBUG_MODE
4188     );
4189 softime 10968 return false;
4190     }
4191 softime 10808 // Préparation de la notification
4192     $inst_notif = $this->f->get_inst__om_dbform(array(
4193     "obj" => "instruction_notification",
4194     "idx" => "]",
4195     ));
4196     $notif_val = array(
4197     'instruction_notification' => null,
4198     'instruction' => $idInstruction,
4199     'automatique' => $demandeAuto,
4200     'emetteur' => $emetteur,
4201     'date_envoi' => null,
4202 softime 10869 'destinataire' => $destinataire['destinataire'],
4203     'courriel' => $destinataire['courriel'],
4204 softime 10808 'date_premier_acces' => null,
4205 softime 12124 'statut' => $statut,
4206     'commentaire' => $commentaire
4207 softime 10808 );
4208    
4209     // Création de la notification
4210     $add_notif = $inst_notif->ajouter($notif_val);
4211     if ($add_notif === false) {
4212 softime 10968 $this->addToMessage(__("Erreur lors de la génération de la notification au(x) pétitionnaire(s)."));
4213 softime 13528 $this->addToLog(
4214     sprintf(
4215     '%s() : %s %s : %s',
4216     __METHOD__,
4217     __("Echec de l'ajout de la notification en base de données."),
4218     __('Paramétrage de la notification'),
4219     var_export($notif_val, true)
4220     ),
4221     DEBUG_MODE
4222     );
4223 softime 10808 return false;
4224     }
4225    
4226 softime 10869 // Si il y a une lettretype finalisé stockage de la clé d'accès au documents
4227     if ($this->evenement_has_an_edition($this->getVal('evenement')) === true) {
4228 softime 12433 $add_notif_doc = $this->ajouter_notification_document(
4229     $inst_notif->getVal($inst_notif->clePrimaire),
4230 softime 10869 $this->getVal($this->clePrimaire),
4231 softime 12433 'instruction'
4232 softime 10808 );
4233     if ($add_notif_doc === false) {
4234 softime 10968 $this->addToMessage(__("Erreur lors de la génération de la notification du document."));
4235 softime 10808 return false;
4236     }
4237 softime 10869 }
4238     // Si une annexe a été choisie stockage de la clé d'accès à l'annexe
4239 softime 12433 if (! empty($annexes) && is_array($annexes)) {
4240     $add_notif_annexe = $this->ajouter_notification_document_multiple(
4241 softime 10869 $inst_notif->getVal($inst_notif->clePrimaire),
4242 softime 12433 $annexes
4243 softime 10869 );
4244     if ($add_notif_annexe === false) {
4245 softime 10968 $this->addToMessage(__("Erreur lors de la génération de la notification de l'annexe."));
4246 softime 10869 return false;
4247     }
4248     }
4249 softime 10808
4250     // Renvoie l'id de la nouvelle instance de instruction_notification
4251     return $inst_notif->getVal($inst_notif->clePrimaire);
4252     }
4253    
4254     /**
4255 softime 11585 * Pour chaque élément du tableau passé en paramètre ajoute une nouvelle
4256     * instance dans la table instruction_notification_document lié a la
4257     * notification dont l'id est passé en paramètre.
4258     *
4259     * @param array tableau contenant les informations nécessaires pour créer les annexes
4260     *
4261     * @return integer|boolean identifiant de la notification créée si le traitement
4262     * a réussie, false sinon.
4263     */
4264     protected function ajouter_notification_document_multiple($idNotification, $listeDocument) {
4265 softime 12433 foreach ($listeDocument as $paramDoc) {
4266     if (! $this->ajouter_notification_document($idNotification, $paramDoc['id'], $paramDoc['tableDocument'], $paramDoc['isAnnexe'])) {
4267 softime 11585 $this->addToMessage(__("Erreur lors de la génération des documents à notifier."));
4268     return false;
4269     }
4270     }
4271     return true;
4272     }
4273    
4274     /**
4275     * Ajoute un élément dans la table instruction_notification_document en utilisant
4276     * les éléments fourni en paramètre
4277     *
4278     * @param integer $idNotification : id de la notification à laquelle on associe le document
4279     * @param integer $idDocument : id de l'objet auquel est rattaché le document
4280     * @param string $tableDocument : nom de la table a laquelle est rattaché le document
4281     * @param boolean $isAnnexe : indique si le document est une annexe ou pas
4282     *
4283     * @return boolean indique si le traitement a réussi
4284     */
4285     protected function ajouter_notification_document($idNotification, $idDocument, $tableDocument, $isAnnexe = false) {
4286     $inst_notif_doc = $this->f->get_inst__om_dbform(array(
4287     "obj" => "instruction_notification_document",
4288     "idx" => "]",
4289     ));
4290     // l'attribut instruction doit obligatoirement être renseigné
4291     // pour éviter toutes confusion avec d'autres instruction l'id
4292     // 0 est donné au document n'appartenant pas aux instructions
4293     $notif_doc_val = array(
4294     'instruction_notification_document' => null,
4295     'instruction_notification' => $idNotification,
4296     'instruction' => $tableDocument == 'instruction' ? $idDocument : 0,
4297     'document_type' => $tableDocument,
4298     'document_id' => $idDocument,
4299     'cle' => $this->getCleAccesDocument(),
4300     'annexe' => $isAnnexe
4301     );
4302    
4303     $add_notif_doc = $inst_notif_doc->ajouter($notif_doc_val);
4304     if ($add_notif_doc === false) {
4305 softime 13528 $this->addToLog(
4306     sprintf(
4307     '%s() : %s %s : %s',
4308     __METHOD__,
4309     __('Echec de l\'ajout du paramétrage du document notifié en base de données.'),
4310     __('Paramétrage du document'),
4311     var_export($notif_doc_val, true)
4312     ),
4313     DEBUG_MODE
4314     );
4315 softime 11585 return false;
4316     }
4317     return true;
4318     }
4319    
4320     /**
4321 softime 10968 * Vérifie si le paramétrage de la notification des demandeurs est correct.
4322     *
4323     * @param integer identifiant de la collectivité
4324     * @return boolean
4325     */
4326     protected function is_parametrage_notification_correct($collectiviteId) {
4327     $categorie = $this->f->get_param_option_notification($collectiviteId);
4328     $urlAccesNotif = $this->f->get_parametre_notification_url_acces($collectiviteId);
4329 softime 14064 if ($categorie === 'mail' && $urlAccesNotif === null) {
4330 softime 10968 return false;
4331     }
4332     return true;
4333     }
4334    
4335     /**
4336 softime 8989 * TRIGGER - triggermodifierapres.
4337     *
4338     * @return boolean
4339     */
4340     function triggermodifierapres($id, &$dnu1 = null, $val = array(), $dnu2 = null) {
4341     $this->addToLog(__METHOD__."(): start", EXTRA_VERBOSE_MODE);
4342 softime 10808 $collectivite_di = $this->get_dossier_instruction_om_collectivite($val['dossier']);
4343     $message = '';
4344 mbroquet 3730
4345 softime 13137 // Définit si le dossier d'instruction doit être mis à jour
4346     $update_dossier = true;
4347     // Les actions de mise à jour des dates ne doivent pas appliquer
4348     // l'action de l'événement et donc ne pas mettre à jour le dossier
4349     if ($this->getParameter("maj") == 125
4350     || $this->getParameter("maj") == 170
4351     || $this->getParameter("maj") == 175) {
4352     $update_dossier = false;
4353     }
4354    
4355     // Traitement en cas de mise à jour du dossier
4356     if ($update_dossier === true) {
4357     /**
4358     * L'objectif ici est d'effectuer les recalculs de date dans le dossier
4359     * si la date de l'evenement est modifiee
4360     */
4361     // Initialisation
4362     $valF = array();
4363     $valF_dt = array();
4364     // Initialisation du type d'événement
4365     $type_evmt = "";
4366     // Récupération de l'action correspondante à l'événement
4367 softime 14064 $evenement = $this->f->get_inst__om_dbform(array(
4368     "obj" => "evenement",
4369     "idx" => $this->valF['evenement']
4370     ));
4371 softime 13137
4372     // Récupération des paramètres de l'action
4373 softime 14542 // TODO : remplacer cette requête par l'instanciation de l'action
4374     $qres = $this->f->get_all_results_from_db_query(
4375     sprintf(
4376     'SELECT
4377     *
4378     FROM
4379     %1$saction
4380     WHERE
4381     action = \'%2$s\'',
4382     DB_PREFIXE,
4383     $this->f->db->escapeSimple($evenement->getVal('action'))
4384     ),
4385     array(
4386     "origin" => __METHOD__
4387     )
4388 softime 14064 );
4389 softime 14542 foreach ($qres['result'] as $row) {
4390 softime 13137 // application des regles sur le courrier + delai
4391     if(preg_match("/date_evenement/",$row['regle_date_limite'])){
4392     $valF['date_limite']= $this->regle($row['regle_date_limite'], 'regle_date_limite');
4393     }
4394     if(preg_match("/date_evenement/",$row['regle_date_complet'])){
4395     $valF['date_complet']= $this->regle($row['regle_date_complet'], 'regle_date_complet');
4396     }
4397     if(preg_match("/date_evenement/",$row['regle_date_dernier_depot'])){
4398     $valF['date_dernier_depot']= $this->regle($row['regle_date_dernier_depot'], 'regle_date_dernier_depot');
4399     }
4400     if(preg_match("/date_evenement/",$row['regle_date_notification_delai'])){
4401     $valF['date_notification_delai']= $this->regle($row['regle_date_notification_delai'], 'regle_date_notification_delai');
4402     }
4403     if(preg_match("/date_evenement/",$row['regle_date_decision'])){
4404     $valF['date_decision']= $this->regle($row['regle_date_decision'], 'regle_date_decision');
4405     }
4406     if(preg_match("/date_evenement/",$row['regle_date_rejet'])){
4407     $valF['date_rejet']= $this->regle($row['regle_date_rejet'], 'regle_date_rejet');
4408     }
4409     if(preg_match("/date_evenement/",$row['regle_date_validite'])){
4410     $valF['date_validite']= $this->regle($row['regle_date_validite'], 'regle_date_validite');
4411     }
4412     if(preg_match("/date_evenement/",$row['regle_date_chantier'])){
4413     $valF['date_chantier']= $this->regle($row['regle_date_chantier'], 'regle_date_chantier');
4414     }
4415     if(preg_match("/date_evenement/",$row['regle_date_achevement'])){
4416     $valF['date_achevement']= $this->regle($row['regle_date_achevement'], 'regle_date_achevement');
4417     }
4418     if(preg_match("/date_evenement/",$row['regle_date_conformite'])){
4419     $valF['date_conformite']= $this->regle($row['regle_date_conformite'], 'regle_date_conformite');
4420     }
4421     if(preg_match("/date_evenement/",$row['regle_date_cloture_instruction'])){
4422     $valF['date_cloture_instruction']= $this->regle($row['regle_date_cloture_instruction'], 'regle_date_cloture_instruction');
4423     }
4424     if(preg_match("/date_evenement/",$row['regle_date_premiere_visite'])){
4425     $valF['date_premiere_visite']= $this->regle($row['regle_date_premiere_visite'], 'regle_date_premiere_visite');
4426     }
4427     if(preg_match("/date_evenement/",$row['regle_date_derniere_visite'])){
4428     $valF['date_derniere_visite']= $this->regle($row['regle_date_derniere_visite'], 'regle_date_derniere_visite');
4429     }
4430     if(preg_match("/date_evenement/",$row['regle_date_contradictoire'])){
4431     $valF['date_contradictoire']= $this->regle($row['regle_date_contradictoire'], 'regle_date_contradictoire');
4432     }
4433     if(preg_match("/date_evenement/",$row['regle_date_retour_contradictoire'])){
4434     $valF['date_retour_contradictoire']= $this->regle($row['regle_date_retour_contradictoire'], 'regle_date_retour_contradictoire');
4435     }
4436     if(preg_match("/date_evenement/",$row['regle_date_ait'])){
4437     $valF['date_ait']= $this->regle($row['regle_date_ait'], 'regle_date_ait');
4438     }
4439     if(preg_match("/date_evenement/",$row['regle_date_transmission_parquet'])){
4440     $valF['date_transmission_parquet']= $this->regle($row['regle_date_transmission_parquet'], 'regle_date_transmission_parquet');
4441     }
4442     if ($row['regle_donnees_techniques1'] !== '') {
4443     $valF_dt[$row['cible_regle_donnees_techniques1']] = $this->regle($row['regle_donnees_techniques1'], 'regle_donnees_techniques1');
4444     }
4445     if ($row['regle_donnees_techniques2'] !== '') {
4446     $valF_dt[$row['cible_regle_donnees_techniques2']] = $this->regle($row['regle_donnees_techniques2'], 'regle_donnees_techniques2');
4447     }
4448     if ($row['regle_donnees_techniques3'] !== '') {
4449     $valF_dt[$row['cible_regle_donnees_techniques3']] = $this->regle($row['regle_donnees_techniques3'], 'regle_donnees_techniques3');
4450     }
4451     if ($row['regle_donnees_techniques4'] !== '') {
4452     $valF_dt[$row['cible_regle_donnees_techniques4']] = $this->regle($row['regle_donnees_techniques4'], 'regle_donnees_techniques4');
4453     }
4454     if ($row['regle_donnees_techniques5'] !== '') {
4455     $valF_dt[$row['cible_regle_donnees_techniques5']] = $this->regle($row['regle_donnees_techniques5'], 'regle_donnees_techniques5');
4456     }
4457     if ($row['regle_dossier_instruction_type'] !== '') {
4458     $valF['dossier_instruction_type'] = $this->regle($row['regle_dossier_instruction_type'], 'regle_dossier_instruction_type');
4459     }
4460 mbroquet 3730 }
4461 softime 13137 // Si des valeurs de données techniques ont été calculées alors on met à jour l'enregistrement
4462     if (count($valF_dt) > 0) {
4463     $dt_id = $this->getDonneesTechniques();
4464     // On met à jour le dossier
4465     $cle = " donnees_techniques='".$dt_id."'";
4466     $res1 = $this->f->db->autoExecute(DB_PREFIXE.'donnees_techniques', $valF_dt, DB_AUTOQUERY_UPDATE, $cle);
4467     $this->addToLog(
4468     __METHOD__."(): db->autoexecute(\"".DB_PREFIXE."donnees_techniques\", ".print_r($valF_dt, true).", DB_AUTOQUERY_UPDATE, \"".$cle."\");",
4469     VERBOSE_MODE
4470     );
4471     $this->f->isDatabaseError($res1);
4472     // Affichage d'informations à l'utilisateur
4473     $this->addToMessage(_('enregistrement')." ".$this->valF['dossier']." "._('table')." dossier [".$this->f->db->affectedRows()." "._('enregistrement')." "._('mis_a_jour')."]");
4474 mbroquet 3730 }
4475 softime 13137 // Si des valeurs ont été calculées alors on met à jour l'enregistrement
4476     if (count($valF) > 0) {
4477     $inst_dossier = $this->f->get_inst__om_dbform(array(
4478     "obj" => "dossier",
4479     "idx" => $this->valF['dossier'],
4480     ));
4481     $valF['instruction'] = $id;
4482     $valF['crud'] = 'update';
4483     $update_by_instruction = $inst_dossier->update_by_instruction($valF);
4484     if ($update_by_instruction === false) {
4485     $this->cleanMessage();
4486     $this->addToMessage(sprintf('%s %s', __("Une erreur s'est produite lors de la mise à jour du dossier d'instruction."), __("Veuillez contacter votre administrateur.")));
4487     return false;
4488     }
4489     // Affichage d'informations à l'utilisateur
4490     $this->addToMessage(_('enregistrement')." ".$this->valF['dossier']." "._('table')." dossier [".$this->f->db->affectedRows()." "._('enregistrement')." "._('mis_a_jour')."]");
4491 mbroquet 3730 }
4492     }
4493    
4494 softime 14064 // Par défaut les instructions à ajouter suite à la saisie d'une date
4495     // de retour signature ou de notification, utilisent l'action 0
4496     // Si la création d'événement d'instruction suivant est déclenchée par
4497     // une notification suite au traitement d'une tâche (démat') alors l'ajout
4498     // de la nouvelle instruction se fait avec l'action 176
4499     // Cela permet de ne pas contrôler la restriction lors de l'ajout de la
4500     // nouvelle instruction, depuis la méthode verifier()
4501     $code_action_add = 0;
4502     if ($this->getParameter("maj") == 175) {
4503     $code_action_add = 176;
4504     }
4505 mbroquet 3730 $restriction = $this->get_restriction($val['evenement']);
4506     $this->restriction_valid = $this->restrictionIsValid($restriction);
4507    
4508     if($restriction == "" || $this->restriction_valid ){
4509     // Récupération de tous les paramètres de l'événement sélectionné
4510 softime 14542 // TODO : remplacer cette requête par l'instanciation de l'evenement
4511     $qres = $this->f->get_all_results_from_db_query(
4512     sprintf(
4513     'SELECT
4514     *
4515     FROM
4516     %1$sevenement
4517     WHERE
4518     evenement = %2$d',
4519     DB_PREFIXE,
4520     intval($this->valF['evenement'])
4521     ),
4522     array(
4523     "origin" => __METHOD__
4524     )
4525     );
4526 nmeucci 3965 $current_id = $this->getVal($this->clePrimaire);
4527 softime 14542 foreach ($qres['result'] as $row) {
4528 mbroquet 3730 // Si la date de retour signature est éditée on vérifie si il existe un événement automatique
4529     if ($this->getVal('date_retour_signature') == "" AND
4530     $this->valF['date_retour_signature'] != "" AND
4531     $row['evenement_retour_signature'] != "") {
4532 softime 7996 $new_instruction = $this->f->get_inst__om_dbform(array(
4533     "obj" => "instruction",
4534     "idx" => "]",
4535     ));
4536 mbroquet 3730 // Création d'un tableau avec la liste des champs de l'instruction
4537     foreach($new_instruction->champs as $champ) {
4538     $valNewInstr[$champ] = "";
4539     }
4540     // Définition des valeurs de la nouvelle instruction
4541     $valNewInstr["evenement"] = $row['evenement_retour_signature'];
4542     $valNewInstr["destinataire"] = $this->valF['destinataire'];
4543     $valNewInstr["dossier"] = $this->valF['dossier'];
4544     $valNewInstr["date_evenement"] = $this->f->formatDate($this->valF['date_retour_signature']);
4545     $valNewInstr["date_envoi_signature"] = $this->f->formatDate($this->valF['date_envoi_signature']);
4546     $valNewInstr["date_retour_signature"] = $this->f->formatDate($this->valF['date_retour_signature']);
4547     $valNewInstr["date_envoi_rar"] = $this->f->formatDate($this->valF['date_envoi_rar']);
4548     $valNewInstr["date_retour_rar"] = $this->f->formatDate($this->valF['date_retour_rar']);
4549     $valNewInstr["date_envoi_controle_legalite"] = $this->f->formatDate($this->valF['date_envoi_controle_legalite']);
4550     $valNewInstr["date_retour_controle_legalite"] = $this->f->formatDate($this->valF['date_retour_controle_legalite']);
4551 softime 14064 $new_instruction->setParameter("maj", $code_action_add);
4552     $new_instruction->class_actions[$code_action_add]["identifier"] =
4553 softime 13528 sprintf(
4554     __("Ajout suite au retour signature de l'instruction %s"),
4555     $current_id
4556     );
4557 softime 8989 $retour = $new_instruction->ajouter($valNewInstr);
4558 mbroquet 3730
4559     //Si une erreur s'est produite et qu'il s'agit d'un problème
4560     //de restriction
4561     if ($retour == false && !$new_instruction->restriction_valid){
4562     $error_message = $this->get_restriction_error_message($restriction);
4563     $this->f->displayMessage("error", $error_message);
4564 softime 8989 $this->addToLog(__METHOD__."(): evenement retour ".
4565 mbroquet 3730 "instruction ".$this->valF[$this->clePrimaire]." : ".
4566     $new_instruction->msg);
4567     }
4568     //Si une erreur s'est produite après le test de la restriction
4569     elseif ($retour == false && $new_instruction->restriction_valid){
4570     $this->correct = false ;
4571     $this->msg .= $new_instruction->msg;
4572     return false;
4573     }
4574     }
4575     // Si la date de retour AR est éditée on vérifie si il existe un événement automatique
4576     if ($this->getVal('date_retour_rar') == "" AND
4577     $this->valF['date_retour_rar'] != "") {
4578    
4579     if($row['evenement_retour_ar'] != "") {
4580 softime 7996 $new_instruction = $this->f->get_inst__om_dbform(array(
4581     "obj" => "instruction",
4582     "idx" => "]",
4583     ));
4584 mbroquet 3730 // Création d'un tableau avec la liste des champs de l'instruction
4585     foreach($new_instruction->champs as $champ) {
4586     $valNewInstr[$champ] = "";
4587     }
4588     // Définition des valeurs de la nouvelle instruction
4589     $valNewInstr["evenement"] = $row['evenement_retour_ar'];
4590     $valNewInstr["destinataire"] = $this->valF['destinataire'];
4591     $valNewInstr["dossier"] = $this->valF['dossier'];
4592     $valNewInstr["date_evenement"] = $this->f->formatDate($this->valF['date_retour_rar']);
4593     $valNewInstr["date_envoi_signature"] = $this->f->formatDate($this->valF['date_envoi_signature']);
4594     $valNewInstr["date_retour_signature"] = $this->f->formatDate($this->valF['date_retour_signature']);
4595     $valNewInstr["date_envoi_rar"] = $this->f->formatDate($this->valF['date_envoi_rar']);
4596     $valNewInstr["date_retour_rar"] = $this->f->formatDate($this->valF['date_retour_rar']);
4597     $valNewInstr["date_envoi_controle_legalite"] = $this->f->formatDate($this->valF['date_envoi_controle_legalite']);
4598     $valNewInstr["date_retour_controle_legalite"] = $this->f->formatDate($this->valF['date_retour_controle_legalite']);
4599 softime 14064 $new_instruction->setParameter("maj", $code_action_add);
4600     $new_instruction->class_actions[$code_action_add]["identifier"] =
4601 softime 13137 sprintf(__("Ajout suite à la notification de l'instruction %s"), $current_id);
4602 softime 8989 $retour = $new_instruction->ajouter($valNewInstr);
4603 mbroquet 3730
4604     //Si une erreur s'est produite et qu'il s'agit d'un problème
4605     //de restriction
4606     if ($retour == false && !$new_instruction->restriction_valid) {
4607     $error_message = $this->get_restriction_error_message($restriction);
4608     $this->f->displayMessage("error", $error_message);
4609     $this->addToLog(
4610 softime 8989 __METHOD__."(): evenement retour instruction ".
4611 mbroquet 3730 $this->valF[$this->clePrimaire]." : ".
4612     $new_instruction->msg
4613     );
4614     }
4615     //Si une erreur s'est produite après le test de la restriction
4616     elseif ($retour == false && $new_instruction->restriction_valid){
4617     $this->correct = false ;
4618     $this->msg .= $new_instruction->msg;
4619     return false;
4620     }
4621     }
4622     }
4623     }
4624     }
4625    
4626 softime 13137 // Traitement en cas de mise à jour du dossier
4627     if ($update_dossier === true) {
4628     /**
4629     * Mise à jour de la date de dernière modification du dossier
4630     * d'instruction
4631     */
4632     $inst_di = $this->get_inst_dossier($this->getVal('dossier'));
4633     $inst_di->update_last_modification_date();
4634 softime 8640
4635 softime 13137 // Mise à jour des données du dossier d'autorisation
4636     $da = $this->f->get_inst__om_dbform(array(
4637     "obj" => "dossier_autorisation",
4638     "idx" => $this->getNumDemandeAutorFromDossier($this->valF['dossier']),
4639     ));
4640     $params = array(
4641     'di_id' => $this->getVal('dossier'),
4642     );
4643     if($da->majDossierAutorisation($params) === false) {
4644     $this->addToMessage(_("Erreur lors de la mise a jour des donnees du dossier d'autorisation. Contactez votre administrateur."));
4645     $this->correct = false;
4646     return false;
4647     }
4648 mbroquet 3730 }
4649 softime 7996
4650 softime 10573 // mise à jour des métadonnées issues des dates de suivi
4651     $dateRetourSignatureModified = ($this->valF['date_retour_signature'] != $this->getVal('date_retour_signature'));
4652     $dateRetourRARModified = ($this->valF['date_retour_rar'] != $this->getVal('date_retour_rar'));
4653     if ($dateRetourSignatureModified || $dateRetourRARModified) {
4654    
4655     // Calculs des nouvelles métadonnées
4656     $metadata = $this->getMetadata("om_fichier_instruction");
4657    
4658     // On vérifie si l'instruction à finaliser a un événement de type arrete
4659 softime 14064 // TODO : A voir pour remplacer par une instanciation de l'événement.
4660     // Voir également si l'événement ne dois pas être instancié en début de
4661     // méthode pour pouvoir être réutilisé.
4662     $qres = $this->f->get_one_result_from_db_query(
4663     sprintf(
4664     'SELECT
4665     type
4666     FROM
4667     %1$sevenement
4668     WHERE
4669     evenement = \'%2$d\'',
4670     DB_PREFIXE,
4671     intval($this->getVal("evenement"))
4672     ),
4673     array(
4674     "origin" => __METHOD__,
4675     "force_return" => true,
4676     )
4677     );
4678    
4679     if ($qres["code"] !== "OK") {
4680 softime 10573 $this->correct = false;
4681     $this->addToMessage(__("Erreur de traitement de fichier."));
4682 softime 14064 $this->addToLog(__METHOD__."() erreur BDD: ".var_export($qres['message'], true), DEBUG_MODE);
4683 softime 10573 return false;
4684     }
4685    
4686     // Si l'événement est de type arrete, on ajoute les métadonnées spécifiques
4687 softime 14064 if ($qres['result'] == 'arrete'){
4688 softime 10573 $metadata = array_merge($metadata, $this->getMetadata("arrete"));
4689     }
4690    
4691     // Filtre pour conserver uniquement les métadonnées liées aux dates
4692     $metadataToKeep = array(
4693     "statutAutorisation",
4694     "dateEvenementDocument",
4695     'date_cloture_metier',
4696     "NotificationArrete",
4697     "dateNotificationArrete",
4698     "controleLegalite",
4699     "dateSignature",
4700     "nomSignataire",
4701     "qualiteSignataire",
4702     "dateControleLegalite",
4703     );
4704     $metadata = array_filter(
4705     $metadata,
4706     function($key) use ($metadataToKeep) { return in_array($key, $metadataToKeep); },
4707     ARRAY_FILTER_USE_KEY
4708     );
4709    
4710     // Mise à jour des métadonnées du document en GED
4711     $docUid = $this->getVal("om_fichier_instruction");
4712     $operationOrUID = $this->f->storage->update_metadata($docUid, $metadata);
4713     if ($operationOrUID == 'OP_FAILURE') {
4714     $this->correct = false;
4715     $this->addToMessage(__("Erreur de traitement de fichier."));
4716     $this->addToLog(__METHOD__."() failed to update metadata: ".var_export($operationOrUID, true), DEBUG_MODE);
4717     return false;
4718     }
4719    
4720     // mise à jour de l'UID du document en BDD
4721     else {
4722     $valF = array('om_fichier_instruction' => $operationOrUID);
4723     $res = $this->f->db->autoExecute(DB_PREFIXE.$this->table, $valF, DB_AUTOQUERY_UPDATE, $this->getCle($id));
4724     $this->addToLog(__METHOD__.'() : db->autoExecute("'.DB_PREFIXE.$this->table.'", '.print_r($valF, true).', DB_AUTOQUERY_UPDATE, "'.$this->getCle($id).'")', VERBOSE_MODE);
4725     if ($this->f->isDatabaseError($res, true) === true) {
4726     $this->correct = false;
4727     $this->addToMessage(__("Erreur de traitement de fichier."));
4728     $this->addToLog(__METHOD__."() erreur BDD: ".var_export($res->getMessage(), true), DEBUG_MODE);
4729     return false;
4730     }
4731     $this->addToMessage(__("La mise a jour du document s'est effectuee avec succes."));
4732     }
4733     }
4734    
4735 softime 13137 // Déclenchement des notifications automatique après finalisation et
4736     // retour de signature
4737 softime 10808 if ($dateRetourSignatureModified === true
4738     && $this->valF['date_retour_signature'] !== ''
4739     && $this->valF['date_retour_signature'] !== null) {
4740 softime 13137
4741     // Message à afficher dans les logs pour indiquer quelle notification a échouée
4742 softime 13528 $msgLog = sprintf(
4743     '%s %s : %d',
4744     __('Erreur lors de la notification automatique du(des) pétitionnaire(s) après retour signature.'),
4745     __('Instruction notifiée'),
4746     $id
4747     );
4748 softime 13137
4749     // Récupération de l'instance de l'événement pour accéder au paramètrage
4750     // des notifications
4751 softime 10808 $ev = $this->get_inst_evenement($this->valF['evenement']);
4752 softime 13137 // Si la notification automatique des tiers consulté est active
4753     // déclenche le traitement de notification.
4754     // Ce traitement va envoyer des courriels de notification à tous les tiers concernés
4755     $typeNotifTiers = $ev->getVal('notification_tiers');
4756     $inst_di = $this->get_inst_dossier($this->getVal('dossier'));
4757     if ($typeNotifTiers === 'notification_automatique') {
4758     if ($this->traitement_notification_automatique_tiers_consulte($ev, $inst_di) === false) {
4759     $this->addToMessage(__('Le traitement de la notification automatique de tiers à échoué.'));
4760     $this->correct = false;
4761     }
4762     }
4763    
4764 softime 10808 if ($ev->getVal('notification') === 'notification_auto_signature_requise') {
4765     // Récupération de la liste des demandeurs à notifier et de la catégorie
4766     $categorie = $this->f->get_param_option_notification($collectivite_di);
4767 softime 14064 $isPortal = $categorie === PORTAL;
4768 softime 10869 $demandeursANotifie = $this->get_demandeurs_notifiable(
4769     $this->valF['dossier'],
4770     $isPortal
4771     );
4772 softime 10808
4773     // Création d'une notification et d'une tâche pour chaque demandeur à notifier
4774 softime 12124 $demandeurPrincipalNotifie = false;
4775 softime 10808 foreach ($demandeursANotifie as $demandeur) {
4776 softime 12124 // Identifie si le demandeur principal a été notifié ou pas
4777     // et récupère ses informations
4778     if ($demandeur['petitionnaire_principal'] == 't') {
4779     $demandeurPrincipalNotifie = true;
4780     // Si le demandeur principal est notifiable mais qu'il y a des erreurs dans
4781     // son paramétrage, on effectue pas le traitement et on passe à l'itération
4782     // suivante. On le considère également comme non notifié pour gérer l'envoie
4783     // des messages d'erreurs
4784     // Si la demande a été déposée via le portail alors le paramétrage n'a pas
4785     // d'impact sur la notification
4786     $erreursParam = $this->get_info_notification_fail();
4787     if (! $this->dossier_depose_sur_portail() && $erreursParam != array()) {
4788     $demandeurPrincipalNotifie = false;
4789     continue;
4790     }
4791     }
4792 softime 10808 // Ajout de la notif et récupération de son id
4793     $idNotif = $this->ajouter_notification(
4794     $this->valF[$this->clePrimaire],
4795     $this->f->get_connected_user_login_name(),
4796 softime 10968 $demandeur,
4797     $collectivite_di,
4798 softime 12433 array(),
4799 softime 10968 true
4800 softime 10808 );
4801     if ($idNotif === false) {
4802 softime 13528 $this->addToLog(
4803     sprintf('%s() : %s',__METHOD__, $msgLog),
4804     DEBUG_MODE
4805     );
4806 softime 10808 return false;
4807     }
4808     // Création de la tache en lui donnant l'id de la notification
4809     $notification_by_task = $this->notification_by_task(
4810     $idNotif,
4811     $this->valF['dossier'],
4812     $categorie
4813     );
4814     if ($notification_by_task === false) {
4815 softime 13528 $this->addToLog(
4816     sprintf('%s() : %s',__METHOD__, $msgLog),
4817     DEBUG_MODE
4818     );
4819 softime 10808 $this->addToMessage(
4820     __("Erreur lors de la génération de la notification au(x) pétitionnaire(s).")
4821     );
4822     return false;
4823     }
4824     }
4825 softime 12847 // Pour la notification par mail ou la notification via portal si le dossier a
4826     // été déposés via portal, si le demandeur principal n'est pas notifiable,
4827     // on créé une nouvelle notification en erreur avec en commentaire la raison pour
4828     // laquelle le demandeur principal n'a pas pu être notifié
4829     $depotPortal = $this->dossier_depose_sur_portail();
4830     if (! $demandeurPrincipalNotifie && ($isPortal === false || $depotPortal === true)) {
4831 softime 13137 // Précise dans les logs que le pétitionnaire principal n'a pas été notifié
4832 softime 13528 $msgLog .= sprintf(' %s', __('Le pétitionnaire principale n\'est pas notifiable.'));
4833 softime 12124 // Analyse pour savoir pourquoi le demandeur principal n'est pas notifiable
4834     $erreursParam = $this->get_info_notification_fail();
4835     $demandeurPrincipal = $this->get_info_petitionnaire_principal_dossier($this->getVal('dossier'));
4836     // Ajout de la notif et récupération de son id
4837     $idNotif = $this->ajouter_notification(
4838     $this->valF[$this->clePrimaire],
4839     $this->f->get_connected_user_login_name(),
4840     $demandeurPrincipal,
4841     $collectivite_di,
4842 softime 12433 array(),
4843 softime 12124 true,
4844     'Echec',
4845     implode(' ', $erreursParam)
4846     );
4847     if ($idNotif === false) {
4848 softime 13528 $this->addToLog(
4849     sprintf('%s() : %s', __METHOD__, $msgLog),
4850     DEBUG_MODE
4851     );
4852 softime 12124 $this->addToMessage(
4853     __('Erreur : la création de la notification a échouée.').
4854     __("Veuillez contacter votre administrateur.")
4855     );
4856     return false;
4857     }
4858     // Prépare un message d'alerte à destination de l'instructeur pour l'informer
4859     // de l'échec de la notification
4860     $dossier_message = $this->get_inst_dossier_message(0);
4861     $dossier_message_val = array(
4862     'dossier' => $this->getVal('dossier'),
4863     'type' => _('erreur expedition'),
4864     'emetteur' => $this->f->get_connected_user_login_name(),
4865     'login' => $_SESSION['login'],
4866     'date_emission' => date('Y-m-d H:i:s'),
4867     'contenu' => _('Échec lors de la notification de l\'instruction ').
4868     $ev->getVal('libelle').
4869     '.<br>'.
4870     implode("\n", $erreursParam).
4871     '<br>'.
4872     _('Veuillez corriger ces informations avant de renvoyer la notification.')
4873     );
4874     $add = $dossier_message->add_notification_message($dossier_message_val, true);
4875     // Si une erreur se produit pendant l'ajout
4876     if ($add !== true) {
4877 softime 13528 $this->addToLog(
4878     sprintf(
4879     '%s() : %s',
4880     __METHOD__,
4881     __("Le message d'alerte concernant l'echec de l'envoi de la notification n'a pas pu être envoyé.")
4882     ),
4883     DEBUG_MODE
4884     );
4885 softime 12124 return false;
4886     }
4887     }
4888 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.")));
4889     }
4890     }
4891    
4892 nmeucci 3933 return $this->add_log_to_dossier($id, $val);
4893 fmichon 4708 }
4894 mbroquet 3730
4895 softime 8989 /**
4896     * TRIGGER - triggersupprimer.
4897     *
4898     * @return boolean
4899     */
4900     function triggersupprimer($id, &$dnu1 = null, $val = array(), $dnu2 = null) {
4901     $this->addToLog(__METHOD__."(): start", EXTRA_VERBOSE_MODE);
4902 mbroquet 3730 /**
4903     * L'objectif ici est de repositionner les valeurs récupérées en
4904     * archive dans le dossier d'instruction avant de supprimer l'événement
4905 softime 10573 * d'instruction si les valeurs du dossier sont différentes
4906 mbroquet 3730 */
4907 softime 10573 $valF = array();
4908     $inst_di = $this->get_inst_dossier($this->getVal('dossier'));
4909     foreach ($inst_di->champs as $key => $champ) {
4910     // Si le champ du DI à une archive dans l'instruction
4911     if (isset($val[sprintf('archive_%s', $champ)]) === true) {
4912     // Si la valeur entre le champ du DI et son archive dans instruction
4913     // est différente
4914     if ($inst_di->getVal($champ) !== $val[sprintf('archive_%s', $champ)]) {
4915     $val[sprintf('archive_%s', $champ)] === '' ? $valF[$champ] = null : $valF[$champ] = $val[sprintf('archive_%s', $champ)];
4916 softime 15037 // Gestion du cas particulier 'accord_tacite' pour renvoyer la valeur ' ' (3 espaces vides) au lieu de null
4917     // Car les valeurs possibles du champ accord_tacite sont : 'Oui', 'Non' ou ' '
4918     if ($champ === "accord_tacite" && $valF[$champ] === null) {
4919     $valF[$champ] = ' ';
4920     }
4921 softime 10573 }
4922     }
4923 softime 5024 }
4924 softime 10573 // Spécificité du champ avis_decision dont le champ archive est nommé
4925     // différemment
4926     if ($inst_di->getVal('avis_decision') !== $val['archive_avis']) {
4927     $val['archive_avis'] === '' ? $valF['avis_decision'] = null : $valF['avis_decision'] = $val['archive_avis'];
4928 softime 5024 }
4929 softime 10573 // Spécificité de la date d'affichage dont la valeur n'ai jamais modifiée
4930     // par l'archive
4931     unset($valF['date_affichage']);
4932 softime 6565
4933 softime 9245 /**
4934     * Mise à jour de la version de clôture *version_clos* du dossier si et
4935     * seulement si l'instruction met à jour l'état du dossier.
4936     */
4937 softime 10573 if (isset($valF['etat']) === true
4938     && $valF['etat'] !== null
4939 softime 9245 && $valF['etat'] !== '') {
4940 softime 10573 // Récupère l'état actuel du dossier d'instruction
4941     $inst_current_etat = $this->f->get_inst__om_dbform(array(
4942     "obj" => "etat",
4943     "idx" => $inst_di->get_id_etat(),
4944     ));
4945 softime 9245 // Instanciation de l'état archivé appliqué sur le dossier
4946     $inst_etat = $this->f->get_inst__om_dbform(array(
4947     "obj" => "etat",
4948     "idx" => $valF['etat'],
4949     ));
4950     //
4951     $update_version_clos = null;
4952     // En cas de clôture du dossier par l'état archivé
4953     if ($inst_etat->getVal('statut') === 'cloture') {
4954     $update_version_clos = $inst_di->update_version_clos('up');
4955     }
4956     // En cas de réouverture du dossier par l'état archivé
4957     if ($inst_current_etat->getVal('statut') === 'cloture'
4958     && $inst_etat->getVal('statut') !== 'cloture') {
4959     //
4960     $update_version_clos = $inst_di->update_version_clos('down');
4961     //
4962     $this->set_att_di_reopened(true);
4963     }
4964     //
4965     if ($update_version_clos === false) {
4966     $this->f->addToLog(sprintf(
4967     "%s() : ERREUR - %s %s",
4968     __METHOD__,
4969     sprintf(
4970     __("Impossible de mettre à jour la version de clôture du dossier d'instruction %s."),
4971     $inst_di->getVal($inst_di->clePrimaire)
4972     ),
4973     sprintf(
4974     __("L'instruction tente d'appliquer l'état %s."),
4975     $inst_etat->getVal($inst_etat->clePrimaire)
4976     )
4977     ));
4978     $this->addToMessage(sprintf(
4979     "%s %s",
4980     __("Erreur lors de la mise à jour de la version de clôture du dossier d'instruction."),
4981     __("Veuillez contacter votre administrateur.")
4982     ));
4983     return false;
4984     }
4985     }
4986 softime 10808 // On supprime toutes les notications liées à l'instruction
4987 softime 12654 $notifASupprimer = $this->get_instruction_notification(
4988     $this->getVal($this->clePrimaire),
4989     array(
4990     'notification_recepisse',
4991     'notification_instruction',
4992     'notification_decision',
4993     'notification_service_consulte',
4994     'notification_tiers_consulte',
4995 softime 13137 'notification_depot_demat',
4996 softime 15037 'notification_commune',
4997     'notification_signataire'
4998 softime 12654 ),
4999     true
5000     );
5001    
5002 softime 10808 foreach ($notifASupprimer as $idNotif) {
5003     $inst_notif = $this->f->get_inst__om_dbform(array(
5004     "obj" => "instruction_notification",
5005     "idx" => $idNotif,
5006     ));
5007     $val_notif = array();
5008     foreach ($inst_notif->champs as $champ) {
5009     $val_notif[$champ] = $inst_notif->getVal($champ);
5010     }
5011     // La suppression des notifications entrainera la suppression des tâches qui y sont
5012     // liées
5013     $supprNotif = $inst_notif->supprimer($val_notif);
5014     if ($supprNotif == false) {
5015     $this->addToMessage(sprintf(
5016     "%s %s",
5017     __("Erreur lors de la suppression des notifications de l'instruction."),
5018     __("Veuillez contacter votre administrateur.")
5019     ));
5020     return false;
5021     }
5022     }
5023 softime 9245
5024 softime 10573 // On met à jour le dossier
5025     $valF['instruction'] = $id;
5026 softime 10968 $valF['crud'] = 'delete';
5027 softime 10573 $update_by_instruction = $inst_di->update_by_instruction($valF);
5028     if ($update_by_instruction === false) {
5029     $this->cleanMessage();
5030     $this->addToMessage(sprintf('%s %s', __("Une erreur s'est produite lors de la mise à jour du dossier d'instruction."), __("Veuillez contacter votre administrateur.")));
5031     return false;
5032     }
5033    
5034 softime 5024 // Affichage d'informations à l'utilisateur
5035 softime 8989 $this->addToMessage(_("Suppression de l'instruction")." [".$this->f->db->affectedRows()." "._('enregistrement')." "._('mis_a_jour')."]");
5036 softime 5024
5037     // Mise à jour de la demande si un récépissé d'instruction correspond à l'instruction à supprimer
5038 mbroquet 3730 }
5039    
5040 softime 8989 /**
5041     * TRIGGER - triggersupprimerapres.
5042     *
5043     * @return boolean
5044     */
5045     function triggersupprimerapres($id, &$dnu1 = null, $val = array(), $dnu2 = null) {
5046     $this->addToLog(__METHOD__."(): start", EXTRA_VERBOSE_MODE);
5047 softime 8640 /**
5048     * Mise à jour de la date de dernière modification du dossier
5049     * d'instruction
5050     */
5051     $inst_di = $this->get_inst_dossier($this->getVal('dossier'));
5052     $inst_di->update_last_modification_date();
5053    
5054     /**
5055     * Mise à jour des données du dossier d'autorisation
5056     */
5057 softime 7996 $da = $this->f->get_inst__om_dbform(array(
5058     "obj" => "dossier_autorisation",
5059     "idx" => $this->getNumDemandeAutorFromDossier($val["dossier"]),
5060     ));
5061 softime 8640 $params = array(
5062     'di_id' => $this->getVal('dossier'),
5063 softime 9245 'di_reopened' => $this->get_att_di_reopened(),
5064 softime 8640 );
5065     if($da->majDossierAutorisation($params) === false) {
5066 mbroquet 3730 $this->addToMessage(_("Erreur lors de la mise a jour des donnees du dossier d'autorisation. Contactez votre administrateur."));
5067     $this->correct = false;
5068     return false;
5069     }
5070 softime 7996
5071 softime 10573 /**
5072     * Gestion des tâches pour la dématérialisation
5073     */
5074     $inst_task_empty = $this->f->get_inst__om_dbform(array(
5075     "obj" => "task",
5076     "idx" => 0,
5077     ));
5078     foreach ($inst_di->task_types as $task_type) {
5079     $task_exists = $inst_task_empty->task_exists($task_type, $id);
5080     if ($task_exists !== false) {
5081     $inst_task = $this->f->get_inst__om_dbform(array(
5082     "obj" => "task",
5083     "idx" => $task_exists,
5084     ));
5085     if ($inst_task->getVal('state') === $inst_task::STATUS_NEW || $inst_task->getVal('state') === $inst_task::STATUS_DRAFT) {
5086     $task_val = array(
5087     'state' => $inst_task::STATUS_CANCELED,
5088     );
5089     $update_task = $inst_task->update_task(array('val' => $task_val));
5090     if ($update_task === false) {
5091     $this->addToMessage(sprintf('%s %s',
5092     sprintf(__("Une erreur s'est produite lors de la modification de la tâche %."), $inst_task->getVal($inst_task->clePrimaire)),
5093     __("Veuillez contacter votre administrateur.")
5094     ));
5095     $this->correct = false;
5096     return false;
5097     }
5098     }
5099     }
5100     }
5101    
5102 softime 7996 //
5103 softime 8640 $val['evenement'] = $this->getVal('evenement');
5104 nmeucci 3933 return $this->add_log_to_dossier($id, $val);
5105 mbroquet 3730 }
5106    
5107     /**
5108 softime 9245 * Permet de mettre la valeur passée en paramètre dans l'attribut de classe
5109     * "di_reopened".
5110     *
5111     * @param boolean $val
5112     */
5113     function set_att_di_reopened($val) {
5114     $this->di_reopened = $val;
5115     }
5116    
5117     /**
5118     * Permet de récupérer la valeur de l'attribut de classe "di_reopened".
5119     *
5120     * @return boolean
5121     */
5122     function get_att_di_reopened() {
5123     return $this->di_reopened;
5124     }
5125    
5126     /**
5127 mbroquet 3730 * Permet de composer un message d'erreur sur restriction non valide en
5128     * fonction du contexte.
5129     *
5130     * @param string $restriction formule de la restriction
5131     *
5132     * @return string message d'erreur
5133     */
5134     function get_restriction_error_message($restriction) {
5135     // Affichage du message si la restriction s'applique
5136     // Contexte du suivi des dates (message simple)
5137     $message_restrict = _("Probleme de dates :");
5138     // Split restriction
5139     $champs_restrict = preg_split(
5140     '/(\W+)/',
5141     $restriction,
5142     null,
5143     PREG_SPLIT_NO_EMPTY|PREG_SPLIT_DELIM_CAPTURE
5144     );
5145     $formated_restrict = "";
5146     // Ajout des chaînes à traduire
5147     foreach ($champs_restrict as $value) {
5148     $formated_restrict .= _($value)." ";
5149     }
5150     $formated_restrict = substr($formated_restrict, 0, -1);
5151     // Message d'erreur dans le contexte du suivi des dates
5152     if($this->getParameter("maj") == 170) {
5153     $message_restrict .= " "._("contactez l'instructeur du dossier");
5154     $message_restrict .= "<br/>(".$formated_restrict.")";
5155     } else {
5156     // Affichage du message si la restriction s'applique
5157     // Contexte instruction
5158     $message_restrict .= "<br/>".$formated_restrict;
5159     }
5160    
5161     return $message_restrict;
5162     }
5163    
5164     /**
5165 softime 12124 * Surcharge de la méthode verifier() de la classe om_dbform pour y ajouter
5166     * les vérifications suivantes :
5167     * - Si l'instruction à un événement associé et que cet événement à des restrictions :
5168     * 1. vérifie si la restriction est valide, si ce n'est pas le cas récupère et affiche
5169     * le message d'erreur associé à la restriction
5170     * 2. vérifie si les restrictions sont respectées. Si ce n'est pas le cas bloque l'ajout
5171     * et / ou la modification et affiche un message d'erreur
5172     * -
5173     * -
5174     * -
5175     * -
5176     * -
5177     * -
5178     *
5179     * @param array val : tableau contenant les valeurs issues du formulaire.
5180     * @param - dnu1 : Paramètre déprécié et non utilisé.
5181     * @param - dnu2 : Paramètre déprécié et non utilisé.
5182     *
5183 softime 8989 * @return void
5184 mbroquet 3730 */
5185 softime 8989 function verifier($val = array(), &$dnu1 = null, $dnu2 = null) {
5186     parent::verifier($val);
5187     //
5188 mbroquet 3730 if ( isset($val['evenement']) && is_numeric($val['evenement'])){
5189     $restriction = $this->get_restriction($val['evenement']);
5190    
5191     //Test qu'une restriction est présente
5192     if ($restriction != "" ){
5193    
5194 softime 14064 // Vérifie le contexte de la modification et test si la restriction est valide.
5195     // Si l'instruction est modifiée par une tache le dossier n'est pas impacté.
5196     // Il n'est donc pas nécessaire de vérifier les restrictions.
5197 mbroquet 3730 $this->restriction_valid = $this->restrictionIsValid($restriction);
5198 softime 14064 if ($this->getParameter("maj") != 176
5199     && !$this->restriction_valid) {
5200 mbroquet 3730
5201     // Affichage du message si la restriction s'applique
5202     $this->addToMessage(
5203     $this->get_restriction_error_message($restriction)
5204     );
5205     $this->correct=false;
5206     return false;
5207     }
5208    
5209     // Liste des opérateurs possible
5210 nmeucci 3873 $operateurs = array(">=", "<=", "+", "-", "&&", "||", "==", "!=");
5211 mbroquet 3730 // Supprime tous les espaces de la chaîne de caractère
5212     $restriction = str_replace(' ', '', $restriction);
5213    
5214     // Met des espace avant et après les opérateurs puis transforme la
5215     // chaine en un tableau
5216     $tabRestriction = str_replace($operateurs, " ", $restriction);
5217     // Tableau des champ
5218     $tabRestriction = explode(" ", $tabRestriction);
5219     // Supprime les numériques du tableau
5220     foreach ($tabRestriction as $key => $value) {
5221     if (is_numeric($value)) {
5222     unset($tabRestriction[$key]);
5223     }
5224     }
5225    
5226     // Vérifie les champs utilisés pour la restriction
5227     $check_field_exist = $this->f->check_field_exist($tabRestriction, 'instruction');
5228     if ($check_field_exist !== true) {
5229    
5230     // Liste des champs en erreur
5231     $string_error_fields = implode(", ", $check_field_exist);
5232    
5233     // Message d'erreur
5234     $error_message = _("Le champ %s n'est pas utilisable pour le champ %s");
5235     if (count($check_field_exist) > 1) {
5236     $error_message = _("Les champs %s ne sont pas utilisable pour le champ %s");
5237     }
5238    
5239     // Affiche l'erreur
5240     $this->correct=false;
5241     $this->addToMessage(sprintf($error_message, $string_error_fields, _("restriction")));
5242     $this->addToMessage(_("Veuillez contacter votre administrateur."));
5243     }
5244     }
5245    
5246     }
5247     if(!$this->updateDate("date_envoi_signature")) {
5248     return false;
5249     }
5250     if(!$this->updateDate("date_retour_signature")) {
5251     return false;
5252     }
5253     if(!$this->updateDate("date_envoi_rar")) {
5254     return false;
5255     }
5256     if(!$this->updateDate("date_retour_rar")) {
5257     return false;
5258     }
5259     if(!$this->updateDate("date_envoi_controle_legalite")) {
5260     return false;
5261     }
5262     if(!$this->updateDate("date_retour_controle_legalite")) {
5263     return false;
5264     }
5265    
5266     }
5267 softime 12124
5268     /**
5269     * Récupère et stocket dans un tableau toutes les infos du pétitionnaire
5270     * principal du dossier auquel appartiens l'instruction.
5271     * Renvoie un tableau contenant les informations du pétitionnaire principal.
5272     *
5273     * Si l'identifiant de l'instruction n'a pas pu etre récupéré renvoie false
5274     * et affiche un message dans les logs.
5275     * En cas d'erreur de base de donnée renvoie false et affiche un message d'erreur.
5276     *
5277     * @param string identifiant du dossier
5278     * @return array|boolean
5279     */
5280     protected function get_info_petitionnaire_principal_dossier($dossier = null) {
5281     // Si l'identifiant de l'instruction n'a pas été fournit on récupère celui de
5282     // l'objet courant
5283     if (empty($dossier)) {
5284     $dossier = $this->getVal('dossier');
5285     // Si la récupération de l'identifiant de l'instruction a échoué la méthode renvoie
5286     // false et on affiche un message d'erreur dans les logs
5287     if (empty($dossier)) {
5288     $this->addToLog(__METHOD__.' : L\'identifiant du dossier n\'a pas pu être récupéré');
5289     return false;
5290     }
5291     }
5292    
5293     // Requête sql servant à récupérer toutes les informations relatives au demandeurs
5294     // principal
5295 softime 13137 $qres = $this->f->get_all_results_from_db_query(
5296     sprintf(
5297     'SELECT
5298     -- Récupère toutes les informations du demandeur principal
5299     demandeur.*,
5300     CASE
5301     WHEN demandeur.qualite=\'particulier\'
5302     THEN TRIM(CONCAT(demandeur.particulier_nom, \' \', demandeur.particulier_prenom, \' \', demandeur.courriel))
5303     ELSE
5304     TRIM(CONCAT(demandeur.personne_morale_raison_sociale, \' \', demandeur.personne_morale_denomination, \' \', demandeur.courriel))
5305     END AS destinataire
5306     FROM
5307     %1$sdossier
5308     LEFT JOIN %1$slien_dossier_demandeur
5309     ON lien_dossier_demandeur.dossier = dossier.dossier
5310     LEFT JOIN %1$sdemandeur
5311     ON demandeur.demandeur = lien_dossier_demandeur.demandeur
5312     WHERE
5313     dossier.dossier = \'%2$s\'
5314     AND lien_dossier_demandeur.petitionnaire_principal IS TRUE',
5315     DB_PREFIXE,
5316     $this->f->db->escapeSimple($dossier)
5317     ),
5318     array(
5319     "origin" => __METHOD__,
5320     )
5321 softime 12124 );
5322 softime 13137 if (is_array($qres["result"]) === true
5323     && array_key_exists(0, $qres["result"]) === true) {
5324     //
5325     return $qres["result"][0];
5326 softime 12124 }
5327 softime 13137 return null;
5328 softime 12124 }
5329    
5330    
5331 mbroquet 3730
5332     /**
5333     * Finalisation des documents.
5334     * @param string $champ champ du fichier à finaliser
5335     * @param booleen $status permet de définir si on finalise ou définalise
5336     * @param string $sousform permet de savoir si se trouve dans un sousformulaire (passé au javascript)
5337     */
5338     function manage_finalizing($mode = null, $val = array()) {
5339 softime 5024 //
5340     $this->begin_treatment(__METHOD__);
5341 mbroquet 3730
5342 softime 5024 //
5343     $id_inst = $this->getVal($this->clePrimaire);
5344 mbroquet 3730
5345 softime 5024 //
5346     $admin_msg_error = _("Veuillez contacter votre administrateur.");
5347     $file_msg_error = _("Erreur de traitement de fichier.")
5348     ." ".$admin_msg_error;
5349     $bdd_msg_error = _("Erreur de base de données.")
5350     ." ".$admin_msg_error;
5351 softime 5169 $log_msg_error = "Finalisation non enregistrée - id instruction = %s - uid fichier = %s";
5352 mbroquet 3730
5353     // Si on finalise le document
5354     if ($mode == "finalize"){
5355 softime 5024 //
5356     $etat = _('finalisation');
5357 mbroquet 3730
5358     // Récupère la collectivite du dossier d'instruction
5359     $dossier_instruction_om_collectivite = $this->get_dossier_instruction_om_collectivite();
5360    
5361     //
5362     $collectivite = $this->f->getCollectivite($dossier_instruction_om_collectivite);
5363 softime 8593
5364     //
5365     $params = array(
5366     "specific" => array(),
5367     );
5368     // Si la rédaction libre est activée sur l'instruction
5369     if ($this->getVal("flag_edition_integrale") == 't') {
5370     $params["specific"]["corps"] = array(
5371     "mode" => "set",
5372     "value" => $this->getVal("corps_om_htmletatex"),
5373     );
5374     $params["specific"]["titre"] = array(
5375     "mode" => "set",
5376     "value" => $this->getVal("titre_om_htmletat"),
5377     );
5378     }
5379 mbroquet 3730 // Génération du PDF
5380 softime 8593 $result = $this->compute_pdf_output('lettretype', $this->getVal('lettretype'), $collectivite, null, $params);
5381 mbroquet 3730 $pdf_output = $result['pdf_output'];
5382 softime 10573
5383 mbroquet 3730 //Métadonnées du document
5384     $metadata = array(
5385 softime 5024 'filename' => 'instruction_'.$id_inst.'.pdf',
5386 mbroquet 3730 'mimetype' => 'application/pdf',
5387     'size' => strlen($pdf_output)
5388     );
5389    
5390     // Récupération des métadonnées calculées après validation
5391     $spe_metadata = $this->getMetadata("om_fichier_instruction");
5392    
5393     //On vérifie si l'instruction à finaliser a un événement de type arrete
5394 softime 14064 // TODO : A voir pour remplacer par une instanciation de l'événement.
5395     // Voir également si l'événement ne dois pas être instancié en début de
5396     // méthode pour pouvoir être réutilisé.
5397     $qres = $this->f->get_one_result_from_db_query(
5398     sprintf(
5399     'SELECT
5400     type
5401     FROM
5402     %1$sevenement
5403     WHERE
5404     evenement = \'%2$d\'',
5405     DB_PREFIXE,
5406     intval($this->getVal("evenement"))
5407     ),
5408     array(
5409     "origin" => __METHOD__,
5410     "force_return" => true,
5411     )
5412     );
5413    
5414     if ($qres["code"] !== "OK") {
5415 softime 5024 $this->correct = false;
5416     $this->addToMessage($bdd_msg_error);
5417     return $this->end_treatment(__METHOD__, false);
5418 mbroquet 3730 }
5419    
5420     //Initialisation de la variable
5421     $arrete_metadata = array();
5422     // Si l'événement est de type arrete, on ajoute les métadonnées spécifiques
5423 softime 14064 if ($qres['result'] === 'arrete'){
5424 mbroquet 3730 $arrete_metadata = $this->getMetadata("arrete");
5425     }
5426    
5427     $metadata = array_merge($metadata, $spe_metadata, $arrete_metadata);
5428    
5429 softime 10573 /*
5430     // transforme le tableau de métadonnées en objet
5431     $mdf = new MetadataFactory();
5432     $md = $mdf->build('Instruction', $metadata);
5433     */
5434    
5435 softime 5024 // Si le document a déjà été finalisé on le met à jour
5436     // en conservant son UID
5437 mbroquet 3730 if ($this->getVal("om_fichier_instruction") != ''){
5438     $uid = $this->f->storage->update(
5439     $this->getVal("om_fichier_instruction"), $pdf_output, $metadata);
5440     }
5441 softime 5024 // Sinon on crée un nouveau document et dont on récupère l'UID
5442 mbroquet 3730 else {
5443 softime 10573 $uid = $this->f->storage->create($pdf_output, $metadata, "from_content", $this->table.".om_fichier_instruction");
5444 mbroquet 3730 }
5445     }
5446    
5447 softime 5024 // Si on définalise le document
5448 mbroquet 3730 if ($mode == "unfinalize") {
5449 softime 5024 //
5450     $etat = _('définalisation');
5451 mbroquet 3730 // Récupération de l'uid du document finalisé
5452     $uid = $this->getVal("om_fichier_instruction");
5453     }
5454 softime 5024
5455     // Si on définalise l'UID doit être défini
5456     // Si on finalise la création/modification du fichier doit avoir réussi
5457 mbroquet 3730 if ($uid == '' || $uid == 'OP_FAILURE' ) {
5458 softime 5024 $this->correct = false;
5459     $this->addToMessage($file_msg_error);
5460 softime 8989 $this->addToLog(sprintf($log_msg_error, $id_inst, $uid), DEBUG_MODE);
5461 softime 5024 return $this->end_treatment(__METHOD__, false);
5462 mbroquet 3730 }
5463    
5464     //
5465     foreach ($this->champs as $key => $champ) {
5466     //
5467     $val[$champ] = $this->val[$key];
5468     }
5469    
5470     //
5471 softime 6565 $val['date_evenement'] = $this->dateDBToForm($val['date_evenement']);
5472     $val['archive_date_complet'] = $this->dateDBToForm($val['archive_date_complet']);
5473     $val['archive_date_rejet'] = $this->dateDBToForm($val['archive_date_rejet']);
5474     $val['archive_date_limite'] = $this->dateDBToForm($val['archive_date_limite']);
5475     $val['archive_date_notification_delai'] = $this->dateDBToForm($val['archive_date_notification_delai']);
5476     $val['archive_date_decision'] = $this->dateDBToForm($val['archive_date_decision']);
5477     $val['archive_date_validite'] = $this->dateDBToForm($val['archive_date_validite']);
5478     $val['archive_date_achevement'] = $this->dateDBToForm($val['archive_date_achevement']);
5479     $val['archive_date_chantier'] = $this->dateDBToForm($val['archive_date_chantier']);
5480     $val['archive_date_conformite'] = $this->dateDBToForm($val['archive_date_conformite']);
5481     $val['archive_date_dernier_depot'] = $this->dateDBToForm($val['archive_date_dernier_depot']);
5482     $val['archive_date_limite_incompletude'] = $this->dateDBToForm($val['archive_date_limite_incompletude']);
5483     $val['date_finalisation_courrier'] = $this->dateDBToForm($val['date_finalisation_courrier']);
5484     $val['date_envoi_signature'] = $this->dateDBToForm($val['date_envoi_signature']);
5485     $val['date_retour_signature'] = $this->dateDBToForm($val['date_retour_signature']);
5486     $val['date_envoi_rar'] = $this->dateDBToForm($val['date_envoi_rar']);
5487     $val['date_retour_rar'] = $this->dateDBToForm($val['date_retour_rar']);
5488     $val['date_envoi_controle_legalite'] = $this->dateDBToForm($val['date_envoi_controle_legalite']);
5489     $val['date_retour_controle_legalite'] = $this->dateDBToForm($val['date_retour_controle_legalite']);
5490     $val['archive_date_cloture_instruction'] = $this->dateDBToForm($val['archive_date_cloture_instruction']);
5491     $val['archive_date_premiere_visite'] = $this->dateDBToForm($val['archive_date_premiere_visite']);
5492     $val['archive_date_derniere_visite'] = $this->dateDBToForm($val['archive_date_derniere_visite']);
5493     $val['archive_date_contradictoire'] = $this->dateDBToForm($val['archive_date_contradictoire']);
5494     $val['archive_date_retour_contradictoire'] = $this->dateDBToForm($val['archive_date_retour_contradictoire']);
5495     $val['archive_date_ait'] = $this->dateDBToForm($val['archive_date_ait']);
5496     $val['archive_date_transmission_parquet'] = $this->dateDBToForm($val['archive_date_transmission_parquet']);
5497 softime 8989 $val['archive_date_affichage'] = $this->dateDBToForm($val['archive_date_affichage']);
5498 mbroquet 3730 $this->setvalF($val);
5499    
5500     // Verification de la validite des donnees
5501 softime 8989 $this->verifier($this->val);
5502 mbroquet 3730 // Si les verifications precedentes sont correctes, on procede a
5503     // la modification, sinon on ne fait rien et on retourne une erreur
5504 softime 5024 if ($this->correct === true) {
5505 mbroquet 3730 //
5506     $valF = array(
5507     "om_fichier_instruction" => $uid,
5508     "date_finalisation_courrier" => date('Y-m-d')
5509     );
5510     //
5511     if($mode=="finalize") {
5512     // état finalisé vrai
5513 softime 5024 $valF["om_final_instruction"] = true;
5514 mbroquet 3730 // ajout log utilisateur
5515     $login = $_SESSION['login'];
5516     $nom = "";
5517     $this->f->getUserInfos();
5518     if (isset($this->f->om_utilisateur["nom"])
5519     && !empty($this->f->om_utilisateur["nom"])) {
5520     $nom = $this->f->om_utilisateur["nom"];
5521     }
5522     $valF["om_final_instruction_utilisateur"] = $_SESSION['login'];
5523     if ($nom != "") {
5524     $valF["om_final_instruction_utilisateur"] .= " (".$nom.")";
5525     }
5526     } else {
5527     // état finalisé faux
5528 softime 5024 $valF["om_final_instruction"] = false;
5529 mbroquet 3730 // suppression log utilisateur
5530     $valF["om_final_instruction_utilisateur"] = '';
5531     }
5532    
5533     // Execution de la requête de modification des donnees de l'attribut
5534     // valF de l'objet dans l'attribut table de l'objet
5535 softime 8989 $res = $this->f->db->autoExecute(DB_PREFIXE.$this->table, $valF,
5536 softime 5024 DB_AUTOQUERY_UPDATE, $this->getCle($id_inst));
5537     $this->addToLog(__METHOD__."() : db->autoExecute(\"".DB_PREFIXE.$this->table."\", ".print_r($valF, true).", DB_AUTOQUERY_UPDATE, \"".$this->getCle($id_inst)."\")", VERBOSE_MODE);
5538     //
5539     if ($this->f->isDatabaseError($res, true) === true) {
5540     $this->correct = false;
5541     $this->addToMessage($bdd_msg_error);
5542     return $this->end_treatment(__METHOD__, false);
5543     }
5544 mbroquet 3730
5545 softime 5024 //
5546     $this->addToMessage(sprintf(_("La %s du document s'est effectuee avec succes."), $etat));
5547     //
5548     if ($this->add_log_to_dossier($id_inst, $val) === false) {
5549     return $this->end_treatment(__METHOD__, false);
5550     }
5551     //
5552     return $this->end_treatment(__METHOD__, true);
5553 mbroquet 3730 }
5554 softime 5024 // L'appel de verifier() a déjà positionné correct à false
5555     // et défini un message d'erreur.
5556 softime 8989 $this->addToLog(sprintf($log_msg_error, $id_inst, $uid), DEBUG_MODE);
5557 softime 5024 return $this->end_treatment(__METHOD__, false);
5558 mbroquet 3730 }
5559    
5560     /**
5561     * Récupération du numéro de dossier d'instruction à ajouter aux métadonnées
5562     * @return string numéro de dossier d'instruction
5563     */
5564 softime 10573 protected function getDossier($champ = null) {
5565 mbroquet 3730 if(empty($this->specificMetadata)) {
5566     $this->getSpecificMetadata();
5567     }
5568     return $this->specificMetadata->dossier;
5569     }
5570     /**
5571     * Récupération la version du dossier d'instruction à ajouter aux métadonnées
5572     * @return int Version
5573     */
5574     protected function getDossierVersion() {
5575     if(empty($this->specificMetadata)) {
5576     $this->getSpecificMetadata();
5577     }
5578     return $this->specificMetadata->version;
5579     }
5580     /**
5581     * Récupération du numéro de dossier d'autorisation à ajouter aux métadonnées
5582     * @return string numéro de dossier d'autorisation
5583     */
5584     protected function getNumDemandeAutor() {
5585     if(empty($this->specificMetadata)) {
5586     $this->getSpecificMetadata();
5587     }
5588     return $this->specificMetadata->dossier_autorisation;
5589     }
5590     /**
5591     * Récupération de la date de demande initiale du dossier à ajouter aux métadonnées
5592     * @return date de la demande initiale
5593     */
5594     protected function getAnneemoisDemandeAutor() {
5595     if(empty($this->specificMetadata)) {
5596     $this->getSpecificMetadata();
5597     }
5598     return $this->specificMetadata->date_demande_initiale;
5599     }
5600     /**
5601     * Récupération du type de dossier d'instruction à ajouter aux métadonnées
5602     * @return string type du dossier d'instruction
5603     */
5604     protected function getTypeInstruction() {
5605     if(empty($this->specificMetadata)) {
5606     $this->getSpecificMetadata();
5607     }
5608     return $this->specificMetadata->dossier_instruction_type;
5609     }
5610     /**
5611     * Récupération du statut du dossier d'autorisation à ajouter aux métadonnées
5612     * @return string avis
5613     */
5614     protected function getStatutAutorisation() {
5615     if(empty($this->specificMetadata)) {
5616     $this->getSpecificMetadata();
5617     }
5618     return $this->specificMetadata->statut;
5619     }
5620     /**
5621     * Récupération du type de dossier d'autorisation à ajouter aux métadonnées
5622     * @return string type du dossier d'autorisation
5623     */
5624     protected function getTypeAutorisation() {
5625     if(empty($this->specificMetadata)) {
5626     $this->getSpecificMetadata();
5627     }
5628     return $this->specificMetadata->dossier_autorisation_type;
5629     }
5630     /**
5631     * Récupération de la date d'ajout de document à ajouter aux métadonnées
5632     * @return date de l'évènement
5633     */
5634     protected function getDateEvenementDocument() {
5635     return date("Y-m-d");
5636     }
5637     /**
5638     * Récupération du groupe d'instruction à ajouter aux métadonnées
5639     * @return string Groupe d'instruction
5640     */
5641     protected function getGroupeInstruction() {
5642     if(empty($this->specificMetadata)) {
5643     $this->getSpecificMetadata();
5644     }
5645     return $this->specificMetadata->groupe_instruction;
5646     }
5647     /**
5648     * Récupération du libellé du type du document à ajouter aux métadonnées
5649     * @return string Groupe d'instruction
5650     */
5651     protected function getTitle() {
5652    
5653     // Récupère le champ événement
5654     if (isset($this->valF["evenement"]) AND $this->valF["evenement"] != "") {
5655     $evenement = $this->valF["evenement"];
5656     } else {
5657     $evenement = $this->getVal("evenement");
5658     }
5659    
5660     // Requête sql
5661 softime 14064 $evenement = $this->f->get_inst__om_dbform(array(
5662     "obj" => "evenement",
5663     "idx" => $evenement
5664     ));
5665    
5666 mbroquet 3730 // Retourne le libelle de l'événement
5667 softime 14064 return $evenement->getVal('libelle');
5668 mbroquet 3730 }
5669    
5670 softime 6272
5671 mbroquet 3730 /**
5672 softime 6272 * Récupération du champ ERP du dossier d'instruction.
5673     *
5674     * @return boolean
5675     */
5676     public function get_concerne_erp() {
5677     //
5678     if(empty($this->specificMetadata)) {
5679     $this->getSpecificMetadata();
5680     }
5681     //
5682     return $this->specificMetadata->erp;
5683     }
5684    
5685    
5686     /**
5687 mbroquet 3730 * Cette méthode permet de stocker en attribut toutes les métadonnées
5688     * nécessaire à l'ajout d'un document.
5689     */
5690     public function getSpecificMetadata() {
5691     if (isset($this->valF["dossier"]) AND $this->valF["dossier"] != "") {
5692     $dossier = $this->valF["dossier"];
5693     } else {
5694     $dossier = $this->getVal("dossier");
5695     }
5696     //Requête pour récupérer les informations essentiels sur le dossier d'instruction
5697 softime 14542 $qres = $this->f->get_all_results_from_db_query(
5698     sprintf(
5699     'SELECT
5700     dossier.dossier AS dossier,
5701     dossier_autorisation.dossier_autorisation AS dossier_autorisation,
5702     to_char(dossier.date_demande, \'YYYY/MM\') AS date_demande_initiale,
5703     dossier_instruction_type.code AS dossier_instruction_type,
5704     etat_dossier_autorisation.libelle AS statut,
5705     dossier_autorisation_type.code AS dossier_autorisation_type,
5706     groupe.code AS groupe_instruction,
5707     CASE WHEN dossier.erp IS TRUE
5708     THEN \'true\'
5709     ELSE \'false\'
5710     END AS erp
5711     FROM
5712     %1$sdossier
5713     LEFT JOIN %1$sdossier_instruction_type
5714 mbroquet 3730 ON dossier.dossier_instruction_type = dossier_instruction_type.dossier_instruction_type
5715 softime 14542 LEFT JOIN %1$sdossier_autorisation
5716 mbroquet 3730 ON dossier.dossier_autorisation = dossier_autorisation.dossier_autorisation
5717 softime 14542 LEFT JOIN %1$setat_dossier_autorisation
5718 mbroquet 3730 ON dossier_autorisation.etat_dossier_autorisation = etat_dossier_autorisation.etat_dossier_autorisation
5719 softime 14542 LEFT JOIN %1$sdossier_autorisation_type_detaille
5720 mbroquet 3730 ON dossier_autorisation.dossier_autorisation_type_detaille = dossier_autorisation_type_detaille.dossier_autorisation_type_detaille
5721 softime 14542 LEFT JOIN %1$sdossier_autorisation_type
5722 mbroquet 3730 ON dossier_autorisation_type_detaille.dossier_autorisation_type = dossier_autorisation_type.dossier_autorisation_type
5723 softime 14542 LEFT JOIN %1$sgroupe
5724 mbroquet 3730 ON dossier_autorisation_type.groupe = groupe.groupe
5725 softime 14542 WHERE
5726     dossier.dossier = \'%2$s\'',
5727     DB_PREFIXE,
5728     $this->f->db->escapeSimple($dossier)
5729     ),
5730     array(
5731     "origin" => __METHOD__,
5732     )
5733     );
5734     $row = array_shift($qres['result']);
5735 mbroquet 3730
5736     //Si il y a un résultat
5737 softime 14542 if (! empty($row)) {
5738 mbroquet 3730
5739 fmichon 3892 // Instrance de la classe dossier
5740     $inst_dossier = $this->get_inst_dossier($dossier);
5741 softime 14542 // TODO : améliorer ce code
5742     //
5743     // Avant l e résultat été récupéré dans un objet à partir de la requête mais en modifiant pour
5744     // utiliser la méthode get_all_results_from_db_query() c'est maintenant un tableau
5745     // qu'on obtiens. Pour garder le même fonctionnement on transforme le tableau des
5746     // valeurs issues de la requête en objet.
5747     $metadata = (object)$row;
5748 fmichon 3892 // Insère l'attribut version à l'objet
5749 softime 14542 $metadata->version = $inst_dossier->get_di_numero_suffixe();
5750 fmichon 3892
5751 mbroquet 3730 //Alors on créé l'objet dossier_instruction
5752 softime 14542 $this->specificMetadata = $metadata;
5753 mbroquet 3730
5754     }
5755     }
5756    
5757     /**
5758     * Retourne le statut du dossier d'instruction
5759     * @param string $idx Identifiant du dossier d'instruction
5760     * @return string Le statut du dossier d'instruction
5761     */
5762     function getStatutAutorisationDossier($idx){
5763    
5764     $statut = '';
5765    
5766     //Si l'identifiant du dossier d'instruction fourni est correct
5767     if ( $idx != '' ){
5768    
5769     //On récupère le statut de l'état du dossier à partir de l'identifiant du
5770     //dossier
5771 softime 14064 $qres = $this->f->get_one_result_from_db_query(
5772     sprintf(
5773     'SELECT
5774     etat.statut
5775     FROM
5776     %1$sdossier
5777     LEFT JOIN
5778     %1$setat
5779     ON
5780     dossier.etat = etat.etat
5781     WHERE
5782     dossier = \'%2$s\'',
5783     DB_PREFIXE,
5784     $this->f->db->escapeSimple($idx)
5785     ),
5786     array(
5787     "origin" => __METHOD__,
5788     )
5789     );
5790 mbroquet 3730 }
5791 softime 14064
5792     return $qres['result'];
5793 mbroquet 3730 }
5794    
5795     /**
5796     * Récupère les données du dossier
5797     * @return array
5798     */
5799     function get_dossier_actual() {
5800    
5801     // Initialisation de la valeur de retour
5802     $return = array();
5803    
5804     // Récupération de toutes les valeurs du dossier d'instruction en cours
5805 softime 14542 // TODO : remplacer cette requête par une instanciation de l'objet
5806     $qres = $this->f->get_all_results_from_db_query(
5807     sprintf(
5808     'SELECT
5809     *
5810     FROM
5811     %1$sdossier
5812     WHERE
5813     dossier = \'%2$s\'',
5814     DB_PREFIXE,
5815     $this->f->db->escapeSimple($this->valF['dossier'])
5816     ),
5817     array(
5818     'origin' => __METHOD__
5819     )
5820     );
5821 mbroquet 3730
5822 softime 14542 foreach ($qres['result'] as $row) {
5823 mbroquet 3730
5824     // Récupération de la valeur actuelle du délai, de l'accord tacite,
5825     // de l'état et de l'avis du dossier d'instruction
5826 softime 6565 $return['archive_delai'] = $row['delai'];
5827     $return['archive_accord_tacite'] = $row['accord_tacite'];
5828     $return['archive_etat'] = $row['etat'];
5829     $return['archive_avis'] = $row['avis_decision'];
5830     // Récupération de la valeur actuelle des dates du dossier
5831 mbroquet 3730 // d'instruction
5832 softime 6565 $return['archive_date_complet'] = $row['date_complet'];
5833     $return['archive_date_dernier_depot'] = $row['date_dernier_depot'];
5834     $return['archive_date_rejet'] = $row['date_rejet'];
5835     $return['archive_date_limite'] = $row['date_limite'];
5836     $return['archive_date_notification_delai'] = $row['date_notification_delai'];
5837     $return['archive_date_decision'] = $row['date_decision'];
5838     $return['archive_date_validite'] = $row['date_validite'];
5839     $return['archive_date_achevement'] = $row['date_achevement'];
5840     $return['archive_date_chantier'] = $row['date_chantier'];
5841     $return['archive_date_conformite'] = $row['date_conformite'];
5842     $return['archive_incompletude'] = $row['incompletude'];
5843     $return['archive_incomplet_notifie'] = $row['incomplet_notifie'];
5844     $return['archive_evenement_suivant_tacite'] = $row['evenement_suivant_tacite'];
5845     $return['archive_evenement_suivant_tacite_incompletude'] = $row['evenement_suivant_tacite_incompletude'];
5846     $return['archive_etat_pendant_incompletude'] = $row['etat_pendant_incompletude'];
5847     $return['archive_date_limite_incompletude'] = $row['date_limite_incompletude'];
5848     $return['archive_delai_incompletude'] = $row['delai_incompletude'];
5849     $return['archive_autorite_competente'] = $row['autorite_competente'];
5850 softime 8593 $return['archive_dossier_instruction_type'] = $row['dossier_instruction_type'];
5851 softime 6565 $return['duree_validite'] = $row['duree_validite'];
5852     $return['date_depot'] = $row['date_depot'];
5853 softime 10573 $return['date_depot_mairie'] = $row['date_depot_mairie'];
5854 softime 6565 $return['archive_date_cloture_instruction'] = $row['date_cloture_instruction'];
5855     $return['archive_date_premiere_visite'] = $row['date_premiere_visite'];
5856     $return['archive_date_derniere_visite'] = $row['date_derniere_visite'];
5857     $return['archive_date_contradictoire'] = $row['date_contradictoire'];
5858     $return['archive_date_retour_contradictoire'] = $row['date_retour_contradictoire'];
5859     $return['archive_date_ait'] = $row['date_ait'];
5860     $return['archive_date_transmission_parquet'] = $row['date_transmission_parquet'];
5861 softime 8989 $return['archive_date_affichage'] = $row['date_affichage'];
5862 softime 10573 $return['archive_pec_metier'] = $row['pec_metier'];
5863     $return['archive_a_qualifier'] = $row['a_qualifier'];
5864 mbroquet 3730 }
5865    
5866     // Retour de la fonction
5867     return $return;
5868    
5869     }
5870    
5871     /**
5872     * Permet de vérifier qu'un événement est verrouillable
5873     * @param integer $idx Identifiant de l'instruction
5874     * @return boolean
5875     */
5876     function checkEvenementNonVerrouillable($idx) {
5877     // Si la condition n'est pas vide
5878     if ($idx != "") {
5879    
5880     // Requête SQL
5881 softime 14064 $qres = $this->f->get_one_result_from_db_query(
5882     sprintf(
5883     'SELECT
5884     evenement.non_verrouillable
5885     FROM
5886     %1$sevenement
5887     LEFT JOIN %1$sinstruction
5888     ON instruction.evenement = evenement.evenement
5889     WHERE
5890     instruction.instruction = \'%2$s\'',
5891     DB_PREFIXE,
5892     intval($idx)
5893     ),
5894     array(
5895     "origin" => __METHOD__,
5896     )
5897     );
5898 mbroquet 3730 }
5899    
5900 softime 14064 // Si on a un résultat et que ce résultat indique que l'événement n'est
5901     // pas vérrouillable renvoie true, sinon renvoie false
5902     return isset($qres) && isset($qres['result']) && $qres['result'] == 't';
5903 mbroquet 3730 }
5904    
5905     /**
5906     * Mise à jour des champs archive_*
5907     * @param mixed $row La ligne de données
5908     */
5909     public function updateArchiveData($row){
5910    
5911     // Récupération de la valeur actuelle du délai, de l'accord tacite,
5912     // de l'état et de l'avis du dossier d'instruction
5913     $this->valF['archive_delai']=$row['delai'];
5914     $this->valF['archive_accord_tacite']=$row['accord_tacite'];
5915     $this->valF['archive_etat']=$row['etat'];
5916     $this->valF['archive_avis']=$row['avis_decision'];
5917     // Récupération de la valeur actuelle des 9 dates du dossier
5918     // d'instruction
5919     if ($row['date_complet'] != '') {
5920     $this->valF['archive_date_complet']=$row['date_complet'];
5921     }
5922     if ($row['date_dernier_depot'] != '') {
5923     $this->valF['archive_date_dernier_depot']=$row['date_dernier_depot'];
5924     }
5925 softime 6565 if ($row['date_rejet'] != '') {
5926 mbroquet 3730 $this->valF['archive_date_rejet']= $row['date_rejet'];
5927     }
5928 softime 6565 if ($row['date_limite'] != '') {
5929 mbroquet 3730 $this->valF['archive_date_limite']= $row['date_limite'];
5930     }
5931 softime 6565 if ($row['date_notification_delai'] != '') {
5932 mbroquet 3730 $this->valF['archive_date_notification_delai']= $row['date_notification_delai'];
5933     }
5934 softime 6565 if ($row['date_decision'] != '') {
5935 mbroquet 3730 $this->valF['archive_date_decision']= $row['date_decision'];
5936     }
5937 softime 6565 if ($row['date_validite'] != '') {
5938 mbroquet 3730 $this->valF['archive_date_validite']= $row['date_validite'];
5939     }
5940 softime 6565 if ($row['date_achevement'] != '') {
5941 mbroquet 3730 $this->valF['archive_date_achevement']= $row['date_achevement'];
5942     }
5943 softime 6565 if ($row['date_chantier'] != '') {
5944 mbroquet 3730 $this->valF['archive_date_chantier']= $row['date_chantier'];
5945     }
5946 softime 6565 if ($row['date_conformite'] != '') {
5947 mbroquet 3730 $this->valF['archive_date_conformite']= $row['date_conformite'];
5948     }
5949 softime 6565 if ($row['incompletude'] != '') {
5950 mbroquet 3730 $this->valF['archive_incompletude']= $row['incompletude'];
5951     }
5952 softime 6565 if ($row['incomplet_notifie'] != '') {
5953 mbroquet 3730 $this->valF['archive_incomplet_notifie']= $row['incomplet_notifie'];
5954     }
5955 softime 6565 if ($row['evenement_suivant_tacite'] != '') {
5956 mbroquet 3730 $this->valF['archive_evenement_suivant_tacite']= $row['evenement_suivant_tacite'];
5957     }
5958 softime 6565 if ($row['evenement_suivant_tacite_incompletude'] != '') {
5959 mbroquet 3730 $this->valF['archive_evenement_suivant_tacite_incompletude']= $row['evenement_suivant_tacite_incompletude'];
5960     }
5961 softime 6565 if ($row['etat_pendant_incompletude'] != '') {
5962 mbroquet 3730 $this->valF['archive_etat_pendant_incompletude']= $row['etat_pendant_incompletude'];
5963     }
5964 softime 6565 if ($row['date_limite_incompletude'] != '') {
5965 mbroquet 3730 $this->valF['archive_date_limite_incompletude']= $row['date_limite_incompletude'];
5966     }
5967 softime 6565 if ($row['delai_incompletude'] != '') {
5968 mbroquet 3730 $this->valF['archive_delai_incompletude']= $row['delai_incompletude'];
5969     }
5970 softime 6565 if ($row['autorite_competente'] != '') {
5971 mbroquet 3730 $this->valF['archive_autorite_competente']= $row['autorite_competente'];
5972     }
5973 softime 6565 if ($row['duree_validite'] != '') {
5974 mbroquet 3730 $this->valF['duree_validite']= $row['duree_validite'];
5975     }
5976 softime 6565 if ($row['date_depot'] != '') {
5977 nmeucci 3873 $this->valF['date_depot']= $row['date_depot'];
5978     }
5979 softime 10573 if ($row['date_depot_mairie'] != '') {
5980     $this->valF['date_depot_mairie']= $row['date_depot_mairie'];
5981     }
5982 softime 6565 // Dates concernant les dossiers contentieux
5983     if ($row['date_cloture_instruction'] != '') {
5984     $this->valF['archive_date_cloture_instruction']= $row['date_cloture_instruction'];
5985     }
5986     if ($row['date_premiere_visite'] != '') {
5987     $this->valF['archive_date_premiere_visite']= $row['date_premiere_visite'];
5988     }
5989     if ($row['date_derniere_visite'] != '') {
5990     $this->valF['archive_date_derniere_visite']= $row['date_derniere_visite'];
5991     }
5992     if ($row['date_contradictoire'] != '') {
5993     $this->valF['archive_date_contradictoire']= $row['date_contradictoire'];
5994     }
5995     if ($row['date_retour_contradictoire'] != '') {
5996     $this->valF['archive_date_retour_contradictoire']= $row['date_retour_contradictoire'];
5997     }
5998     if ($row['date_ait'] != '') {
5999     $this->valF['archive_date_ait']= $row['date_ait'];
6000     }
6001     if ($row['date_transmission_parquet'] != '') {
6002     $this->valF['archive_date_transmission_parquet']= $row['date_transmission_parquet'];
6003     }
6004 softime 8989 //
6005 softime 8593 if ($row['dossier_instruction_type'] != '') {
6006     $this->valF['archive_dossier_instruction_type']= $row['dossier_instruction_type'];
6007     }
6008 softime 8989 if ($row['date_affichage'] != '') {
6009     $this->valF['archive_date_affichage']= $row['date_affichage'];
6010     }
6011 softime 10573 if (isset($row['pec_metier']) === true && $row['pec_metier'] != '') {
6012     $this->valF['archive_pec_metier']= $row['pec_metier'];
6013     }
6014     if (isset($row['a_qualifier']) === true && $row['a_qualifier'] != '') {
6015     $this->valF['archive_a_qualifier']= $row['a_qualifier'];
6016     }
6017 mbroquet 3730 }
6018    
6019     // {{{
6020     // Méthodes de récupération des métadonnées arrêté
6021     /**
6022     * @return string Retourne le numéro d'arrêté
6023     */
6024     function getNumArrete() {
6025     return $this->getVal("numero_arrete");
6026     }
6027     /**
6028     * @return chaîne vide
6029     */
6030     function getReglementaireArrete() {
6031     return 'true';
6032     }
6033     /**
6034     * @return boolean de notification au pétitionnaire
6035     */
6036     function getNotificationArrete() {
6037     return 'true';
6038     }
6039     /**
6040     * @return date de notification au pétitionnaire
6041     */
6042     function getDateNotificationArrete() {
6043     if (empty($this->metadonneesArrete)) {
6044     $this->getArreteMetadata();
6045     }
6046     return $this->metadonneesArrete["datenotification"];
6047     }
6048     /**
6049     * @return boolean check si le document est passé au contrôle de légalité
6050     */
6051     function getControleLegalite() {
6052     return 'true';
6053     }
6054     /**
6055     * @return date de signature de l'arrêté
6056     */
6057     function getDateSignature() {
6058     if (empty($this->metadonneesArrete)) {
6059     $this->getArreteMetadata();
6060     }
6061     return $this->metadonneesArrete["datesignaturearrete"];
6062     }
6063     /**
6064     * @return string nom du signataire
6065     */
6066     function getNomSignataire() {
6067     if (empty($this->metadonneesArrete)) {
6068     $this->getArreteMetadata();
6069     }
6070     return $this->metadonneesArrete["nomsignataire"];
6071     }
6072     /**
6073     * @return string qualité du signataire
6074     */
6075     function getQualiteSignataire() {
6076     if (empty($this->metadonneesArrete)) {
6077     $this->getArreteMetadata();
6078     }
6079     return $this->metadonneesArrete["qualitesignataire"];
6080     }
6081     /**
6082     * @return string numéro du terrain
6083     */
6084     function getAp_numRue() {
6085     if (empty($this->metadonneesArrete)) {
6086     $this->getArreteMetadata();
6087     }
6088     return $this->metadonneesArrete["ap_numrue"];
6089     }
6090     /**
6091     * @return string nom de la rue du terrain
6092     */
6093     function getAp_nomDeLaVoie() {
6094     if (empty($this->metadonneesArrete)) {
6095     $this->getArreteMetadata();
6096     }
6097     return $this->metadonneesArrete["ap_nomdelavoie"];
6098     }
6099     /**
6100     * @return string code postal du terrain
6101     */
6102     function getAp_codePostal() {
6103     if (empty($this->metadonneesArrete)) {
6104     $this->getArreteMetadata();
6105     }
6106     return $this->metadonneesArrete["ap_codepostal"];
6107     }
6108     /**
6109     * @return string ville du terrain
6110     */
6111     function getAp_ville() {
6112     if (empty($this->metadonneesArrete)) {
6113     $this->getArreteMetadata();
6114     }
6115     return $this->metadonneesArrete["ap_ville"];
6116     }
6117     /**
6118     * @return string activité
6119     */
6120     function getActivite() {
6121     return "Droit du sol";
6122     }
6123     /**
6124     * @return string date du retour de controle légalité
6125     */
6126     function getDateControleLegalite() {
6127     if (empty($this->metadonneesArrete)) {
6128     $this->getArreteMetadata();
6129     }
6130     return $this->metadonneesArrete["datecontrolelegalite"];
6131     }
6132    
6133     // Fin des méthodes de récupération des métadonnées
6134     // }}}
6135    
6136     /**
6137     * Méthode de récupération des métadonnées arrêtés dans la base de données,
6138     * les données sont stockés dans l'attribut $this->metadonneesArrete
6139     */
6140     function getArreteMetadata() {
6141    
6142 softime 14542 //Récupération de la dernière instruction dont l'événement est de type 'arrete'
6143     $this->metadonneesArrete = array("nomsignataire"=>"", "qualitesignataire"=>"",
6144     "decisionarrete"=>"", "datenotification"=>"", "datesignaturearrete"=>"",
6145     "datecontrolelegalite"=>"", "ap_numrue"=>"", "ap_nomdelavoie"=>"",
6146     "ap_codepostal"=>"", "ap_ville"=>"");
6147 mbroquet 3730
6148 softime 14542 $qres = $this->f->get_all_results_from_db_query(
6149     sprintf(
6150     'SELECT
6151     signataire_arrete.prenom || \' \' ||signataire_arrete.nom as nomsignataire,
6152     signataire_arrete.qualite as qualitesignataire,
6153     instruction.etat as decisionarrete,
6154     instruction.date_retour_rar as datenotification,
6155     instruction.date_retour_signature as datesignaturearrete,
6156     instruction.date_retour_controle_legalite as datecontrolelegalite,
6157     dossier.terrain_adresse_voie_numero as ap_numrue,
6158     dossier.terrain_adresse_voie as ap_nomdelavoie,
6159     dossier.terrain_adresse_code_postal as ap_codepostal,
6160     dossier.terrain_adresse_localite as ap_ville
6161     FROM
6162     %1$sinstruction
6163     LEFT JOIN %1$ssignataire_arrete
6164     ON instruction.signataire_arrete = signataire_arrete.signataire_arrete
6165     LEFT JOIN %1$sdossier
6166     ON instruction.dossier = dossier.dossier
6167     LEFT JOIN %1$sdonnees_techniques
6168     ON donnees_techniques.dossier_instruction = dossier.dossier
6169     WHERE
6170     instruction.instruction = %2$d',
6171     DB_PREFIXE,
6172     intval($this->getVal('instruction'))
6173     ),
6174     array(
6175     'origin' => __METHOD__
6176     )
6177     );
6178     $this->metadonneesArrete = array_shift($qres['result']);
6179 mbroquet 3730 }
6180    
6181     /**
6182     * CONDITION - has_an_edition.
6183     *
6184     * Condition pour afficher le bouton de visualisation de l'édition.
6185     *
6186     * @return boolean
6187     */
6188     function has_an_edition() {
6189     // Récupère la valeur du champ lettretype
6190     $lettretype = $this->getVal("lettretype");
6191     // Si le champ est vide
6192 softime 7521 if ($lettretype !== '' && $lettretype !== null) {
6193 mbroquet 3730 //
6194 softime 7521 return true;
6195 mbroquet 3730 }
6196    
6197     //
6198 softime 7521 return false;
6199 mbroquet 3730 }
6200    
6201     /**
6202 softime 10573 * CONDITION - is_modifiable.
6203     *
6204     * Controle si l'évenement est modifiable.
6205     *
6206     * @return boolean
6207     */
6208     function is_evenement_modifiable() {
6209     $evenement = $this->get_inst_evenement($this->getVal('evenement'));
6210     return ! $this->get_boolean_from_pgsql_value($evenement->getVal('non_modifiable'));
6211     }
6212    
6213     /**
6214 mbroquet 3730 * CONDITION - is_editable.
6215     *
6216     * Condition pour la modification.
6217     *
6218     * @return boolean
6219     */
6220     function is_editable() {
6221 softime 10573
6222     // XXX
6223     // 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é)
6224     // Si cette tâche identifiée est DONE alors la suppression/modification de cette intruction est impossible
6225    
6226 mbroquet 3730 // Contrôle si l'utilisateur possède un bypass
6227 softime 7996 $bypass = $this->f->isAccredited($this->get_absolute_class_name()."_modifier_bypass");
6228 mbroquet 3730 //
6229     if ($bypass == true) {
6230     //
6231     return true;
6232     }
6233 softime 6565
6234 mbroquet 3730 // Si l'utilisateur est un instructeur, que le dossier est cloturé et
6235     // que l'événement n'est pas identifié comme non verrouillable
6236     if ($this->f->isUserInstructeur()
6237     && $this->getStatutAutorisationDossier($this->getParameter("idxformulaire")) == "cloture"
6238     && $this->checkEvenementNonVerrouillable($this->getVal("instruction")) === false) {
6239     //
6240     return false;
6241     }
6242    
6243 softime 6565 // Si l'utilisateur est un intructeur qui correspond à la division du
6244     // dossier
6245     if ($this->is_instructeur_from_division_dossier() === true) {
6246     //
6247     return true;
6248     }
6249    
6250     // Si l'utilisateur est instructeur de la commune du dossier et que
6251     // l'instruction est créée par un instructeur de la commune
6252     if ($this->is_instructeur_from_collectivite_dossier() === true and
6253     $this->getVal('created_by_commune') === 't') {
6254     return true;
6255     }
6256    
6257 mbroquet 3730 //
6258 softime 6565 return false;
6259 mbroquet 3730 }
6260    
6261     /**
6262 softime 10573 * Vérifie si l'événement est supprimable ou pas.
6263     *
6264     * @return boolean
6265     */
6266     function is_evenement_supprimable() {
6267     // Controle si l'évenement est supprimable
6268     $evenement = $this->get_inst_evenement($this->getVal('evenement'));
6269     return ! $this->get_boolean_from_pgsql_value($evenement->getVal('non_supprimable'));
6270     }
6271    
6272     /**
6273 mbroquet 3730 * CONDITION - is_deletable.
6274     *
6275 softime 6864 * Condition pour la suppression.
6276 mbroquet 3730 *
6277     * @return boolean
6278     */
6279     function is_deletable() {
6280 softime 10573
6281     // XXX
6282     // 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é)
6283     // Si cette tâche identifiée est DONE alors la suppression/modification de cette intruction est impossible
6284    
6285 softime 6864 // Contrôle si l'utilisateur possède un bypass intégral
6286 softime 7996 $bypass = $this->f->isAccredited($this->get_absolute_class_name()."_supprimer_bypass");
6287 mbroquet 3730 //
6288     if ($bypass == true) {
6289    
6290     //
6291     return true;
6292     }
6293    
6294     // Si l'utilisateur est un intructeur qui ne correspond pas à la
6295 softime 6864 // division du dossier et si l'utilisateur n'a pas la permission bypass
6296     // de la division
6297     if ($this->is_instructeur_from_division_dossier() === false
6298 softime 7996 && $this->f->isAccredited($this->get_absolute_class_name()."_supprimer_bypass_division") === false) {
6299 mbroquet 3730
6300     //
6301     return false;
6302     }
6303 softime 5024
6304     // l'événement est-il le dernier ?
6305     $dernier_evenement = false;
6306     // instanciation dossier
6307 softime 7996 $dossier = $this->f->get_inst__om_dbform(array(
6308     "obj" => "dossier",
6309     "idx" => $this->getVal('dossier'),
6310     ));
6311 softime 5024 // récupération dernier événement
6312     $id_dernier_evenement = $dossier->get_dernier_evenement();
6313     if ($id_dernier_evenement == $this->getVal($this->clePrimaire)) {
6314     $dernier_evenement = true;
6315     }
6316 mbroquet 3730
6317 softime 5024 // Si dossier cloturé ou si pas dernier événement
6318     // ou de type retour ou si une date est renseignée
6319     // ET utilisateur non administrateur
6320     if ($this->getStatutAutorisationDossier($this->getVal('dossier')) == 'cloture'
6321     || $dernier_evenement == false
6322     || $this->is_evenement_retour($this->getVal("evenement")) == true
6323     || $this->getVal('date_envoi_signature') != ''
6324     || $this->getVal('date_retour_signature') != ''
6325     || $this->getVal('date_envoi_rar') != ''
6326     || $this->getVal('date_retour_rar') != ''
6327     || $this->getVal('date_envoi_controle_legalite') != ''
6328     || $this->getVal('date_retour_controle_legalite') != '') {
6329     // pas le droit de supprimer
6330     return false;;
6331     }
6332    
6333 mbroquet 3730 //
6334     return true;
6335     }
6336 softime 6565
6337    
6338 mbroquet 3730 /**
6339 softime 6565 * Vérifie que l'utilisateur est instructeur et qu'il est de la division du
6340     * dossier.
6341     *
6342     * @return, boolean true/false
6343     */
6344     function is_instructeur_from_collectivite_dossier() {
6345     if ($this->f->isUserInstructeur() === true and
6346     $this->f->om_utilisateur["om_collectivite"] == $this->get_dossier_instruction_om_collectivite()) {
6347     return true;
6348     }
6349     return false;
6350     }
6351    
6352     /**
6353 mbroquet 3730 * CONDITION - is_addable.
6354     *
6355     * Condition pour afficher les boutons modifier et supprimer.
6356     *
6357     * @return boolean
6358     */
6359     function is_addable() {
6360     // Contrôle si l'utilisateur possède un bypass
6361 softime 7996 $bypass = $this->f->isAccredited($this->get_absolute_class_name()."_ajouter_bypass");
6362 mbroquet 3730 //
6363     if ($bypass == true) {
6364    
6365     //
6366     return true;
6367     }
6368 softime 6565 // Si l'utilisateur est un intructeur qui correspond à la
6369     // division du dossier ou qu'il peut changer la décision
6370     if ($this->is_instructeur_from_division_dossier() === true or
6371     $this->isInstrCanChangeDecision($this->getParameter('idxformulaire')) === true) {
6372 mbroquet 3730 //
6373 softime 6565 return true;
6374 mbroquet 3730 }
6375    
6376     //
6377 softime 6565 return false;
6378 mbroquet 3730 }
6379    
6380     /**
6381     * CONDITION - is_finalizable.
6382     *
6383     * Condition pour afficher le bouton.
6384     *
6385     * @return boolean
6386     */
6387     function is_finalizable() {
6388     // Contrôle si l'utilisateur possède un bypass
6389 softime 7996 $bypass = $this->f->isAccredited($this->get_absolute_class_name()."_finaliser_bypass");
6390 mbroquet 3730 //
6391     if ($bypass == true) {
6392     //
6393     return true;
6394     }
6395 softime 6565
6396 mbroquet 3730 // Si l'utilisateur est un instructeur, que le dossier est cloturé et
6397     // que l'événement n'est pas identifié comme non verrouillable
6398     if ($this->f->isUserInstructeur()
6399     && $this->getStatutAutorisationDossier($this->getParameter("idxformulaire")) == "cloture"
6400     && $this->checkEvenementNonVerrouillable($this->getVal("instruction")) === false) {
6401     //
6402     return false;
6403     }
6404 softime 6565
6405     // Si l'utilisateur est un intructeur qui correspond à la division du
6406     // dossier
6407     if ($this->is_instructeur_from_division_dossier() === true) {
6408     //
6409     return true;
6410     }
6411 mbroquet 3730
6412 softime 6565 // Si l'utilisateur est instructeur de la commune du dossier et que
6413     // l'instruction est créée par un instructeur de la commune
6414     if ($this->is_instructeur_from_collectivite_dossier() === true and
6415     $this->getVal('created_by_commune') === 't') {
6416     return true;
6417     }
6418    
6419 mbroquet 3730 //
6420 softime 6565 return false;
6421 mbroquet 3730 }
6422    
6423     /**
6424     * CONDITION - is_finalize_without_bypass.
6425     *
6426     * Condition pour afficher le bouton sans le bypass.
6427     *
6428     * @return boolean [description]
6429     */
6430     function is_finalizable_without_bypass() {
6431     // Récupère la valeur du champ finalisé
6432     $om_final_instruction = $this->getVal('om_final_instruction');
6433    
6434     // Si le rapport n'est pas finalisé
6435     if (empty($om_final_instruction)
6436     || $om_final_instruction == 'f') {
6437     //
6438     return true;
6439     }
6440    
6441     //
6442     return false;
6443     }
6444    
6445     /**
6446     * CONDITION - is_unfinalizable.
6447     *
6448     * Condition pour afficher le bouton.
6449     *
6450     * @return boolean
6451     */
6452     function is_unfinalizable(){
6453     // Contrôle si l'utilisateur possède un bypass
6454 softime 7996 $bypass = $this->f->isAccredited($this->get_absolute_class_name()."_definaliser_bypass");
6455 mbroquet 3730 //
6456     if ($bypass == true) {
6457     //
6458     return true;
6459     }
6460 softime 6565
6461     // Si l'utilisateur est un instructeur, que le dossier est cloturé et
6462     // que l'événement n'est pas identifié comme non verrouillable
6463 mbroquet 3730 if ($this->f->isUserInstructeur()
6464 softime 6565 && $this->getStatutAutorisationDossier($this->getParameter("idxformulaire")) == "cloture"
6465     && $this->checkEvenementNonVerrouillable($this->getVal("instruction")) === false) {
6466 mbroquet 3730 //
6467     return false;
6468     }
6469    
6470 softime 6565 // Si l'utilisateur est un intructeur qui correspond à la division du
6471     // dossier
6472     if ($this->is_instructeur_from_division_dossier() === true) {
6473     //
6474     return true;
6475 mbroquet 3730 }
6476    
6477 softime 6565 // Si l'utilisateur est instructeur de la commune du dossier et que
6478     // l'instruction est créée par un instructeur de la commune
6479     if ($this->is_instructeur_from_collectivite_dossier() === true and
6480     $this->getVal('created_by_commune') === 't') {
6481     return true;
6482 mbroquet 3730 }
6483    
6484     //
6485 softime 6565 return false;
6486 mbroquet 3730 }
6487    
6488     /**
6489     * CONDITION - is_unfinalizable_without_bypass.
6490     *
6491     * Condition pour afficher le bouton sans le bypass.
6492     *
6493     * @return boolean
6494     */
6495     function is_unfinalizable_without_bypass() {
6496     // Récupère la valeur du champ finalisé
6497     $om_final_instruction = $this->getVal('om_final_instruction');
6498    
6499     // Si l'instruction est finalisée
6500     if ($om_final_instruction == 't') {
6501     //
6502     return true;
6503     }
6504    
6505     //
6506     return false;
6507     }
6508    
6509 softime 5169
6510 mbroquet 3730 /**
6511 softime 6565 * Permet de définir si un instructeur commune peut editer une instruction
6512     *
6513     * @return boolean true si il peut
6514     */
6515     function isInstrCanChangeDecision($idx) {
6516    
6517     if ($this->f->isAccredited(array("instruction", "instruction_changer_decision"), "OR") !== true or
6518     $this->f->isUserInstructeur() !== true) {
6519     return false;
6520     }
6521    
6522    
6523    
6524     // Sinon on vérifie l'éligibilité du dossier au changement de décision
6525 softime 11876 // /!\ Requête lié à celles du widget indiquant les dossiers éligible au changement
6526     // de décision :
6527     // * dossier_instruction.class.php : view_widget_dossiers_evenement_retour_finalise()
6528     // * dossier_instruction.inc.php : si le paramètre filtre_decision = true
6529     $sql = sprintf(
6530     'SELECT
6531 softime 6565 dossier.dossier
6532     FROM
6533 softime 11876 %1$sdossier
6534     JOIN %1$setat
6535     ON dossier.etat = etat.etat AND etat.statut = \'encours\'
6536     JOIN %1$slien_dossier_demandeur
6537     ON dossier.dossier = lien_dossier_demandeur.dossier AND lien_dossier_demandeur.petitionnaire_principal IS TRUE
6538     JOIN %1$sdossier_instruction_type
6539     ON dossier.dossier_instruction_type=dossier_instruction_type.dossier_instruction_type
6540     JOIN %1$sinstruction
6541     -- Recherche de la dernière instruction qui ne soit pas liée à un événement retour
6542     ON instruction.instruction = (
6543     SELECT instruction
6544     FROM %1$sinstruction
6545     JOIN %1$sevenement ON instruction.evenement=evenement.evenement
6546     AND evenement.retour IS FALSE
6547     WHERE instruction.dossier = dossier.dossier
6548     ORDER BY date_evenement DESC, instruction DESC
6549     LIMIT 1
6550     )
6551     -- On ne garde que les dossiers pour lesquels la dernière instruction est finalisée
6552     -- ou alors pour laquelle l instruction a été ajouté par la commune et est
6553     -- non signée, non notifié, etc.
6554     AND (instruction.om_final_instruction IS TRUE
6555     OR instruction.created_by_commune IS TRUE)
6556     AND instruction.date_retour_signature IS NULL
6557     AND instruction.date_envoi_rar IS NULL
6558     AND instruction.date_retour_rar IS NULL
6559     AND instruction.date_envoi_controle_legalite IS NULL
6560     AND instruction.date_retour_controle_legalite IS NULL
6561     -- On vérifie que l instruction soit un arrêté ou un changement de décision
6562     JOIN %1$sevenement
6563     ON instruction.evenement=evenement.evenement
6564     AND (evenement.type = \'arrete\'
6565     OR evenement.type = \'changement_decision\')
6566     -- Recherche les informations du pétitionnaire principal pour l affichage
6567     JOIN %1$sdemandeur
6568     ON lien_dossier_demandeur.demandeur = demandeur.demandeur
6569     -- Recherche la collectivité rattachée à l instructeur
6570     JOIN %1$sinstructeur
6571     ON dossier.instructeur=instructeur.instructeur
6572     JOIN %1$sdivision
6573     ON instructeur.division=division.division
6574     JOIN %1$sdirection
6575     ON division.direction=direction.direction
6576     JOIN %1$som_collectivite
6577     ON direction.om_collectivite=om_collectivite.om_collectivite
6578 softime 6565 WHERE
6579 softime 11876 -- Vérification que la décision a été prise par l agglo
6580     om_collectivite.niveau = \'2\'
6581     AND dossier.dossier = \'%2$s\'
6582     ',
6583     DB_PREFIXE,
6584 softime 14064 $this->f->db->escapeSimple($idx)
6585 softime 11876 );
6586 softime 6565
6587    
6588     // Si collectivité de l'utilisateur niveau mono alors filtre sur celle-ci
6589     if ($this->f->isCollectiviteMono($_SESSION['collectivite']) === true) {
6590 softime 11876 $sql .= sprintf(
6591 softime 14064 ' AND dossier.om_collectivite = %1$d',
6592     intval($_SESSION['collectivite'])
6593 softime 11876 );
6594 softime 6565 }
6595 softime 14064 $qres = $this->f->get_one_result_from_db_query(
6596     $sql,
6597     array(
6598     "origin" => __METHOD__,
6599     )
6600     );
6601    
6602     return $qres['result'] !== null;
6603 softime 6565 }
6604    
6605    
6606     /**
6607 softime 5169 * CONDITION - can_monitoring_dates.
6608     *
6609     * Condition pour afficher le bouton de suivi des dates.
6610     *
6611     * @return boolean
6612     */
6613     public function can_monitoring_dates() {
6614     // Récupère la valeur du champ finalisé
6615     $om_final_instruction = $this->getVal('om_final_instruction');
6616    
6617     // Si l'instruction n'est pas finalisée
6618     if ($om_final_instruction !== 't') {
6619     //
6620     return false;
6621     }
6622    
6623     // Contrôle si l'utilisateur possède un bypass
6624 softime 7996 $bypass = $this->f->isAccredited($this->get_absolute_class_name()."_modification_dates_bypass");
6625 softime 5169 if ($bypass === true) {
6626     return true;
6627     }
6628    
6629 softime 8989 // Permission de modifier le suivi des dates sur un dossier cloturé pour
6630     // un utilisateur lié à un instructeur
6631     $perm_moni_dates_d_closed = $this->f->isAccredited($this->get_absolute_class_name()."_modification_dates_cloture");
6632    
6633     // On vérifie en premier lieu que le DI n'est pas clôturé et que
6634     // l'utilisateur ne possède pas la permission de modifier le suivi des
6635     // dates sur un dossier clôturé
6636 softime 5169 $inst_dossier = $this->get_inst_dossier();
6637 softime 8989 if ($inst_dossier->getStatut() === 'cloture'
6638     && $perm_moni_dates_d_closed === false) {
6639 softime 5169 //
6640     return false;
6641     }
6642     // On récupère ses infos
6643     $coll_di = $inst_dossier->getVal('om_collectivite');
6644     $div_di = $this->getDivisionFromDossier();
6645     // et celles de son éventuel instructeur
6646     $instr_di = $inst_dossier->getVal('instructeur');
6647    
6648 softime 6565 // Il faut disposer d'une entrée instructeur
6649     if ($this->f->isUserInstructeur() === false) {
6650     return false;
6651     }
6652    
6653 softime 5169 // Par défaut on prétend que l'instructeur n'est pas multi
6654     $instr_di_coll_multi = false;
6655     // Si un instructeur est affecté au dossier
6656     if ($instr_di !== '' && $instr_di !== null) {
6657     // Vérifie si l'instructeur est de la collectivité de niveau 2
6658 softime 5295 $instr_di_coll = $this->get_instructeur_om_collectivite($instr_di);
6659 softime 5169 if ($this->f->isCollectiviteMono($instr_di_coll) === false) {
6660     //
6661     $instr_di_coll_multi = true;
6662     }
6663     }
6664    
6665 softime 6565 // Il faut qu'il instruise le dossier ou soit de la même division
6666     if ($this->f->om_utilisateur['instructeur'] === $instr_di
6667     || $this->f->om_utilisateur['division'] === $div_di) {
6668 softime 5169 //
6669     return true;
6670     }
6671    
6672 softime 6565 // On donne également le droit s'il est de la même collectivité que
6673     // le dossier ET si l'instruction est déléguée à la communauté
6674     if ($this->f->isCollectiviteMono($this->f->om_utilisateur['om_collectivite']) === true
6675     && $this->f->om_utilisateur['om_collectivite'] === $coll_di
6676     && $instr_di_coll_multi === true) {
6677 softime 5169 //
6678     return true;
6679     }
6680    
6681 softime 6565 // Si l'instructeur ne rentre pas dans les deux cas précédents
6682 softime 5169 return false;
6683     }
6684    
6685    
6686     /**
6687 softime 12847 * CONDITION - is_finalized.
6688     *
6689     * Condition pour vérifier si une instruction est finalisée.
6690     *
6691     * @return boolean
6692     */
6693     public function is_finalized() {
6694    
6695     return $this->getVal('om_final_instruction') === "t";
6696     }
6697    
6698     /**
6699     * CONDITION - is_not_date_retour_signature_set.
6700     *
6701     * Condition pour vérifier si une date de retour signature n'est pas définie.
6702     *
6703     * @return boolean
6704     */
6705     public function is_not_date_retour_signature_set() {
6706    
6707     return $this->getVal('date_retour_signature') == null;
6708    
6709     }
6710    
6711    
6712     /**
6713 mbroquet 3730 * TREATMENT - finalize.
6714     *
6715     * Permet de finaliser un enregistrement.
6716     *
6717     * @param array $val valeurs soumises par le formulaire
6718     *
6719     * @return boolean
6720     */
6721     function finalize($val = array()) {
6722    
6723     // Cette méthode permet d'exécuter une routine en début des méthodes
6724     // dites de TREATMENT.
6725     $this->begin_treatment(__METHOD__);
6726 softime 10808 $message = '';
6727 softime 11585 $ev = $this->get_inst_evenement($this->getVal('evenement'));
6728 mbroquet 3730
6729 softime 11585 // Controle du signataire
6730     if (! $this->controle_signataire($ev)) {
6731     $this->addToMessage(__("Le document ne peut pas être finalisé car aucun signataire n'a été sélectionné."));
6732     // Termine le traitement
6733     return $this->end_treatment(__METHOD__, false);
6734     }
6735    
6736 mbroquet 3730 // Traitement de la finalisation
6737     $ret = $this->manage_finalizing("finalize", $val);
6738    
6739     // Si le traitement retourne une erreur
6740     if ($ret !== true) {
6741    
6742     // Termine le traitement
6743 softime 5024 return $this->end_treatment(__METHOD__, false);
6744 mbroquet 3730 }
6745    
6746 softime 10808 // Envoi des notifications aux demandeurs si la notification est automatique
6747     // et que la signature n'est pas requise
6748     if ($ev->getVal('notification') === 'notification_automatique') {
6749 softime 13137 // Préparation du message de log en cas d'erreur de notification
6750 softime 13528 $msgLog = sprintf(
6751     '%s %s : %d',
6752     __('Erreur lors de la notification automatique du(des) pétitionnaire(s) suite à la finalisation de l\'instruction.'),
6753     __('Instruction notifiée'),
6754     $this->getVal($this->clePrimaire)
6755     );
6756 softime 10808 // Récupération de la catégorie et envoie des notifications au(x) demandeur(s)
6757     $collectivite_di = $this->get_dossier_instruction_om_collectivite($this->getVal('dossier'));
6758     // Récupération de la liste des demandeurs à notifier et de la catégorie
6759     $categorie = $this->f->get_param_option_notification($collectivite_di);
6760 softime 14064 $isPortal = $categorie === PORTAL;
6761 softime 10869 $demandeursANotifie = $this->get_demandeurs_notifiable(
6762     $this->getVal('dossier'),
6763     $isPortal
6764     );
6765 softime 10808
6766     // Création d'une notification et d'une tâche pour chaque demandeur à notifier
6767 softime 12124 $demandeurPrincipalNotifie = false;
6768 softime 10813 if (count($demandeursANotifie) > 0) {
6769     foreach ($demandeursANotifie as $demandeur) {
6770 softime 12124 // Identifie si le demandeur principal a été notifié ou pas
6771     // et récupère ses informations
6772     if ($demandeur['petitionnaire_principal'] == 't') {
6773     $demandeurPrincipalNotifie = true;
6774     // Si le demandeur principal est notifiable mais qu'il y a des erreurs dans
6775     // son paramétrage, on effectue pas le traitement et on passe à l'itération
6776     // suivante. On le considère également comme non notifié pour gérer l'envoie
6777     // des messages d'erreurs
6778     // Si la demande a été déposée via le portail alors le paramétrage n'a pas
6779     // d'impact sur la notification
6780     $erreursParam = $this->get_info_notification_fail();
6781     if (! $this->dossier_depose_sur_portail() && $erreursParam != array()) {
6782     $demandeurPrincipalNotifie = false;
6783     continue;
6784     }
6785     }
6786 softime 10813 // Ajout de la notif et récupération de son id
6787     $idNotif = $this->ajouter_notification(
6788     $this->getVal($this->clePrimaire),
6789     $this->f->get_connected_user_login_name(),
6790 softime 10968 $demandeur,
6791     $collectivite_di,
6792 softime 12433 array(),
6793 softime 10968 true
6794 softime 10808 );
6795 softime 10813 if ($idNotif === false) {
6796     // Termine le traitement
6797 softime 13528 $this->addToLog(
6798     sprintf('%s() : %s', __METHOD__, $msgLog),
6799     DEBUG_MODE
6800     );
6801 softime 10813 return $this->end_treatment(__METHOD__, false);
6802     }
6803     $notification_by_task = $this->notification_by_task(
6804     $idNotif,
6805     $this->getVal('dossier'),
6806     $categorie
6807 softime 10808 );
6808 softime 10813 if ($notification_by_task === false) {
6809 softime 13528 $this->addToLog(
6810     sprintf('%s() : %s', __METHOD__, $msgLog),
6811     DEBUG_MODE
6812     );
6813 softime 10813 $this->addToMessage(
6814     __("Erreur lors de la génération de la notification au(x) pétitionnaire(s).")
6815     );
6816     // Termine le traitement
6817     return $this->end_treatment(__METHOD__, false);
6818     }
6819 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.")));
6820 softime 10808 }
6821     }
6822 softime 12847 // Pour la notification par mail ou la notification via portal si le dossier a
6823     // été déposés via portal, si le demandeur principal n'est pas notifiable,
6824     // on créé une nouvelle notification en erreur avec en commentaire la raison pour
6825     // laquelle le demandeur principal n'a pas pu être notifié
6826     $depotPortal = $this->dossier_depose_sur_portail();
6827     if (! $demandeurPrincipalNotifie && ($isPortal === false || $depotPortal === true)) {
6828 softime 13137 // Préparation des logs pour indiquer que le pétitionnaire principale n'est pas notifiable
6829 softime 13528 $msgLog .= sprintf(' %s', __('Le pétitionnaire principale n\'est pas notifiable.'));
6830 softime 12124 // Analyse pour savoir pourquoi le demandeur principal n'est pas notifiable
6831     $erreursParam = $this->get_info_notification_fail();
6832     $demandeurPrincipal = $this->get_info_petitionnaire_principal_dossier($this->getVal('dossier'));
6833     // Ajout de la notif et récupération de son id
6834     $idNotif = $this->ajouter_notification(
6835     $this->valF[$this->clePrimaire],
6836     $this->f->get_connected_user_login_name(),
6837     $demandeurPrincipal,
6838     $collectivite_di,
6839 softime 12433 array(),
6840 softime 12124 true,
6841     'Echec',
6842     implode(' ', $erreursParam)
6843     );
6844     if ($idNotif === false) {
6845     $this->addToMessage(
6846     __('Erreur : la création de la notification a échouée.').
6847     __("Veuillez contacter votre administrateur.")
6848     );
6849 softime 13528 $this->addToLog(
6850     sprintf('%s() : %s', __METHOD__, $msgLog),
6851     DEBUG_MODE
6852     );
6853 softime 12124 return false;
6854     }
6855     // Prépare un message d'alerte à destination de l'instructeur pour l'informer
6856     // de l'échec de la notification
6857     $dossier_message = $this->get_inst_dossier_message(0);
6858     $dossier_message_val = array(
6859     'dossier' => $this->getVal('dossier'),
6860     'type' => _('erreur expedition'),
6861     'emetteur' => $this->f->get_connected_user_login_name(),
6862     'login' => $_SESSION['login'],
6863     'date_emission' => date('Y-m-d H:i:s'),
6864     'contenu' => _('Échec lors de la notification de l\'instruction ').
6865     $ev->getVal('libelle').
6866     '.<br>'.
6867     implode("\n", $erreursParam).
6868     '<br>'.
6869     _('Veuillez corriger ces informations avant de renvoyer la notification.')
6870     );
6871     $add = $dossier_message->add_notification_message($dossier_message_val, true);
6872     // Si une erreur se produit pendant l'ajout
6873     if ($add !== true) {
6874     $this->addToLog(__METHOD__."(): Le message d'alerte concernant l'echec de l'envoi de la notification n'a pas pu être envoyé.", DEBUG_MODE);
6875     return false;
6876     }
6877     }
6878 softime 10808 }
6879    
6880 mbroquet 3730 // Termine le traitement
6881     return $this->end_treatment(__METHOD__, true);
6882     }
6883    
6884     /**
6885 softime 12124 * Récupère l'instance de dossier message.
6886     *
6887     * @param string $dossier_message Identifiant du message.
6888     *
6889     * @return object
6890     */
6891     private function get_inst_dossier_message($dossier_message = null) {
6892     //
6893     return $this->get_inst_common("dossier_message", $dossier_message);
6894     }
6895    
6896     /**
6897 softime 11585 * Vérifie si le signataire est obligatoire pour finaliser
6898     * le document apartir du paramétrage de l'événement.
6899     * Si c'est le cas, vérifie si il y a bien un signataire
6900     * renseigné.
6901     * Si c'est le cas renvoie true, sinon renvoie false.
6902     *
6903     * @param evenement évenement de l'instruction permettant de
6904     * récupérer le paramétrage
6905     * @return boolean
6906     */
6907     protected function controle_signataire($evenement) {
6908     // Vérifie si le signataire est obligatoire et si c'est le cas
6909     // vérifie si il y a bien un signataire pour le document
6910     if ($evenement->is_signataire_obligatoire() &&
6911     ($this->getVal('signataire_arrete') === null ||
6912     $this->getVal('signataire_arrete') === '')) {
6913     return false;
6914     }
6915     return true;
6916     }
6917    
6918     /**
6919 mbroquet 3730 * TREATMENT - unfinalize.
6920     *
6921     * Permet de définaliser un enregistrement.
6922     *
6923     * @param array $val valeurs soumises par le formulaire
6924     *
6925     * @return boolean
6926     */
6927     function unfinalize($val = array()) {
6928    
6929     // Cette méthode permet d'exécuter une routine en début des méthodes
6930     // dites de TREATMENT.
6931     $this->begin_treatment(__METHOD__);
6932    
6933     // Traitement de la finalisation
6934     $ret = $this->manage_finalizing("unfinalize", $val);
6935    
6936     // Si le traitement retourne une erreur
6937     if ($ret !== true) {
6938    
6939     // Termine le traitement
6940 softime 5024 return $this->end_treatment(__METHOD__, false);
6941 mbroquet 3730 }
6942    
6943     // Termine le traitement
6944     return $this->end_treatment(__METHOD__, true);
6945     }
6946    
6947     /**
6948     * VIEW - view_edition
6949     *
6950     * Edite l'édition de l'instruction ou affiche celle contenue dans le stockage.
6951     *
6952     * @return null Si l'action est incorrecte
6953     */
6954     function view_edition() {
6955    
6956     // Si l'instruction est finalisée
6957     if($this->getVal("om_final_instruction") == 't'
6958     && $this->getVal("om_final_instruction") != null) {
6959    
6960     // Ouvre le document
6961 softime 7996 $lien = '../app/index.php?module=form&snippet=file&obj='.$this->table.'&'.
6962 mbroquet 3730 'champ=om_fichier_instruction&id='.$this->getVal($this->clePrimaire);
6963     //
6964     header("Location: ".$lien);
6965     } else {
6966    
6967     // Récupère la collectivite du dossier d'instruction
6968     $dossier_instruction_om_collectivite = $this->get_dossier_instruction_om_collectivite();
6969    
6970     //
6971     $collectivite = $this->f->getCollectivite($dossier_instruction_om_collectivite);
6972    
6973     // Paramètre du PDF
6974     $params = array(
6975     "watermark" => true,
6976     "specific" => array(
6977     "mode" => "previsualisation",
6978     ),
6979     );
6980 softime 8593 // Si la rédaction libre est activée sur l'instruction
6981     if ($this->getVal("flag_edition_integrale") == 't') {
6982     $params["specific"]["corps"] = array(
6983     "mode" => "set",
6984     "value" => $this->getVal("corps_om_htmletatex"),
6985     );
6986     $params["specific"]["titre"] = array(
6987     "mode" => "set",
6988     "value" => $this->getVal("titre_om_htmletat"),
6989     );
6990     }
6991 mbroquet 3730
6992     // Génération du PDF
6993     $result = $this->compute_pdf_output('lettretype', $this->getVal("lettretype"), $collectivite, null, $params);
6994     // Affichage du PDF
6995     $this->expose_pdf_output(
6996     $result['pdf_output'],
6997     $result['filename']
6998     );
6999     }
7000     }
7001    
7002     /**
7003     * Récupère la collectivité du dossier d'instruction.
7004     *
7005 softime 7685 * @param string $dossier_instruction_id Identifiant du DI.
7006     *
7007 mbroquet 3730 * @return integer
7008     */
7009 softime 7685 function get_dossier_instruction_om_collectivite($dossier_instruction_id = null) {
7010 mbroquet 3730
7011 softime 7685 // Si l'identifiant n'est pas renseigné
7012     if ($dossier_instruction_id === null) {
7013 softime 8593 // Récupère la valeur
7014     if ($this->getVal('dossier') !== null && $this->getVal('dossier') !== '') {
7015     $dossier_instruction_id = $this->getVal('dossier');
7016     } elseif ($this->getParameter('idxformulaire') !== null
7017     && $this->getParameter('idxformulaire') !== '') {
7018     //
7019     $dossier_instruction_id = $this->getParameter('idxformulaire');
7020     } elseif ($this->f->get_submitted_get_value('idxformulaire') !== null
7021     && $this->f->get_submitted_get_value('idxformulaire') !== '') {
7022     //
7023     $dossier_instruction_id = $this->f->get_submitted_get_value('idxformulaire');
7024     }
7025 softime 7685 }
7026    
7027 mbroquet 3730 //
7028 softime 7996 $dossier_instruction = $this->f->get_inst__om_dbform(array(
7029     "obj" => "dossier_instruction",
7030     "idx" => $dossier_instruction_id,
7031     ));
7032 mbroquet 3730
7033     //
7034     return $dossier_instruction->getVal('om_collectivite');
7035     }
7036    
7037     /**
7038     * VIEW - view_bible
7039     *
7040     * Affiche la bible manuelle.
7041     *
7042     * @return void
7043     */
7044     function view_bible() {
7045     // Vérification de l'accessibilité sur l'élément
7046     $this->checkAccessibility();
7047    
7048     /**
7049     * Affichage de la structure HTML
7050     */
7051     //
7052 softime 8989 if ($this->f->isAjaxRequest()) {
7053 mbroquet 3730 //
7054     header("Content-type: text/html; charset=".HTTPCHARSET."");
7055     } else {
7056     //
7057 softime 8989 $this->f->setFlag("htmlonly");
7058     $this->f->display();
7059 mbroquet 3730 }
7060     //
7061 softime 8989 $this->f->displayStartContent();
7062 mbroquet 3730 //
7063 softime 8989 $this->f->setTitle(_("Liste des éléments de la bible en lien avec un evenement"));
7064     $this->f->displayTitle();
7065 mbroquet 3730
7066     /**
7067     *
7068     */
7069     //
7070 softime 8989 ($this->f->get_submitted_get_value("ev") ? $evenement = $this->f->get_submitted_get_value("ev") : $evenement = "");
7071 mbroquet 3730 $evenement = intval($evenement);
7072     //
7073 softime 8989 ($this->f->get_submitted_get_value("idx") ? $idx = $this->f->get_submitted_get_value("idx") : $idx = "");
7074 softime 5169 // Récupération du code du type de DA
7075     $code_da_type = '';
7076     if (preg_match('/[A-Za-z]{2,3}/', $idx, $matches) !== false) {
7077     $code_da_type = $matches[0];
7078     }
7079 mbroquet 3730 //
7080 softime 8989 ($this->f->get_submitted_get_value("complement") ? $complement = $this->f->get_submitted_get_value("complement") : $complement = "1");
7081 mbroquet 3730
7082     // Récupération de la collectivité du dossier
7083 softime 7996 $dossier = $this->f->get_inst__om_dbform(array(
7084     "obj" => "dossier",
7085     "idx" => $idx,
7086     ));
7087 mbroquet 3730
7088 softime 14542 $qres = $this->f->get_all_results_from_db_query(
7089     sprintf(
7090     'SELECT
7091     *,
7092     bible.libelle as bible_lib
7093     FROM
7094     %1$sbible
7095     LEFT OUTER JOIN %1$sdossier_autorisation_type
7096     ON bible.dossier_autorisation_type = dossier_autorisation_type.dossier_autorisation_type
7097     LEFT JOIN %1$som_collectivite
7098     ON bible.om_collectivite = om_collectivite.om_collectivite
7099     WHERE
7100     (evenement = %2$d
7101     OR evenement IS NULL)
7102     AND (complement = %3$d
7103     OR complement IS NULL)
7104     AND (bible.dossier_autorisation_type IS NULL
7105     OR dossier_autorisation_type.code = \'%4$s\')
7106     AND (om_collectivite.niveau = \'2\'
7107     OR bible.om_collectivite = %5$d)
7108     ORDER BY
7109     bible_lib ASC',
7110     DB_PREFIXE,
7111     intval($evenement),
7112     intval($complement),
7113     $this->f->db->escapeSimple($code_da_type),
7114     intval($dossier->getVal("om_collectivite"))
7115     ),
7116     array(
7117     'origin' => __METHOD__
7118     )
7119     );
7120 mbroquet 3730 //
7121     echo "<form method=\"post\" name=\"f3\" action=\"#\">\n";
7122     //
7123 softime 15835 if ($qres['row_count'] > 0) {
7124 mbroquet 3730 //
7125     echo "\t<table id='tab-bible' width='100%'>\n";
7126     //
7127     echo "\t\t<tr class=\"ui-tabs-nav ui-accordion ui-state-default tab-title\">";
7128     echo "<th>"._("Choisir")."</th>";
7129     echo "<th>"._("Libelle")."</th>";
7130     echo "</tr>\n";
7131     //
7132     $i = 0;
7133     //
7134 softime 14542 foreach ($qres['result'] as $row) {
7135 mbroquet 3730 //
7136     echo "\t\t<tr";
7137     echo " class=\"".($i % 2 == 0 ? "odd" : "even")."\"";
7138     echo ">";
7139     //
7140     echo "<td class=\"center\"><input type=\"checkbox\" name=\"choix[]\" value=\"".$i."\" id=\"checkbox".$i."\" /></td>";
7141     // XXX utilisation de l'attribut titre pour afficher une infobulle
7142     echo "<td><span class=\"content\" title=\"".htmlentities($row['contenu'])."\" id=\"content".$i."\">".$row['bible_lib']."</span></td>";
7143     //
7144     echo "</tr>\n";
7145     //
7146     $i++;
7147     }
7148     echo "\t</table>\n";
7149     //
7150     echo "<div class=\"formControls\">\n";
7151 softime 8989 $this->f->layout->display_form_button(array(
7152 mbroquet 3730 "value" => _("Valider"),
7153     "onclick" => "bible_return('f2', 'complement".($complement == "1" ? "" : $complement)."_om_html'); return false;",
7154     ));
7155 softime 8989 $this->f->displayLinkJsCloseWindow();
7156 mbroquet 3730 echo "</div>\n";
7157    
7158     } else {
7159     //
7160     $message_class = "error";
7161     $message = _("Aucun element dans la bible pour l'evenement")." : ".$evenement;
7162 softime 8989 $this->f->displayMessage($message_class, $message);
7163 mbroquet 3730 //
7164     echo "<div class=\"formControls\">\n";
7165 softime 8989 $this->f->displayLinkJsCloseWindow();
7166 mbroquet 3730 echo "</div>\n";
7167     }
7168     //
7169     echo "</form>\n";
7170    
7171     /**
7172     * Affichage de la structure HTML
7173     */
7174     //
7175 softime 8989 $this->f->displayEndContent();
7176 mbroquet 3730 }
7177    
7178     /**
7179 softime 5169 * VIEW - view_bible_auto
7180 mbroquet 3730 *
7181 softime 5169 * Renvoie les valeurs de la bible à placer dans les compléments de l'instruction.
7182 mbroquet 3730 *
7183     * @return void
7184     */
7185     function view_bible_auto() {
7186     // Vérification de l'accessibilité sur l'élément
7187     $this->checkAccessibility();
7188     //
7189 softime 8989 $this->f->disableLog();
7190 mbroquet 3730
7191     $formatDate="AAAA-MM-JJ";
7192    
7193     // Récupération des paramètres
7194 softime 8989 $idx = $this->f->get_submitted_get_value('idx');
7195     $evenement = $this->f->get_submitted_get_value('ev');
7196 mbroquet 3730
7197     // Initialisation de la variable de retour
7198     $retour['complement_om_html'] = '';
7199     $retour['complement2_om_html'] = '';
7200     $retour['complement3_om_html'] = '';
7201     $retour['complement4_om_html'] = '';
7202 softime 14064
7203 mbroquet 3730 // Vérification d'une consultation liée à l'événement
7204 softime 14064 $instEvenement = $this->f->get_inst__om_dbform(array(
7205     "obj" => "evenement",
7206     "idx" => $evenement,
7207     ));
7208    
7209 mbroquet 3730 // Si consultation liée, récupération du retour d'avis
7210 softime 14064 if($instEvenement->getVal('consultation') == 'Oui'){
7211 softime 14542
7212     $qres = $this->f->get_all_results_from_db_query(
7213     sprintf(
7214     'SELECT
7215     date_retour,
7216     avis_consultation.libelle as avis_consultation,
7217     COALESCE(service.libelle, tiers_consulte.libelle) as service
7218     FROM
7219     %1$sconsultation
7220     LEFT JOIN %1$stiers_consulte
7221     ON consultation.tiers_consulte = tiers_consulte.tiers_consulte
7222     LEFT JOIN %1$sservice
7223     ON consultation.service = service.service
7224     LEFT JOIN %1$savis_consultation
7225     ON consultation.avis_consultation = avis_consultation.avis_consultation
7226     WHERE
7227     dossier = \'%2$s\'
7228     AND consultation.visible',
7229     DB_PREFIXE,
7230     $this->f->db->escapeSimple($idx)
7231     ),
7232     array(
7233     'origin' => __METHOD__
7234     )
7235 softime 11876 );
7236 mbroquet 3730 // Récupération des consultations
7237 softime 14542 foreach ($qres['result'] as $row) {
7238 mbroquet 3730 $correct=false;
7239     // date retour
7240     if ($row['date_retour']<>""){
7241     if ($formatDate=="AAAA-MM-JJ"){
7242     $date = explode("-", $row['date_retour']);
7243     // controle de date
7244     if (count($date) == 3 and
7245     checkdate($date[1], $date[2], $date[0])) {
7246     $date_retour_f= $date[2]."/".$date[1]."/".$date[0];
7247     $correct=true;
7248     }else{
7249     $msg= $msg."<br>La date ".$row['date_retour']." n'est pas une date.";
7250     $correct=false;
7251     }
7252     }
7253     }
7254     //
7255     $temp="Vu l'avis ".$row['avis_consultation']." du service ".$row['service'];
7256     if($correct == true){
7257     $temp=$temp." du ".$date_retour_f;
7258     }
7259     // Concaténation des retours d'avis de consultation
7260 softime 7067 $retour['complement_om_html'] .= $temp . "<br/><br/>";
7261 mbroquet 3730 } // while
7262    
7263     } // consultation
7264     // Récupération des bibles automatiques pour le champ complement_om_html
7265 softime 8989 $retour['complement_om_html'] .= $this->getBible($evenement, $idx, '1');
7266 mbroquet 3730 // Récupération des bibles automatiques pour le champ complement2_om_html
7267 softime 8989 $retour['complement2_om_html'] .= $this->getBible($evenement, $idx, '2');
7268 mbroquet 3730 // Récupération des bibles automatiques pour le champ complement3_om_html
7269 softime 8989 $retour['complement3_om_html'] .= $this->getBible($evenement, $idx, '3');
7270 mbroquet 3730 // Récupération des bibles automatiques pour le champ complement4_om_html
7271 softime 8989 $retour['complement4_om_html'] .= $this->getBible($evenement, $idx, '4');
7272 mbroquet 3730
7273    
7274    
7275     echo json_encode($retour);
7276     }
7277    
7278     /**
7279 softime 7521 * VIEW - view_pdf_temp
7280     *
7281     * @return void
7282     */
7283     function view_pdf_temp() {
7284     $this->checkAccessibility();
7285 softime 8593 // Utilisation de $_POST pour ne pas que les textes soient altérés.
7286 softime 7521 $this->f->set_submitted_value();
7287 softime 8593 $merge_fields = array();
7288     //
7289     if (array_key_exists('c1', $_POST) === true) {
7290 softime 11876 $merge_fields['[complement_instruction]'] = $_POST['c1'];
7291     $merge_fields['[complement1_instruction]'] = $_POST['c1'];
7292 softime 8593 }
7293     if (array_key_exists('c2', $_POST) === true) {
7294 softime 11876 $merge_fields['[complement2_instruction]'] = $_POST['c2'];
7295 softime 8593 }
7296     if (array_key_exists('c3', $_POST) === true) {
7297 softime 11876 $merge_fields['[complement3_instruction]'] = $_POST['c3'];
7298 softime 8593 }
7299     if (array_key_exists('c4', $_POST) === true) {
7300 softime 11876 $merge_fields['[complement4_instruction]'] = $_POST['c4'];
7301 softime 8593 }
7302 softime 7521 $params = array(
7303     "watermark" => true,
7304     "specific" => array(
7305     "merge_fields" => $merge_fields,
7306     ),
7307     );
7308 softime 8593 //
7309     if (array_key_exists('corps', $_POST) === true) {
7310     $params["specific"]["corps"] = array(
7311     "mode" => "set",
7312 softime 11876 "value" => $_POST['corps'],
7313 softime 8593 );
7314     }
7315     if (array_key_exists('titre', $_POST) === true) {
7316     $params["specific"]["titre"] = array(
7317     "mode" => "set",
7318 softime 11876 "value" => $_POST['titre'],
7319 softime 8593 );
7320     }
7321 softime 7521 $dossier_instruction_om_collectivite = $this->get_dossier_instruction_om_collectivite();
7322     $collectivite = $this->f->getCollectivite($dossier_instruction_om_collectivite);
7323     $result = $this->compute_pdf_output('lettretype', $this->getVal('lettretype'), $collectivite, null, $params);
7324     $retour = array(
7325     'base' => base64_encode($result['pdf_output']),
7326     );
7327     echo json_encode($retour);
7328     }
7329    
7330     /**
7331     * Dans le contexte de prévisualisation des éditions, génère le rendu du
7332     * PDF sans prise en compte de la valeur des compléments et le retourne en
7333     * base 64.
7334     *
7335     * @return string Rendu PDF converti en base 64.
7336     */
7337     function init_pdf_temp() {
7338     $params = array(
7339     "watermark" => true,
7340     );
7341 softime 8593 // Si la rédaction libre est activée sur l'instruction
7342     if ($this->getVal("flag_edition_integrale") == 't') {
7343     $params["specific"]["corps"] = array(
7344     "mode" => "set",
7345     "value" => $this->getVal("corps_om_htmletatex"),
7346     );
7347     $params["specific"]["titre"] = array(
7348     "mode" => "set",
7349     "value" => $this->getVal("titre_om_htmletat"),
7350     );
7351     }
7352 softime 7521 $dossier_instruction_om_collectivite = $this->get_dossier_instruction_om_collectivite();
7353     $collectivite = $this->f->getCollectivite($dossier_instruction_om_collectivite);
7354     $result = $this->compute_pdf_output('lettretype', $this->getVal('lettretype'), $collectivite, null, $params);
7355    
7356     return base64_encode($result['pdf_output']);
7357     }
7358    
7359     /**
7360 mbroquet 3730 * Récupération des éléments de bible.
7361     *
7362     * @param integer $event id de l'événement
7363     * @param string $idx id du dossier
7364     * @param integer $compnb numéro du champ complement
7365 softime 17036 * @param string $type types possibles : automatique ou precharge
7366 mbroquet 3730 *
7367     * @return string Chaîne de texte à insérer dans le champ complement
7368     */
7369 softime 17036 function getBible($event, $idx, $compnb, $type = 'automatique') {
7370 mbroquet 3730 // Récupération de la collectivité du dossier
7371 softime 7996 $dossier = $this->f->get_inst__om_dbform(array(
7372     "obj" => "dossier",
7373     "idx" => $idx,
7374     ));
7375 softime 5169 // Récupération du code du type de DA
7376     $code_da_type = '';
7377     if (preg_match('/[A-Za-z]{2,3}/', $idx, $matches) !== false) {
7378     $code_da_type = $matches[0];
7379     }
7380 mbroquet 3730
7381 softime 17036 // Prépare le filtre de la requête selon le type de remplissage voulu
7382     $sql_filter_type = '';
7383     if ($type === 'automatique') {
7384     $sql_filter_type = "AND automatique = 'Oui'";
7385     } elseif ($type === 'precharge') {
7386     $sql_filter_type = "AND precharge IS TRUE";
7387     }
7388    
7389 softime 14542 $qres = $this->f->get_all_results_from_db_query(
7390     sprintf(
7391     'SELECT
7392     *
7393     FROM
7394     %1$sbible
7395     LEFT OUTER JOIN %1$sdossier_autorisation_type
7396     ON bible.dossier_autorisation_type =
7397     dossier_autorisation_type.dossier_autorisation_type
7398     LEFT JOIN %1$som_collectivite
7399     ON bible.om_collectivite = om_collectivite.om_collectivite
7400     WHERE
7401     (evenement = %2$d
7402     OR evenement IS NULL)
7403     AND (complement = %3$d
7404     OR complement IS NULL)
7405     AND (dossier_autorisation_type.code = \'%4$s\'
7406     OR bible.dossier_autorisation_type IS NULL)
7407     AND (om_collectivite.niveau = \'2\'
7408 softime 17036 OR bible.om_collectivite = %5$d)
7409     %6$s',
7410 softime 14542 DB_PREFIXE,
7411     intval($event),
7412     intval($compnb),
7413     $this->f->db->escapeSimple($code_da_type),
7414 softime 17036 intval($dossier->getVal("om_collectivite")),
7415     $sql_filter_type
7416 softime 14542 ),
7417     array(
7418     "origin" => __METHOD__
7419     )
7420     );
7421 mbroquet 3730 $temp = "";
7422 softime 14542 foreach ($qres['result'] as $row) {
7423 mbroquet 3730 // Remplacement des retours à la ligne par des br
7424     $temp .= preg_replace(
7425     '#(\\\r|\\\r\\\n|\\\n)#', '<br/>', $row['contenu']
7426     );
7427 softime 7521 // Ajout d'un saut de ligne entre chaque bible.
7428     $temp .= '<br/>';
7429 mbroquet 3730 } // fin while
7430     return $temp;
7431     }
7432    
7433     /**
7434     * VIEW - view_suivi_bordereaux.
7435     *
7436 nmeucci 4317 * Formulaire de choix du bordereau de suivi, permettant de générer les 4 bordereaux.
7437     * Si l'utilisateur est d'une collectivité de niveau 2 il a le choix de la
7438     * collectivité des dossiers affichés.
7439 mbroquet 3730 *
7440     * @return void
7441     */
7442     function view_suivi_bordereaux() {
7443     // Vérification de l'accessibilité sur l'élément
7444     $this->checkAccessibility();
7445    
7446     /**
7447     * Validation du formulaire
7448     */
7449     // Si le formulaire a été validé
7450 softime 8989 if ($this->f->get_submitted_post_value("validation") !== null) {
7451 mbroquet 3730 // Si un bordereau à été sélectionné
7452 softime 8989 if ($this->f->get_submitted_post_value("bordereau") !== null && $this->f->get_submitted_post_value("bordereau") == "" ) {
7453 mbroquet 3730 // Si aucun bordereau n'a été sélectionné
7454     $message_class = "error";
7455     $message = _("Veuillez selectionner un bordereau.");
7456     }
7457     // Sinon si les dates ne sont pas valide
7458 softime 8989 elseif (($this->f->get_submitted_post_value("date_bordereau_debut") !== null
7459     && $this->f->get_submitted_post_value("date_bordereau_debut") == "")
7460     || ($this->f->get_submitted_post_value("date_bordereau_fin") !== null
7461     && $this->f->get_submitted_post_value("date_bordereau_fin") == "")) {
7462 mbroquet 3730 // Si aucune date n'a été saisie
7463     $message_class = "error";
7464     $message = _("Veuillez saisir une date valide.");
7465     }
7466 softime 7366 // Sinon si les dates ne sont pas valides
7467 softime 8989 elseif ($this->f->get_submitted_post_value("bordereau") === "bordereau_avis_maire_prefet"
7468     && $this->f->getParameter("id_evenement_bordereau_avis_maire_prefet") == null) {
7469 softime 7366 // Si aucune date n'a été saisie
7470     $message_class = "error";
7471     $message = _("Erreur de parametrage. Contactez votre administrateur.");
7472     }
7473 mbroquet 3730 // Affiche le message de validation
7474     else {
7475     // On récupère le libellé du bordereau pour l'afficher à l'utilisateur
7476 softime 14064 $etat = $this->f->get_inst__om_dbform(array(
7477     "obj" => "om_etat",
7478     "idx" => $this->f->get_submitted_post_value("bordereau")
7479     ));
7480     $qres = $this->f->get_one_result_from_db_query(
7481     sprintf(
7482     'SELECT
7483     om_etat.libelle
7484     FROM
7485     %som_etat
7486     WHERE
7487     om_etat.id = \'%s\'',
7488     DB_PREFIXE,
7489     $this->f->db->escapeSimple($this->f->get_submitted_post_value("bordereau"))
7490     ),
7491     array(
7492     "origin" => __METHOD__,
7493     )
7494     );
7495    
7496 mbroquet 3730 //
7497     $message_class = "valid";
7498     $message = _("Cliquez sur le lien ci-dessous pour telecharger votre bordereau");
7499     $message .= " : <br/><br/>";
7500     $message .= "<a class='om-prev-icon pdf-16'";
7501     $message .= " title=\""._("Bordereau")."\"";
7502 softime 7996 $message .= "href='".OM_ROUTE_FORM."&obj=instruction";
7503 nmeucci 4317 $message .= "&action=220";
7504     $message .= "&idx=0";
7505 softime 8989 $message .= "&type_bordereau=".$this->f->get_submitted_post_value("bordereau");
7506     $message .= "&date_bordereau_debut=".$this->f->get_submitted_post_value("date_bordereau_debut");
7507     $message .= "&date_bordereau_fin=".$this->f->get_submitted_post_value("date_bordereau_fin");
7508 mbroquet 3730 // Si l'utilisateur est MULTI alors on ajoute le paramètre collectivite
7509 softime 8989 if ($this->f->get_submitted_post_value("om_collectivite") !== null) {
7510     $message .= "&collectivite=".$this->f->get_submitted_post_value("om_collectivite");
7511 mbroquet 3730 }
7512     $message .= "'"." target='_blank'>";
7513 softime 14064 $message .= $qres['result']." "._("du")." ".$this->f->get_submitted_post_value("date_bordereau_debut")
7514 softime 8989 ." "._("au")." ".$this->f->get_submitted_post_value("date_bordereau_fin");
7515 mbroquet 3730 $message .= "</a>";
7516     }
7517     }
7518    
7519     /**
7520     * Affichage des messages et du formulaire
7521     */
7522     // Affichage du message de validation ou d'erreur
7523     if (isset($message) && isset($message_class) && $message != "") {
7524 softime 8989 $this->f->displayMessage($message_class, $message);
7525 mbroquet 3730 }
7526     // Ouverture du formulaire
7527     printf("\t<form");
7528     printf(" method=\"post\"");
7529     printf(" id=\"suivi_bordereaux_form\"");
7530     printf(" action=\"\"");
7531     printf(">\n");
7532     // Paramétrage des champs du formulaire
7533     $champs = array("date_bordereau_debut", "date_bordereau_fin", "bordereau");
7534 softime 8989 // Si l'utilisateur est d'une collectivité de niveau 2 on affiche un select
7535 mbroquet 3730 // collectivité dans le formulaire
7536 softime 8989 if ($_SESSION["niveau"] == 2) {
7537 mbroquet 3730 array_push($champs, "om_collectivite");
7538     }
7539     // Création d'un nouvel objet de type formulaire
7540 softime 7996 $form = $this->f->get_inst__om_formulaire(array(
7541     "validation" => 0,
7542     "maj" => 0,
7543     "champs" => $champs,
7544     ));
7545 mbroquet 3730 // Paramétrage du champ date_bordereau_debut
7546     $form->setLib("date_bordereau_debut", _("date_bordereau_debut"));
7547     $form->setType("date_bordereau_debut", "date");
7548     $form->setTaille("date_bordereau_debut", 12);
7549     $form->setMax("date_bordereau_debut", 12);
7550     $form->setRequired("date_bordereau_debut");
7551     $form->setOnchange("date_bordereau_debut", "fdate(this)");
7552     $form->setVal("date_bordereau_debut", date("d/m/Y"));
7553     // Paramétrage du champ date_bordereau_fin
7554     $form->setLib("date_bordereau_fin", _("date_bordereau_fin"));
7555     $form->setType("date_bordereau_fin", "date");
7556     $form->setTaille("date_bordereau_fin", 12);
7557     $form->setMax("date_bordereau_fin", 12);
7558     $form->setRequired("date_bordereau_fin");
7559     $form->setOnchange("date_bordereau_fin", "fdate(this)");
7560     $form->setVal("date_bordereau_fin", date("d/m/Y"));
7561     // Paramétrage du champ bordereau
7562     $form->setLib("bordereau", _("bordereau"));
7563     $form->setType("bordereau", "select");
7564     $form->setRequired("bordereau");
7565     // Valeurs des champs
7566 softime 8989 if ($this->f->get_submitted_post_value("validation") !== null) {
7567     $form->setVal("date_bordereau_debut", $this->f->get_submitted_post_value("date_bordereau_debut"));
7568     $form->setVal("date_bordereau_fin", $this->f->get_submitted_post_value("date_bordereau_fin"));
7569     $form->setVal("bordereau", $this->f->get_submitted_post_value("bordereau"));
7570     $form->setVal("om_collectivite", $this->f->get_submitted_post_value("om_collectivite"));
7571 mbroquet 3730 }
7572     // Données du select - On récupère ici la liste de tous les états disponibles
7573     // dans la table om_etat qui ont un id qui commence par la cahine de caractères
7574     // 'bordereau_'
7575 softime 14542 $qres = $this->f->get_all_results_from_db_query(
7576     sprintf(
7577     'SELECT
7578     om_etat.id,
7579     om_etat.libelle
7580     FROM
7581     %1$som_etat
7582     WHERE
7583     om_etat.id LIKE \'bordereau_%%\'
7584     ORDER BY
7585     om_etat.id',
7586     DB_PREFIXE
7587     ),
7588     array(
7589     "origin" => __METHOD__
7590     )
7591     );
7592 mbroquet 3730 // Données du select
7593     $contenu = array(
7594     0 => array("", ),
7595     1 => array(_("choisir bordereau")),
7596     );
7597 softime 14542 foreach ($qres['result'] as $row) {
7598 mbroquet 3730 $contenu[0][] = $row['id'];
7599     $contenu[1][] = $row['libelle'];
7600     }
7601     $form->setSelect("bordereau", $contenu);
7602 softime 8989 //
7603     if ($_SESSION["niveau"] == 2) {
7604     $form->setLib("om_collectivite", _("collectivite"));
7605     $form->setType("om_collectivite", "select");
7606 mbroquet 3730
7607 softime 8989 // Données du select - On récupère ici la liste de tous toutes les collectivités
7608     // de niveau 1
7609 softime 14542 $qres = $this->f->get_all_results_from_db_query(
7610     sprintf(
7611     'SELECT
7612     om_collectivite,
7613     libelle
7614     FROM
7615     %1$som_collectivite
7616     WHERE
7617     niveau = \'1\'
7618     ORDER BY
7619     libelle',
7620     DB_PREFIXE
7621     ),
7622     array(
7623     "origin" => __METHOD__
7624     )
7625     );
7626 softime 8989 // La valeur par défaut du select est Toutes
7627     $list_collectivites = array(
7628     0 => array("", ),
7629     1 => array(_("toutes"))
7630     );
7631 mbroquet 3730
7632 softime 8989 $id_colls = "";
7633     // On stocke dans $id_colls l'id de toutes les collectivités de niveau 1 séparées
7634     // par des virgules, pour un traitement plus facile dans la requête de sous-état
7635 softime 14542 foreach ($qres['result'] as $row) {
7636 softime 8989 if ($id_colls != "") {
7637     $id_colls .= ",";
7638     }
7639     $id_colls .= $row['om_collectivite'];
7640     $list_collectivites[0][] = $row['om_collectivite'];
7641     $list_collectivites[1][] = $row['libelle'];
7642 mbroquet 3730 }
7643 softime 8989 // On affecte la liste d'identifiants à l'option Toutes
7644     $list_collectivites[0][0] = $id_colls ;
7645     $form->setSelect("om_collectivite", $list_collectivites);
7646 mbroquet 3730 }
7647     // Affichage du formulaire
7648     $form->entete();
7649     $form->afficher($champs, 0, false, false);
7650     $form->enpied();
7651     // Affichage du bouton
7652     printf("\t<div class=\"formControls\">\n");
7653 softime 8989 $this->f->layout->display_form_button(array("value" => _("Valider"), "name" => "validation"));
7654 mbroquet 3730 printf("\t</div>\n");
7655     // Fermeture du formulaire
7656     printf("\t</form>\n");
7657     }
7658    
7659 nmeucci 4317
7660     /**
7661     * VIEW - view_generate_suivi_bordereaux.
7662     *
7663     * Génère et affiche les bordereaux de suivi.
7664     *
7665     * @return [void]
7666     */
7667     function view_generate_suivi_bordereaux() {
7668     // Vérification de l'accessibilité sur l'élément
7669     $this->checkAccessibility();
7670     // Récupération du type de bordereau
7671     $bordereau = $this->f->get_submitted_get_value('type_bordereau');
7672     // Génération du PDF
7673     $result = $this->compute_pdf_output('etat', $bordereau, null, $this->getVal($this->clePrimaire));
7674     // Affichage du PDF
7675     $this->expose_pdf_output(
7676     $result['pdf_output'],
7677     $result['filename']
7678     );
7679     }
7680    
7681    
7682 mbroquet 3730 /**
7683     * VIEW - view_suivi_envoi_lettre_rar.
7684     *
7685 softime 8989 * Vue pour imprimer les AR.
7686 mbroquet 3730 *
7687     * @return void
7688     */
7689     function view_suivi_envoi_lettre_rar() {
7690     // Vérification de l'accessibilité sur l'élément
7691     $this->checkAccessibility();
7692    
7693     //
7694 softime 8989 if ($this->f->get_submitted_post_value("date") !== null) {
7695     $date = $this->f->get_submitted_post_value("date");
7696 mbroquet 3730 } else {
7697     $date = "";
7698     }
7699     //
7700 softime 8989 if ($this->f->get_submitted_post_value("liste_code_barres_instruction") !== null) {
7701     $liste_code_barres_instruction = $this->f->get_submitted_post_value("liste_code_barres_instruction");
7702 mbroquet 3730 } else {
7703     $liste_code_barres_instruction = "";
7704     }
7705    
7706     // Compteur du nombre de page générées
7707     $nbLettres = 0;
7708     // Liste d'id des instructions
7709     $id4Gen = array();
7710     //
7711     $error = "";
7712    
7713 softime 5504 // Initialisation du tableau qui va contenir les DI pour lister les liens
7714     $dossierTab = array();
7715     // On vérifie que l'utilisateur ait les droits pour afficher des consultations
7716     $isAccredited = $this->f->isAccredited(array("dossier_instruction","dossier_instruction_consulter"), "OR");
7717     $hasHidden = true;
7718     // S'il ne peut pas les consulter il aura des dossiers caché
7719     if ($isAccredited === true) {
7720     $hasHidden = false;
7721     }
7722    
7723 mbroquet 3730 /**
7724     * Validation du formulaire
7725     */
7726     // Si le formulaire a été validé
7727 softime 8989 if ($this->f->get_submitted_post_value('validation') !== null) {
7728 mbroquet 3730 //
7729     if (empty($date) || empty($liste_code_barres_instruction)) {
7730     //
7731     $message_class = "error";
7732     $message = _("Tous les champs doivent etre remplis.");
7733     } else {
7734     // Création d'un tableau d'instruction
7735 softime 8989 $liste = explode("\r\n", $this->f->get_submitted_post_value("liste_code_barres_instruction"));
7736 mbroquet 3730 //
7737     foreach ($liste as $code_barres) {
7738     // On enlève les éventuels espaces saisis
7739     $code_barres = trim($code_barres);
7740     // Vérification de l'existence de l'instruction
7741     if ($code_barres != "") {
7742     // Si la valeur transmise est numérique
7743     if (is_numeric($code_barres)) {
7744     //
7745 softime 6565 $sql = "SELECT count(*)
7746     FROM ".DB_PREFIXE."instruction
7747     INNER JOIN ".DB_PREFIXE."dossier
7748     ON dossier.dossier=instruction.dossier
7749     INNER JOIN ".DB_PREFIXE."dossier_instruction_type
7750     ON dossier.dossier_instruction_type = dossier_instruction_type.dossier_instruction_type
7751     INNER JOIN ".DB_PREFIXE."dossier_autorisation_type_detaille
7752     ON dossier_instruction_type.dossier_autorisation_type_detaille = dossier_autorisation_type_detaille.dossier_autorisation_type_detaille
7753     INNER JOIN ".DB_PREFIXE."dossier_autorisation_type
7754     ON dossier_autorisation_type_detaille.dossier_autorisation_type = dossier_autorisation_type.dossier_autorisation_type
7755     INNER JOIN ".DB_PREFIXE."groupe
7756     ON dossier_autorisation_type.groupe = groupe.groupe
7757     WHERE code_barres='".$this->f->db->escapesimple($code_barres)."'";
7758 softime 7067
7759     // Ajout d'un filtre sur les groupes auxquels l'utilisateur a accès
7760     $group_clause = array();
7761     foreach ($_SESSION["groupe"] as $key => $value) {
7762     $group_clause[$key] = "(groupe.code = '".$key."'";
7763     if($value["confidentiel"] !== true) {
7764     $group_clause[$key] .= " AND dossier_autorisation_type.confidentiel IS NOT TRUE";
7765     }
7766     $group_clause[$key] .= ")";
7767     }
7768     $conditions = implode(" OR ", $group_clause);
7769     $sql .= " AND (" . $conditions . ")";
7770    
7771 softime 14064 $qres = $this->f->get_one_result_from_db_query(
7772     $sql,
7773     array(
7774     "origin" => __METHOD__,
7775     )
7776     );
7777    
7778     if ($qres['result'] == "1") {
7779 mbroquet 3730 // Récupération de la date d'envoi de l'instruction bippé
7780 softime 14542 $qres = $this->f->get_all_results_from_db_query(
7781     sprintf(
7782     'SELECT
7783     to_char(date_envoi_rar, \'DD/MM/YYYY\') as date_envoi_rar,
7784     instruction
7785     FROM
7786     %1$sinstruction
7787     WHERE
7788     code_barres = \'%2$s\'',
7789     DB_PREFIXE,
7790     $this->f->db->escapeSimple($code_barres)
7791     ),
7792     array(
7793     'origin' => __METHOD__
7794     )
7795     );
7796     $row = array_shift($qres['result']);
7797 mbroquet 3730 // Si pas de date ou correspond à la date du formulaire on
7798     // effectue le traitement
7799     if ($row["date_envoi_rar"] == "" || $row["date_envoi_rar"] == $date) {
7800 softime 7996 $instr = $this->f->get_inst__om_dbform(array(
7801     "obj" => "instruction",
7802     "idx" => $row['instruction'],
7803     ));
7804 mbroquet 3730 $valF = array();
7805     foreach($instr->champs as $id => $champ) {
7806     $valF[$champ] = $instr->val[$id];
7807     }
7808 softime 5504
7809     # Si on peut consulter les dossiers et que le dossier n'existe pas déjà dans la liste
7810     if ($isAccredited === true
7811     && array_key_exists($instr->getVal("dossier"), $dossierTab) === false) {
7812 softime 7996 $dossier = $this->f->get_inst__om_dbform(array(
7813     "obj" => "dossier",
7814     "idx" => $instr->getVal("dossier"),
7815     ));
7816 softime 5504 if ($dossier->is_user_from_allowed_collectivite()){
7817     $dossierTab[$instr->getVal("dossier")] = $dossier;
7818     } else {
7819     $hasHidden = true;
7820     }
7821     }
7822    
7823 mbroquet 3730 $valF['date_evenement']=
7824     $instr->dateDBToForm($valF['date_evenement']);
7825     $valF['archive_date_complet']=
7826     $instr->dateDBToForm($valF['archive_date_complet']);
7827     $valF['archive_date_rejet']=
7828     $instr->dateDBToForm($valF['archive_date_rejet']);
7829     $valF['archive_date_limite']=
7830     $instr->dateDBToForm($valF['archive_date_limite']);
7831     $valF['archive_date_notification_delai']=
7832     $instr->dateDBToForm($valF['archive_date_notification_delai']);
7833     $valF['archive_date_decision']=
7834     $instr->dateDBToForm($valF['archive_date_decision']);
7835     $valF['archive_date_validite']=
7836     $instr->dateDBToForm($valF['archive_date_validite']);
7837     $valF['archive_date_achevement']=
7838     $instr->dateDBToForm($valF['archive_date_achevement']);
7839     $valF['archive_date_chantier']=
7840     $instr->dateDBToForm($valF['archive_date_chantier']);
7841     $valF['archive_date_conformite']=
7842     $instr->dateDBToForm($valF['archive_date_conformite']);
7843     $valF['archive_date_dernier_depot']=
7844     $instr->dateDBToForm($valF['archive_date_dernier_depot']);
7845     $valF['archive_date_limite_incompletude']=
7846     $instr->dateDBToForm($valF['archive_date_limite_incompletude']);
7847     $valF['date_finalisation_courrier']=
7848     $instr->dateDBToForm($valF['date_finalisation_courrier']);
7849     $valF['date_envoi_signature']=
7850     $instr->dateDBToForm($valF['date_envoi_signature']);
7851     $valF['date_retour_signature']=
7852     $instr->dateDBToForm($valF['date_retour_signature']);
7853     $valF['date_envoi_rar']=
7854     $instr->dateDBToForm($valF['date_envoi_rar']);
7855     $valF['date_retour_rar']=
7856     $instr->dateDBToForm($valF['date_retour_rar']);
7857     $valF['date_envoi_controle_legalite']=
7858     $instr->dateDBToForm($valF['date_envoi_controle_legalite']);
7859     $valF['date_retour_controle_legalite']=
7860     $instr->dateDBToForm($valF['date_retour_controle_legalite']);
7861     $valF['date_envoi_rar'] = $date;
7862    
7863     // Vérification de la finalisation du document
7864     // correspondant au code barres
7865     if($instr->getVal("om_final_instruction") === 't') {
7866     $instr->setParameter('maj', 1);
7867 nmeucci 3971 $instr->class_actions[1]["identifier"] =
7868     "envoi lettre RAR (depuis le menu suivi des pièces)";
7869 softime 8989 if ($instr->modifier($valF) == true) {
7870 mbroquet 3730 $id4Gen[] = $code_barres;
7871     $nbLettres ++;
7872     } else {
7873     //
7874     if ($error != "") {
7875     $error .= "<br/>";
7876     }
7877     $error .= sprintf(_("Une erreur s'est produite lors de la modification de l'instruction %s."),
7878     $code_barres);
7879     $error .= " ";
7880     $error .= _("Veuillez contacter votre administrateur.");
7881     }
7882     } else {
7883     //
7884     if ($error != "") {
7885     $error .= "<br/>";
7886     }
7887     $error .= sprintf(_("Le document correspondant au
7888     code barres %s n'est pas finalise,
7889     le bordereau ne sera pas genere."),
7890     $code_barres);
7891     }
7892    
7893     } else {
7894     //
7895     if ($error != "") {
7896     $error .= "<br/>";
7897     }
7898     $error .= _("Une lettre correspondante a l'instruction ayant pour code barres")." ".$code_barres." "._("a deja ete envoyee, le bordereau ne sera pas genere.");
7899     }
7900     } else {
7901     //
7902     if ($error != "") {
7903     $error .= "<br/>";
7904     }
7905     $error .= _("Le numero")." ".$code_barres." "._("ne correspond a aucun code barres d'instruction.");
7906     }
7907     } else {
7908     //
7909     if ($error != "") {
7910     $error .= "<br/>";
7911     }
7912     $error .= _("Le code barres d'instruction")." ".$code_barres." "._("n'est pas valide.");
7913     }
7914     }
7915     }
7916     }
7917     }
7918    
7919     /**
7920     * Affichage des messages et du formulaire
7921     */
7922     // Affichage du message de validation ou d'erreur
7923     if (isset($message) && isset($message_class) && $message != "") {
7924 softime 8989 $this->f->displayMessage($message_class, $message);
7925 mbroquet 3730 }
7926     // Affichage du message d'erreur
7927     if(!empty($error)) {
7928 softime 8989 $this->f->displayMessage("error", $error);
7929 mbroquet 3730 }
7930     // Affichage du message de validation de la saisie
7931     if ($nbLettres > 0) {
7932     //
7933 softime 5504 echo "\n<div class=\"message ui-widget ui-corner-all ui-state-highlight ui-state-valid\" >";
7934     echo "\n<p>";
7935     echo "\n<span class=\"ui-icon ui-icon-info\"></span>";
7936     echo "\n<span class=\"text\">";
7937     echo _("Cliquez sur le lien ci-dessous pour telecharger votre document");
7938     echo " : \n<br/><br/>";
7939     echo "\n<a class='om-prev-icon pdf-16'";
7940 softime 8989 echo "\n title=\""._("imprimer les AR")."\"";
7941 softime 7996 echo "\n href=\"".OM_ROUTE_FORM."&obj=instruction&action=180&idx=0&liste=".implode(",",$id4Gen)."\"";
7942 softime 5504 echo "\n target='_blank'>";
7943 softime 8989 echo _("Telecharger le document pour")." ".$nbLettres." "._("AR");
7944 softime 5504 echo "\n</a>";
7945     echo "\n</span>";
7946     echo "\n</p>";
7947     echo "\n<br/>\n";
7948     if ($isAccredited === true) {
7949     echo '<fieldset id="fieldset-form-rar-lien_di" class="cadre ui-corner-all startClosed" style="background-color: inherite;">';
7950     echo "\n<legend class=\"ui-corner-all ui-widget-content ui-state-active\" style=\"background-color: transparent; color: inherit;\">\n";
7951     echo _('Dossiers concernés par ce traitement');
7952     echo "\n</legend>";
7953     echo "\n<div class=\"fieldsetContent\" style=\"display: none;background-color: inherite\">";
7954    
7955     if ($hasHidden === true) {
7956     echo "\n<br/>";
7957     echo "\n<p>";
7958     echo "\n<span class='text'>";
7959     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.");
7960     echo "</span>";
7961     echo "\n</p>";
7962     echo "\n<br/>";
7963     }
7964     foreach ($dossierTab as $dossier) {
7965 softime 7067
7966     $inst_da = $this->get_inst_common("dossier_autorisation", $dossier->getVal('dossier_autorisation'));
7967     $inst_datd = $this->get_inst_common("dossier_autorisation_type_detaille", $inst_da->getVal('dossier_autorisation_type_detaille'));
7968     $code_datd = $inst_datd->getVal('code');
7969    
7970     $obj = "dossier_instruction";
7971     if ($code_datd === 'REC' OR $code_datd === 'REG') {
7972     $obj = "dossier_contentieux_tous_recours";
7973     }
7974     if ($code_datd === 'IN') {
7975     $obj = "dossier_contentieux_toutes_infractions";
7976     }
7977    
7978 softime 5504 echo "\n<div class=\"bloc group\">";
7979     echo "\n<div class=\"field field-type-text\">";
7980    
7981     echo "\n<p>";
7982     echo "\n<span class='text'>";
7983     echo "\n<a class=\"om-icon om-icon-16 consult-16\" title=\"" . _('Consulter') . "\"";
7984 softime 7996 echo "\n href=\"".OM_ROUTE_FORM."&obj=dossier_instruction&action=3&idx=";
7985 softime 5504 echo $dossier->getVal("dossier");
7986     echo "\">";
7987     echo "\n</a>";
7988    
7989     echo "\n<a title=\""._("Consulter")."\" style=\"vertical-align:middle;\"";
7990 softime 7996 echo " href=\"".OM_ROUTE_FORM."&obj=";
7991 softime 7067 echo $obj;
7992     echo "&action=3&idx=";
7993 softime 5504 echo $dossier->getVal("dossier");
7994     echo "\">";
7995     echo $dossier->getVal("dossier_libelle");
7996     echo "\n</a>";
7997     echo "\n</span>";
7998     echo "\n</p>";
7999    
8000     echo "\n</div>";
8001     echo "\n</div>";
8002     }
8003     echo "\n</div>";
8004     echo "\n</fieldset>";
8005     }
8006     echo "\n</div>";
8007     echo "\n</div>";
8008 mbroquet 3730 }
8009     // Ouverture du formulaire
8010     echo "\t<form";
8011     echo " method=\"post\"";
8012     echo " id=\"suivi_envoi_lettre_rar_form\"";
8013     echo " action=\"\"";
8014     echo ">\n";
8015     // Paramétrage des champs du formulaire
8016     $champs = array("date", "liste_code_barres_instruction");
8017     // Création d'un nouvel objet de type formulaire
8018 softime 7996 $form = $this->f->get_inst__om_formulaire(array(
8019     "validation" => 0,
8020     "maj" => 0,
8021     "champs" => $champs,
8022     ));
8023 mbroquet 3730 // Paramétrage du champ date du formulaire
8024     $form->setLib("date", _("Date")."* :");
8025     $form->setType("date", "date");
8026     $form->setOnchange("date", "fdate(this)");
8027     $form->setVal("date", ($date == "" ? date("d/m/Y") : $date));
8028     $form->setTaille("date", 10);
8029     $form->setMax("date", 10);
8030     // Paramétrage du champ liste_code_barres_instruction du formulaire
8031     $form->setLib("liste_code_barres_instruction", _("Liste des codes barres d'instructions scannes")."* :");
8032     $form->setType("liste_code_barres_instruction", "textarea");
8033     $form->setVal("liste_code_barres_instruction", $liste_code_barres_instruction);
8034     $form->setTaille("liste_code_barres_instruction", 20);
8035     $form->setMax("liste_code_barres_instruction", 20);
8036     // Affichage du formulaire
8037     $form->entete();
8038     $form->afficher($champs, 0, false, false);
8039     $form->enpied();
8040     // Affichage du bouton
8041     echo "\t<div class=\"formControls\">\n";
8042 softime 8989 $this->f->layout->display_form_button(array("value" => _("Valider"), "name" => "validation"));
8043 mbroquet 3730 echo "\t</div>\n";
8044     // Fermeture du formulaire
8045     echo "\t</form>\n";
8046     }
8047    
8048     /**
8049     * VIEW - view_suivi_mise_a_jour_des_dates.
8050     *
8051     * Vu pour mettre à jour les dates de suivi de l'instruction.
8052     *
8053     * @return void
8054     */
8055     function view_suivi_mise_a_jour_des_dates() {
8056     // Vérification de l'accessibilité sur l'élément
8057     $this->checkAccessibility();
8058    
8059     // Récupération des valeur passées en POST ou GET
8060 softime 8989 if($this->f->get_submitted_post_value("type_mise_a_jour") !== null) {
8061     $type_mise_a_jour = $this->f->get_submitted_post_value("type_mise_a_jour");
8062     } elseif($this->f->get_submitted_get_value('type_mise_a_jour') !== null) {
8063     $type_mise_a_jour = $this->f->get_submitted_get_value('type_mise_a_jour');
8064 mbroquet 3730 } else {
8065     $type_mise_a_jour = "";
8066     }
8067 softime 8989 if($this->f->get_submitted_post_value('date') !== null) {
8068     $date = $this->f->get_submitted_post_value('date');
8069     } elseif($this->f->get_submitted_get_value('date') !== null) {
8070     $date = $this->f->get_submitted_get_value('date');
8071 mbroquet 3730 } else {
8072     $date = "";
8073     }
8074 softime 8989 if($this->f->get_submitted_post_value('code_barres') !== null) {
8075     $code_barres = $this->f->get_submitted_post_value('code_barres');
8076     } elseif($this->f->get_submitted_get_value('code_barres') !== null) {
8077     $code_barres = $this->f->get_submitted_get_value('code_barres');
8078 mbroquet 3730 } else {
8079     $code_barres = "";
8080     }
8081     // Booléen permettant de définir si un enregistrement à eu lieu
8082     $correct = false;
8083     // Booléen permettant de définir si les dates peuvent êtres enregistrées
8084     $date_error = false;
8085     // Champs date à mettre à jour
8086     $liste_champs=array();
8087    
8088     // Si le formulaire a été validé
8089 softime 8989 if ($this->f->get_submitted_post_value('validation') !== null) {
8090 mbroquet 3730 if(!empty($type_mise_a_jour) and !empty($date) and !empty($code_barres)) {
8091    
8092 softime 7067 // Ajout d'un filtre sur les groupes auxquels l'utilisateur a accès
8093     $group_clause = array();
8094     foreach ($_SESSION["groupe"] as $key => $value) {
8095     $group_clause[$key] = "(groupe.code = '".$key."'";
8096     if($value["confidentiel"] !== true) {
8097     $group_clause[$key] .= " AND dossier_autorisation_type.confidentiel IS NOT TRUE";
8098     }
8099     $group_clause[$key] .= ")";
8100     }
8101     $conditions = implode(" OR ", $group_clause);
8102 softime 14542 $groupFilter = " AND (" . $conditions . ")";
8103 softime 7067
8104 softime 14542 $qres = $this->f->get_all_results_from_db_query(
8105     sprintf(
8106     'SELECT
8107     instruction
8108     FROM
8109     %1$sinstruction
8110     INNER JOIN %1$sdossier
8111     ON dossier.dossier = instruction.dossier
8112     INNER JOIN %1$sdossier_instruction_type
8113     ON dossier.dossier_instruction_type = dossier_instruction_type.dossier_instruction_type
8114     INNER JOIN %1$sdossier_autorisation_type_detaille
8115     ON dossier_instruction_type.dossier_autorisation_type_detaille = dossier_autorisation_type_detaille.dossier_autorisation_type_detaille
8116     INNER JOIN %1$sdossier_autorisation_type
8117     ON dossier_autorisation_type_detaille.dossier_autorisation_type = dossier_autorisation_type.dossier_autorisation_type
8118     INNER JOIN %1$sgroupe
8119     ON dossier_autorisation_type.groupe = groupe.groupe
8120     WHERE
8121     code_barres = \'%2$s\'
8122     %3$s',
8123     DB_PREFIXE,
8124     $this->f->db->escapeSimple($code_barres),
8125     $groupFilter
8126     ),
8127     array(
8128     'origin' => __METHOD__
8129     )
8130     );
8131 softime 15835 if($qres['row_count'] === 1) {
8132 mbroquet 3730 $liste_champs = explode(";", $type_mise_a_jour);
8133 softime 14542 $row = array_shift($qres['result']);
8134 softime 11418 $instr = $this->f->get_inst__om_dbform(array(
8135     "obj" => "instruction",
8136     "idx" => $row['instruction'],
8137     ));
8138 mbroquet 3730 // Mise à jour des dates après l'écran de verification
8139 softime 8989 if($this->f->get_submitted_post_value('is_valid') !== null and $this->f->get_submitted_post_value('is_valid') == "true") {
8140 mbroquet 3730 $valF = array();
8141     foreach($instr->champs as $id => $champ) {
8142     $valF[$champ] = $instr->val[$id];
8143     }
8144 softime 6565 $valF['date_evenement'] = $instr->dateDBToForm($valF['date_evenement']);
8145     $valF['archive_date_complet'] = $instr->dateDBToForm($valF['archive_date_complet']);
8146     $valF['archive_date_rejet'] = $instr->dateDBToForm($valF['archive_date_rejet']);
8147     $valF['archive_date_limite'] = $instr->dateDBToForm($valF['archive_date_limite']);
8148     $valF['archive_date_notification_delai'] = $instr->dateDBToForm($valF['archive_date_notification_delai']);
8149     $valF['archive_date_decision'] = $instr->dateDBToForm($valF['archive_date_decision']);
8150     $valF['archive_date_validite'] = $instr->dateDBToForm($valF['archive_date_validite']);
8151     $valF['archive_date_achevement'] = $instr->dateDBToForm($valF['archive_date_achevement']);
8152     $valF['archive_date_chantier'] = $instr->dateDBToForm($valF['archive_date_chantier']);
8153     $valF['archive_date_conformite'] = $instr->dateDBToForm($valF['archive_date_conformite']);
8154     $valF['archive_date_dernier_depot'] = $instr->dateDBToForm($valF['archive_date_dernier_depot']);
8155     $valF['archive_date_limite_incompletude'] = $instr->dateDBToForm($valF['archive_date_limite_incompletude']);
8156     $valF['date_finalisation_courrier'] = $instr->dateDBToForm($valF['date_finalisation_courrier']);
8157     $valF['date_envoi_signature'] = $instr->dateDBToForm($valF['date_envoi_signature']);
8158     $valF['date_retour_signature'] = $instr->dateDBToForm($valF['date_retour_signature']);
8159     $valF['date_envoi_rar'] = $instr->dateDBToForm($valF['date_envoi_rar']);
8160     $valF['date_retour_rar'] = $instr->dateDBToForm($valF['date_retour_rar']);
8161     $valF['date_envoi_controle_legalite'] = $instr->dateDBToForm($valF['date_envoi_controle_legalite']);
8162     $valF['date_retour_controle_legalite'] = $instr->dateDBToForm($valF['date_retour_controle_legalite']);
8163     $valF['archive_date_cloture_instruction'] = $instr->dateDBToForm($valF['archive_date_cloture_instruction']);
8164     $valF['archive_date_premiere_visite'] = $instr->dateDBToForm($valF['archive_date_premiere_visite']);
8165     $valF['archive_date_derniere_visite'] = $instr->dateDBToForm($valF['archive_date_derniere_visite']);
8166     $valF['archive_date_contradictoire'] = $instr->dateDBToForm($valF['archive_date_contradictoire']);
8167     $valF['archive_date_retour_contradictoire'] = $instr->dateDBToForm($valF['archive_date_retour_contradictoire']);
8168     $valF['archive_date_ait'] = $instr->dateDBToForm($valF['archive_date_ait']);
8169     $valF['archive_date_transmission_parquet'] = $instr->dateDBToForm($valF['archive_date_transmission_parquet']);
8170 mbroquet 3730
8171     foreach(explode(";", $type_mise_a_jour) as $maj_date) {
8172     $valF[$maj_date]=$date;
8173     }
8174    
8175     // Vérification de la finalisation du document
8176     // correspondant au code barres
8177     if($valF["om_final_instruction"] === 't' or
8178     $valF["lettretype"] == '') {
8179     $code_barres = "";
8180    
8181     //Désactivation de l'autocommit
8182 softime 8989 $this->f->db->autoCommit(false);
8183 mbroquet 3730
8184     //On modifie les valeurs de l'instruction
8185     $instr->setParameter('maj', 170);
8186 nmeucci 3965 $instr->class_actions[170]["identifier"] =
8187 nmeucci 3972 "mise à jour des dates (depuis le menu suivi des pièces)";
8188 softime 8989 $retour = $instr->modifier($valF);
8189 mbroquet 3730
8190     //Si une erreur s'est produite, on défait les modifications
8191     //qui ont été faites
8192     if (!$retour){
8193     $instr->undoValidation();
8194     }
8195     //Sinon, on valide en base de données les modifications
8196     else {
8197 softime 8989 $this->f->db->commit();
8198 mbroquet 3730 }
8199    
8200     // Variable correct retourné depuis la classe instruction
8201     $correct = $instr->correct;
8202    
8203     // Si la modification sur l'instruction a échoué
8204     if ($correct === false) {
8205    
8206     // Message d'erreur de la classe instruction
8207     $error = $instr->msg;
8208     }
8209    
8210     } else {
8211     // Indique que le traitement est en erreur
8212     $correct = false;
8213     // Message d'erreur
8214     $error = sprintf(_("Le document n'est pas finalise."),
8215     "<span class='bold'>".$code_barres."</span>");
8216     }
8217     } else {
8218     // Récupération des infos du dossier
8219 softime 14542 $qres = $this->f->get_all_results_from_db_query(
8220     sprintf(
8221     'SELECT
8222     dossier.dossier_libelle,
8223     evenement.libelle as evenement,
8224     autorite_competente.code as autorite_competente_code,
8225     autorite_competente.libelle as autorite_competente,
8226     evenement.type as evenement_type,
8227     to_char(date_envoi_signature,\'DD/MM/YYYY\') as date_envoi_signature,
8228     to_char(date_retour_signature,\'DD/MM/YYYY\') as date_retour_signature,
8229     to_char(date_envoi_controle_legalite,\'DD/MM/YYYY\') as date_envoi_controle_legalite,
8230     to_char(date_retour_controle_legalite,\'DD/MM/YYYY\') as date_retour_controle_legalite,
8231     to_char(date_envoi_rar,\'DD/MM/YYYY\') as date_envoi_rar,
8232     to_char(date_retour_rar,\'DD/MM/YYYY\') as date_retour_rar
8233     FROM
8234     %1$sinstruction
8235     INNER JOIN %1$sdossier
8236     ON dossier.dossier=instruction.dossier
8237     LEFT JOIN %1$sautorite_competente
8238     ON dossier.autorite_competente=autorite_competente.autorite_competente
8239     INNER JOIN %1$sevenement
8240     ON instruction.evenement=evenement.evenement
8241     WHERE
8242     code_barres = \'%2$s\'',
8243     DB_PREFIXE,
8244     $this->f->db->escapeSimple($code_barres)
8245     ),
8246     array(
8247     "origin" => __METHOD__
8248     )
8249     );
8250     $infos = array_shift($qres['result']);
8251 mbroquet 3730
8252     // Vérification de la non modification des dates de suivi
8253     foreach(explode(";", $type_mise_a_jour) as $champ) {
8254 softime 11418 if ($champ === 'date_envoi_controle_legalite') {
8255     if ($instr->is_sent_to_cl() === true) {
8256     $error = __("Les dates de suivis ne peuvent etre modifiees");
8257     $date_error = true;
8258     break;
8259     }
8260     }
8261 mbroquet 3730 if($infos[$champ] != "" AND $infos[$champ] != $date) {
8262     $error = _("Les dates de suivis ne peuvent etre modifiees");
8263     $date_error = true;
8264 softime 11418 break;
8265 mbroquet 3730 }
8266     }
8267     }
8268     } else {
8269     $error = _("Le numero saisi ne correspond a aucun code barres d'instruction.");
8270     }
8271    
8272     } else {
8273     $error = _("Tous les champs doivent etre remplis.");
8274     }
8275     }
8276    
8277     /**
8278     * Affichage des messages et du formulaire
8279     */
8280     // Affichage du message de validation ou d'erreur
8281     if (isset($message) && isset($message_class) && $message != "") {
8282 softime 8989 $this->f->displayMessage($message_class, $message);
8283 mbroquet 3730 }
8284     // Affichage du message d'erreur
8285     if(!empty($error)) {
8286 softime 8989 $this->f->displayMessage("error", $error);
8287 mbroquet 3730 }
8288    
8289     // Affichage du message de validation de la saisie
8290     if($correct === true) {
8291 softime 8989 $this->f->displayMessage("ok", _("Saisie enregistree"));
8292 mbroquet 3730 }
8293     // Ouverture du formulaire
8294     echo "\t<form";
8295     echo " method=\"post\"";
8296     echo " id=\"suivi_mise_a_jour_des_dates_form\"";
8297     echo " action=\"\"";
8298     echo ">\n";
8299     // Paramétrage des champs du formulaire
8300     if(isset($infos)) {
8301     $champs = array("type_mise_a_jour", "date", "code_barres", "dossier_libelle", "evenement"
8302     , "autorite_competente", "date_envoi_signature",
8303     "date_retour_signature", "date_envoi_controle_legalite",
8304     "date_retour_controle_legalite", "date_envoi_rar",
8305     "date_retour_rar", "is_valid");
8306     } else {
8307     $champs = array("type_mise_a_jour", "date", "code_barres");
8308     }
8309     // Création d'un nouvel objet de type formulaire
8310 softime 7996 $form = $this->f->get_inst__om_formulaire(array(
8311     "validation" => 0,
8312     "maj" => 0,
8313     "champs" => $champs,
8314     ));
8315 mbroquet 3730 // Paramétrage des champs du formulaire
8316     // Parametrage du champ type_mise_a_jour
8317     $form->setLib("type_mise_a_jour", _("Date a mettre a jour")."* :");
8318     if(isset($infos)) {
8319     $form->setType("type_mise_a_jour", "selecthiddenstatic");
8320    
8321     } else {
8322     $form->setType("type_mise_a_jour", "select");
8323    
8324     }
8325     $form->setVal("type_mise_a_jour", $type_mise_a_jour);
8326     $contenu = array();
8327    
8328     $contenu[0][0] = "date_envoi_signature";
8329     $contenu[1][0] = _("date d'envoi pour signature Mairie/Prefet");
8330    
8331     $contenu[0][1] = "date_retour_signature";
8332     $contenu[1][1] = _("date de retour de signature Mairie/Prefet");
8333    
8334     $contenu[0][2] = "date_retour_signature;date_envoi_controle_legalite";
8335     $contenu[1][2] = _("date de retour de signature + Envoi controle legalite");
8336    
8337     $contenu[0][3] = "date_envoi_controle_legalite";
8338     $contenu[1][3] = _("date d'envoi au controle de legalite");
8339    
8340     $contenu[0][4] = "date_retour_controle_legalite";
8341     $contenu[1][4] = _("date de retour de controle de legalite");
8342    
8343     $contenu[0][5] = "date_retour_rar";
8344 softime 8989 $contenu[1][5] = __("date de notification du correspondant");
8345 mbroquet 3730
8346     $form->setSelect("type_mise_a_jour", $contenu);
8347    
8348     // Parametrage du champ date
8349     $form->setLib("date", _("Date")."* :");
8350     if(isset($infos)) {
8351     $form->setType("date", "hiddenstaticdate");
8352    
8353     } else {
8354     $form->setType("date", "date");
8355     }
8356     $form->setVal("date", $date);
8357     $form->setTaille("date", 10);
8358     $form->setMax("date", 10);
8359    
8360     // Parametrage du champ code_barres
8361     $form->setLib("code_barres", _("Code barres d'instruction")."* :");
8362     if(isset($infos)) {
8363     $form->setType("code_barres", "hiddenstatic");
8364     } else {
8365     $form->setType("code_barres", "text");
8366     }
8367     $form->setVal("code_barres", $code_barres);
8368     $form->setTaille("code_barres", 20);
8369     $form->setMax("code_barres", 20);
8370    
8371     // Ajout des infos du dossier correspondantes à l'instruction séléctionnée
8372     if(isset($infos)) {
8373    
8374     // Tous les champs sont défini par defaut à static
8375     foreach ($infos as $key => $value) {
8376     $form->setType($key, "static");
8377     if(in_array($key, $liste_champs)) {
8378     $form->setVal($key, $date);
8379     } else {
8380     $form->setVal($key, $value);
8381     }
8382     }
8383    
8384     // Les champs dont on viens de définir la valeur sont en gras
8385     foreach ($liste_champs as $value) {
8386     $form->setBloc($value,'DF',"",'bold');
8387     }
8388    
8389     // Parametrage du champ dossier
8390     $form->setLib("dossier_libelle", _("dossier_libelle")." :");
8391     $form->setType("dossier_libelle", "static");
8392     $form->setVal("dossier_libelle", $infos['dossier_libelle']);
8393    
8394     // Parametrage du champ evenement
8395     $form->setLib("evenement", _("evenement")." :");
8396     $form->setType("evenement", "static");
8397     $form->setVal("evenement", $infos['evenement']);
8398    
8399     // Parametrage du champ autorite_competente
8400     $form->setLib("autorite_competente", _("Autorite competente")." :");
8401     $form->setType("autorite_competente", "static");
8402     $form->setVal("autorite_competente", $infos['autorite_competente']);
8403    
8404 softime 8989 // Parametrage des libellés d'envoi avec AR
8405     $form->setLib("date_envoi_rar", __("date_envoi_ar")." :");
8406     $form->setLib("date_retour_rar", __("date_notification")." :");
8407 mbroquet 3730
8408     $form->setLib("date_envoi_signature", _("date_envoi_signature")." :");
8409     $form->setLib("date_retour_signature", _("date_retour_signature")." :");
8410     $form->setLib("date_envoi_controle_legalite", _("date_envoi_controle_legalite")." :");
8411     $form->setLib("date_retour_controle_legalite", _("date_retour_controle_legalite")." :");
8412     // Configuration des libellé en fonction de l'autorité compétente
8413     if($infos['autorite_competente_code'] == 'ETAT') {
8414     $form->setType("date_envoi_controle_legalite", "hiddendate");
8415     $form->setType("date_retour_controle_legalite", "hiddendate");
8416     }
8417    
8418     // Ajout d'un champ hidden permettant de savoir que le formulaire précédant est celui de vérification
8419     $form->setLib("is_valid", _("Valide")." :");
8420     $form->setType("is_valid", "hidden");
8421     $form->setVal("is_valid", 'true');
8422    
8423     $form->setFieldset('dossier_libelle','D',_('Synthese'));
8424     $form->setFieldset('is_valid','F');
8425    
8426     }
8427    
8428    
8429     // Création du fieldset regroupant les champs permettant la mise à jour des date
8430     $form->setFieldset('type_mise_a_jour','D',_('Mise a jour'));
8431     $form->setFieldset('code_barres','F');
8432     // Affichage du formulaire
8433     $form->entete();
8434     $form->afficher($champs, 0, false, false);
8435     $form->enpied();
8436     // Affichage du bouton
8437     echo "\t<div class=\"formControls\">\n";
8438     //
8439     if(!$date_error) {
8440 softime 8989 $this->f->layout->display_form_button(array("value" => _("Valider"), "name" => "validation"));
8441 mbroquet 3730 }
8442     // Si pas sur l'écran de validation
8443     if(isset($infos)) {
8444 softime 7996 echo "<a class=\"retour\" href=\"".OM_ROUTE_FORM."&obj=instruction_suivi_mise_a_jour_des_dates&action=170&idx=0";
8445 mbroquet 3730 echo "&amp;type_mise_a_jour=".$type_mise_a_jour."&amp;date=".$date."&amp;code_barres=".$code_barres;
8446     echo "\">Retour</a>";
8447     }
8448     echo "\t</div>\n";
8449     // Fermeture du formulaire
8450     echo "\t</form>\n";
8451     }
8452    
8453     /**
8454     * [view_pdf_lettre_rar description]
8455     *
8456     * @return [type] [description]
8457     */
8458     function view_pdf_lettre_rar() {
8459     // Vérification de l'accessibilité sur l'élément
8460     $this->checkAccessibility();
8461 softime 8989 //
8462     $this->f->disableLog();
8463 mbroquet 3730
8464 softime 8989 if($this->f->get_submitted_get_value('liste') != null) {
8465     $listeCodeBarres = explode(',',$this->f->get_submitted_get_value('liste'));
8466 mbroquet 3730
8467     // Classe permettant la mise en page de l'édition pdf
8468     require_once "../obj/pdf_lettre_rar.class.php";
8469     $pdf_lettre_rar = new pdf_lettre_rar('P', 'mm', 'A4');
8470     // Initialisation de la mise en page
8471 softime 8989 $pdf_lettre_rar->init($this->f);
8472 mbroquet 3730
8473     foreach ($listeCodeBarres as $code_barres) {
8474    
8475 softime 7067 // On récupère le dossier
8476 softime 14064 $qres = $this->f->get_one_result_from_db_query(
8477     sprintf(
8478     'SELECT
8479     dossier
8480     FROM
8481     %1$sinstruction
8482     WHERE
8483     code_barres = \'%2$s\'',
8484     DB_PREFIXE,
8485     $this->f->db->escapeSimple($code_barres)
8486     ),
8487     array(
8488     "origin" => __METHOD__,
8489     )
8490     );
8491    
8492 softime 7996 $inst_dossier = $this->f->get_inst__om_dbform(array(
8493     "obj" => "dossier",
8494 softime 14064 "idx" => $qres['result'],
8495 softime 7996 ));
8496 softime 7067
8497     // En fonction du type de dossier, on récupère un demandeur différent dans les requêtes
8498     $groupe = $inst_dossier->get_type_affichage_formulaire();
8499     switch ($groupe) {
8500     case 'CTX IN':
8501     $sql_demandeur = "(lien_dossier_demandeur.petitionnaire_principal IS TRUE AND demandeur.type_demandeur='plaignant')";
8502     break;
8503     case 'CTX RE':
8504     $sql_demandeur = "(lien_dossier_demandeur.petitionnaire_principal IS TRUE AND demandeur.type_demandeur='requerant')";
8505     break;
8506     case 'ADS':
8507     case 'DPC':
8508 softime 10573 case 'CONSULTATION ENTRANTE':
8509 softime 7067 default:
8510     $sql_demandeur = "((lien_dossier_demandeur.petitionnaire_principal IS TRUE AND demandeur.type_demandeur='petitionnaire') OR demandeur.type_demandeur='delegataire')";
8511     break;
8512     }
8513    
8514 mbroquet 3730 // Test si l'evenement est de type arrete et si un délégataire a été nommé
8515 softime 14542 $qres = $this->f->get_all_results_from_db_query(
8516     sprintf(
8517     'SELECT
8518 mbroquet 3730 dossier.dossier_libelle,
8519     evenement.type,
8520 softime 3834 count(lien_dossier_demandeur) as nbdemandeur,
8521     CASE
8522     WHEN division.libelle IS NOT NULL AND phase.code IS NOT NULL
8523 softime 14542 THEN CONCAT(phase.code, \' - \', division.libelle)
8524 softime 3834 ELSE
8525     phase.code
8526     END AS code_phase
8527 softime 14542 FROM
8528     %1$sinstruction
8529     LEFT JOIN %1$sdossier
8530     ON instruction.dossier = dossier.dossier
8531     LEFT JOIN %1$sdivision
8532     ON dossier.division = division.division
8533     INNER JOIN %1$sevenement
8534     ON instruction.evenement=evenement.evenement
8535     LEFT JOIN %1$sphase
8536     ON evenement.phase = phase.phase
8537     inner JOIN %1$slien_dossier_demandeur
8538     ON instruction.dossier=lien_dossier_demandeur.dossier
8539     inner join %1$sdemandeur
8540     ON demandeur.demandeur=lien_dossier_demandeur.demandeur
8541     WHERE
8542     code_barres = \'%2$s\'
8543     AND %3$s
8544     GROUP BY
8545     dossier.dossier_libelle,
8546     evenement.type,
8547     phase.code,
8548     division.libelle',
8549     DB_PREFIXE,
8550     $this->f->db->escapeSimple($code_barres),
8551     $sql_demandeur
8552     ),
8553     array(
8554     "origin" => __METHOD__
8555     )
8556     );
8557     $testDemandeur = array_shift($qres['result']);
8558 mbroquet 3730
8559    
8560     // Recuperation de l'adresse de destination
8561     // Envoi pour delegataire ou petitionnaire principal selon le type d'evenement
8562 softime 14542 $sqlAdresse = " AND demandeur.type_demandeur='petitionnaire' AND lien_dossier_demandeur.petitionnaire_principal IS TRUE";
8563 mbroquet 3730 if($testDemandeur['type'] != 'arrete' AND $testDemandeur['nbdemandeur'] > 1) {
8564 softime 14542 $sqlAdresse = " AND demandeur.type_demandeur='delegataire'";
8565 mbroquet 3730 }
8566    
8567 softime 14542 $qres = $this->f->get_all_results_from_db_query(
8568     sprintf(
8569     'SELECT
8570     CASE WHEN demandeur.qualite = \'particulier\'
8571     THEN TRIM(CONCAT_WS(\' \', pc.libelle, demandeur.particulier_nom, demandeur.particulier_prenom))
8572     ELSE TRIM(demandeur.personne_morale_denomination)
8573     END as ligne1,
8574     CASE WHEN demandeur.qualite = \'personne_morale\'
8575     THEN TRIM(demandeur.personne_morale_raison_sociale)
8576     ELSE \'\'
8577     END as ligne1_1,
8578     CASE WHEN demandeur.qualite = \'personne_morale\' AND (demandeur.personne_morale_nom IS NOT NULL OR demandeur.personne_morale_prenom IS NOT NULL)
8579     THEN TRIM(CONCAT_WS(\' \', \'rep. par\', demandeur.personne_morale_nom, demandeur.personne_morale_prenom))
8580     ELSE \'\'
8581     END as ligne1_2,
8582     trim(concat(demandeur.numero,\' \',demandeur.voie)) as ligne2,
8583     CASE demandeur.complement
8584     WHEN null THEN \'\'
8585     ELSE trim(demandeur.complement)
8586     END as ligne3,
8587     CASE demandeur.lieu_dit
8588     WHEN null THEN \'\'
8589     ELSE trim(demandeur.lieu_dit)
8590     END as ligne4,
8591     CONCAT_WS(\' \', demandeur.code_postal, demandeur.localite,
8592     (CASE WHEN demandeur.bp IS NOT NULL
8593     THEN CONCAT_WS(\' \', \'BP\', demandeur.bp)
8594     ELSE \'\'
8595     END),
8596     (CASE WHEN demandeur.cedex IS NOT NULL
8597     THEN CONCAT_WS(\' \', \'CEDEX\', demandeur.cedex)
8598     ELSE \'\'
8599     END))
8600     as ligne5,
8601     code_barres as code_barres
8602     FROM
8603     %1$sinstruction
8604     INNER JOIN %1$sdossier
8605     ON dossier.dossier = instruction.dossier
8606     INNER JOIN %1$slien_dossier_demandeur
8607     ON dossier.dossier = lien_dossier_demandeur.dossier
8608     INNER JOIN %1$sdemandeur
8609     ON lien_dossier_demandeur.demandeur = demandeur.demandeur
8610     LEFT OUTER JOIN %1$scivilite AS pc
8611     ON demandeur.particulier_civilite = pc.civilite
8612     OR demandeur.personne_morale_civilite = pc.civilite
8613     WHERE
8614     instruction.code_barres = \'%2$s\'
8615     %3$s',
8616     DB_PREFIXE,
8617     $this->f->db->escapeSimple($code_barres),
8618     $sqlAdresse
8619     ),
8620     array(
8621     "origin" => __METHOD__
8622     )
8623     );
8624     $adresse_dest = array_shift($qres['result']);
8625 mbroquet 3730
8626     // Création adresse destinataire sans ligne vide
8627     $adresse_destinataire = array();
8628     if (!empty($adresse_dest['ligne1'])) {
8629     $adresse_destinataire[] = $adresse_dest['ligne1'];
8630     }
8631     if (!empty($adresse_dest['ligne1_1'])) {
8632     $adresse_destinataire[] = $adresse_dest['ligne1_1'];
8633     }
8634     if (!empty($adresse_dest['ligne1_2'])) {
8635     $adresse_destinataire[] = $adresse_dest['ligne1_2'];
8636     }
8637     $adresse_destinataire[] = $adresse_dest['ligne2'];
8638     if (!empty($adresse_dest['ligne3'])) {
8639     $adresse_destinataire[] = $adresse_dest['ligne3'];
8640     }
8641     if (!empty($adresse_dest['ligne4'])) {
8642     $adresse_destinataire[] = $adresse_dest['ligne4'];
8643     }
8644     $adresse_destinataire[] = $adresse_dest['ligne5'];
8645    
8646     // Création du champ specifique
8647     $specifique_content = array();
8648     $specifique_content[] = $adresse_dest['ligne1'];
8649     $specifique_content[] = $adresse_dest['ligne1_1'];
8650     $specifique_content[] = $adresse_dest['ligne1_2'];
8651     $specifique_content[] = $testDemandeur['dossier_libelle'];
8652     $specifique_content[] = "|||||".$adresse_dest['code_barres']."|||||";
8653     unset($adresse_dest['code_barres']);
8654     // Ajout d'une page aux pdf
8655 softime 3834 $pdf_lettre_rar->addLetter($adresse_destinataire, $specifique_content, $testDemandeur['code_phase']);
8656 mbroquet 3730
8657     }
8658     $pdf_output = $pdf_lettre_rar->output("lettre_rar".date("dmYHis").".pdf","S");
8659 softime 7685 $om_edition = $this->f->get_inst__om_edition();
8660 mbroquet 3730 $om_edition->expose_pdf_output($pdf_output, "lettre_rar".date("dmYHis").".pdf");
8661     }
8662     }
8663    
8664     /**
8665     * VIEW - view_bordereau_envoi_maire.
8666     *
8667     * Formulaire demandant :
8668     * - le code-barres de l'événement d'instruction
8669     * - la date d'envoi du courrier pour signature par le maire
8670     *
8671     * Lors de la validation :
8672     * => met à jour cette date dans l'événement d'instruction
8673     * => crée un lien permettant de générer en PDF le bordereau
8674     *
8675     * @return void
8676     */
8677     function view_bordereau_envoi_maire() {
8678     // Vérification de l'accessibilité sur l'élément
8679     $this->checkAccessibility();
8680    
8681     // Récupération des valeur passées en POST ou GET
8682     $code_barres = "";
8683     if($this->f->get_submitted_post_value('code_barres') !== null) {
8684     $code_barres = $this->f->get_submitted_post_value('code_barres');
8685     } elseif($this->f->get_submitted_get_value('code_barres')!==null) {
8686     $code_barres = $this->f->get_submitted_get_value('code_barres');
8687     }
8688     $date = "";
8689     if($this->f->get_submitted_post_value('date') !== null) {
8690     $date = $this->f->get_submitted_post_value('date');
8691     } elseif($this->f->get_submitted_get_value('date') !== null) {
8692     $date = $this->f->get_submitted_get_value('date');
8693     }
8694     $validation = 0;
8695     if($this->f->get_submitted_post_value('validation') !== null) {
8696     $validation = $this->f->get_submitted_post_value('validation');
8697     } elseif($this->f->get_submitted_get_value('validation') !== null) {
8698     $validation = $this->f->get_submitted_get_value('validation');
8699     }
8700    
8701     // Si le formulaire a été validé
8702     if ($this->f->get_submitted_post_value('validation') !== null) {
8703     // Tous les champs doivent obligatoirement être remplis
8704     if (!empty($date) && !empty($code_barres)) {
8705     $date_en = $this->dateDB($date);
8706     // Si date valide
8707     if ($date_en != "") {
8708     $id_instruction = $this->get_instruction_by_barcode($code_barres);
8709     // Si un événement d'instruction a été trouvé pour ce code-barres
8710     if ($id_instruction !== null) {
8711     $ret = $this->update_date_envoi_signature($id_instruction, $date_en);
8712     // Si mise à jour réussie de la date d'envoi du courrier
8713     // pour signature par l'autorité compétente
8714     if($ret === true) {
8715     // Message de validation avec lien PDF
8716     $message_class = "valid";
8717     $message = '&bullet; '._("Veuillez cliquer sur le lien ci-dessous pour telecharger votre bordereau");
8718     $message .= " : <br/><br/>";
8719     $message .= "<a class='om-prev-icon pdf-16'";
8720     $message .= " id=\"generer_bordereau_envoi_maire\"";
8721     $message .= " title=\""._("Bordereau")."\"";
8722 softime 7996 $message .= " href='".OM_ROUTE_FORM."&obj=instruction";
8723 mbroquet 3730 $message .= "&action=200";
8724     $message .= "&idx=".$id_instruction."'";
8725     $message .= " target='_blank'>";
8726     $message .= _("Bordereau d'envoi au maire");
8727     $message .= "</a><br/><br/>";
8728     $message .= '&bullet; '._("Rappel des informations saisies")." :<br/><br/>";
8729     $message .= _("Code du courrier")." : ".$code_barres."<br/>";
8730     $message .= _("Date d'envoi du courrier pour signature par le maire")." : ".$date;
8731    
8732     } else {
8733     // Message d'erreur
8734     $message_class = "error";
8735     $message = sprintf(_("Erreur lors de la mise a jour de l'evenement d'instruction correspondant au code barres %s."),
8736     $code_barres);
8737     }
8738     }
8739     else {
8740     $message_class = "error";
8741     $message = _("Le numero saisi ne correspond a aucun code-barres d'evenement d'instruction.");
8742     }
8743     }
8744     else {
8745     $message_class = "error";
8746     $message = _("La date est invalide.");
8747     }
8748     } else {
8749     $message_class = "error";
8750     $message = _("Tous les champs doivent etre remplis.");
8751     }
8752     }
8753    
8754     /**
8755     * Affichage des messages et du formulaire
8756     */
8757    
8758     // Affichage du message de validation ou d'erreur
8759     if (isset($message) && isset($message_class) && $message != "") {
8760     $this->f->displayMessage($message_class, $message);
8761     }
8762    
8763     // Ouverture du formulaire
8764     $datasubmit = $this->getDataSubmit();
8765     echo "\n<!-- ########## START DBFORM ########## -->\n";
8766     echo "<form";
8767     echo " id=\"bordereau_envoi_maire\"";
8768     echo " method=\"post\"";
8769     echo " name=\"f1\"";
8770     echo " action=\"";
8771     echo $datasubmit;
8772     echo "\"";
8773     echo ">\n";
8774    
8775     // Paramétrage des champs du formulaire
8776     $champs = array("code_barres","date");
8777    
8778     // Création d'un nouvel objet de type formulaire
8779 softime 7996 $form = $this->f->get_inst__om_formulaire(array(
8780     "validation" => 0,
8781     "maj" => 0,
8782     "champs" => $champs,
8783     ));
8784 mbroquet 3730
8785     $template_required_label = '%s *';
8786     // Parametrage du champ code_barres
8787     $form->setLib("code_barres", sprintf($template_required_label,_("Code du courrier")));
8788     $form->setType("code_barres", "text");
8789     $form->setVal("code_barres", $code_barres);
8790     $form->setTaille("code_barres", 20);
8791     $form->setMax("code_barres", 20);
8792     // Parametrage du champ date
8793     $form->setLib("date", sprintf($template_required_label,_("Date d'envoi du courrier pour signature par le maire")));
8794     $form->setType("date", "date") ;
8795     if (empty($date)) {
8796     $date = date('d/m/Y');
8797     }
8798     $form->setVal("date", $date);
8799     $form->setTaille("date", 10);
8800     $form->setMax("date", 10);
8801    
8802     // Création du bloc regroupant les champs
8803     $form->setBloc('code_barres','D');
8804     $form->setBloc('date','F');
8805     // Affichage du formulaire
8806     $form->entete();
8807     $form->afficher($champs, 0, false, false);
8808     $form->enpied();
8809     // Affichage du bouton
8810     printf("\t<div class=\"formControls\">\n");
8811     //
8812     $this->f->layout->display_form_button(array("value" => _("Valider"), "name" => "validation"));
8813     printf("\t</div>\n");
8814     // Fermeture du formulaire
8815     printf("\t</form>\n");
8816     }
8817    
8818     /**
8819     * VIEW - view_bordereau_envoi_maire.
8820     *
8821     * PDF de bordereau d'envoi au maire pour l'événement d'instruction instancié
8822     *
8823     * @return [void]
8824     */
8825     function view_generate_bordereau_envoi_maire() {
8826     // Vérification de l'accessibilité sur l'élément
8827     $this->checkAccessibility();
8828     // Récupération de la collectivité du dossier d'instruction
8829     $collectivite_di = $this->get_dossier_instruction_om_collectivite();
8830     // Récupération de ses paramètres
8831     $collectivite = $this->f->getCollectivite($collectivite_di);
8832     // Génération du PDF
8833     $result = $this->compute_pdf_output('etat', 'communaute_bordereau_envoi_maire', $collectivite, $this->getVal(($this->clePrimaire)));
8834     // Affichage du PDF
8835     $this->expose_pdf_output(
8836     $result['pdf_output'],
8837     $result['filename']
8838     );
8839     }
8840    
8841     /**
8842 softime 10808 * VIEW - view_rapport_instruction.
8843     *
8844     * Ouvre le sous-formulaire en ajaxIt dans un overlay.
8845     * Cette action est bindée pour utiliser la fonction popUpIt.
8846     *
8847     * @return void
8848     */
8849     function view_overlay_notification_manuelle() {
8850    
8851     // Vérification de l'accessibilité sur l'élément
8852     $this->checkAccessibility();
8853    
8854     printf(
8855     '<script type="text/javascript" >
8856     overlayIt(\'%1$s\',\'%2$s&objsf=%1$s&idxformulaire=%4$s&retourformulaire=dossier_instruction&obj=%1$s&action=411&idx=%3$s\', 1);
8857     </script>',
8858     'instruction_notification_manuelle',
8859     OM_ROUTE_SOUSFORM,
8860     $this->getVal($this->clePrimaire),
8861     $this->getVal('dossier')
8862     );
8863     }
8864    
8865     /**
8866 softime 11585 * VIEW - view_overlay_notification_service_consulte.
8867     *
8868     * Ouvre le sous-formulaire de notification des services consulte
8869     * en ajaxIt dans un overlay.
8870     * Cette action est bindée pour utiliser la fonction popUpIt.
8871     *
8872     * @return void
8873     */
8874     function view_overlay_notification_service_consulte() {
8875    
8876     // Vérification de l'accessibilité sur l'élément
8877     $this->checkAccessibility();
8878    
8879     printf(
8880     '<script type="text/javascript" >
8881     overlayIt(\'%1$s\',\'%2$s&objsf=%1$s&idxformulaire=%4$s&retourformulaire=dossier_instruction&obj=%1$s&action=420&idx=%3$s\', 1);
8882     </script>',
8883     'instruction_notification_manuelle',
8884     OM_ROUTE_SOUSFORM,
8885     $this->getVal($this->clePrimaire),
8886     $this->getVal('dossier')
8887     );
8888     }
8889    
8890     /**
8891     * VIEW - overlay_notification_tiers_consulte.
8892     *
8893     * Ouvre le sous-formulaire de notification des tiers consulte
8894     * en ajaxIt dans un overlay.
8895     * Cette action est bindée pour utiliser la fonction popUpIt.
8896     *
8897     * @return void
8898     */
8899     function view_overlay_notification_tiers_consulte() {
8900    
8901     // Vérification de l'accessibilité sur l'élément
8902     $this->checkAccessibility();
8903    
8904     printf(
8905     '<script type="text/javascript" >
8906     overlayIt(\'%1$s\',\'%2$s&objsf=%1$s&idxformulaire=%4$s&retourformulaire=dossier_instruction&obj=%1$s&action=430&idx=%3$s\', 1);
8907     </script>',
8908     'instruction_notification_manuelle',
8909     OM_ROUTE_SOUSFORM,
8910     $this->getVal($this->clePrimaire),
8911     $this->getVal('dossier')
8912     );
8913     }
8914 softime 12847
8915 softime 11585 /**
8916 softime 12847 * VIEW - view_modale_selection_document_signe
8917     *
8918     * Ouvre le sous-formulaire de notification des services consulte
8919     * en ajaxIt dans un overlay.
8920     * Cette action est bindée pour utiliser la fonction popUpIt.
8921     *
8922     * @return void
8923     */
8924     function view_modale_selection_document_signe() {
8925    
8926     // Vérification de l'accessibilité sur l'élément
8927     $this->checkAccessibility();
8928    
8929     printf(
8930     '<script type="text/javascript" >
8931     overlayIt(\'%1$s\',\'%2$s&objsf=%1$s&idxformulaire=%4$s&retourformulaire=dossier_instruction&obj=%1$s&action=115&idx=%3$s\', 1);
8932     </script>',
8933     'instruction_modale',
8934     OM_ROUTE_SOUSFORM,
8935     $this->getVal($this->clePrimaire),
8936     $this->getVal('dossier')
8937     );
8938     }
8939    
8940     /**
8941 softime 6565 * Retourne l'événement d'instruction dont on donne le code-barres, avec un filtre
8942     * pour exclure les dossiers du groupe contentieux.
8943 mbroquet 3730 *
8944     * @param [string] $barcode numéro du code-barres
8945     * @return [mixed] ID de son instruction ou null si aucun code
8946     */
8947     function get_instruction_by_barcode($barcode) {
8948     // Begin
8949     $this->begin_treatment(__METHOD__);
8950 softime 14064
8951 mbroquet 3730 // Vérification de l'existence de l'événement d'instruction
8952 softime 6565 // pour le code-barres donné, en excluant les dossiers liés au groupe CTX
8953 softime 14064 $qres = $this->f->get_one_result_from_db_query(
8954     sprintf(
8955     'SELECT
8956     instruction
8957     FROM
8958     %1$sinstruction
8959     INNER JOIN %1$sdossier
8960 softime 6565 ON dossier.dossier=instruction.dossier
8961 softime 14064 INNER JOIN %1$sdossier_instruction_type
8962 softime 6565 ON dossier.dossier_instruction_type = dossier_instruction_type.dossier_instruction_type
8963 softime 14064 INNER JOIN %1$sdossier_autorisation_type_detaille
8964 softime 6565 ON dossier_instruction_type.dossier_autorisation_type_detaille = dossier_autorisation_type_detaille.dossier_autorisation_type_detaille
8965 softime 14064 INNER JOIN %1$sdossier_autorisation_type
8966 softime 6565 ON dossier_autorisation_type_detaille.dossier_autorisation_type = dossier_autorisation_type.dossier_autorisation_type
8967 softime 14064 INNER JOIN %1$sgroupe
8968 softime 6565 ON dossier_autorisation_type.groupe = groupe.groupe
8969 softime 14064 AND groupe.code != \'CTX\'
8970     WHERE
8971     code_barres = \'%2$s\'',
8972     DB_PREFIXE,
8973     $this->f->db->escapeSimple($barcode)
8974     ),
8975     array(
8976     "origin" => __METHOD__,
8977     )
8978     );
8979    
8980 mbroquet 3730 // Retourne résultat
8981 softime 14064 return $this->end_treatment(__METHOD__, $qres['result']);
8982 mbroquet 3730 }
8983    
8984     /**
8985     * Met à jour le champ date d'envoi signature
8986     * avec la date fournie et pour l'instruction donnée
8987     *
8988     * @param [string] $id ID de l'événement d'instruction
8989     * @param [string] $date date au format EN
8990     * @return [boolean] true si mise à jour avec succès
8991     */
8992     function update_date_envoi_signature($id, $date) {
8993     // Préparation du tableau
8994     $valF = array();
8995     $valF['date_envoi_signature'] = $date;
8996     // Begin
8997     $this->begin_treatment(__METHOD__);
8998     // Requête
8999 softime 12847 $res = $this->f->db->autoexecute(
9000 mbroquet 3730 DB_PREFIXE.$this->table,
9001     $valF,
9002     DB_AUTOQUERY_UPDATE,
9003     $this->getCle($id)
9004     );
9005 softime 12847 $this->addToLog(
9006     __METHOD__."(): db->autoexecute(\"".DB_PREFIXE.'.'.$this->table."\", ".print_r($valF, true).", DB_AUTOQUERY_UPDATE, \"".$this->getCle($id)."\");",
9007     VERBOSE_MODE
9008     );
9009     if ($this->f->isDatabaseError($res, true) !== false) {
9010 mbroquet 3730 $this->end_treatment(__METHOD__, false);
9011     }
9012     //
9013     return $this->end_treatment(__METHOD__, true);
9014     }
9015    
9016     /**
9017     * Méthode permettant de définir des valeurs à envoyer en base après
9018     * validation du formulaire d'ajout.
9019     * @param array $val tableau des valeurs retournées par le formulaire
9020     */
9021 softime 6929 function setValFAjout($val = array()) {
9022 mbroquet 3730 // Mise à jour du flag created_by_commune lors d'un changement de décision
9023     // par un utilisateur de commune sur un dossier instruit par la comcom
9024 softime 6565 if ($this->isInstrCanChangeDecision($this->valF["dossier"])) {
9025 mbroquet 3730 $this->valF['created_by_commune'] = true;
9026     }
9027 softime 8593
9028     //
9029     if ($this->evenement_has_an_edition($this->valF['evenement']) === false) {
9030     if (isset($this->valF['flag_edition_integrale']) === true) {
9031     unset($this->valF['flag_edition_integrale']);
9032     }
9033     if (isset($this->valF['signataire_arrete']) === true) {
9034     unset($this->valF['signataire_arrete']);
9035     }
9036     }
9037 mbroquet 3730 }
9038 nmeucci 3876
9039 fmichon 3892
9040 fmichon 4708 /**
9041     * Récupère l'instance d'un événement de workflow.
9042     *
9043     * @param mixed $evenement Identifiant de l'événement.
9044     *
9045     * @return object
9046     */
9047     function get_inst_evenement($evenement = null) {
9048     //
9049     return $this->get_inst_common("evenement", $evenement);
9050     }
9051 softime 3976
9052 fmichon 3892 /**
9053 softime 3976 * Logue l'action de l'instruction dans son DI.
9054 nmeucci 3933 *
9055 softime 3976 * @param string $id Clé primaire de l'instruction.
9056     * @param array $val Valeurs de l'instruction.
9057     *
9058     * @return bool Vrai si traitement effectué avec succès
9059 nmeucci 3876 */
9060 softime 3976 private function add_log_to_dossier($id, array $val) {
9061 nmeucci 3933 $maj = $this->getParameter("maj");
9062 nmeucci 3943 // Action = Trace par défaut
9063     $action = $this->get_backtrace();
9064     // Action = Identifant de l'action si contexte connu
9065     if (empty($maj) === false
9066     || (empty($maj) === true && $maj === 0)) {
9067     $action = $this->get_action_param($maj, 'identifier');
9068 nmeucci 3965 if ($action === 'modifier_suivi') {
9069     $action = "modifier (via l'action suivi des dates)";
9070     }
9071 nmeucci 4108 if ($action === 'notifier_commune'
9072     && isset($val['mails_destinataires']) === true) {
9073     $action = "notification de la commune (courriels : ";
9074     $action .= $val['mails_destinataires'].")";
9075     }
9076 nmeucci 3943 }
9077 nmeucci 3876 // Création du log
9078     $log = array(
9079     'date' => date('Y-m-d H:i:s'),
9080     'user' => $_SESSION['login'],
9081     'action' => $action,
9082     'values' => array(
9083     'date_evenement' => $this->dateDB($val['date_evenement']),
9084     'date_retour_rar' => $this->dateDB($val['date_retour_rar']),
9085     'date_retour_signature' => $this->dateDB($val['date_retour_signature']),
9086     'evenement' => $val['evenement'],
9087     'action' => $val['action'],
9088 nmeucci 3963 'instruction' => $id,
9089 nmeucci 3876 'etat' => $val['etat'],
9090     ),
9091     );
9092     // Ajout du log
9093 softime 3976 $di = $this->get_inst_dossier($val['dossier']);
9094 nmeucci 3876 $ret = $di->add_log_instructions($log);
9095     if ($ret === false) {
9096     $this->correct = false;
9097     $this->msg = '';
9098     $this->addToMessage($di->msg);
9099     }
9100     return $ret;
9101     }
9102 nmeucci 3943
9103 softime 3976
9104 nmeucci 3943 /**
9105 softime 3976 * Retourne le contexte de déboguage formaté en HTML.
9106 nmeucci 3943 *
9107 softime 3976 * @return string Une ligne par trace
9108 nmeucci 3943 */
9109     private function get_backtrace() {
9110     $trace = debug_backtrace();
9111 nmeucci 3957 $backtrace = '';
9112     $i = 1;
9113 nmeucci 3943 foreach ($trace as $key => $value) {
9114 nmeucci 3957 $func = $trace[$key]['function'];
9115     // On ne s'autolog pas
9116     if ($func === 'get_backtrace'
9117     || $func === 'add_log_to_dossier') {
9118     continue;
9119     }
9120     $backtrace .= $i.') ';
9121     // Si dans une classe
9122     if (isset($trace[$key]['class']) === true
9123     && empty($trace[$key]['class']) === false) {
9124 nmeucci 3963 $backtrace .= $trace[$key]['class'].'->'.$func;
9125 nmeucci 3957 }
9126     // Si procédural
9127     else {
9128     $file = $trace[$key]['file'];
9129 nmeucci 3963 $line = $trace[$key]['line'];
9130 softime 3976 $truncated_file = $this->f->get_relative_path($file);
9131 nmeucci 3963 if ($truncated_file !== false) {
9132     $file = $truncated_file;
9133     }
9134     $backtrace .= $func.' IN<br/>&nbsp;&nbsp;&nbsp;&nbsp; '.$file.':'.$line;
9135 nmeucci 3957 }
9136     $backtrace .= '<br/>';
9137     $i++;
9138 nmeucci 3943 }
9139 nmeucci 3957 return $backtrace;
9140 nmeucci 3943 }
9141 nmeucci 3963
9142 nmeucci 4108 /**
9143     * CONDITION - is_notifiable.
9144     *
9145     * Condition pour afficher l'action notifier_commune.
9146     *
9147     * @return boolean
9148     */
9149     public function is_notifiable() {
9150     // L'instruction doit être finalisée, ce qui revient à dire
9151     // définalisable sans bypass
9152     if ($this->is_unfinalizable_without_bypass() === false) {
9153     return false;
9154     }
9155     // La collectivité de l'utilisateur doit être de niveau multi
9156     if ($this->f->has_collectivite_multi() === false) {
9157     return false;
9158     }
9159     // Le paramètre multi de l'objet du courriel doit exister
9160     if ($this->f->getParameter('param_courriel_de_notification_commune_objet_depuis_instruction') === NULL) {
9161     return false;
9162     }
9163     // Le paramètre multi du modèle du courriel doit exister
9164     if ($this->f->getParameter('param_courriel_de_notification_commune_modele_depuis_instruction') === NULL) {
9165     return false;
9166     }
9167     // A ce stade toutes les conditions sont satisfaites
9168     return true;
9169     }
9170 nmeucci 3963
9171 nmeucci 4108 /**
9172     * TREATMENT - notifier_commune.
9173     *
9174     * Notifie aux communes et par courriel la finalisation d'une instruction.
9175     *
9176     * @return boolean
9177     */
9178     public function notifier_commune() {
9179     // Cette méthode permet d'exécuter une routine en début des méthodes
9180     // dites de TREATMENT.
9181     $this->begin_treatment(__METHOD__);
9182 softime 14542 $message = __('Erreur de paramétrage :');
9183 softime 12654 $erreurParametrage = false;
9184     // Récupération du paramétrage de la collectivité du dossier
9185 nmeucci 4108 $id_di = $this->getVal('dossier');
9186     $di = $this->get_inst_dossier($id_di);
9187     $collectivite_di = $di->getVal('om_collectivite');
9188 softime 12654 // Récupération de l'url permettant d'accèder à l'instruction et au dossier
9189     $urlAcces = $this->f->get_parametre_notification_url_acces($collectivite_di);
9190     if (empty($urlAcces) && empty(PATH_BASE_URL)) {
9191     $erreurParametrage = true;
9192     $message .= '<br>'.__("* l'url de notification n'est pas correctement paramétré");
9193 nmeucci 4108 }
9194 softime 12654
9195     // Récupération de la liste des mails
9196     $adresses = $this->f->get_param_courriel_de_notification_commune($collectivite_di);
9197     if (empty($adresses)) {
9198     $erreurParametrage = true;
9199     $message .= '<br>'.__("* aucun courriel valide de destinataire de la commune");
9200 nmeucci 4108 }
9201 softime 12654
9202     // Vérification du paramétrage des mails
9203     $paramMail = $this->f->get_notification_commune_parametre_courriel_type($collectivite_di);
9204     if (empty($paramMail) || empty($paramMail['parametre_courriel_type_message'])) {
9205     $erreurParametrage = true;
9206     $message .= '<br>'.__("* le modèle du courriel envoyé aux communes est vide");
9207 nmeucci 4108 }
9208 softime 12654 if (empty($paramMail) || empty($paramMail['parametre_courriel_type_titre'])) {
9209     $erreurParametrage = true;
9210     $message .= '<br>'.__("* l'objet du courriel envoyé aux communes est vide");
9211 nmeucci 4108 }
9212 softime 12654
9213     // Si il y a des erreurs de paramétrage on ne déclenche pas la notification et
9214     // un message a destination de l'utilisateur est affiché
9215     if ($erreurParametrage) {
9216     $message .= '<br>'.__("Veuillez contacter votre administrateur.");
9217     $this->addToMessage($message);
9218 nmeucci 4108 return $this->end_treatment(__METHOD__, false);
9219     }
9220 softime 12654
9221     // Création d'un notification et de sa tâche associé pour chaque mail
9222     foreach ($adresses as $adresse) {
9223     // Ajout de la notif et récupération de son id
9224     $destinataire = array(
9225     'destinataire' => $adresse,
9226     'courriel' => $adresse
9227     );
9228     $idNotif = $this->ajouter_notification(
9229     $this->getVal($this->clePrimaire),
9230     $this->f->get_connected_user_login_name(),
9231     $destinataire,
9232     $collectivite_di
9233     );
9234     if ($idNotif === false) {
9235     $this->addToMessage(__("Veuillez contacter votre administrateur."));
9236     return $this->end_treatment(__METHOD__, false);
9237 nmeucci 4108 }
9238 softime 12654 // Création de la tache en lui donnant l'id de la notification
9239     $notification_by_task = $this->notification_by_task(
9240     $idNotif,
9241     $this->getVal('dossier'),
9242     'mail',
9243     'notification_commune'
9244     );
9245     if ($notification_by_task === false) {
9246     $this->addToMessage(__("Erreur lors de la préparation de la notification des communes."));
9247     $this->addToMessage(__("Veuillez contacter votre administrateur."));
9248     return $this->end_treatment(__METHOD__, false);
9249     }
9250 nmeucci 4108 }
9251 softime 12654 $this->addToMessage(__('La commune a été notifiée.'));
9252 nmeucci 4108 return $this->end_treatment(__METHOD__, true);
9253     }
9254    
9255     /**
9256 softime 5169 * Récupère l'instance de l'instructeur
9257     *
9258     * @param integer $instructeur Identifiant de l'instructeur.
9259     *
9260     * @return object
9261     */
9262     protected function get_inst_instructeur($instructeur) {
9263     //
9264     return $this->get_inst_common("instructeur", $instructeur);
9265     }
9266    
9267    
9268     /**
9269     * Récupère l'instance de l'utilisateur
9270     *
9271     * @param integer $om_utilisateur Identifiant de l'utilisateur.
9272     *
9273     * @return object
9274     */
9275     protected function get_inst_om_utilisateur($om_utilisateur) {
9276     //
9277     return $this->get_inst_common("om_utilisateur", $om_utilisateur);
9278     }
9279    
9280    
9281 softime 6565 /**
9282 softime 5295 * Récupère l'instance de la division.
9283     *
9284     * @param integer $division Identifiant de la division.
9285     *
9286     * @return object
9287     */
9288     protected function get_inst_division($division) {
9289     //
9290     return $this->get_inst_common("division", $division);
9291     }
9292    
9293    
9294     /**
9295     * Récupère l'instance de la direction.
9296     *
9297     * @param integer $direction Identifiant de la direction.
9298     *
9299     * @return object
9300     */
9301     protected function get_inst_direction($direction) {
9302     //
9303     return $this->get_inst_common("direction", $direction);
9304     }
9305    
9306    
9307     /**
9308     * Récupère la collectivité d'un instructeur en passant par sa division puis
9309     * par sa direction.
9310     *
9311     * @param integer $instructeur Identifiant de l'instructeur.
9312     *
9313     * @return integer
9314     */
9315     protected function get_instructeur_om_collectivite($instructeur) {
9316     // Chemin vers la collectivité d'un instructeur
9317     $inst_instr = $this->get_inst_instructeur($instructeur);
9318     $inst_division = $this->get_inst_division($inst_instr->getVal('division'));
9319     $inst_direction = $this->get_inst_direction($inst_division->getVal('direction'));
9320    
9321     // Collectivité
9322     $om_collectivite = $inst_direction->getVal('om_collectivite');
9323    
9324     //
9325     return $om_collectivite;
9326     }
9327    
9328 softime 6565 /*
9329     * CONDITION - can_user_access_dossier_contexte_ajout
9330     *
9331     * Vérifie que l'utilisateur a bien accès au dossier d'instruction passé dans le
9332     * formulaire d'ajout.
9333     * Cette méthode vérifie que l'utilisateur est lié au groupe du dossier, et si le
9334     * dossier est confidentiel qu'il a accès aux confidentiels de ce groupe.
9335     *
9336     */
9337     function can_user_access_dossier_contexte_ajout() {
9338 softime 5295
9339 softime 6565 ($this->f->get_submitted_get_value('idxformulaire') !== null ? $id_dossier =
9340     $this->f->get_submitted_get_value('idxformulaire') : $id_dossier = "");
9341     //
9342     if ($id_dossier !== "") {
9343 softime 7996 $dossier = $this->f->get_inst__om_dbform(array(
9344     "obj" => "dossier_instruction",
9345     "idx" => $id_dossier,
9346     ));
9347 softime 6565 //
9348     return $dossier->can_user_access_dossier();
9349     }
9350     return false;
9351     }
9352    
9353     /*
9354     * CONDITION - can_user_access_dossier
9355     *
9356     * Vérifie que l'utilisateur a bien accès au dossier lié à l'instruction instanciée.
9357     * Cette méthode vérifie que l'utilisateur est lié au groupe du dossier, et si le
9358     * dossier est confidentiel qu'il a accès aux confidentiels de ce groupe.
9359     *
9360     */
9361     function can_user_access_dossier_contexte_modification() {
9362    
9363     $id_dossier = $this->getVal('dossier');
9364     //
9365     if ($id_dossier !== "" && $id_dossier !== null) {
9366 softime 7996 $dossier = $this->f->get_inst__om_dbform(array(
9367     "obj" => "dossier_instruction",
9368     "idx" => $id_dossier,
9369     ));
9370 softime 6565 //
9371     return $dossier->can_user_access_dossier();
9372     }
9373     return false;
9374     }
9375    
9376 softime 8593 /**
9377 softime 10713 * TREATMENT - envoyer_a_signature_sans_relecture
9378     *
9379     * Permet d'envoyer le document de l'instruction au parapheur pour signature sans relecture
9380     *
9381     * @return boolean true si l'envoi a été effectué avec succès false sinon
9382     */
9383     function envoyer_a_signature_sans_relecture() {
9384     return $this->envoyer_a_signature();
9385     }
9386    
9387     /**
9388     * TREATMENT - envoyer_a_signature_avec_relecture
9389     *
9390     * Permet d'envoyer le document de l'instruction au parapheur pour signature avec relecture
9391     *
9392     * @return boolean true si l'envoi a été effectué avec succès false sinon
9393     */
9394     function envoyer_a_signature_avec_relecture() {
9395 softime 10808 $is_forced_view_files = true;
9396     return $this->envoyer_a_signature($is_forced_view_files);
9397 softime 10713 }
9398    
9399     /**
9400 softime 10573 * TREATMENT - envoyer_a_signature
9401     *
9402     * Permet d'envoyer le document de l'instruction au parapheur pour signature
9403 softime 10713 *
9404     * @param boolean $is_forced_view_files Indique si il y a une relecture (true) ou non (false)
9405 softime 10573 *
9406     * @return boolean true si l'envoi a été effectué avec succès false sinon
9407     */
9408 softime 10713 function envoyer_a_signature($is_forced_view_files = false) {
9409 softime 10573 $this->begin_treatment(__METHOD__);
9410     $this->correct = true;
9411    
9412     // Instanciation de l'objet signataire_arrete
9413     $inst_signataire_arrete = $this->f->get_inst__om_dbform(array(
9414     'obj' => 'signataire_arrete',
9415     'idx' => $this->getVal('signataire_arrete'),
9416     ));
9417    
9418     // Instanciation de l'objet dossier
9419     $inst_dossier = $this->f->get_inst__om_dbform(array(
9420     'obj' => 'dossier',
9421     'idx' => $this->getVal('dossier'),
9422     ));
9423    
9424 softime 15037 //Instanciation de la classe electronicsignature
9425     $inst_es = $this->get_electronicsignature_instance();
9426     if ($inst_es === false) {
9427     $this->correct = false;
9428     return $this->end_treatment(__METHOD__, false);
9429     }
9430    
9431     // Vérifie si la notification se fait via l'application ou via le parapheur
9432     try {
9433     $notification_required = $inst_es->signer_notification_is_delegated();
9434     } catch(electronicsignature_connector_method_not_implemented_exception $_) {
9435     // Si la méthode n'existe pas, on considère que la notification est faite par le parapheur
9436     $notification_required = false;
9437     }
9438    
9439     // Si la notification est faite par l'application vérifie que l'adresse mail du
9440     // signataire est correcte. Si ce n'est pas le cas le document n'est pas envoyé
9441     // au parapheur car il ne sera pas accessible sans le lien transmis dans la
9442     // notification
9443     if ($notification_required === true) {
9444     $signer_mail = $inst_signataire_arrete->getVal('email');
9445     $signer_name = trim($inst_signataire_arrete->getVal('prenom').' '.$inst_signataire_arrete->getVal('nom'));
9446    
9447     $err_msg = __('Le document n\'a pas pu être envoyé en signature car ');
9448    
9449     if (empty($signer_mail)) {
9450     $this->correct = false;
9451     $err_detail = sprintf(__("l'email du signataire '%s' est vide."), $signer_name);
9452     $this->addToMessage($err_msg.$err_detail);
9453     $this->addToLog(__METHOD__.$err_msg.$err_detail.' Instruction : '.$this->getVal($this->clePrimaire), DEBUG_MODE);
9454     return $this->end_treatment(__METHOD__, false);
9455     }
9456     if (! $this->f->checkValidEmailAddress($signer_mail)) {
9457     $this->correct = false;
9458     $err_detail = sprintf(__("l'email du signataire '%s' est invalide (%s)."), $signer_name, $signer_mail);
9459     $this->addToMessage($err_msg.$err_detail);
9460     $this->addToLog(__METHOD__.$err_msg.$err_detail.' Instruction : '.$this->getVal($this->clePrimaire), DEBUG_MODE);
9461     return $this->end_treatment(__METHOD__, false);
9462     }
9463     }
9464    
9465 softime 10573 // Récupération du document à signer
9466     $file = $this->f->storage->get($this->getVal('om_fichier_instruction'));
9467     if ($file === OP_FAILURE) {
9468     $this->correct = false;
9469     $this->addToMessage(__("Une erreur est survenue lors de la récupération du contenu du document de l'instruction."));
9470     // Termine le traitement
9471     return $this->end_treatment(__METHOD__, false);
9472     }
9473    
9474     // Initialisation des paramètre à passer pour l'envoi en signature
9475 softime 10808 $data = array(
9476 softime 10573 "om_utilisateur_email" => $this->f->om_utilisateur['email'],
9477     "om_utilisateur_nom" => $this->f->om_utilisateur['nom'],
9478     "signataire_arrete_email" => $inst_signataire_arrete->getVal('email'),
9479     "signataire_arrete_nom" => $inst_signataire_arrete->getVal('nom'),
9480     "signataire_arrete_prenom" => $inst_signataire_arrete->getVal('prenom'),
9481 softime 11876 // Permet d'envoyer en signature l'instruction le jour de la date limite
9482 softime 14064 "date_limite_instruction" => $this->compute_date_limite(1) != null ? $this->compute_date_limite(1) : null,
9483 softime 10573 "dossier" => $this->getVal('dossier'),
9484 softime 10713 "is_forced_view_files" => $is_forced_view_files,
9485     'commentaire_signature' => $is_forced_view_files === true ? __('relecture demandee.') : null
9486 softime 10573 );
9487    
9488 softime 10808 // Initialisation des métadonnées
9489     $metadonnee_dossier = $file['metadata'];
9490 softime 11228 // récupération de l'extension du fichier
9491     $extension = substr($metadonnee_dossier['filename'], strrpos($metadonnee_dossier['filename'], '.'));
9492     // Modification du libellé du document transmis au parapheur
9493     // pour le mettre sous la forme : instruction_xxx_libelle_lettretype.extension
9494     $metadonnee_dossier['filename'] = $this->getDocumentLibelle().$extension;
9495     $metadonnee_dossier['titre_document'] = $this->getDocumentTitre();
9496 softime 10808
9497     $metadonnee_dossier['url_di'] = sprintf(
9498 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',
9499 softime 11418 $this->f->get_param_base_path_metadata_url_di() !== null ? $this->f->get_param_base_path_metadata_url_di() : PATH_BASE_URL,
9500 softime 15037 $this->getVal('dossier')
9501 softime 10808 );
9502    
9503     $optional_data = null;
9504     // Si il y a des paramètres supplémentaire spécifié dans le signataire alors on les récupère
9505     if ($inst_signataire_arrete->getVal('parametre_parapheur') !== null && $inst_signataire_arrete->getVal('parametre_parapheur') !== '') {
9506     $optional_data = json_decode($inst_signataire_arrete->getVal('parametre_parapheur'), true);
9507     if (json_last_error() !== JSON_ERROR_NONE) {
9508     $this->correct = false;
9509     $this->addToMessage(__("Les paramètres supplémentaires envoyés au parapheur ne sont pas au bon format."));
9510     $this->addToLog(__METHOD__."(): ".
9511     __("Erreur lors du décodage du format json des paramètres supplémentaires envoyé au parapheur.
9512     Tableau : ").var_export($inst_signataire_arrete->getVal('parametre_parapheur'), true)
9513     );
9514     // Termine le traitement
9515     return $this->end_treatment(__METHOD__, false);
9516     }
9517     }
9518    
9519 softime 10573 // Appel de la méthode de l'abstracteur send_for_signature()
9520     // Cette méthode doit retourner un tableau de valeur
9521     try {
9522 softime 10808 $result = $inst_es->send_for_signature($data, $file['file_content'], $metadonnee_dossier, $optional_data);
9523 softime 10573 } catch (electronicsignature_exception $e) {
9524     $this->handle_electronicsignature_exception($e);
9525     return $this->end_treatment(__METHOD__, false);
9526     }
9527    
9528     // Après avoir reçu le résultat du parapheur, il faut mettre à jour les champs
9529     $valF = array();
9530    
9531     // Pour appeler la fonction modifier il faut traiter tous les champs de l'objet
9532     foreach($this->champs as $identifiant => $champ) {
9533     $valF[$champ] = $this->val[$identifiant];
9534     }
9535     // On fait ensuite nos modifications spécifiques
9536     $valF['id_parapheur_signature'] = $result['id_parapheur_signature'];
9537     $valF['statut_signature'] = $result['statut'];
9538     $valF['commentaire_signature'] = isset($result['commentaire_signature']) == true ? $result['commentaire_signature'] : null;
9539     $valF['date_envoi_signature'] = date("Y-m-d", strtotime($result['date_envoi_signature']));
9540     $valF['historique_signature'] = $this->get_updated_historique_signature($result);
9541 softime 15037 $valF['parapheur_lien_page_signature'] = isset($result['signature_page_url']) ? $result['signature_page_url'] : null;
9542 softime 10573 $ret = $this->modifier($valF);
9543    
9544     if ($ret === false) {
9545     $this->correct = false;
9546     $this->addToMessage(__("Une erreur est survenue lors de la mise à jour des champs."));
9547     // Termine le traitement
9548     return $this->end_treatment(__METHOD__, false);
9549     }
9550    
9551 softime 15037 // Notification du signataire
9552     if ($notification_required === true) {
9553     if ($this->notify_signer($signer_name, $signer_mail, $data['om_utilisateur_nom']) === false) {
9554     $msg = __("Une erreur s'est produite lors de la notification du signataire \"%s (%s)\". Annulation de l'envoi pour signature du document%s.");
9555     $this->addToMessage(sprintf($msg, $signer_name, $signer_mail, ''));
9556     $this->addToLog(sprintf($msg, $signer_name, $signer_mail, ' : '.$this->getVal($this->clePrimaire)), DEBUG_MODE);
9557     // Met à jour les valeurs de l'objet courant pour prendre en compte les modifications faites
9558     // precedemment
9559     $this->init_record_data($this->getVal($this->clePrimaire));
9560     $this->annuler_envoi_en_signature();
9561     $this->correct = false;
9562     return $this->end_treatment(__METHOD__, true);
9563     }
9564     }
9565    
9566 softime 10573 // Message
9567     $this->addToMessage(__("Le document a été envoyé pour signature dans le parapheur."));
9568 softime 15037 if ($this->f->is_option_enabled('option_afficher_lien_parapheur') === true
9569     && array_key_exists('signature_page_url', $result) === true) {
9570 softime 10573 $this->addToMessage(sprintf(
9571 softime 11228 '<br> > <a href="%1$s" title="%2$s" target="_blank">%2$s</a>',
9572     $result['signature_page_url'],
9573     __("Signez directement le document")
9574 softime 10573 ));
9575     }
9576 softime 15037 if ($notification_required !== true) {
9577     $this->addToMessage(__("L'envoi de la notification au signataire est effectué par la plateforme."));
9578     }
9579 softime 10573
9580     // Tout s'est bien passé, on termine le traitement
9581     return $this->end_treatment(__METHOD__, true);
9582     }
9583    
9584     /**
9585 softime 15037 * Notifie le signataire d'un document à signer.
9586     * Gère l'affichage des messages à destination de l'utilisateur selon l'état du traitement.
9587     * En cas d'erreur ajoute une ligne dans les logs de l'application.
9588     *
9589     * @param string $signer_name Nom du signataire
9590     * @param string $signer_mail Mail du signataire
9591     * @param string $user_name Nom de l'utilisateur openADS courant
9592     *
9593     * @return boolean true si succés, false si erreur
9594     */
9595     protected function notify_signer($signer_name, $signer_mail, $user_name) {
9596     // message d'erreur
9597     $err_msg_log = sprintf(
9598     __("Échec de la notification du signataire \"%s (%s)\" lors de l'envoi au parapaheur du document de l'instruction : %s"),
9599     $signer_name,
9600     $signer_mail,
9601     $this->getVal($this->clePrimaire)
9602     );
9603     $err_msg = sprintf(
9604     '%s %s (%s)"',
9605     __("Échec de la notification du signataire"),
9606     $signer_name,
9607     $signer_mail
9608     );
9609    
9610     // vérification des informations requises
9611     if (empty($signer_name)) {
9612     $err_detail = __("le nom du signataire est vide");
9613     $this->addToLog(__METHOD__.', '.$err_msg_log.', '.$err_detail, DEBUG_MODE);
9614     $this->addToMessage($err_msg.', '.$err_detail);
9615     return false;
9616     }
9617     if (empty($signer_mail)) {
9618     $err_detail = __("le courriel du signataire est vide");
9619     $this->addToLog(__METHOD__.', '.$err_msg_log.', '.$err_detail, DEBUG_MODE);
9620     $this->addToMessage($err_msg.', '.$err_detail);
9621     return false;
9622     }
9623     if (empty($this->getVal('dossier'))) {
9624     $err_detail = __("l'identifiant du dossier est vide");
9625     $this->addToLog(__METHOD__.', '.$err_msg_log.', '.$err_detail, DEBUG_MODE);
9626     $this->addToMessage($err_msg.', '.$err_detail);
9627     return false;
9628     }
9629    
9630     // ajout de la notification à la liste des notifications de l'instruction
9631     $instruction_id = $this->getVal($this->clePrimaire);
9632     $inst_notif = $this->f->get_inst__om_dbform(array(
9633     "obj" => "instruction_notification",
9634     "idx" => "]",
9635     ));
9636     $notif_val = array(
9637     'instruction_notification' => null,
9638     'instruction' => $instruction_id,
9639     'automatique' => true,
9640     'emetteur' => $user_name,
9641     'date_envoi' => null,
9642     'destinataire' => "$signer_name <$signer_mail>",
9643     'courriel' => $signer_mail,
9644     'date_premier_acces' => null,
9645     'statut' => '',
9646     'commentaire' => ''
9647     );
9648     $add_notif = $inst_notif->ajouter($notif_val);
9649     if ($add_notif === false) {
9650     $err_detail = __("Échec de l'ajout de la notification.");
9651     $this->addToLog(__METHOD__.' '.$err_msg_log.'. '.$err_detail.' Notification : '.var_export($notif_val, true), DEBUG_MODE);
9652     $this->addToMessage($err_msg);
9653     return false;
9654     }
9655     $notification_id = $inst_notif->getVal($inst_notif->clePrimaire);
9656    
9657     // ajout d'une tâche de notification (envoi du mail)
9658     $notification_task = $this->notification_by_task(
9659     $notification_id,
9660     $this->getVal('dossier'),
9661     'mail',
9662     'notification_signataire'
9663     );
9664     if ($notification_task === false) {
9665     $err_detail = sprintf(
9666     __("Échec de l'ajout de la tâche de notification (notification %s)."),
9667     $notification_id);
9668     $this->addToLog(__METHOD__.' '.$err_msg_log.'. '.$err_detail, DEBUG_MODE);
9669     $this->addToMessage($err_msg);
9670     return false;
9671     }
9672    
9673     // Vérification de la réussite de l'envoi du mail
9674     // Fais une requête pour récupérer la liste des notifications de signataire faites par mail
9675     // et associées à l'instruction en cours. Récupère uniquement la dernière qui doit être celle
9676     // qui viens d'être créée.
9677     // Si la tâche d'envoi du mail est en erreur alors on considère que l'envoi du mail a échoué.
9678     $qres = $this->f->get_one_result_from_db_query(
9679     sprintf(
9680     'SELECT
9681     state
9682     FROM
9683     %1$stask
9684     WHERE
9685     type = \'notification_signataire\'
9686     AND category = \'mail\'
9687     AND dossier = \'%2$s\'
9688     ORDER BY
9689     task DESC
9690     LIMIT 1',
9691     DB_PREFIXE,
9692     $this->f->db->escapeSimple($this->getVal('dossier'))
9693     ),
9694     array(
9695     'origin' => __METHOD__
9696     )
9697     );
9698     if ($qres['result'] === 'error') {
9699     $err_detail = sprintf(
9700     __("Échec de l'envoi du mail de notification (notification %s)."),
9701     $notification_id);
9702     $this->addToLog(__METHOD__.' '.$err_msg_log.'. '.$err_detail, DEBUG_MODE);
9703     $this->addToMessage($err_msg);
9704     return false;
9705     }
9706    
9707     // succès de la planification de la notification
9708     $this->addToMessage(sprintf(
9709     __('Le signataire "%s (%s)" sera notifié prochainement'),
9710     $signer_name,
9711     $signer_mail));
9712     return true;
9713     }
9714    
9715     /**
9716 softime 11876 * Permet de récupérer la bonne date limite en fonction de si l'instruction
9717     * est en incomplet notifié ou non.
9718     * On peut ajouter des jours à cette date grâce au paramètre "delay".
9719     * Cette fonction est utilisée dans un cas spécifique où on veut envoyer
9720     * l'instruction en signature le jour de la date limite.
9721     *
9722     * @param int $delay Le nombre de jour à ajouter à la date limite.
9723     *
9724     * @return string $date_limite la date limite calculé ou false
9725     */
9726     private function compute_date_limite($delay) {
9727     // Instanciation de l'objet dossier
9728     $inst_dossier = $this->f->get_inst__om_dbform(array(
9729     'obj' => 'dossier',
9730     'idx' => $this->getVal('dossier'),
9731     ));
9732    
9733     $date_to_compute = null;
9734     if ($inst_dossier->getVal('incomplet_notifie') === 't') {
9735     $date_to_compute = $inst_dossier->getVal('date_limite_incompletude');
9736     } else {
9737     $date_to_compute = $inst_dossier->getVal('date_limite');
9738     }
9739 softime 14064 if ($date_to_compute != null) {
9740     return date("Y-m-d", strtotime($date_to_compute."+ $delay days"));
9741     }
9742 softime 11876
9743 softime 14064 return null;
9744 softime 11876 }
9745    
9746     /**
9747 softime 10573 * Permet de récupérer la traduction de la valeur de statut_signature
9748     *
9749     * @return string la valeur de statut_signature traduite | false
9750     */
9751     function get_trad_for_statut($value_to_trad){
9752     $statut_signature_tab = array(
9753     'waiting' => __('en préparation'),
9754     'in_progress' => __('en cours de signature'),
9755     'canceled' => __('signature annulée'),
9756 softime 10808 'expired' => __('délai de signature expiré'),
9757 softime 10573 'finished' => __('signé')
9758     );
9759     if (array_key_exists($value_to_trad, $statut_signature_tab) === true) {
9760     return $statut_signature_tab[$value_to_trad];
9761     }
9762    
9763     return false;
9764     }
9765    
9766     /**
9767     * Permet de mettre à jour le tableau json sotcké dans le champ historique_signature
9768     *
9769     * @return string (json) la valeur de historique_signature mis à jour | false
9770     */
9771     function get_updated_historique_signature($historique_signature_values) {
9772    
9773     $historique_signature_value_tab = $this->get_historique_signature_decoded();
9774    
9775     if ($historique_signature_value_tab === false) {
9776     $this->addToLog(__METHOD__."(): erreur historique signature", DEBUG_MODE);
9777     return false;
9778     }
9779    
9780     $last_val_historique_signature = array();
9781    
9782     // Si la tableau récupéré n'est pas vide alors
9783     // on récupère la dernière ligne du tableau
9784     if (empty($historique_signature_value_tab) === false) {
9785     $last_val_historique_signature = end($historique_signature_value_tab);
9786     }
9787    
9788     $format_date = '';
9789     $format_date_hour = '';
9790     $date_converted=array();
9791    
9792     $date_to_convert = array(
9793     'date_envoi_signature' => $historique_signature_values['date_envoi_signature'],
9794 softime 11876 'date_limite_instruction' => $this->compute_date_limite(0),
9795 softime 10573 'date_retour_signature' => $historique_signature_values['date_retour_signature']
9796     );
9797    
9798     // Conversion des dates en fonction de leur format
9799     foreach ($date_to_convert as $key => $value) {
9800     $date_converted[$key] = null;
9801     if ($value != null) {
9802     $format_date = 'd/m/Y';
9803     $format_date_hour = 'd/m/Y H:i:s';
9804     $date_converted[$key] = empty(date_parse($value)['hour']) === false ? date($format_date_hour, strtotime($value)) : date($format_date, strtotime($value));
9805     }
9806     }
9807    
9808     // Ce tableau permet de lister les colonnes de historique_signature et de les rendre traduisibles.
9809     // Il faut en effet mettre les gettext avec l'intitulé explicite au moins
9810     // une fois afin qu'il puisse être reconnu par le logiciel de traduction.
9811     $tab_for_columns_trad = array(
9812     __('entry_date'),
9813     __('id_parapheur_signature'),
9814     __('emetteur'),
9815     __('signataire'),
9816     __('date_envoi'),
9817     __('date_limite'),
9818     __('date_retour'),
9819     __('statut_signature'),
9820     __('commentaire_signature')
9821     );
9822    
9823     array_push($historique_signature_value_tab, array(
9824     'entry_date' => date('d/m/Y H:i:s'),
9825     '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'],
9826     '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'],
9827     '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'],
9828     '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'],
9829     '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'],
9830     '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'],
9831     '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']),
9832     'commentaire_signature' => isset($historique_signature_values['commentaire_signature']) === false || $historique_signature_values['commentaire_signature'] == null ? null : $historique_signature_values['commentaire_signature'],
9833     ));
9834    
9835     return json_encode($historique_signature_value_tab, JSON_HEX_APOS);
9836     }
9837 softime 11876
9838     /**
9839     * TREATMENT - annuler_envoi_en_signature
9840     *
9841     * Permet d'annuler l'envoi du document de l'instruction au parapheur pour signature
9842     *
9843     * @return boolean true si l'annulation a été effectué avec succès false sinon
9844     */
9845     function annuler_envoi_en_signature() {
9846     $this->begin_treatment(__METHOD__);
9847     $this->correct = true;
9848 softime 10573
9849 softime 11876 //Instanciation de la classe electronicsignature
9850     $inst_es = $this->get_electronicsignature_instance();
9851     if ($inst_es === false) {
9852     $this->correct = false;
9853     return $this->end_treatment(__METHOD__, false);
9854     }
9855 softime 10573
9856 softime 11876 $data = array();
9857     if (! empty($this->getVal('id_parapheur_signature'))) {
9858     $data['id_parapheur_signature'] = $this->getVal('id_parapheur_signature');
9859     } else {
9860     $this->correct = false;
9861     $this->addToMessage(__("Il n'y a pas d'identifiant de parapheur."));
9862     return $this->end_treatment(__METHOD__, false);
9863     }
9864    
9865     // Appel de la méthode de l'abstracteur cancel_send_for_signature()
9866     // Cette méthode doit retourner un tableau de valeur
9867     try {
9868     $result = $inst_es->cancel_send_for_signature($data);
9869     } catch (electronicsignature_exception $e) {
9870     $this->handle_electronicsignature_exception($e);
9871     return $this->end_treatment(__METHOD__, false);
9872     }
9873    
9874     // Après avoir reçu le résultat du parapheur, il faut mettre à jour les champs
9875     $valF = array();
9876    
9877     // Pour appeler la fonction modifier il faut traiter tous les champs de l'objet
9878     foreach($this->champs as $identifiant => $champ) {
9879     $valF[$champ] = $this->val[$identifiant];
9880     }
9881     // On fait ensuite nos modifications spécifiques
9882     $valF['id_parapheur_signature'] = null;
9883     $valF['statut_signature'] = $result['statut'];
9884     $valF['commentaire_signature'] = isset($result['commentaire_signature']) == true ? $result['commentaire_signature'] : null;
9885     $valF['date_envoi_signature'] = null;
9886     $valF['historique_signature'] = $this->get_updated_historique_signature($result);
9887    
9888     $ret = $this->modifier($valF);
9889    
9890     if ($ret === false) {
9891     $this->correct = false;
9892     $this->addToMessage(__("Une erreur est survenue lors de la mise à jour des champs."));
9893     // Termine le traitement
9894     return $this->end_treatment(__METHOD__, false);
9895     }
9896    
9897     // Message
9898     $this->addToMessage(__("L'annulation a été effectuée avec succès."));
9899    
9900     // Tout s'est bien passé, on termine le traitement
9901     return $this->end_treatment(__METHOD__, true);
9902     }
9903    
9904    
9905 softime 10573 /**
9906     * Récupère le contenu du champ historique_signature et le converti en tableau
9907     *
9908     * @return array sinon false en cas d'erreur
9909     */
9910     protected function get_historique_signature_decoded() {
9911 softime 11876 $val = str_replace("'", '"', $this->getVal('historique_signature'));
9912     if ($val === '' || $val == 'false') {
9913 softime 10573 $val = json_encode(array());
9914     }
9915     if($this->isJson($val) === false) {
9916     return false;
9917     }
9918     return json_decode($val, true);
9919     }
9920    
9921 softime 10808 /**
9922     * Récupère les informations à afficher dans le tableau de suivi à l'aide
9923     * d'une requête sql. Stocke ces informations dans un tableau.
9924 softime 12433 * Converti le tableau au format json et renvoi le json obtenu.
9925 softime 10808 *
9926 softime 12433 * Pour identifier quel suivi est affiché (notification des demandeurs, des services ou
9927     * de tiers) ce sont les tâches liées aux notifications qui sont utilisés.
9928     * La clause where de la requête est construite à partir du tableau contenant les types
9929     * de tâches fourni en paramètre.
9930     * Il est également possible d'afficher les notifications n'étant pas lié à des tâches.
9931     *
9932     * Si le suivi concerne la notification des demandeurs via le portail citoyen,
9933     * la date de premier accès ne sera pas affichée.
9934     *
9935     * @param array liste des tâches permettant d'identifier quelles notification afficher
9936     * @param boolean permet d'afficher les notifications non liées à des tâches
9937 softime 10808 * @return json
9938     */
9939 softime 15037 public function get_json_suivi_notification($typeTache, $nonLieTache = false) {
9940 softime 11585 $whereTypeTache = '';
9941 softime 15037 $sqlTaskNull = 'INNER';
9942 softime 12654
9943     // Liste des champs à afficher. Permet également la traduction des noms de colonnes.
9944     $listeChampsTrad = array(
9945     __('emetteur'),
9946     __('date_envoi'),
9947     __('destinataire'),
9948     __('date_premier_acces'),
9949     __('instruction'),
9950     __('annexes'),
9951     __('statut'),
9952     __('commentaire')
9953     );
9954     $listeChamps = array(
9955     'emetteur',
9956     'date_envoi',
9957     'destinataire',
9958     'date_premier_acces',
9959     'instruction',
9960     'annexes',
9961     'statut',
9962     'commentaire'
9963     );
9964    
9965 softime 12124 // Défini si on veux que la requête récupère également les notifications qui n'ont pas
9966     // de tâches associées. C'est le cas pour les notifications de demandeurs lorsque la
9967     // notification du demandeur principal n'a pas pu être envoyée à cause d'un mauvais
9968     // paramétrage
9969     if(is_bool($nonLieTache) && $nonLieTache === true) {
9970 softime 15037 $sqlTaskNull = 'LEFT';
9971 softime 12124 }
9972     // Prépare la clause where pour ne récupérer que les notifications liées à certain type de tâches
9973     // Permet de différencier les notifications des demandeurs de celle des services et de celles des
9974     // tiers consulté
9975 softime 12433 if (is_array($typeTache) && $typeTache != array()) {
9976 softime 11585 if (is_array($typeTache)) {
9977     $whereTypeTache = sprintf(
9978 softime 15835 'AND (task.task IS NULL OR (task.task IS NOT NULL AND task.type IN (%1$s)))',
9979 softime 15037 "'".implode("', '", $typeTache)."'"
9980 softime 11585 );
9981     }
9982 softime 12433 // La date de premier accès n'a pas besoin d'être renseigné pour
9983     // les notifications des demandeurs via le portail citoyen.
9984     // Les notifications des demandeurs sont liés à 3 types de tâches
9985     // notification_recepisse, notification_instruction, notification_decision
9986     // Si le suivi de la notification concerne un de ces types de tâches on
9987     // considère que c'est une notification de demandeurs.
9988     // Dans ce cas on vérifie si cette notification est paramétrée pour passer
9989     // via le portail. Par défaut si rien n'est paramétré on considère que la
9990     // notification est faite via le portail
9991     if ((in_array('notification_recepisse', $typeTache) ||
9992     in_array('notification_instruction', $typeTache) ||
9993     in_array('notification_decision', $typeTache))) {
9994     $dossier = $this->getVal('dossier');
9995     $collectivite_di = $this->get_dossier_instruction_om_collectivite($dossier);
9996     $modeNotification = $this->f->get_param_option_notification($collectivite_di);
9997 softime 14064 if ($modeNotification === PORTAL) {
9998 softime 12654 $listeChamps = array(
9999     'emetteur',
10000     'date_envoi',
10001     'destinataire',
10002     'instruction',
10003     'annexes',
10004     'statut',
10005     'commentaire'
10006     );
10007 softime 12433 }
10008     }
10009 softime 12654 // Il n'y a pas d'annexe pour la notification des communes donc pas besoin
10010     // de les afficher dans le suivi
10011     if (in_array('notification_depot_demat', $typeTache)) {
10012     $listeChamps = array(
10013     'emetteur',
10014     'date_envoi',
10015     'destinataire',
10016     'instruction',
10017     'statut',
10018     'commentaire'
10019     );
10020     }
10021 softime 11585 }
10022 softime 12433
10023 softime 10808 $valSuivi = array();
10024     // Récupération des infos nécessaires à l'affichage du tableau
10025     $sql = sprintf(
10026 softime 11585 'SELECT DISTINCT
10027 softime 10869 instruction_notification.instruction_notification,
10028 softime 12124 -- Affiche la mention automatique avec le nom de l emetteur si la notification a été envoyé automatiquement
10029 softime 10869 CASE WHEN instruction_notification.automatique = TRUE
10030     THEN TRIM(CONCAT(instruction_notification.emetteur, \' \', \'(automatique)\'))
10031     ELSE instruction_notification.emetteur
10032     END as emetteur,
10033 softime 10808 date_envoi,
10034     instruction_notification.destinataire,
10035 softime 10869 instruction_notification.date_premier_acces,
10036 softime 10808 evenement.libelle as instruction,
10037 softime 10869 instruction_notification.statut,
10038     instruction_notification.commentaire,
10039 softime 12433 annexes.instruction_annexe as annexes
10040 softime 10808 FROM
10041     %1$sinstruction_notification
10042     LEFT JOIN %1$sinstruction
10043     ON instruction.instruction = instruction_notification.instruction
10044     LEFT JOIN %1$sevenement
10045     ON instruction.evenement = evenement.evenement
10046 softime 10869 LEFT JOIN %1$sinstruction_notification_document
10047     ON instruction_notification.instruction_notification = instruction_notification_document.instruction_notification
10048     AND instruction_notification_document.annexe = true
10049 softime 12124 -- Récupère les tâches liées au notification pour pouvoir par la suite identifier le type de notification
10050 softime 15037 %4$s JOIN %1$stask
10051 softime 11585 ON instruction_notification.instruction_notification::CHARACTER VARYING = task.object_id
10052 softime 15835 AND task.type LIKE \'notification%%\'
10053 softime 12124 -- Récupération de la liste des annexes sous la forme d une liste
10054 softime 11585 LEFT JOIN (
10055     SELECT
10056     instruction_notification,
10057 softime 12124 -- Récupère la liste des annexes de la notification
10058 softime 12433 -- sous la forme d un json pour récupérer toutes les informatiosn nécessaire
10059     -- à l affichage du lien vers les annexes
10060     CONCAT(
10061     \'[\',
10062     STRING_AGG(
10063     -- Affiche le nom du fichier selon le type de document/pièce
10064     CASE
10065     WHEN instruction_notification_document.document_type = \'instruction\'
10066     THEN CONCAT(
10067     \'{
10068     "obj" : "instruction",
10069     "champs" : "om_fichier_instruction",
10070     "label" : "\', evenement.libelle, \'",
10071     "id" : "\', instruction.instruction,\'"
10072     }\'
10073     )
10074     WHEN instruction_notification_document.document_type = \'consultation\'
10075     THEN CONCAT(
10076 softime 15218 \'{
10077     "obj" : "consultation",
10078     "champs" : "fichier",
10079     "label" : "\', CONCAT_WS( \' - \', \'Avis\', service.libelle, to_char(consultation.date_retour,\'DD/MM/YYYY\')), \'",
10080     "id" : "\', consultation.consultation, \'"
10081     }\'
10082 softime 12433 )
10083     ELSE
10084     CONCAT(
10085     \'{
10086     "obj" : "document_numerise",
10087     "champs" : "uid",
10088     "label" : "\', document_numerise.nom_fichier, \' - \', document_numerise_type.libelle, \'",
10089     "id" : "\', document_numerise.document_numerise,\'"
10090     }\'
10091     )
10092     END,
10093     \', \'),
10094     \']\'
10095 softime 11585 ) AS instruction_annexe
10096     FROM
10097     %1$sinstruction_notification_document
10098     LEFT JOIN %1$sinstruction
10099     ON instruction_notification_document.instruction = instruction.instruction
10100     LEFT JOIN %1$sevenement
10101     ON instruction.evenement = evenement.evenement
10102     LEFT JOIN %1$sconsultation
10103     ON instruction_notification_document.document_id = consultation.consultation
10104     LEFT JOIN %1$sservice
10105     ON consultation.service = service.service
10106 softime 12433 LEFT JOIN %1$sdocument_numerise
10107     ON instruction_notification_document.document_id = document_numerise.document_numerise
10108     LEFT JOIN %1$sdocument_numerise_type
10109     ON document_numerise.document_numerise_type = document_numerise_type.document_numerise_type
10110 softime 11585 WHERE
10111     instruction_notification_document.annexe = \'t\'
10112     GROUP BY
10113     instruction_notification
10114     ) AS annexes
10115     ON
10116     annexes.instruction_notification = instruction_notification.instruction_notification
10117 softime 10808 WHERE
10118 softime 10869 instruction.instruction = %2$s
10119 softime 15835 %3$s
10120 softime 10869 ORDER BY
10121     date_envoi ASC, instruction_notification.destinataire ASC',
10122 softime 10808 DB_PREFIXE,
10123 softime 14542 intval($this->getVal('instruction')),
10124 softime 15037 $whereTypeTache,
10125     $sqlTaskNull
10126 softime 10808 );
10127 softime 14542 $qres = $this->f->get_all_results_from_db_query($sql, array(
10128     "origin" => __METHOD__
10129     )
10130     );
10131 softime 12433 // Préparation du lien de téléchargement des annexes
10132     $htmlList =
10133     '<style>
10134     #content .gridjs-td a.lien_annexe {
10135     text-decoration : underline dotted 1px;
10136     }
10137     #content a.lien_annexe:hover {
10138     text-decoration : underline solid 1px;
10139     color : #46aede;
10140     }
10141     ol {padding-left : 10px;}
10142     </style>
10143     <ol>%1$s</ol>';
10144     $lienTelechargement =
10145     '<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">
10146     Annexe
10147     </a>';
10148 softime 10808 // Stockage des infos de chaque notification dans un tableau
10149 softime 14542 foreach ($qres['result'] as $row) {
10150 softime 10808 $valNotif = array();
10151     foreach($listeChamps as $champ) {
10152     $valNotif[$champ] = $row[$champ];
10153 softime 10815 if (($champ === 'date_envoi'
10154     || $champ === 'date_premier_acces')
10155     && $row[$champ] !== null
10156     && $row[$champ] !== '') {
10157 softime 10814 //
10158     $valNotif[$champ] = date('d/m/Y H:i:s', strtotime($row[$champ]));
10159 softime 12433 } else if ($champ === 'annexes') {
10160     $listeAnnexe = '';
10161     $infoAnnexes = json_decode($row[$champ], true);
10162     if (! empty($infoAnnexes) && json_last_error() === JSON_ERROR_NONE) {
10163     // A partir des infos récupérées prépare le code html du lien vers chacune
10164     // des annexes et ajoute un élément de liste par annexe
10165     foreach($infoAnnexes as $annexe) {
10166     $listeAnnexe .= sprintf(
10167     '<li>%s</li>',
10168     sprintf($lienTelechargement,
10169     $annexe['obj'],
10170     $annexe['champs'],
10171     $annexe['id'],
10172     $annexe['label']
10173     )
10174     );
10175     }
10176     // Construction de la liste des annexes
10177     $valNotif[$champ] = sprintf(
10178     $htmlList,
10179     $listeAnnexe
10180     );
10181     }
10182 softime 10814 }
10183 softime 10808 }
10184     array_push($valSuivi, $valNotif);
10185     }
10186    
10187     // Passage du tableau au format json
10188     return json_encode($valSuivi, JSON_HEX_APOS);
10189     }
10190    
10191 softime 10573 /**
10192     * Traitement des erreurs retournées par l'abstracteur electronicsignature.
10193     *
10194     * @param electronicsignature_exception $exception Exception retournée par l'abstracteur.
10195     *
10196     * @return void
10197     */
10198     public function handle_electronicsignature_exception(electronicsignature_exception $exception) {
10199     $this->f->displayMessage('error', $exception->getMessage());
10200     }
10201    
10202    
10203     /**
10204     * Retourne une instance du connecteur electronicsignature, et la créer si elle n'existe pas.
10205     *
10206     * @param boolean $with_handle_error Flag pour afficher ou non le message d'erreur à l'utilisateur.
10207     * @return electronicsignature Instance de l'abstracteur.
10208     */
10209     public function get_electronicsignature_instance($with_handle_error = true) {
10210     if(isset($this->electronicsignature_instance)) {
10211     return $this->electronicsignature_instance;
10212     }
10213     // Instanciation du connecteur electronicsignature
10214     try {
10215     require_once "electronicsignature.class.php";
10216     $collectivites = array("collectivite_idx" => $this->get_dossier_instruction_om_collectivite(), "collectivite_multi_idx" => $this->f->get_idx_collectivite_multi());
10217     $this->electronicsignature_instance = new electronicsignature($collectivites);
10218     } catch (electronicsignature_exception $e) {
10219     if ($with_handle_error === true) {
10220     $this->handle_electronicsignature_exception($e);
10221     }
10222     return false;
10223     }
10224     return $this->electronicsignature_instance;
10225     }
10226    
10227     /**
10228 softime 11418 * TREATMENT - envoyer_au_controle_de_legalite
10229     *
10230     * Ajoute la tâche envoi_CL.
10231     * C'est le traitement de la tâche qui mettra à jour la date d'envoi au contrôle de légalité.
10232     *
10233     * @return [type] [description]
10234     */
10235     function envoyer_au_controle_de_legalite() {
10236     $this->begin_treatment(__METHOD__);
10237     $this->correct = true;
10238    
10239     //
10240     if ($this->can_be_sended_to_cl() === true) {
10241     // Création de la task 'envoi_CL'
10242     $inst_task = $this->f->get_inst__om_dbform(array(
10243     "obj" => "task",
10244     "idx" => 0,
10245     ));
10246     $task_val = array(
10247     'type' => 'envoi_CL',
10248     'object_id' => $this->getVal('instruction'),
10249     'dossier' => $this->getVal('dossier'),
10250     );
10251     // Change l'état de la tâche de notification en fonction de l'état de
10252     // transmission du dossier d'instruction
10253     $inst_di = $this->get_inst_dossier($this->getVal('dossier'));
10254     if ($this->f->is_option_mode_service_consulte_enabled() === false
10255     && ($inst_di->getVal('etat_transmission_platau') == 'non_transmissible'
10256     || $inst_di->getVal('etat_transmission_platau') == 'transmis_mais_non_transmissible')) {
10257     //
10258     $task_val['state'] = $inst_task::STATUS_DRAFT;
10259     }
10260     $add_task = $inst_task->add_task(array('val' => $task_val));
10261     if ($add_task === false) {
10262     $this->addToMessage(sprintf('%s %s',
10263     __("Une erreur s'est produite lors de la création tâche."),
10264     __("Veuillez contacter votre administrateur.")
10265     ));
10266     $this->correct = false;
10267     return $this->end_treatment(__METHOD__, false);
10268     }
10269     // Mise à jour du champs 'envoye_cl_platau'
10270     $instr_val = array(
10271     'envoye_cl_platau' => 't',
10272     );
10273     $res = $this->f->db->autoExecute(
10274     DB_PREFIXE.$this->table,
10275     $instr_val,
10276     DB_AUTOQUERY_UPDATE,
10277     $this->getCle($this->getVal($this->clePrimaire))
10278     );
10279 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);
10280 softime 11418 if ($this->f->isDatabaseError($res, true) === true) {
10281     $this->addToMessage(sprintf('%s %s',
10282     __("Une erreur s'est produite lors de la mise à jour de l'instruction."),
10283     __("Veuillez contacter votre administrateur.")
10284     ));
10285     $this->correct = false;
10286     return $this->end_treatment(__METHOD__, false);
10287     }
10288     // Message de validation à l'utilisateur
10289     $this->addToMessage(__('Votre demande de transfert au contrôle de légalité à bien été prise en compte.'));
10290     $this->addToMessage(__("La date d'envoi au contrôle de légalité sera mise à jour ultérieurement."));
10291     }
10292     //
10293     return $this->end_treatment(__METHOD__, true);
10294     }
10295    
10296    
10297     /**
10298 softime 8593 * Retourne le lien de retour (VIEW formulaire et VIEW sousformulaire).
10299     *
10300     * @param string $view Appel dans le contexte de la vue 'formulaire' ou de
10301     * la vue 'sousformulaire'.
10302     *
10303     * @return string
10304     */
10305     function get_back_link($view = "formulaire") {
10306     //
10307     $href = parent::get_back_link($view);
10308     //
10309     $crud = $this->get_action_crud();
10310 mbroquet 3730
10311 softime 8593 // Redirection vers le formulaire de modification à la validation du
10312     // formulaire d'ajout si l'événement associé possède une lettre type
10313     if (($crud === 'create'
10314     || ($crud === null
10315     && $this->getParameter('maj') == 0))
10316     && $this->correct == true
10317     && $this->evenement_has_an_edition($this->valF['evenement']) === true) {
10318 softime 7996
10319 softime 8593 // On instancie l'instruction
10320     $inst_instruction = $this->f->get_inst__om_dbform(array(
10321     "obj" => "instruction",
10322     "idx" => $this->valF[$this->clePrimaire],
10323     ));
10324    
10325     // Si l'instruction n'est pas finalisée automatiquement
10326     if ($inst_instruction->getVal('om_final_instruction') !== 't') {
10327     $href = str_replace("&action=3", "&action=1", $href);
10328     //
10329     if (strpos($href, "&retour=tab") !== false) {
10330     $href = str_replace("&retour=tab", "&retour= form", $href);
10331     } else {
10332     $href .= "&retour=form";
10333     }
10334     }
10335     }
10336    
10337     //
10338     return $href;
10339     }
10340    
10341 softime 10573 public function view_json_data() {
10342     $this->checkAccessibility();
10343     $this->f->disableLog();
10344     $view = $this->get_json_data();
10345     printf(json_encode($view));
10346     }
10347    
10348     public function get_json_data() {
10349     $val = array_combine($this->champs, $this->val);
10350     foreach ($val as $key => $value) {
10351     $val[$key] = strip_tags($value);
10352     }
10353     $val['tacite'] = 'f';
10354     $inst_ad = $this->f->get_inst__om_dbform(array(
10355     "obj" => "avis_decision",
10356     "idx" => $val['avis_decision'],
10357     ));
10358     if (preg_match('/[tT]acite/', $inst_ad->getVal('libelle')) === 1) {
10359     $val['tacite'] = 't';
10360     }
10361     return $val;
10362     }
10363    
10364 softime 13528 /**
10365     * Permet de récupérer l'identifiant de l'instruction sur le dossier, ayant
10366     * comme événement lié le suivant définit dans l'événement de l'instruction
10367     * instanciée.
10368     *
10369     * @param string $next_type Correspond aux trois déclenchement automatique
10370     * de création d'instruction paramétré sur un événement.
10371     * @param integer $instruction Identifiant de l'instruction à instancier.
10372     * @return mixed Identifiant de l'instruction recherchée ou false.
10373     */
10374 softime 11418 public function get_related_instructions_next($next_type = 'retour_signature', $instruction = null) {
10375     if (in_array($next_type, array('retour_signature', 'retour_ar', 'suivant_tacite', )) === false) {
10376     return false;
10377     }
10378     $result = array();
10379     $evenements = array();
10380     if ($instruction === null) {
10381     $instruction = $this->getVal($this->clePrimaire);
10382     $evenement = $this->getVal('evenement');
10383     $dossier = $this->getVal('dossier');
10384     } else {
10385     $inst = $this->f->get_inst__om_dbform(array(
10386     "obj" => "instruction",
10387     "idx" => $instruction,
10388     ));
10389     $evenement = $inst->getVal('evenement');
10390     $dossier = $inst->getVal('dossier');
10391     }
10392 softime 13528 // Récupération de l'identifiant de l'événement paramétré comme suivant
10393     // sur l'instruction instanciée
10394 softime 13137 $qres = $this->f->get_one_result_from_db_query(
10395     sprintf(
10396     'SELECT
10397     evenement_%3$s
10398     FROM
10399     %1$sevenement
10400     WHERE
10401     evenement = %2$s',
10402     DB_PREFIXE,
10403     intval($evenement),
10404     $next_type
10405     ),
10406     array(
10407     "origin" => __METHOD__,
10408     "force_return" => true,
10409     )
10410 softime 11418 );
10411 softime 13137 if ($qres["code"] !== "OK") {
10412 softime 11418 return false;
10413     }
10414 softime 13137 $ev_next = $qres["result"];
10415 softime 13528 // Récupération de l'instruction dans le dossier utilisant l'événement
10416     // suivant identifié dans la requête précédente
10417     $qres = $this->f->get_one_result_from_db_query(
10418 softime 13137 sprintf(
10419     'SELECT
10420     MAX(instruction.instruction) as instruction
10421     FROM
10422     %1$sinstruction
10423     WHERE
10424     dossier = \'%3$s\'
10425     AND evenement = %2$s',
10426     DB_PREFIXE,
10427     intval($ev_next),
10428 softime 14064 $this->f->db->escapeSimple($dossier)
10429 softime 13137 ),
10430     array(
10431     "origin" => __METHOD__,
10432     "force_return" => true,
10433     )
10434 softime 11418 );
10435 softime 13137 if ($qres["code"] !== "OK") {
10436 softime 11418 return false;
10437     }
10438 softime 13137 return $qres["result"];
10439 softime 11418 }
10440    
10441 softime 10573 public function get_related_instructions($instruction = null) {
10442     $result = array();
10443     $evenements = array();
10444     if ($instruction === null) {
10445     $instruction = $this->getVal($this->clePrimaire);
10446     $evenement = $this->getVal('evenement');
10447     $dossier = $this->getVal('dossier');
10448     } else {
10449     $inst = $this->f->get_inst__om_dbform(array(
10450     "obj" => "instruction",
10451     "idx" => $instruction,
10452     ));
10453     $evenement = $inst->getVal('evenement');
10454     $dossier = $inst->getVal('dossier');
10455     }
10456     //
10457 softime 13137 $qres = $this->f->get_one_result_from_db_query(
10458     sprintf(
10459     'SELECT
10460     evenement
10461     FROM
10462     %1$sevenement
10463     WHERE
10464     evenement_retour_ar = %2$s
10465     OR evenement_retour_signature = %2$s',
10466     DB_PREFIXE,
10467     intval($evenement)
10468     ),
10469     array(
10470     "origin" => __METHOD__,
10471     "force_return" => true,
10472     )
10473 softime 10573 );
10474 softime 13137 if ($qres["code"] !== "OK") {
10475 softime 10573 return false;
10476     }
10477 softime 13137 $ev_parent = $qres["result"];
10478 softime 10573 //
10479 softime 13137 $qres = $this->f->get_one_result_from_db_query(
10480     sprintf(
10481     'SELECT
10482     MAX(instruction.instruction) as instruction
10483     FROM
10484     %1$sinstruction
10485     WHERE
10486     dossier = \'%3$s\'
10487     AND evenement = %2$s',
10488     DB_PREFIXE,
10489     intval($ev_parent),
10490     $this->f->db->escapeSimple($dossier)
10491     ),
10492     array(
10493     "origin" => __METHOD__,
10494     "force_return" => true,
10495     )
10496 softime 10573 );
10497 softime 13137 if ($qres["code"] !== "OK") {
10498 softime 10573 return false;
10499     }
10500 softime 13137 $result[] = $qres["result"];
10501 softime 10573 //
10502 softime 13137 $qres = $this->f->get_one_result_from_db_query(
10503     sprintf(
10504     'SELECT
10505     evenement_retour_ar
10506     FROM
10507     %1$sevenement
10508     WHERE
10509 softime 14542 evenement = %2$d
10510     AND evenement_retour_ar != %3$d',
10511 softime 13137 DB_PREFIXE,
10512     intval($ev_parent),
10513     intval($evenement)
10514     ),
10515     array(
10516     "origin" => __METHOD__,
10517     "force_return" => true,
10518     )
10519 softime 10573 );
10520 softime 13137 if ($qres["code"] !== "OK") {
10521 softime 10573 return false;
10522     }
10523 softime 13137 $evenements[] = $qres["result"];
10524 softime 10573 //
10525 softime 13137 $qres = $this->f->get_one_result_from_db_query(
10526     sprintf(
10527     'SELECT
10528     evenement_retour_signature
10529     FROM
10530     %1$sevenement
10531     WHERE
10532     evenement = %2$s
10533     AND evenement_retour_signature != %3$s
10534     ',
10535     DB_PREFIXE,
10536     intval($ev_parent),
10537     intval($evenement)
10538     ),
10539     array(
10540     "origin" => __METHOD__,
10541     "force_return" => true,
10542     )
10543 softime 10573 );
10544 softime 13137 if ($qres["code"] !== "OK") {
10545 softime 10573 return false;
10546     }
10547 softime 13137 $evenements[] = $qres["result"];
10548 softime 10573 foreach ($evenements as $value) {
10549     if ($value !== null) {
10550 softime 13137 $qres = $this->f->get_one_result_from_db_query(
10551     sprintf(
10552     'SELECT
10553     MAX(instruction.instruction) as instruction
10554     FROM
10555     %1$sinstruction
10556     WHERE
10557     dossier = \'%3$s\'
10558     AND evenement = %2$s',
10559     DB_PREFIXE,
10560     intval($value),
10561     $this->f->db->escapeSimple($dossier)
10562     ),
10563     array(
10564     "origin" => __METHOD__,
10565     "force_return" => true,
10566     )
10567 softime 10573 );
10568 softime 13137 if ($qres["code"] !== "OK") {
10569 softime 10573 return false;
10570     }
10571 softime 13137 $result[] = $qres["result"];
10572 softime 10573 }
10573     }
10574     return $result;
10575     }
10576    
10577     protected function getDocumentType($champ = null) {
10578     $evenementId = $this->getVal('evenement');
10579     if (! empty($evenementId)) {
10580     $evenement = $this->f->findObjectById('evenement', $evenementId);
10581     if (! empty($evenement)) {
10582     return __("Instruction").':'.$evenement->getVal('libelle');
10583     }
10584     }
10585     return parent::getDocumentType();
10586     }
10587    
10588 softime 10808 /**
10589     * Récupère à l'aide d'une requête sql la liste des demandeurs
10590     * pouvant être notifié. C'est à dire les demandeurs acceptant
10591     * les notifications et pour lesquels une adresse mail existe.
10592     *
10593     * Dans le cas, d'une notification pour le portail citoyen, seul
10594     * le pétitionnaire principal doit être notifier et uniquement si
10595     * il a une adress mail et qu'il accepte les notifications.
10596     *
10597     * @param string identifiant du dossier
10598     * @param boolean true si il faut récupérer la liste des demandeurs notifiable
10599     * pour une notification de categorie portail
10600     * @return array liste des demandeurs pouvant être notifié
10601     */
10602     protected function get_demandeurs_notifiable($idDossier = null, $portail = false) {
10603     if ($idDossier === null) {
10604     $idDossier = $this->getVal('dossier');
10605     }
10606     // Ajoute une condition sur le where pour ne récupérer que le pétitionnaire principal
10607     // pour une notification depuis le portail citoyen
10608     $sqlPetitionnairePrincipal = '';
10609 softime 12124 // Gestion des champs nécessaires pour la notification d'un demandeur
10610     $condition_demandeur = "AND demandeur.notification = 't'
10611     AND demandeur.courriel IS NOT NULL";
10612 softime 10808 if ($portail === true) {
10613     $sqlPetitionnairePrincipal = 'AND lien_dossier_demandeur.petitionnaire_principal = true';
10614 softime 12124 $condition_demandeur = "AND (
10615     (notification = 't' AND courriel IS NOT NULL)
10616     OR demande.source_depot = 'portal'
10617     )";
10618 softime 10808 }
10619    
10620     $listeDemandeursNotifiable = array();
10621    
10622     // Requête de récupération des demandeurs
10623 softime 14542 $qres = $this->f->get_all_results_from_db_query(
10624     sprintf(
10625     'SELECT
10626     demandeur.demandeur,
10627     CASE
10628     WHEN demandeur.qualite=\'particulier\'
10629     THEN TRIM(CONCAT(demandeur.particulier_nom, \' \', demandeur.particulier_prenom, \' \', demandeur.courriel))
10630     ELSE
10631     TRIM(CONCAT(demandeur.personne_morale_raison_sociale, \' \', demandeur.personne_morale_denomination, \' \', demandeur.courriel))
10632     END AS destinataire,
10633     demandeur.courriel,
10634     petitionnaire_principal
10635     FROM
10636     %1$sdossier
10637     INNER JOIN %1$slien_dossier_demandeur
10638     ON dossier.dossier = lien_dossier_demandeur.dossier
10639     INNER JOIN %1$sdemandeur
10640     ON lien_dossier_demandeur.demandeur = demandeur.demandeur
10641     -- Récupération de la plus ancienne demande associée au dossier (la demande
10642     -- de création du dossier)
10643     INNER JOIN (
10644     SELECT
10645     demande,
10646     dossier_instruction,
10647     source_depot
10648     FROM
10649     %1$sdemande
10650     WHERE
10651     dossier_instruction = \'%2$s\'
10652     ORDER BY
10653     demande ASC
10654     LIMIT 1
10655     ) as demande
10656     ON dossier.dossier = demande.dossier_instruction
10657     WHERE
10658     dossier.dossier = \'%2$s\'
10659     %3$s
10660     %4$s',
10661     DB_PREFIXE,
10662     $this->f->db->escapeSimple($idDossier),
10663     $condition_demandeur,
10664     $sqlPetitionnairePrincipal
10665     ),
10666     array(
10667     "origin" => __METHOD__
10668     )
10669 softime 10808 );
10670     // Récupération des infos des demandeurs et stockage dans un tableau
10671     // ayant pour clé les id des demandeurs
10672 softime 14542 foreach ($qres['result'] as $row) {
10673 softime 10869 $listeDemandeursNotifiable[$row['demandeur']] = $row;
10674 softime 10808 }
10675    
10676     return $listeDemandeursNotifiable;
10677     }
10678    
10679     /**
10680     * Renvoie la liste des notifications liées à l'instruction
10681     *
10682     * @param integer id de l'instruction dont on cherche les notifications
10683     * @return array liste des instruction_notification liés à l'instruction
10684     */
10685 softime 12124 public function get_instruction_notification($id_instruction, $typeNotification = null, $nonLieTache = false) {
10686 softime 11585 $whereTypeTache = '';
10687 softime 15037 $sqlTaskNull = 'INNER';
10688 softime 12124 // Défini si on veux que la requête récupère également les notifications qui n'ont pas
10689     // de tâches associées. C'est le cas pour les notifications de demandeurs lorsque la
10690     // notification du demandeur principal n'a pas pu être envoyée à cause d'un mauvais
10691     // paramétrage
10692     if(is_bool($nonLieTache) && $nonLieTache === true) {
10693 softime 15037 $sqlTaskNull = 'LEFT';
10694 softime 12124 }
10695 softime 11585 if ($typeNotification != null) {
10696     if (is_array($typeNotification)) {
10697     $whereTypeTache = sprintf(
10698 softime 15037 'AND (task.type IN (%1$s))',
10699     "'".implode("', '", $typeNotification)."'"
10700 softime 11585 );
10701     } else {
10702     $whereTypeTache = sprintf(
10703 softime 15037 'AND (task.type = \'%1$s\')',
10704     $typeNotification
10705 softime 11585 );
10706     }
10707     }
10708 softime 10808 $listeInstrNotif = array();
10709 softime 14542 $qres = $this->f->get_all_results_from_db_query(
10710     sprintf('
10711     SELECT
10712     instruction_notification.instruction_notification
10713     FROM
10714     %1$sinstruction_notification
10715 softime 15037 %4$s JOIN %1$stask
10716 softime 14542 ON instruction_notification.instruction_notification::CHARACTER VARYING = task.object_id
10717 softime 15037 %3$s
10718 softime 14542 WHERE
10719 softime 15037 instruction = %2$s',
10720 softime 14542 DB_PREFIXE,
10721     intval($id_instruction),
10722 softime 15037 $whereTypeTache,
10723     $sqlTaskNull
10724 softime 14542 ),
10725     array(
10726     "origin" => __METHOD__
10727     )
10728 softime 10808 );
10729 softime 14542 foreach ($qres['result'] as $row) {
10730 softime 10808 $listeInstrNotif[] = $row['instruction_notification'];
10731     }
10732     return $listeInstrNotif;
10733     }
10734    
10735     /**
10736     * Crée une clé d'accès unique permettant à un utilisateur
10737     * anonyme de récupérer le document.
10738     *
10739     * @return string clé d'accès du document
10740     */
10741     protected function getCleAccesDocument() {
10742 softime 10869 // Initialisation d'un tableau
10743     $number_list = array();
10744    
10745     // Génération aléatoire d'un nombre sur 4 caractères, 4 fois
10746     for ($i = 0; $i < 4; $i++) {
10747     $number_list[] = str_pad(mt_rand(0, 9999), 4, 0, STR_PAD_LEFT);
10748     }
10749    
10750     // Transformation en chaîne tout en séparant les nombres par un "-"
10751     $result = implode('-', $number_list);
10752    
10753     // Vérifie si la clé existe déjà et si c'est le cas génére une nouvelle clé
10754     if ($this->getUidDocumentInstructionWithKey($result) != null) {
10755     return $this->getCleAccesDocument();
10756     }
10757    
10758     //
10759     return $result;
10760 softime 10808 }
10761    
10762     /**
10763 softime 10869 * Récupère une clé et renvoie l'uid du document liée à cette
10764     * clé. Si la clé n'existe pas renvoie null.
10765     *
10766     * @param string $cleGen clé dont on cherche l'instruction
10767     * @return integer|null
10768     */
10769     protected function getUidDocumentInstructionWithKey($cleGen) {
10770 softime 14064 $qres = $this->f->get_one_result_from_db_query(
10771     sprintf(
10772     'SELECT
10773     instruction.om_fichier_instruction
10774     FROM
10775     %1$sinstruction_notification_document
10776     LEFT JOIN %1$sinstruction
10777     ON instruction_notification_document.instruction = instruction.instruction
10778     WHERE
10779     instruction_notification_document.cle = \'%2$s\'',
10780     DB_PREFIXE,
10781     $this->f->db->escapeSimple($cleGen)
10782     ),
10783     array(
10784     "origin" => __METHOD__,
10785     )
10786 softime 10869 );
10787 softime 14064
10788     return $qres['result'];
10789 softime 10869 }
10790    
10791     /**
10792     * Récupère une clé, fait une requête pour récupérer l'id de la notification liée a cette clé.
10793     * Récupère l'instance de instruction_notification dont l'id a été récupéré et la renvoie.
10794     *
10795     * @param string $cleGen
10796     * @return instruction_notification
10797     */
10798     protected function getInstanceNotificationWithKey($key) {
10799 softime 14064 $qres = $this->f->get_one_result_from_db_query(
10800     sprintf(
10801     'SELECT
10802     instruction_notification
10803     FROM
10804     %1$sinstruction_notification_document
10805     WHERE
10806     cle = \'%2$s\'',
10807     DB_PREFIXE,
10808     $this->f->db->escapeSimple($key)
10809     ),
10810     array(
10811     "origin" => __METHOD__,
10812     )
10813 softime 10869 );
10814    
10815     // Récupération de l'instance de notification
10816     $instNotif = $this->f->get_inst__om_dbform(array(
10817     "obj" => "instruction_notification",
10818 softime 14064 "idx" => $qres['result'],
10819 softime 10869 ));
10820     return $instNotif;
10821     }
10822    
10823    
10824     /**
10825 softime 10808 * Affiche la page de téléchargement du document de la notification.
10826     *
10827     * @param boolean $content_only Affiche le contenu seulement.
10828     *
10829     * @return void
10830     */
10831 softime 10869 public function view_telecharger_document_anonym() {
10832 softime 10808 // Par défaut on considère qu'on va afficher le formulaire
10833     $idx = 0;
10834     // Flag d'erreur
10835     $error = false;
10836     // Message d'erreur
10837     $message = '';
10838    
10839 softime 10869 // Paramètres GET : récupération de la clé d'accès
10840     $cle_acces_document = $this->f->get_submitted_get_value('key');
10841 softime 10808 $cle_acces_document = $this->f->db->escapeSimple($cle_acces_document);
10842 softime 10869 // Vérification de l'existence de la clé et récupération de l'uid du fichier
10843     $uidFichier = $this->getUidDocumentInstructionWithKey($cle_acces_document);
10844     if ($uidFichier != null) {
10845     // Récupération du document
10846     $file = $this->f->storage->get($uidFichier);
10847 softime 10808
10848 softime 10869 // Headers
10849     header("Cache-Control: no-cache, must-revalidate"); // HTTP/1.1
10850     header("Expires: Sat, 26 Jul 1997 05:00:00 GMT"); // Date dans le passé
10851     header("Content-Type: ".$file['metadata']['mimetype']);
10852     header("Accept-Ranges: bytes");
10853     header("Content-Disposition: inline; filename=\"".$file['metadata']['filename']."\";" );
10854     // Affichage du document
10855     echo $file['file_content'];
10856 softime 10808
10857 softime 10869 // Récupération de la date de premier accès et maj du suivi uniquement
10858     // si la date de 1er accès n'a pas encore été remplis
10859     $inst_notif = $this->getInstanceNotificationWithKey($cle_acces_document);
10860     if ($inst_notif->getVal('date_premier_acces') == null ||
10861     $inst_notif->getVal('date_premier_acces') == '') {
10862     $notif_val = array();
10863     foreach ($inst_notif->champs as $champ) {
10864     $notif_val[$champ] = $inst_notif->getVal($champ);
10865     }
10866     $notif_val['date_premier_acces'] = date("d/m/Y H:i:s");
10867     $notif_val['statut'] = 'vu';
10868     $notif_val['commentaire'] = 'Le document a été vu';
10869     $suivi_notif = $inst_notif->modifier($notif_val);
10870 softime 10808 }
10871    
10872     } else {
10873 softime 10869 // Page vide 404
10874     printf('Ressource inexistante');
10875     header('HTTP/1.0 404 Not Found');
10876 softime 10808 }
10877     }
10878    
10879 softime 11228 /**
10880     * Récupère le titre du document envoyé au parapheur
10881     */
10882 softime 10808 protected function getDocumentTitre($champ = null) {
10883     $title = $this->getTitle();
10884     $dossier = $this->getDossier();
10885     return $dossier.' '.$title;
10886     }
10887    
10888 softime 10869 /**
10889 softime 11228 * Compose le nom du document à transmettre au parapheur.
10890     * Le nom ets composé de cette manière :
10891     * instruction_xxx_libelle_de_la_lettre_type_associee
10892     * ou xxx correspond au numéro de l'instruction
10893     */
10894     protected function getDocumentLibelle() {
10895     // Récupère le champ instruction
10896     $instruction = $this->getVal("instruction");
10897    
10898     // Requête sql servant à récupérer le titre du document
10899     // TO_CHAR() introduit un espace avant l'affichage du nombre
10900     // comme les espaces sont remplacé par des '_' dans le retour de la fonction
10901     // il n'est pas nécessaire de mettre un '_' après le mot instruction.
10902 softime 14064 $documentLibelle = $this->f->get_one_result_from_db_query(
10903     sprintf(
10904     'SELECT
10905     CONCAT(
10906     \'instruction\',
10907     TO_CHAR(instruction.instruction, \'000\'),
10908     \'_\',
10909     LOWER(om_lettretype.libelle)
10910     ) AS nom_fichier
10911     FROM
10912     %1$sinstruction
10913     LEFT JOIN %1$som_lettretype
10914     ON om_lettretype.id = instruction.lettretype
10915     WHERE
10916     instruction = %2$d',
10917     DB_PREFIXE,
10918     intval($instruction)
10919     ),
10920     array(
10921     "origin" => __METHOD__,
10922     )
10923 softime 11228 );
10924    
10925 softime 14064 $documentLibelle = $documentLibelle['result'];
10926    
10927 softime 11228 // Transforamtion des ' ' en '_', des accents en lettres sans accents et des
10928     // caractères spéciaux en '_'
10929     // La méthode normalize_string est utilisé pour gérer les accents
10930     $documentLibelle = $this->f->normalize_string($documentLibelle);
10931     // TODO : comparer cette liste et celle de la méthode normalize_string
10932     // pour éviter les doublons + vérifier qu'il n'y a pas de doublons dans cette
10933     // liste
10934     $invalid = array('Œ'=>'oe', 'œ'=>'oe', 'Ÿ'=>'y', 'ü'=>'u',
10935     '¢' => '_', 'ß' => '_', '¥' => '_', '£' => '_', '™' => '_', '©' => '_',
10936     '®' => '_', 'ª' => '_', '×' => '_', '÷' => '_', '±' => '_', '²' => '_',
10937     '³' => '_', '¼' => '_', '½' => '_', '¾' => '_', 'µ' => '_', '¿' => '_',
10938     '¶' => '_', '·' => '_', '¸' => '_', 'º' => '_', '°' => '_', '¯' => '_',
10939     '§' => '_', '…' => '_', '¤' => '_', '¦' => '_', '≠' => '_', '¬' => '_',
10940     'ˆ' => '_', '¨' => '_', '‰' => '_', '¤' => '_', '€' => '_', '$' => '_',
10941     '«' => '_', '»' => '_', '‹' => '_', '›' => '_', 'ƒ' => '_', '¥' => '_',
10942     '‘‘' => '_', '‚' => '_', '!' => '_', '¡' => '_', '¢' => '_', '£' => '_',
10943     '?' => '_', '[' => '_', ']' => '_', '´' => '_', '`' => '_', '^' => '_',
10944     '~' => '_', '˜' => '_', '#' => '_', '*' => '_', '.' => '_', ':' => '_',
10945     ';' => '_', '•' => '_', '¯' => '_', '‾' => '_', '–' => '_', '–' => '_',
10946     '—' => '_', '_' => '_', '|' => '_', '¦‌' => '_', '‡' => '_', '§' => '_',
10947     '¶' => '_', '©' => '_', '®' => '_', '™' => '_', '&' => '_', '@' => '_',
10948     '/' => '_', '\\' => '_', '◊' => '_', '♠' => '_', '♣' => '_', '♥' => '_',
10949     '♦' => '_', '←' => '_', '↑' => '_', '→' => '_', '↓' => '_', '↔' => '_',
10950     '°' => '_', 'µ' => '_', '<' => '_', '>' => '_', '≤' => '_', '≥' => '_',
10951     '=' => '_', '≈' => '_', '≠' => '_', '≡' => '_', '±' => '_', '−' => '_',
10952     '+' => '_', '×' => '_', '÷' => '_', '⁄' => '_', '%' => '_', '‰' => '_',
10953     '¼' => '_', '½' => '_', '¾' => '_', '¹' => '_', '²' => '_', '³' => '_',
10954     '' => '_', 'º' => '_', 'ª' => '_', 'ƒ' => '_', '′' => '_', '″' => '_',
10955     '∂' => '_', '∏' => '_', '∑' => '_', '√' => '_', '∞' => '_', '¬' => '_',
10956     '∩' => '_', '∫' => '_', 'α' => '_', 'Α' => '_', 'β' => '_', 'Β' => '_',
10957     'γ' => '_', 'Γ' => '_', 'δ' => '_', 'Δ' => '_', 'ε' => '_', 'Ε' => '_',
10958     'ζ' => '_', 'Ζ' => '_', 'η' => '_', 'Η' => '_', 'θ' => '_', 'Θ' => '_',
10959     'ι' => '_', 'Ι' => '_', 'κ' => '_', 'Κ' => '_', 'λ' => '_', 'Λ' => '_',
10960     'μ' => '_', 'Μ' => '_', 'ν' => '_', 'Ν' => '_', 'ξ' => '_', 'Ξ' => '_',
10961     'ο' => '_', 'Ο' => '_', 'π' => '_', 'Π' => '_', 'ρ' => '_', 'Ρ' => '_',
10962     'σ' => '_', 'ς' => '_', 'Σ' => '_', 'τ' => '_', 'Τ' => '_', 'υ' => '_',
10963     'Υ' => '_', 'φ' => '_', 'Φ' => '_', 'χ' => '_', 'Χ' => '_', 'ψ' => '_',
10964     'Ψ' => '_', 'ω' => '_', 'Ω' => '_', ',' => '_', ' ' => '_'
10965     );
10966    
10967     return str_replace(array_keys($invalid), array_values($invalid), $documentLibelle);
10968     }
10969    
10970     /**
10971 softime 10869 * Surcharge permettant de ne pas afficher le fil d'Ariane dans
10972     * l'overlay de notification des demandeurs.
10973     */
10974     function getSubFormTitle($ent) {
10975 softime 11876 $actionSansPath = array('411', '420', '430');
10976     if (in_array($this->getParameter('maj'), $actionSansPath)) {
10977 softime 10869 return '';
10978     }
10979     return parent::getSubFormTitle($ent);
10980     }
10981 softime 13137
10982     /**
10983     * Traitement de la notification automatique des tiers consulté.
10984     *
10985     * Récupère la liste des adresses mails des tiers notifiables. Pour chaque adresses
10986     * récupérées ajoute une notification et une tâche de notification par mail.
10987     * La création de la tâche de notification par mail déclenchera l'envoi du mail
10988     * et la mise à jour du suivi.
10989     *
10990     * Les tiers notifiables sont ceux :
10991     * - n’ayant pas un ID PLAT’AU correspondant à l’ID PLAT’AU du service consultant
10992     * - ayant une habilitation dont le type est listé dans les paramètres de
10993     * notification de l’événement,
10994     * - intervenant sur la commune ou le département du dossier
10995     * - ayant au moins une adresse mail valide
10996     *
10997     * @param evenement instance de l'événement associée à l'instruction
10998     * @param dossier instance du dossier de l'instruction
10999     * @return boolean indique si le traitement à réussi
11000     */
11001     protected function traitement_notification_automatique_tiers_consulte($evenement, $dossier) {
11002     // Récupération de l'identifiant plat'au du service consultant
11003     $consultationEntrante = $dossier->get_inst_consultation_entrante();
11004     // Récupération de la liste des types d'habilitations autorisées pour
11005     // cette notification
11006     $typesHabilitationsNotifiable = $evenement->get_types_habilitation_notifiable();
11007     // Récupération du département et de la commune du dossier
11008     $commune = $dossier->getVal('commune');
11009     // Le département est récupéré à partir de la commune du dossier donc si la
11010     // commune n'a pas pu être récupéré on ne récupère pas non plus le département.
11011     $idDepartement = null;
11012     if (! empty($commune)) {
11013     $departement = $dossier->get_inst_departement_dossier();
11014     $idDepartement = $departement->getVal($departement->clePrimaire);
11015     }
11016     // Récupération des courriels des tiers notifiables
11017     $tiersANotifier = $this->get_courriels_tiers_notifiable(
11018     $typesHabilitationsNotifiable,
11019     $consultationEntrante->getVal('service_consultant_id'),
11020     $commune,
11021     $idDepartement
11022     );
11023     // Traitement de chacune des listes de diffusion pour extraire les
11024     // courriels, vérifier la validité des courriels et envoyer la
11025     // notification
11026     $notificationSend = false;
11027     if (empty($tiersANotifier)) {
11028     $this->addToLog(
11029     sprintf(
11030 softime 14542 '%s() : %s %s : %s',
11031 softime 13137 __METHOD__,
11032     __("La récupération des tiers à échoué."),
11033     __('Paramétrage'),
11034     var_export(
11035     array(
11036     'types_habilitations_notifiable' => $typesHabilitationsNotifiable,
11037     'service_consultant' => $consultationEntrante->getVal('service_consultant_id'),
11038     'id_commune' => $commune,
11039     'id_departement' => $idDepartement
11040     ),
11041     true
11042     )
11043     ),
11044     DEBUG_MODE
11045     );
11046     return false;
11047     }
11048     foreach($tiersANotifier as $tierANotifier) {
11049     // Découpe la liste de diffusion pour stocker les adresses mails
11050     // des tiers dans un tableau
11051     $courriels =
11052     array_filter(
11053     array_map(
11054     'trim',
11055     preg_split("/\r\n|\n|\r/", $tierANotifier['liste_diffusion'])));
11056    
11057     foreach ($courriels as $courriel) {
11058     // Pour chaque adresse mail vérifie si l'adresse est valide
11059     if (! $this->f->checkValidEmailAddress($courriel)) {
11060     continue;
11061     }
11062     $destinataire = array(
11063     'destinataire' => $tierANotifier['libelle'].' : '.$courriel,
11064     'courriel' => $courriel
11065     );
11066     // Si l'adresse est valide ajoute une nouvelle notification
11067     // et une tâche d'envoi de mails
11068     $idNotif = $this->ajouter_notification(
11069     $this->getVal($this->clePrimaire),
11070     $this->f->get_connected_user_login_name(),
11071     $destinataire,
11072     $this->get_dossier_instruction_om_collectivite(),
11073     array(),
11074     true
11075     );
11076     if ($idNotif === false) {
11077     $this->addToLog(
11078     __METHOD__.
11079     __("L'ajout de la notification a échoué."),
11080     DEBUG_MODE
11081     );
11082     return false;
11083     }
11084     // Création de la tache en lui donnant l'id de la notification
11085     $notification_by_task = $this->notification_by_task(
11086     $idNotif,
11087     $dossier->getVal('dossier'),
11088     'mail',
11089     'notification_tiers_consulte'
11090     );
11091     if ($notification_by_task === false) {
11092     $this->addToLog(
11093     __METHOD__.
11094     __("L'ajout de la tâche de notification a échoué."),
11095     DEBUG_MODE
11096     );
11097     $this->addToMessage(
11098     __("Erreur lors de la génération de la notification au(x) pétitionnaire(s).")
11099     );
11100     return false;
11101     }
11102     $notificationSend = true;
11103     }
11104     }
11105     // Si aucune notification n'a été envoyé car il n'y a pas de courriels
11106     // valide, affiche un message dans les logs pour avoir un suivi.
11107     if (! $notificationSend) {
11108     $this->addToLog(
11109     sprintf(
11110     '%s %s : %s %s : %s',
11111     __METHOD__,
11112     __("Il n'y a pas de tiers notifiable pour l'instruction"),
11113     $evenement->getVal('libelle'),
11114     __("du dossier"),
11115     $this->getVal('dossier')
11116     ),
11117     DEBUG_MODE
11118     );
11119     }
11120     return true;
11121     }
11122    
11123     /**
11124     * Récupère, à l'aide d'une requête, la liste de diffusion des tiers
11125     * respectant les conditions suvantes :
11126     * - le tiers consulté dois accepté les notifications
11127     * - la liste de diffusion ne dois pas être vide
11128     * - l'uid du tiers consulté ne dois pas être celui passé en paramètre
11129     * si pas d'uid passé en paramètre alors on ne filtre pas selon l'uid
11130     * du tiers
11131     * - le type d'habilitation des tiers dois appartenir à la liste
11132     * fournie en paramètre
11133     * - le tiers dois être associé à la commune ou au département passé
11134     * en paramètre
11135     *
11136     * @param array $typesHabilitations tableau contenant la liste des types d'habilitation
11137     * pouvant être notifiée
11138     * @param integer $idPlautau uid de l'acteur plat'au du dossier qui ne dois pas être notifié
11139     * @param integer $commune identifiant de la commune du dossier
11140     * @param integer $departement identifiant du département du dossier
11141     *
11142     * @return array listes de diffusion des tiers notifiable
11143     */
11144     protected function get_courriels_tiers_notifiable(array $typesHabilitations, $idPlatau, $commune, $departement) {
11145     // Si paramètre non renseigné alors ne renvoie rien
11146     if (empty($typesHabilitations) || empty($commune) || empty($departement)) {
11147     return false;
11148     }
11149     // Si il n'y a pas d'acteur associé au dossier alors on ne filtre pas sur l'uid de l'acteur
11150     $filtreServiceConsulteDI = '';
11151     if (! empty($idPlatau)) {
11152     $filtreServiceConsulteDI = sprintf(
11153 softime 14064 "-- Filtre les tiers ayant une ligne correspondante a l uid platau du service
11154     -- en charge du dossier
11155     AND (tiers_consulte.uid_platau_acteur !~ ('\y' || '%s' || '\y')
11156     OR tiers_consulte.uid_platau_acteur IS NULL)",
11157 softime 13137 $this->f->db->escapeSimple($idPlatau)
11158     );
11159     }
11160     $rst = $this->f->get_all_results_from_db_query(
11161     sprintf(
11162     'SELECT
11163 softime 14064 -- Tiers notifiables lié à la commune du dossier
11164 softime 13137 tiers_consulte.liste_diffusion,
11165     tiers_consulte.libelle
11166     FROM
11167     %1$shabilitation_tiers_consulte
11168     LEFT JOIN %1$stiers_consulte
11169     ON habilitation_tiers_consulte.tiers_consulte = tiers_consulte.tiers_consulte
11170     LEFT JOIN %1$slien_habilitation_tiers_consulte_commune
11171     ON habilitation_tiers_consulte.habilitation_tiers_consulte = lien_habilitation_tiers_consulte_commune.habilitation_tiers_consulte
11172 softime 14064 -- Conservation uniquement des tiers acteur de dossiers
11173     JOIN %1$slien_dossier_tiers
11174     ON tiers_consulte.tiers_consulte = lien_dossier_tiers.tiers
11175     WHERE
11176     tiers_consulte.accepte_notification_email IS TRUE
11177     AND tiers_consulte.liste_diffusion IS NOT NULL
11178     %3$s
11179     AND habilitation_tiers_consulte.type_habilitation_tiers_consulte IN (%2$s)
11180     AND lien_habilitation_tiers_consulte_commune.commune = %4$d
11181     -- Filtre sur les tiers acteur du dossier
11182     AND lien_dossier_tiers.dossier = \'%6$s\'
11183     UNION
11184     SELECT
11185     -- Tiers notifiables lié au département du dossier
11186     tiers_consulte.liste_diffusion,
11187     tiers_consulte.libelle
11188     FROM
11189     %1$shabilitation_tiers_consulte
11190     LEFT JOIN %1$stiers_consulte
11191     ON habilitation_tiers_consulte.tiers_consulte = tiers_consulte.tiers_consulte
11192 softime 13137 LEFT JOIN %1$slien_habilitation_tiers_consulte_departement
11193     ON habilitation_tiers_consulte.habilitation_tiers_consulte = lien_habilitation_tiers_consulte_departement.habilitation_tiers_consulte
11194 softime 14064 -- Conservation uniquement des tiers acteur de dossiers
11195     JOIN %1$slien_dossier_tiers
11196     ON tiers_consulte.tiers_consulte = lien_dossier_tiers.tiers
11197 softime 13137 WHERE
11198     tiers_consulte.accepte_notification_email IS TRUE
11199     AND tiers_consulte.liste_diffusion IS NOT NULL
11200     %3$s
11201     AND habilitation_tiers_consulte.type_habilitation_tiers_consulte IN (%2$s)
11202 softime 14064 AND lien_habilitation_tiers_consulte_departement.departement = %5$d
11203     -- Filtre sur les tiers acteur du dossier
11204     AND lien_dossier_tiers.dossier = \'%6$s\'',
11205 softime 13137 DB_PREFIXE,
11206     implode(', ', $typesHabilitations),
11207     $filtreServiceConsulteDI,
11208     intval($commune),
11209 softime 14064 intval($departement),
11210     $this->f->db->escapeSimple($this->getVal('dossier'))
11211 softime 13137 ),
11212     array(
11213     "origin" => __METHOD__
11214     )
11215     );
11216 softime 14064 // Faire un order by sur un union ne fonctionne pas. A la place
11217     // c'est le tableau des résultats qui est ordonné.
11218     usort($rst['result'], function($a, $b) {
11219     return strcmp($a['libelle'], $b['libelle']);
11220     });
11221 softime 13137 return $rst['result'];
11222     }
11223 softime 17036
11224     /**
11225     * Gestion de l'affichage PDF spécial vue la dif
11226     */
11227     function view_telecharger_editions () {
11228     /**
11229     * Affiche le contenu du fichier
11230     * @param string $uid Identifiant unique du fichier
11231     * @param object $f Instance de la classe utils
11232     * @param string $dl Téléchargement
11233     * @param string $mode Mode permettant de définir l'endroit où se situe le fichier
11234     * @ignore
11235     */
11236     function display_file_content($uid, $dl, $f, $mode) {
11237    
11238     // Choix du support du filestorage
11239     switch ($mode) {
11240     case 'temporary':
11241     $file = $f->storage->get_temporary($uid);
11242     break;
11243    
11244     default:
11245     $file = $f->storage->get($uid);
11246     break;
11247     }
11248    
11249     // Affichage du contenu du fichier
11250     if($file != null) {
11251    
11252     // Headers
11253     header("Cache-Control: no-cache, must-revalidate"); // HTTP/1.1
11254     header("Expires: Sat, 26 Jul 1997 05:00:00 GMT"); // Date dans le passé
11255     header("Content-Type: ".$file['metadata']['mimetype']);
11256     header("Accept-Ranges: bytes");
11257    
11258     // Vérification pour la valeur de $dl
11259     if (!in_array($dl, array("download", "inline"))) {
11260     if ($f->getParameter("edition_output") == "download") {
11261     $dl="download";
11262     } else {
11263     $dl="inline";
11264     }
11265     }
11266    
11267     // Vérification si on affiche simplement l'image, sinon envoi un dialogue de sauvegarde
11268     if ($dl=="download") {
11269     header("Content-Disposition: attachment; filename=\"".$file['metadata']['filename']."\";" );
11270     } else {
11271     header("Content-Disposition: inline; filename=\"".$file['metadata']['filename']."\";" );
11272    
11273     }
11274    
11275     // Rendu du fichier
11276     echo $file['file_content'];
11277    
11278     } else {
11279     // Retour à l'accueil + affichage de l'erreur
11280     $f->displayMessage("error", __("Le fichier n'existe pas ou n'est pas accessible."));
11281    
11282     }
11283     }
11284    
11285     $this->f->displayMessage("info", __("TEST Page Start. "));
11286    
11287     $f = $this->f;
11288     //
11289     $f->disableLog();
11290     // Initialisation des paramètres
11291     $params = array(
11292     "uid" => array(
11293     "default_value" => "",
11294     ),
11295     "dl" => array(
11296     "default_value" => "",
11297     ),
11298     "mode" => array(
11299     "default_value" => "filestorage",
11300     ),
11301     "obj" => array(
11302     "default_value" => "",
11303     ),
11304     "champ" => array(
11305     "default_value" => "",
11306     ),
11307     "idx" => array(
11308     "default_value" => "",
11309     ),
11310     );
11311     foreach ($this->f->get_initialized_parameters($params) as $key => $value) {
11312     ${$key} = $value;
11313     }
11314     // Si les paramètres nécessaires ne sont pas correctement fournis
11315     if (($obj == "" || $champ == "" || $idx == "")) {
11316     $this->f->displayMessage("error", __("Les parametres transmis ne sont pas corrects."));
11317     return;
11318     }
11319    
11320     $this->addToLog(__METHOD__."(): idx = ".$idx." ", DEBUG_MODE);
11321    
11322     if ( strpos($idx, 'STORAGE_') !== FALSE) {
11323     $idx = substr($idx, 8);
11324     $obj = 'storage';
11325     $champ = 'uid';
11326     }
11327     $object = $this->f->get_inst__om_dbform(array(
11328     "obj" => $obj,
11329     "idx" => $idx,
11330     ));
11331    
11332     // Si pas d'objet envoi message de retour
11333     if ($object === null) {
11334     $f->displayMessage("error", __("Objet inexistant."));
11335     die();
11336     }
11337     $uid = $object->getVal($champ);
11338    
11339     //Affichage du fichier
11340     display_file_content($uid, $dl, $f, $mode);
11341    
11342     return;
11343     }
11344 softime 13137 }

Properties

Name Value
svn:keywords "Id"

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26