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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 13137 - (hide annotations)
Thu Oct 27 20:34:03 2022 UTC (2 years, 3 months ago) by softime
File size: 457377 byte(s)
* Fusion de la branche d'intégration 5.14.0-develop dans le trunk

1 mbroquet 3730 <?php
2     /**
3 softime 7996 * DBFORM - 'instruction' - Surcharge gen.
4     *
5 mbroquet 3730 * specific :
6     * - cle secondaire
7     * destruction autorisée que pour le dernier evenement
8     * [delete the last event ]
9     * - variable globale [global variables]
10     * var $retourformulaire;
11     * var $idxformulaire;
12     * - modification des données dans dossier trigger avant
13     * [modify dossier data with trigger function]
14     * - function mois_date : pour ajouter des mois a une date
15     * [add months (delay) and calculation final date]
16     * - voir script_lang.js : bible ...
17 softime 7996 *
18 mbroquet 3730 * @package openfoncier
19 nhaye 5254 * @version SVN : $Id$
20 mbroquet 3730 */
21    
22     //
23     require_once "../gen/obj/instruction.class.php";
24    
25     //
26     class instruction extends instruction_gen {
27    
28     // Champs contenant les UID des fichiers
29     var $abstract_type = array(
30     "om_fichier_instruction" => "file",
31     );
32 softime 8989
33 mbroquet 3730 var $valEvenement;
34     var $restriction_valid = null;
35     // Tableau contenant une partie des métadonnées arrêtés
36     var $metadonneesArrete;
37    
38 fmichon 3892 /**
39     * Instance de la classe dossier
40     *
41     * @var mixed
42     */
43     var $inst_dossier = null;
44    
45 softime 5169 /**
46     * Instance de la classe instructeur
47     *
48     * @var mixed
49     */
50     var $inst_instructeur = null;
51    
52     /**
53     * Instance de la classe om_utilisateur
54     *
55     * @var mixed
56     */
57     var $inst_om_utilisateur = null;
58    
59 mbroquet 3730 var $metadata = array(
60     "om_fichier_instruction" => array(
61     "dossier" => "getDossier",
62     "dossier_version" => "getDossierVersion",
63     "numDemandeAutor" => "getNumDemandeAutor",
64     "anneemoisDemandeAutor" => "getAnneemoisDemandeAutor",
65     "typeInstruction" => "getTypeInstruction",
66     "statutAutorisation" => "getStatutAutorisation",
67     "typeAutorisation" => "getTypeAutorisation",
68     "dateEvenementDocument" => "getDateEvenementDocument",
69     "groupeInstruction" => 'getGroupeInstruction',
70     "title" => 'getTitle',
71 softime 6272 'concerneERP' => 'get_concerne_erp',
72 softime 10573
73     'date_cloture_metier' => 'getDossierDateDecision',
74     'type' => 'getDocumentType',
75     'dossier_autorisation_type_detaille' => 'getDossierAutorisationTypeDetaille',
76     'dossier_instruction_type' => 'getDossierInstructionTypeLibelle',
77     'region' => 'getDossierRegion',
78     'departement' => 'getDossierDepartement',
79     'commune' => 'getDossierCommune',
80     'annee' => 'getDossierAnnee',
81     'division' => 'getDossierDivision',
82 softime 10808 'collectivite' => 'getDossierServiceOrCollectivite',
83 mbroquet 3730 ),
84     "arrete" => array(
85     "numArrete" => "getNumArrete",
86     "ReglementaireArrete" => "getReglementaireArrete",
87     "NotificationArrete" => "getNotificationArrete",
88     "dateNotificationArrete" => "getDateNotificationArrete",
89     "controleLegalite" => "getControleLegalite",
90     "dateSignature" => "getDateSignature",
91     "nomSignataire" => "getNomSignataire",
92     "qualiteSignataire" => "getQualiteSignataire",
93     "ap_numRue" => "getAp_numRue",
94     "ap_nomDeLaVoie" => "getAp_nomDeLaVoie",
95     "ap_codePostal" => "getAp_codePostal",
96     "ap_ville" => "getAp_ville",
97     "activite" => "getActivite",
98     "dateControleLegalite" => "getDateControleLegalite",
99 softime 10573 )
100 mbroquet 3730 );
101    
102 softime 9245 /**
103     * Flag pour identifier la reprise de l'instruction d'un dossier.
104     * Le statut de l'état passe de "cloture" à "encours".
105     *
106     * @var boolean
107     */
108     var $di_reopened = null;
109    
110 mbroquet 3730 // {{{ Gestion de la confidentialité des données spécifiques
111    
112     /**
113     * Définition des actions disponibles sur la classe.
114     *
115     * @return void
116     */
117     function init_class_actions() {
118    
119     parent::init_class_actions();
120    
121     // ACTION - 000 - ajouter
122     // Modifie la condition d'affichage du bouton ajouter
123 softime 6565 $this->class_actions[0]["condition"] = array("is_addable", "can_user_access_dossier_contexte_ajout");
124 mbroquet 3730
125     // ACTION - 001 - modifier
126     // Modifie la condition et le libellé du bouton modifier
127 softime 6565 $this->class_actions[1]["condition"] = array(
128     "is_editable",
129     "is_finalizable_without_bypass",
130     "can_user_access_dossier_contexte_modification",
131 softime 10573 "is_evenement_modifiable",
132 softime 6565 );
133 mbroquet 3730 $this->class_actions[1]["portlet"]["libelle"] = _("Modifier");
134    
135     // ACTION - 002 - supprimer
136     // Modifie la condition et le libellé du bouton supprimer
137 softime 6565 $this->class_actions[2]["condition"] = array(
138     "is_deletable",
139     "is_finalizable_without_bypass",
140 softime 10573 "can_user_access_dossier_contexte_modification",
141     "is_evenement_supprimable",
142 softime 6565 );
143 mbroquet 3730 $this->class_actions[2]["portlet"]["libelle"] = _("Supprimer");
144    
145 softime 6565 // ACTION - 003 - consulter
146     //
147     $this->class_actions[3]["condition"] = "can_user_access_dossier_contexte_modification";
148    
149 mbroquet 3730 // ACTION - 100 - finaliser
150     // Finalise l'enregistrement
151     $this->class_actions[100] = array(
152     "identifier" => "finaliser",
153     "portlet" => array(
154     "type" => "action-direct",
155     "libelle" => _("Finaliser le document"),
156     "order" => 110,
157     "class" => "finalise",
158     ),
159     "view" => "formulaire",
160     "method" => "finalize",
161     "button" => "finaliser",
162     "permission_suffix" => "finaliser",
163 softime 6565 "condition" => array(
164     "is_finalizable",
165     "is_finalizable_without_bypass",
166     "has_an_edition",
167     "can_user_access_dossier_contexte_modification",
168     ),
169 mbroquet 3730 );
170    
171     // ACTION - 110 - definaliser
172     // Finalise l'enregistrement
173     $this->class_actions[110] = array(
174     "identifier" => "definaliser",
175     "portlet" => array(
176     "type" => "action-direct",
177     "libelle" => _("Reprendre la redaction du document"),
178     "order" => 110,
179     "class" => "definalise",
180     ),
181     "view" => "formulaire",
182     "method" => "unfinalize",
183     "button" => "definaliser",
184     "permission_suffix" => "definaliser",
185 softime 6565 "condition" => array(
186     "is_unfinalizable",
187     "is_unfinalizable_without_bypass",
188     "can_user_access_dossier_contexte_modification",
189 softime 10573 "is_not_sent_for_signature",
190 softime 6565 ),
191 mbroquet 3730 );
192    
193 softime 13137 // ACTION - 115 - Modification d'un document généré par une instruction
194 softime 12847 // Permet à un instructeur de modifier un document généré par une instruction
195     $this->class_actions[115] = array(
196     "identifier" => "modale_selection_document_signe",
197     "portlet" => array(
198     "type" => "action-self",
199     "libelle" => _("Remplacer par le document signé"),
200     "order" => 115,
201     "class" => "selection-document-signé",
202     ),
203     "view" => "view_modale_selection_document_signe",
204     "permission_suffix" => "selection_document_signe",
205     "condition" => array(
206     "is_finalized",
207     "is_not_date_retour_signature_set",
208     ),
209     );
210    
211 mbroquet 3730 // ACTION - 120 - edition
212     // Affiche l'édition
213     $this->class_actions[120] = array(
214     "identifier" => "edition",
215     "portlet" => array(
216     "type" => "action-blank",
217     "libelle" => _("Edition"),
218     "order" => 100,
219     "class" => "pdf-16",
220     ),
221     "view" => "view_edition",
222 softime 6565 "condition" => array("has_an_edition", "can_user_access_dossier_contexte_modification"),
223 mbroquet 3730 "permission_suffix" => "om_fichier_instruction_telecharger",
224     );
225    
226     // ACTION - 125 - modifier_suivi
227     // Suivi des dates
228     $this->class_actions[125] = array(
229     "identifier" => "modifier_suivi",
230     "portlet" => array(
231     "type" => "action-self",
232     "libelle" => _("Suivi des dates"),
233     "order" => 125,
234     "class" => "suivi-dates-16",
235     ),
236     "crud" => "update",
237 softime 6565 "condition" => array("can_monitoring_dates", "can_user_access_dossier_contexte_modification"),
238 mbroquet 3730 "permission_suffix" => "modification_dates",
239     );
240    
241     // ACTION - 130 - bible
242     // Affiche la bible
243     $this->class_actions[130] = array(
244     "identifier" => "bible",
245     "view" => "view_bible",
246     "permission_suffix" => "modifier",
247     );
248    
249     // ACTION - 140 - bible_auto
250     // Active la bible automatique
251     $this->class_actions[140] = array(
252     "identifier" => "bible_auto",
253     "view" => "view_bible_auto",
254     "permission_suffix" => "modifier",
255     );
256    
257     // ACTION - 150 - suivi_bordereaux
258     // Imprimer un bordereau d'envoi
259     $this->class_actions[150] = array(
260     "identifier" => "suivi_bordereaux",
261     "view" => "view_suivi_bordereaux",
262     "permission_suffix" => "consulter",
263     );
264    
265     // ACTION - 160 - suivi_envoi_lettre_rar
266     // Imprimer un bordereau d'envoi
267     $this->class_actions[160] = array(
268     "identifier" => "suivi_envoi_lettre_rar",
269     "view" => "view_suivi_envoi_lettre_rar",
270     "permission_suffix" => "consulter",
271     );
272    
273     // ACTION - 170 - suivi_mise_a_jour_des_dates
274     // Mettre à jour les dates de l'instruction
275     $this->class_actions[170] = array(
276     "identifier" => "suivi_mise_a_jour_des_dates",
277     "view" => "view_suivi_mise_a_jour_des_dates",
278     "permission_suffix" => "consulter",
279     );
280    
281 softime 13137 // ACTION - 175 - modifier_by_notification_task
282     // Action à utiliser lors de la mise à jour des instructions par notification
283     $this->class_actions[175] = array(
284     "identifier" => "modifier_by_notification_task",
285     "view" => "formulaire",
286     "permission_suffix" => "modifier",
287     "crud" => "update",
288     );
289    
290 mbroquet 3730 // ACTION - 180 - pdf_lettre_rar
291 softime 8989 // Génère PDF sur bordereaux de lettres AR
292 mbroquet 3730 $this->class_actions[180] = array(
293     "identifier" => "pdf_lettre_rar",
294     "view" => "view_pdf_lettre_rar",
295     "permission_suffix" => "consulter",
296     );
297    
298     // ACTION - 190 - bordereau_envoi_maire
299     // Formulaire pour générer le bordereau d'envoi au maire
300     // Met à jour la date d'envoi à signature du maire
301     $this->class_actions[190] = array(
302     "identifier" => "bordereau_envoi_maire",
303     "view" => "view_bordereau_envoi_maire",
304     "permission_suffix" => "bordereau_envoi_maire",
305     );
306    
307     // ACTION - 200 - generate_bordereau_envoi_maire
308     // Génère PDF bordereau d'envoi au maire
309     $this->class_actions[200] = array(
310     "identifier" => "generate_bordereau_envoi_maire",
311     "view" => "view_generate_bordereau_envoi_maire",
312     "permission_suffix" => "bordereau_envoi_maire",
313     );
314 nmeucci 4108
315     // ACTION - 210 - notifier_commune
316     // Notifie la commune par mail d'un évément d'instruction finalisé
317     $this->class_actions[210] = array(
318     "identifier" => "notifier_commune",
319     "portlet" => array(
320     "type" => "action-direct-with-confirmation",
321     "libelle" => _("Notifier la commune par courriel"),
322     "order" => 210,
323     "class" => "notifier_commune-16",
324     ),
325     "view" => "formulaire",
326     "method" => "notifier_commune",
327     "permission_suffix" => "notifier_commune",
328 softime 6565 "condition" => array("is_notifiable", "can_user_access_dossier_contexte_modification"),
329 nmeucci 4108 );
330 nmeucci 4317
331     // ACTION - 220 - generate_suivi_bordereaux
332     // GénÚre PDF bordereaux
333     $this->class_actions[220] = array(
334     "identifier" => "generate_suivi_bordereaux",
335     "view" => "view_generate_suivi_bordereaux",
336 softime 6565 "permission_suffix" => "consulter",
337     );
338 softime 7521
339     // ACTION - 777 - pdf_temp
340     // Crée un PDF temporaire et affiche son contenu en base64
341     $this->class_actions[777] = array(
342     "identifier" => "pdf_temp",
343     "view" => "view_pdf_temp",
344     "permission_suffix" => "modifier",
345     "condition" => array("can_user_access_dossier_contexte_modification"),
346     );
347 softime 8593
348     // ACTION - 701
349     $this->class_actions[701] = array(
350     "identifier" => "enable-edition-integrale",
351     "portlet" => array(
352     "type" => "action-direct-with-confirmation",
353     "libelle" => _("Rédaction libre"),
354     "order" => 50,
355     "class" => "redac-libre-16",
356     ),
357     "view" => "formulaire",
358     "method" => "enable_edition_integrale",
359     "permission_suffix" => "modifier",
360     "condition" => array(
361     "is_editable",
362     "is_finalizable_without_bypass",
363     "can_user_access_dossier_contexte_modification",
364     "is_edition_integrale_not_enabled",
365     "is_option_redaction_libre_enabled",
366     "has_an_edition",
367     ),
368     );
369     // ACTION - 702
370     $this->class_actions[702] = array(
371     "identifier" => "disable-edition-integrale",
372     "portlet" => array(
373     "type" => "action-direct-with-confirmation",
374     "libelle" => _("Rédaction par compléments"),
375     "order" => 50,
376     "class" => "redac-complement-16",
377     ),
378     "view" => "formulaire",
379     "method" => "disable_edition_integrale",
380     "permission_suffix" => "modifier",
381     "condition" => array(
382     "is_editable",
383     "is_finalizable_without_bypass",
384     "can_user_access_dossier_contexte_modification",
385     "is_edition_integrale_enabled",
386     "is_option_redaction_libre_enabled",
387     "has_an_edition",
388     ),
389     );
390     // ACTION - 300 - evenement_has_an_edition_json
391     //
392     $this->class_actions[300] = array(
393     "identifier" => "evenement_has_an_edition_json",
394     "view" => "view_evenement_has_an_edition_json",
395     "permission_suffix" => "consulter",
396     );
397 softime 10573
398     // ACTION - 301 - evenement_has_a_commentaire
399     //
400     $this->class_actions[301] = array(
401     "identifier" => "evenement_has_a_commentaire_json",
402     "view" => "view_evenement_has_a_commentaire_json",
403     "permission_suffix" => "consulter",
404     );
405    
406     // ACTION - 400 - Envoyer en signature
407     // Cet évenement permet d'envoyer le document au parapheur pour signature
408     $this->class_actions[400] = array(
409     "identifier" => "envoyer_a_signature",
410     "portlet" => array(
411     "libelle" => _("Envoyer à signature"),
412     "type" => "action-direct-with-confirmation",
413     "class" => "envoyer_a_signature-16",
414     ),
415     "view" => "formulaire",
416 softime 10713 "method" => "envoyer_a_signature_sans_relecture",
417 softime 10573 "condition" => array(
418     "can_be_signed",
419     ),
420     "permission_suffix" => "envoyer_a_signature",
421     );
422    
423 softime 10713 // ACTION - 402 - Envoyer en signature avec relecture
424     // Cet évenement permet d'envoyer le document au parapheur pour signature
425     $this->class_actions[402] = array(
426     "identifier" => "envoyer_a_signature_relecture",
427     "portlet" => array(
428     "libelle" => __("Envoyer à signature avec relecture"),
429     "type" => "action-direct-with-confirmation",
430     "class" => "envoyer_a_signature-16",
431     ),
432     "view" => "formulaire",
433     "method" => "envoyer_a_signature_avec_relecture",
434     "condition" => array(
435     "can_be_signed",
436 softime 10808 "is_parapheur_relecture_parameter_enabled"
437 softime 10713 ),
438     "permission_suffix" => "envoyer_a_signature",
439     );
440    
441 softime 11876 // ACTION - 404 - Annuler l'envoi en signature
442     // Cet évenement permet d'annuler l'envoi en signature du document au parapheur
443     $this->class_actions[404] = array(
444     "identifier" => "annuler_envoi_signature",
445     "portlet" => array(
446     "libelle" => __("Annuler l'envoi en signature"),
447     "type" => "action-direct-with-confirmation",
448     "class" => "annuler_envoi_signature-16",
449     ),
450     "view" => "formulaire",
451     "method" => "annuler_envoi_en_signature",
452     "condition" => array(
453 softime 12124 "is_sent_for_signature",
454 softime 11876 "is_parapheur_annulation_parameter_enabled"
455     ),
456     "permission_suffix" => "envoyer_a_signature",
457     );
458    
459 softime 10573 //
460     $this->class_actions[401] = array(
461     "identifier" => "preview_edition",
462     "view" => "formulaire",
463     "permission_suffix" => "tab",
464     );
465    
466 softime 10808 // ACTION - 410 - Notifier les pétitionnaires (mail ou autre)
467     $this->class_actions[410] = array(
468     "identifier" => "overlay_notification_manuelle",
469     "portlet" => array(
470     "libelle" => __("Notifier les pétitionnaires"),
471     "type" => "action-self",
472     "class" => "notifier_commune-16",
473     ),
474     "condition" => array(
475     "is_notifiable_by_task_manual",
476 softime 10869 "is_not_portail_notification_sans_annexe"
477 softime 10808 ),
478     "view" => "view_overlay_notification_manuelle",
479     "permission_suffix" => "modifier",
480     );
481    
482 softime 11585 // ACTION - 411 - Notifier les pétitionnaires (portail citoyen)
483 softime 10808 $this->class_actions[411] = array(
484     "identifier" => "notification_manuelle_portal",
485     "portlet" => array(
486     "libelle" => __("Notifier les pétitionnaires"),
487     "type" => "action-direct-with-confirmation",
488     "class" => "notifier_commune-16",
489     ),
490     "condition" => array(
491     "is_notifiable_by_task_manual",
492 softime 10869 "is_portail_notification_sans_annexe"
493 softime 10808 ),
494     "method" => "notifier_demandeur_principal",
495     "permission_suffix" => "modifier",
496     );
497    
498 softime 11585 // ACTION - 420 - Notifier les services consultés (mail)
499     $this->class_actions[420] = array(
500     "identifier" => "overlay_notification_service_consulte",
501     "portlet" => array(
502     "libelle" => __("Notifier les services consultés"),
503     "type" => "action-self",
504     "class" => "notifier_commune-16",
505     ),
506     "condition" => array(
507     "is_service_notifiable"
508     ),
509     "view" => "view_overlay_notification_service_consulte",
510     "permission_suffix" => "tab",
511     );
512    
513     // ACTION - 430 - Notifier les tiers consultés (mail)
514     $this->class_actions[430] = array(
515     "identifier" => "overlay_notification_tiers_consulte",
516     "portlet" => array(
517     "libelle" => __("Notifier les tiers consultés"),
518     "type" => "action-self",
519     "class" => "notifier_commune-16",
520     ),
521     "condition" => array(
522     "is_tiers_notifiable"
523     ),
524     "view" => "view_overlay_notification_tiers_consulte",
525     "permission_suffix" => "tab",
526     );
527    
528 softime 10573 //
529 softime 11418 $this->class_actions[403] = array(
530     "identifier" => "envoyer_au_controle_de_legalite",
531     "portlet" => array(
532     "libelle" => __("Envoyer au contrôle de légalité"),
533     "type" => "action-direct-with-confirmation",
534     "class" => "envoyer_au_controle_de_legalite-16",
535     ),
536     "view" => "formulaire",
537     "method" => "envoyer_au_controle_de_legalite",
538     "condition" => array(
539     "can_be_sended_to_cl"
540     ),
541     "permission_suffix" => "envoyer_au_controle_de_legalite",
542     );
543    
544     //
545 softime 10573 $this->class_actions[998] = array(
546     "identifier" => "json_data",
547     "view" => "view_json_data",
548     "permission_suffix" => "consulter",
549     );
550 mbroquet 3730 }
551    
552 softime 8593 /**
553 softime 8989 * Clause select pour la requête de sélection des données de l'enregistrement.
554     *
555     * @return array
556     */
557     function get_var_sql_forminc__champs() {
558     return array(
559     "instruction",
560     "destinataire",
561     "instruction.evenement",
562 softime 10573 "instruction.commentaire",
563 softime 8989 "date_evenement",
564     "instruction.lettretype",
565     "signataire_arrete",
566     "flag_edition_integrale",
567     "om_final_instruction_utilisateur",
568     "date_finalisation_courrier",
569     "date_envoi_signature",
570     "date_envoi_rar",
571     "date_envoi_controle_legalite",
572    
573     "date_retour_signature",
574     "date_retour_rar",
575     "date_retour_controle_legalite",
576    
577     "numero_arrete",
578    
579     "complement_om_html",
580     "'' as bible_auto",
581     "'' as bible",
582     "complement2_om_html",
583     "'' as bible2",
584     "complement3_om_html",
585     "'' as bible3",
586     "complement4_om_html",
587     "'' as bible4",
588    
589     "titre_om_htmletat",
590     "corps_om_htmletatex",
591    
592     "'' as btn_preview",
593     "'' as btn_redaction",
594    
595     "'' as btn_refresh",
596     "'' as live_preview",
597    
598     "dossier",
599     "instruction.action",
600     "instruction.delai",
601     "instruction.etat",
602     "instruction.autorite_competente",
603     "instruction.accord_tacite",
604     "instruction.delai_notification",
605     "instruction.avis_decision",
606     "archive_delai",
607     "archive_accord_tacite",
608     "archive_etat",
609     "archive_avis",
610     "archive_date_complet",
611     "archive_date_rejet",
612     "archive_date_limite",
613     "archive_date_notification_delai",
614     "archive_date_decision",
615     "archive_date_validite",
616     "archive_date_achevement",
617     "archive_date_conformite",
618     "archive_date_chantier",
619     "archive_date_dernier_depot",
620     "date_depot",
621 softime 10573 "date_depot_mairie",
622 softime 8989 "complement5_om_html",
623     "'' as bible5",
624     "complement6_om_html",
625     "'' as bible6",
626     "complement7_om_html",
627     "'' as bible7",
628     "complement8_om_html",
629     "'' as bible8",
630     "complement9_om_html",
631     "'' as bible9",
632     "complement10_om_html",
633     "'' as bible10",
634     "complement11_om_html",
635     "'' as bible11",
636     "complement12_om_html",
637     "complement13_om_html",
638     "complement14_om_html",
639     "complement15_om_html",
640     "archive_incompletude",
641     "archive_incomplet_notifie",
642     "archive_evenement_suivant_tacite",
643     "archive_evenement_suivant_tacite_incompletude",
644     "archive_etat_pendant_incompletude",
645     "archive_date_limite_incompletude",
646     "archive_delai_incompletude",
647     "archive_autorite_competente",
648     "code_barres",
649     "om_fichier_instruction",
650     "om_final_instruction",
651     "om_fichier_instruction_dossier_final",
652     "document_numerise",
653     "duree_validite_parametrage",
654     "duree_validite",
655     "created_by_commune",
656     "archive_date_cloture_instruction",
657     "archive_date_premiere_visite",
658     "archive_date_derniere_visite",
659     "archive_date_contradictoire",
660     "archive_date_retour_contradictoire",
661     "archive_date_ait",
662     "archive_date_transmission_parquet",
663     "archive_dossier_instruction_type",
664     "archive_date_affichage",
665 softime 10573 "pec_metier",
666     "archive_pec_metier",
667     "archive_a_qualifier",
668     "id_parapheur_signature",
669     "statut_signature",
670     "commentaire_signature",
671     "historique_signature",
672 softime 10808 "'' as suivi_notification",
673 softime 11585 "'' as suivi_notification_service",
674     "'' as suivi_notification_tiers",
675 softime 12654 "'' as suivi_notification_commune",
676 softime 10573
677     "'' as preview_edition",
678 softime 11418 "envoye_cl_platau",
679 softime 12124 "'' as log_instruction"
680 softime 8989 );
681     }
682    
683     /**
684 softime 8593 * CONDITION - is_edition_integrale_enabled
685     *
686     * Vérifie que la rédaction libre est activée sur l'instruction en cours.
687     *
688     * @return boolean
689     */
690     function is_edition_integrale_enabled() {
691     if ($this->getVal("flag_edition_integrale") == 't') {
692     return true;
693     }
694     return false;
695     }
696 mbroquet 3730
697     /**
698 softime 8593 * CONDITION - is_edition_integrale_not_enabled
699     *
700     * Vérifie que la rédaction libre est désactivée sur l'instruction en cours.
701     *
702     * @return boolean
703     */
704     function is_edition_integrale_not_enabled() {
705     return !$this->is_edition_integrale_enabled();
706     }
707    
708     /**
709     * CONDITION - is_option_redaction_libre_enabled
710     *
711     * Vérifie que l'option de rédaction libre est activée.
712     *
713     * @return boolean
714     */
715     function is_option_redaction_libre_enabled() {
716     $collectivite_di = $this->get_dossier_instruction_om_collectivite();
717     return $this->f->is_option_redaction_libre_enabled($collectivite_di);
718     }
719    
720     /**
721 softime 10713 * CONDITION - is_option_parapheur_relecture_enabled
722     *
723     * Vérifie que l'option de relecture lors de l'envoi en signature est activée.
724     *
725     * @return boolean
726     */
727 softime 10808 function is_parapheur_relecture_parameter_enabled() {
728     //Instanciation de la classe electronicsignature
729     $inst_es = $this->get_electronicsignature_instance();
730     if ($inst_es === false) {
731     return false;
732     }
733    
734     if ($inst_es->get_conf('is_forced_view_files') !== 'true' && $inst_es->get_conf('is_forced_view_files') !== true) {
735     return false;
736     }
737    
738     return true;
739 softime 10713 }
740    
741 softime 11876 /**
742     * CONDITION - is_parapheur_annulation_parameter_enabled
743     *
744     * Vérifie que l'option d'annulation de l'envoi en signature est activée.
745     *
746     * @return boolean
747     */
748     function is_parapheur_annulation_parameter_enabled() {
749     //Instanciation de la classe electronicsignature
750     $inst_es = $this->get_electronicsignature_instance();
751     if ($inst_es === false) {
752     return false;
753     }
754 softime 10713
755 softime 11876 if ($inst_es->get_conf('cancel_send') !== 'true' && $inst_es->get_conf('cancel_send') !== true) {
756     return false;
757     }
758    
759     return true;
760     }
761    
762    
763 softime 10713 /**
764 softime 10573 * CONDITION - is_sent_for_signature
765     *
766     * Vérifie que l'instruction a été envoyé à signature
767     *
768     * @return boolean
769     */
770     function is_sent_for_signature() {
771     // Si un parapheur a été configuré
772     // et que le champ id_parapheur_signature n'est pas vide
773     // que le status est différent de "canceled" ou "expired"
774     // alors l'évènement a été envoyé en signature
775     if ($this->has_connector_electronicsignature() === true
776     && empty($this->getVal("id_parapheur_signature")) === false
777     && ($this->getVal("statut_signature") != "canceled"
778 softime 12124 && $this->getVal("statut_signature") != "expired"
779     && $this->getVal("statut_signature") != "finished")) {
780 softime 10573 //
781     return true;
782     }
783    
784     return false;
785     }
786    
787     /**
788     * CONDITION - is_not_sent_for_signature
789     *
790     * Vérifie que l'instruction n'a pas été envoyé à signature
791     *
792     * @return boolean
793     */
794     function is_not_sent_for_signature() {
795 softime 10968 // Contrôle si l'utilisateur possède un bypass
796     $bypass = $this->f->isAccredited($this->get_absolute_class_name()."_definaliser_bypass");
797     if ($bypass == true) {
798     return true;
799     }
800    
801 softime 10573 return !$this->is_sent_for_signature();
802     }
803    
804    
805     /**
806     * CONDITION - is_signed
807     *
808     * Vérifie que l'instruction a été signé
809     *
810     * @return boolean
811     */
812     function is_signed() {
813     // Si un parapheur a été configuré
814     // et que le champ id_parapheur_signature n'est pas vide
815     // et que le statut est égal à "finished"
816     // alors le document de l'instruciton à été signé
817     if ($this->has_connector_electronicsignature() === true
818     && empty($this->getVal("id_parapheur_signature")) === false
819     && $this->getVal("statut_signature") == "finished") {
820     //
821     return true;
822     }
823    
824     return false;
825     }
826    
827 softime 11876
828 softime 12433 /**
829     * is_sent_to_cl
830     *
831     * Vérifie que l'instruction a été envoyé au contrôle de légalité
832     *
833     * @return boolean
834     */
835 softime 11418 function is_sent_to_cl() {
836 softime 12433 // Si la case à cocher de l'instruction envoye_cl_platau est à "t"
837     if ($this->getVal('envoye_cl_platau') === 't') {
838     //
839     return true;
840 softime 11418 }
841     //
842     return false;
843     }
844    
845 softime 10808 /**
846     * CONDITION - is_portail_notification
847     *
848     * Vérifie si la notification est une notification de catégorie portail
849     *
850     * @return boolean
851     */
852 softime 10869 function is_portail_notification_sans_annexe() {
853 softime 10808 $collectiviteDi = $this->get_dossier_instruction_om_collectivite();
854 softime 10869 $ev = $this->get_inst_evenement($this->getVal('evenement'));
855     if (($this->f->get_param_option_notification($collectiviteDi) === null ||
856 softime 13137 $this->f->get_param_option_notification($collectiviteDi) === PORTAL)
857 softime 10869 && $ev->getVal('notification') != 'notification_manuelle_annexe'
858     && $ev->getVal('notification') != 'notification_manuelle_annexe_signature_requise'
859     ) {
860 softime 10808 return true;
861     }
862     return false;
863     }
864 softime 10573
865     /**
866 softime 10808 * CONDITION - is_not_portail_notification
867     *
868     * Vérifie si la notification n'est pas une notification de catégorie portail
869     *
870     * @return boolean
871     */
872 softime 10869 function is_not_portail_notification_sans_annexe() {
873     return (! $this->is_portail_notification_sans_annexe());
874 softime 10808 }
875    
876     /**
877 softime 10573 * CONDITION - can_be_signed
878     *
879     * Vérifie que le document de l'instruction peut être envoyé au parapheur pour signature
880     *
881     * @return boolean
882     */
883     function can_be_signed() {
884     // Instanciation de l'objet signataire_arrete
885     $inst_signataire_arrete = $this->f->get_inst__om_dbform(array(
886     "obj" => "signataire_arrete",
887     "idx" => $this->getVal("signataire_arrete"),
888     ));
889     // Si un parapheur a été configuré, que le document est finalisé, que le signataire
890     // possède une adresse email, on vérifie le champ id_parapheur_signature
891     // S'il est vide l'évènement peut être envoyé en signature
892     // S'il ne l'est pas, alors on vérifie le champ statut_signature
893     // Si la valeur de ce champ est égal à "canceled" ou "expired"
894     // alors l'évènement peut être envoyé en signature
895     if ($this->has_connector_electronicsignature() === true
896     && $this->getVal("om_final_instruction") == 't'
897     && empty($inst_signataire_arrete->getVal('email')) === false) {
898     //
899     if (empty($this->getVal("id_parapheur_signature")) === true
900     || $this->getVal("statut_signature") == "canceled"
901     || $this->getVal("statut_signature") == "expired") {
902     //
903     return true;
904     }
905     }
906    
907     $this->addToLog(__METHOD__."() has_connector_electronicsignature: ".var_export($this->has_connector_electronicsignature(), true), EXTRA_VERBOSE_MODE);
908     $this->addToLog(__METHOD__."() om_final_instruction: ".var_export($this->getVal("om_final_instruction"), true), EXTRA_VERBOSE_MODE);
909     $this->addToLog(__METHOD__."() email: ".var_export($inst_signataire_arrete->getVal('email'), true), EXTRA_VERBOSE_MODE);
910     $this->addToLog(__METHOD__."() id_parapheur_signature: ".var_export($this->getVal("id_parapheur_signature"), true), EXTRA_VERBOSE_MODE);
911     $this->addToLog(__METHOD__."() statut_signature: ".var_export($this->getVal("statut_signature"), true), EXTRA_VERBOSE_MODE);
912    
913     return false;
914     }
915    
916     /**
917     * CONDITION - has_connector_electronicsignature
918     *
919     * Vérifie qu'un parapheur est paramétré
920     *
921     * @return boolean
922     */
923     function has_connector_electronicsignature() {
924     $inst_es = $this->get_electronicsignature_instance(false);
925     if ($inst_es === false) {
926     return false;
927     }
928     return true;
929     }
930    
931     /**
932     * CONDITION - can_display_parapheur
933     *
934     * Vérifie que le fieldset "Suivi Parapheur" soit affichable
935     *
936     * @return boolean
937     */
938     function can_display_parapheur() {
939     $evenement_id = $this->getVal("evenement");
940     $inst_evenement = $this->get_inst_evenement($evenement_id);
941     if ($this->has_connector_electronicsignature() === true
942     && $inst_evenement->getVal('lettretype') !== ''
943     && $inst_evenement->getVal('lettretype') !== null
944     && (empty($this->getVal("id_parapheur_signature")) === false
945     || empty($this->getVal("historique_signature")) === false)) {
946     //
947     return true;
948     }
949    
950     return false;
951     }
952    
953     /**
954 softime 10808 * CONDITION - can_display_notification
955     *
956 softime 11585 * Vérifie que le champs "Suivi notification" est affichable
957 softime 10808 *
958     * @return boolean
959     */
960 softime 11585 function can_display_notification_demandeur() {
961 softime 10808 // Le suivi des notification est affiché si l'événement est notifiable
962     // et si des notifications ont été envoyées
963     $evenement_id = $this->getVal("evenement");
964     $inst_evenement = $this->get_inst_evenement($evenement_id);
965     if ($inst_evenement->getVal('notification') != null &&
966     $inst_evenement->getVal('notification') != '') {
967     // Des notifications ont été envoyé si il existe au moins une notification
968     // liées à l'instruction
969 softime 11585 $idsNotifs = $this->get_instruction_notification(
970     $this->getVal($this->clePrimaire),
971     array(
972     'notification_recepisse',
973     'notification_instruction',
974     'notification_decision',
975 softime 12124 ),
976     true
977 softime 11585 );
978 softime 10808 if (isset($idsNotifs) && $idsNotifs !== array()) {
979     return true;
980     }
981     }
982     return false;
983     }
984    
985     /**
986 softime 11585 * CONDITION - can_display_notification
987     *
988     * Vérifie que le champs "suivi_notification_service" est affichable
989     *
990     * @return boolean
991     */
992     function can_display_notification_service() {
993     // Le suivi des notification est affiché si l'événement est notifiable
994     // et si des notifications ont été envoyées
995     $evenement_id = $this->getVal("evenement");
996     $inst_evenement = $this->get_inst_evenement($evenement_id);
997     if ($this->get_boolean_from_pgsql_value($inst_evenement->getVal('notification_service')) == true) {
998     // Des notifications ont été envoyé si il existe au moins une notification
999     // de type notification_service_consulte liées à l'instruction
1000     $idsNotifs = $this->get_instruction_notification(
1001     $this->getVal($this->clePrimaire),
1002     'notification_service_consulte'
1003     );
1004     if (isset($idsNotifs) && $idsNotifs !== array()) {
1005     return true;
1006     }
1007     }
1008     return false;
1009     }
1010    
1011    
1012     /**
1013     * CONDITION - can_display_notification_tiers
1014     *
1015     * Vérifie que le champs "suivi_notification_tiers" est affichable
1016     *
1017     * @return boolean
1018     */
1019     function can_display_notification_tiers() {
1020     // Le suivi des notification est affiché si l'événement est notifiable
1021     // et si des notifications ont été envoyées
1022     $evenement_id = $this->getVal("evenement");
1023     $inst_evenement = $this->get_inst_evenement($evenement_id);
1024 softime 13137 if (! empty($inst_evenement->getVal('notification_tiers'))) {
1025 softime 11585 // Des notifications ont été envoyé si il existe au moins une notification
1026     // de type notification_tiers_consulte liées à l'instruction
1027     $idsNotifs = $this->get_instruction_notification(
1028     $this->getVal($this->clePrimaire),
1029     'notification_tiers_consulte'
1030     );
1031     if (isset($idsNotifs) && $idsNotifs !== array()) {
1032     return true;
1033     }
1034     }
1035     return false;
1036     }
1037    
1038     /**
1039 softime 12654 * CONDITION - can_display_notification_commune
1040     *
1041     * Vérifie que le champs "suivi_notification_commune" est affichable
1042     *
1043     * @return boolean
1044     */
1045     function can_display_notification_commune() {
1046     // Le suivi des notification si il existe au moins une notification
1047     // de type notification_depot_demat liées à l'instruction
1048     $idsNotifs = $this->get_instruction_notification(
1049     $this->getVal($this->clePrimaire),
1050     array('notification_depot_demat', 'notification_commune')
1051     );
1052     if (isset($idsNotifs) && $idsNotifs !== array()) {
1053     return true;
1054     }
1055     return false;
1056     }
1057    
1058     /**
1059 softime 8593 * TREATMENT - disable_edition_integrale.
1060     *
1061     * Cette methode permet de passer la consultation en "lu"
1062     *
1063     * @return boolean true si maj effectué false sinon
1064     */
1065     function disable_edition_integrale() {
1066     // Cette méthode permet d'exécuter une routine en début des méthodes
1067     // dites de TREATMENT.
1068     $this->begin_treatment(__METHOD__);
1069     $this->correct = true;
1070     $valF = array(
1071     "flag_edition_integrale" => false,
1072     "titre_om_htmletat" => null,
1073     "corps_om_htmletatex" => null,
1074     );
1075     $res = $this->f->db->autoExecute(
1076     DB_PREFIXE.$this->table,
1077     $valF,
1078     DB_AUTOQUERY_UPDATE,
1079     $this->clePrimaire."=".$this->getVal($this->clePrimaire)
1080     );
1081     if ($this->f->isDatabaseError($res, true)) {
1082     // Appel de la methode de recuperation des erreurs
1083     $this->erreur_db($res->getDebugInfo(), $res->getMessage(), '');
1084     $this->correct = false;
1085     // Termine le traitement
1086     return $this->end_treatment(__METHOD__, false);
1087     } else {
1088     $this->addToMessage(_("Rédaction par compléments activé."));
1089     return $this->end_treatment(__METHOD__, true);
1090     }
1091    
1092     // Termine le traitement
1093     return $this->end_treatment(__METHOD__, false);
1094     }
1095    
1096     /**
1097     * TREATMENT - enable_edition_integrale.
1098     *
1099     * Cette methode permet de passer la consultation en "lu"
1100     *
1101     * @return boolean true si maj effectué false sinon
1102     */
1103     function enable_edition_integrale() {
1104     // Cette méthode permet d'exécuter une routine en début des méthodes
1105     // dites de TREATMENT.
1106     $this->begin_treatment(__METHOD__);
1107     $this->correct = true;
1108    
1109     // Récupère la collectivite du dossier d'instruction
1110     $dossier_instruction_om_collectivite = $this->get_dossier_instruction_om_collectivite();
1111     $collectivite = $this->f->getCollectivite($dossier_instruction_om_collectivite);
1112     //
1113     $params = array(
1114     "specific" => array(
1115     "corps" => array(
1116     "mode" => "get",
1117     )
1118     ),
1119     );
1120     $result = $this->compute_pdf_output('lettretype', $this->getVal('lettretype'), $collectivite, null, $params);
1121     $corps = $result['pdf_output'];
1122     //
1123     $params = array(
1124     "specific" => array(
1125     "titre" => array(
1126     "mode" => "get",
1127     )
1128     ),
1129     );
1130     $result = $this->compute_pdf_output('lettretype', $this->getVal('lettretype'), $collectivite, null, $params);
1131     $titre = $result['pdf_output'];
1132     //
1133     $valF = array(
1134     "flag_edition_integrale" => true,
1135     "titre_om_htmletat" => $titre,
1136     "corps_om_htmletatex" => $corps,
1137     );
1138     $res = $this->f->db->autoExecute(
1139     DB_PREFIXE.$this->table,
1140     $valF,
1141     DB_AUTOQUERY_UPDATE,
1142     $this->clePrimaire."=".$this->getVal($this->clePrimaire)
1143     );
1144     if ($this->f->isDatabaseError($res, true)) {
1145     // Appel de la methode de recuperation des erreurs
1146     $this->erreur_db($res->getDebugInfo(), $res->getMessage(), '');
1147     $this->correct = false;
1148     // Termine le traitement
1149     return $this->end_treatment(__METHOD__, false);
1150     } else {
1151     $this->addToMessage(_("Rédaction libre activé."));
1152     return $this->end_treatment(__METHOD__, true);
1153     }
1154    
1155     // Termine le traitement
1156     return $this->end_treatment(__METHOD__, false);
1157     }
1158    
1159     /**
1160 mbroquet 3730 * Cette méthode permet de récupérer le dossier d'autorisation d'un dossier
1161     */
1162     function getNumDemandeAutorFromDossier($id) {
1163     //
1164     if (!isset($id)) {
1165     return NULL;
1166     }
1167     //
1168     $sql = "select dossier_autorisation from ".DB_PREFIXE."dossier ";
1169     $sql .= " where dossier='".$id."'";
1170     //
1171 softime 12847 $dossier_autorisation = $this->f->db->getone($sql);
1172     $this->addToLog(__METHOD__."(): db->getone(\"".$sql."\")", VERBOSE_MODE);
1173     $this->f->isDatabaseError($dossier_autorisation);
1174 mbroquet 3730 //
1175     return $dossier_autorisation;
1176     }
1177    
1178     // }}}
1179    
1180     function setType(&$form, $maj) {
1181 softime 8593 // Récupération du mode de l'action
1182     $crud = $this->get_action_crud($maj);
1183     // Récupère la collectivité du dossier d'instruction
1184     $collectivite_di = $this->get_dossier_instruction_om_collectivite();
1185 mbroquet 3730
1186 softime 8593 // Cache tous les champs
1187     foreach ($this->champs as $value) {
1188     $form->setType($value, 'hidden');
1189     }
1190 softime 6565
1191 softime 10573 // Les champs historique_signature et statut_signature ne sont pas saisissable dans tous les cas
1192 softime 11228 if ($this->can_display_parapheur() === true && $maj == 3) {
1193 softime 10573 $form->setType('statut_signature', 'selectstatic');
1194     $form->setType('historique_signature', 'jsontotab');
1195     if ($this->getVal('commentaire_signature') == null) {
1196     $form->setType('commentaire_signature', 'hidden');
1197     } else {
1198     $form->setType('commentaire_signature', 'hiddenstatic');
1199     }
1200     }
1201    
1202 softime 11585 // Le champ de suivi des notifications des demandeurs n'est pas affichable dans tous les cas
1203 softime 12654 if ($maj == 3 && $this->can_display_notification_demandeur() === true) {
1204 softime 10808 $form->setType('suivi_notification', 'jsontotab');
1205     }
1206 softime 11585 // Le champ de suivi des notifications des services n'est pas affichable dans tous les cas
1207 softime 12654 if ($maj == 3 && $this->can_display_notification_service() === true) {
1208 softime 11585 $form->setType('suivi_notification_service', 'jsontotab');
1209     }
1210     // Le champ de suivi des notifications des tiers n'est pas affichable dans tous les cas
1211 softime 12654 if ($maj == 3 && $this->can_display_notification_tiers() === true) {
1212 softime 11585 $form->setType('suivi_notification_tiers', 'jsontotab');
1213     }
1214 softime 12654 // Le champ de suivi des notifications des communes n'est pas affichable dans tous les cas
1215     if ($maj == 3 && $this->can_display_notification_commune() === true) {
1216     $form->setType('suivi_notification_commune', 'jsontotab');
1217     }
1218 softime 10808
1219 softime 8593 // MODE AJOUTER
1220     if ($this->getParameter('maj') == 0) {
1221 softime 10573 $form->setType('commentaire', 'textareahidden');
1222     // Si l'option est active passage du champ date en lecture seule
1223     if ($this->f->is_option_date_evenement_instruction_lecture_seule($collectivite_di) === true) {
1224     $form->setType("date_evenement", "hiddenstaticdate");
1225     } else {
1226     $form->setType("date_evenement", "date");
1227     }
1228 softime 8989 if ($this->is_in_context_of_foreign_key("evenement", $this->getParameter("retourformulaire"))) {
1229 softime 8593 $form->setType("evenement", "selecthiddenstatic");
1230     } else {
1231     $form->setType("evenement", "select");
1232     }
1233 softime 8989 if ($this->is_in_context_of_foreign_key("signataire_arrete", $this->getParameter("retourformulaire"))) {
1234 softime 8593 $form->setType("signataire_arrete", "selecthiddenstatic");
1235     } else {
1236     $form->setType("signataire_arrete", "select");
1237     }
1238     if ($this->is_option_redaction_libre_enabled() === true) {
1239     $form->setType("flag_edition_integrale", "select");
1240     }
1241 mbroquet 3730 }
1242    
1243 softime 8593 // MODE MODIFIER
1244     if ($this->getParameter('maj') == 1) {
1245 softime 10573 // Si l'option est active passage du champ date en lecture seule
1246     if ($this->f->is_option_date_evenement_instruction_lecture_seule($collectivite_di) === true) {
1247     $form->setType("date_evenement", "hiddenstaticdate");
1248     } else {
1249     $form->setType("date_evenement", "date");
1250     }
1251 softime 8593 $form->setType("evenement", "selecthiddenstatic");
1252     if ($this->has_an_edition() === true) {
1253     $form->setType('lettretype', 'hiddenstatic');
1254 softime 8989 if ($this->is_in_context_of_foreign_key("signataire_arrete", $this->getParameter("retourformulaire"))) {
1255 softime 8593 $form->setType("signataire_arrete", "selecthiddenstatic");
1256     } else {
1257     $form->setType("signataire_arrete", "select");
1258     }
1259     if ($this->getVal("flag_edition_integrale") == "t") {
1260     $form->setType("titre_om_htmletat", "htmlEtat");
1261     $form->setType("corps_om_htmletatex", "htmlEtatEx");
1262     } else {
1263     $form->setType("complement_om_html", "html");
1264     $form->setType("complement2_om_html", "html");
1265     $form->setType("complement3_om_html", "html");
1266     $form->setType("complement4_om_html", "html");
1267     $form->setType('bible_auto', 'httpclick');
1268     $form->setType('bible', 'httpclick');
1269     $form->setType('bible2', 'httpclick');
1270     $form->setType('bible3', 'httpclick');
1271     $form->setType('bible4', 'httpclick');
1272     }
1273     if ($this->f->is_option_preview_pdf_enabled($collectivite_di) === true) {
1274     //
1275     $form->setType('btn_refresh', 'httpclickbutton');
1276     $form->setType('btn_preview', 'httpclickbutton');
1277     $form->setType('btn_redaction', 'httpclickbutton');
1278 softime 11876 // /!\ le type du champs est utilisé dans un selecteur dans le jscript.js
1279     // pour identifiant le champ de prévisualisation et régler sa taille à
1280     // l'affichage du champ. En cas de modification, le selecteur doit également
1281     // être mis à jour
1282 softime 11418 $form->setType('live_preview', 'previsualiser_pdf');
1283 softime 7521 }
1284 softime 8593
1285 mbroquet 3730 // necessaire pour calcul de date en modification
1286     //$form->setType('delai', 'hiddenstatic');
1287     // les administrateurs technique et fonctionnel peuvent
1288     // modifier tous les champs de date
1289     // si l'instruction a déjà été finalisée au moins une fois
1290 softime 7996 if (($this->f->isAccredited(array($this->get_absolute_class_name(), $this->get_absolute_class_name()."modification_dates"), "OR")
1291 softime 6565 || $this->f->isAccredited(array('instruction', 'instruction_modification_dates'), "OR"))
1292 mbroquet 3730 && $this->getVal("date_finalisation_courrier") != '') {
1293 softime 8593 //
1294 mbroquet 3730 $form->setType('date_envoi_signature', 'date');
1295     $form->setType('date_retour_signature', 'date');
1296 softime 10573 if ($this->is_sent_for_signature() === true
1297     && $this->is_signed() === true) {
1298     //
1299     $form->setType("date_envoi_signature", "datereadonly");
1300     $form->setType("date_retour_signature", "datereadonly");
1301     }
1302 mbroquet 3730 $form->setType('date_envoi_rar', 'date');
1303     $form->setType('date_retour_rar', 'date');
1304     $form->setType('date_envoi_controle_legalite', 'date');
1305 softime 11418 if ($this->is_sent_to_cl() === true) {
1306 softime 12124 $form->setType("date_envoi_controle_legalite", "datedisabled");
1307 softime 11418 }
1308 mbroquet 3730 $form->setType('date_retour_controle_legalite', 'date');
1309     $form->setType('date_finalisation_courrier', 'date');
1310     }
1311     }
1312     }
1313    
1314 softime 10808 // MODE CONSULTER + SUPPRIMER + SUIVI DES DATES 125 + NOTIFICATION MANUELLE
1315 softime 8593 if ($this->getParameter('maj') == 3
1316     || $this->getParameter('maj') == 2
1317 softime 10808 || $this->getParameter('maj') == 125
1318     || $this->getParameter('maj') == 410) {
1319 softime 8593 //
1320     $form->setType("date_evenement", "datestatic");
1321     $form->setType("evenement", "selecthiddenstatic");
1322     if ($this->has_an_edition() === true) {
1323     $form->setType('lettretype', 'hiddenstatic');
1324     $form->setType("signataire_arrete", "selecthiddenstatic");
1325     if ($this->getVal("om_final_instruction") == 't') {
1326     $form->setType('om_final_instruction_utilisateur', 'textareastatic');
1327     } else {
1328     $form->setType('om_final_instruction_utilisateur', 'hidden');
1329     }
1330     }
1331 softime 10573 if ($this->evenement_has_a_commentaire($this->getVal('evenement')) === true ) {
1332     $form->setType('commentaire', 'textareastatic');
1333     }
1334 mbroquet 3730 }
1335    
1336 softime 10808 // MODE CONSULTER + SUPPRIMER + NOTIFICATION MANUELLE
1337     if ($this->getParameter('maj') == 3
1338     || $this->getParameter('maj') == 2
1339     || $this->getParameter('maj') == 410) {
1340 softime 10573 // Si il n'y a pas de lettre type (edition) associé à l'événement
1341     // les dates de suivi ne sont pas affichée
1342 softime 8593 if ($this->has_an_edition() === true) {
1343 softime 10573 $form->setType('date_envoi_signature', 'datestatic');
1344     $form->setType('date_retour_signature', 'datestatic');
1345     $form->setType('date_envoi_rar', 'datestatic');
1346     $form->setType('date_retour_rar', 'datestatic');
1347     $form->setType('date_envoi_controle_legalite', 'datestatic');
1348     $form->setType('date_retour_controle_legalite', 'datestatic');
1349     $form->setType('date_finalisation_courrier', 'datestatic');
1350 softime 8593 if ($this->getVal("flag_edition_integrale") == "t") {
1351     $form->setType("titre_om_htmletat", "htmlstatic");
1352     $form->setType("corps_om_htmletatex", "htmlstatic");
1353     } else {
1354     $form->setType("complement_om_html", "htmlstatic");
1355     $form->setType("complement2_om_html", "htmlstatic");
1356     $form->setType("complement3_om_html", "htmlstatic");
1357     $form->setType("complement4_om_html", "htmlstatic");
1358     }
1359 mbroquet 3730 }
1360     }
1361 softime 8593
1362     // MODE SUIVI DES DATES 125
1363     if ($this->getParameter('maj') == 125) {
1364     $form->setType("date_evenement", "hiddenstaticdate");
1365     $form->setType('om_final_instruction_utilisateur', 'hiddenstatic');
1366     $form->setType('date_envoi_signature', 'date');
1367     $form->setType('date_retour_signature', 'date');
1368 softime 10573 if ($this->is_sent_for_signature() === true
1369     || $this->is_signed() === true) {
1370     //
1371     $form->setType("date_envoi_signature", "datereadonly");
1372     $form->setType("date_retour_signature", "datereadonly");
1373     }
1374 softime 8593 $form->setType('date_envoi_rar', 'date');
1375     $form->setType('date_retour_rar', 'date');
1376     $form->setType('date_envoi_controle_legalite', 'date');
1377 softime 11418 if ($this->is_sent_to_cl() === true) {
1378 softime 12124 $form->setType("date_envoi_controle_legalite", "datedisabled");
1379 softime 11418 }
1380 softime 8593 $form->setType('date_retour_controle_legalite', 'date');
1381     $form->setType('date_finalisation_courrier', 'date');
1382     }
1383 softime 10573
1384     if ($maj == 401) {
1385     foreach ($this->champs as $champ) {
1386     $form->setType($champ, 'hidden');
1387     }
1388 softime 11418 $form->setType('preview_edition', 'previsualiser');
1389 softime 10573 }
1390 softime 12124
1391     // Si l'instruction a été envoyé au contrôle de légalité et que la
1392     // tâche envoi_cl lié n'a pas encore été traité il faut indiquer à
1393     // l'utilisateur que l'envoi au cl est en cours de traitement.
1394     if ($this->is_sent_to_cl() === true
1395     && empty($this->getVal('date_envoi_controle_legalite'))
1396     && $maj == 3) {
1397     $form->setType("date_envoi_controle_legalite", "hiddenstatic");
1398     }
1399 mbroquet 3730 }
1400    
1401 softime 8593 function setOnchange(&$form,$maj){
1402     parent::setOnchange($form,$maj);
1403    
1404     // MODE AJOUTER
1405     if ($this->getParameter('maj') == 0) {
1406 softime 10573 $form->setOnchange(
1407     "evenement",
1408     "manage_instruction_evenement_lettretype(this.value, '".addslashes($this->getParameter('idxformulaire'))."');
1409     manage_instruction_evenement_commentaire(this.value, '".addslashes($this->getParameter('idxformulaire'))."');"
1410     );
1411 softime 8593 }
1412     }
1413    
1414     function evenement_has_an_edition($evenement_id) {
1415     $evenement = $this->get_inst_evenement($evenement_id);
1416     $lettretype = $evenement->getVal('lettretype');
1417     if ($lettretype !== '' && $lettretype !== null) {
1418     return true;
1419     }
1420     return false;
1421     }
1422    
1423     function view_evenement_has_an_edition_json() {
1424     $json_return = array(
1425     "lettretype" => $this->evenement_has_an_edition($this->f->get_submitted_get_value('evenement_id')),
1426     "option_redaction_libre_enabled" => $this->is_option_redaction_libre_enabled(),
1427     );
1428     echo json_encode($json_return);
1429     }
1430    
1431 softime 10573 function evenement_has_a_commentaire($evenement_id) {
1432     $evenement = $this->get_inst_evenement($evenement_id);
1433     return $this->get_boolean_from_pgsql_value($evenement->getVal('commentaire'));
1434     }
1435    
1436     function view_evenement_has_a_commentaire_json() {
1437     $json_return = array(
1438     "commentaire" => $this->evenement_has_a_commentaire($this->f->get_submitted_get_value('evenement_id'))
1439     );
1440     echo json_encode($json_return);
1441     }
1442    
1443 softime 11418
1444 softime 8989 /**
1445 softime 11418 * CONDITION - can_be_sended_to_cl
1446 softime 8989 *
1447 softime 11418 * Vérifie que le contrôle de légalité est disponible
1448     *
1449     * @return boolean
1450     */
1451     function can_be_sended_to_cl() {
1452     // Si l'instruction a une édition
1453     // et que l'événement est paramétré pour envoyer le contrôle de légalité
1454     // par Plat'AU
1455     // et que la date de retour signature est renseignée
1456     // et que la date d'envoi au contrôle légalité n'est pas renseignée
1457     // et qu'il n'existe pas de task envoi_CL en cours (!= done ou canceled)
1458     if ($this->has_an_edition() === true) {
1459     $inst_di = $this->get_inst_dossier($this->getVal('dossier'));
1460     $inst_evenement = $this->get_inst_evenement($this->getVal('evenement'));
1461     if ($inst_evenement->getVal('envoi_cl_platau') === 't'
1462     && empty($this->getVal('date_retour_signature')) === false
1463     && empty($this->getVal('date_envoi_controle_legalite')) === true
1464     && $this->getVal('envoye_cl_platau') === 'f'
1465     && $this->f->is_type_dossier_platau($inst_di->getVal('dossier_autorisation')) === true
1466     && $inst_di->getVal('etat_transmission_platau') !== 'jamais_transmissible') {
1467     //
1468     return true;
1469     }
1470     }
1471     //
1472     return false;
1473     }
1474    
1475     /**
1476     *
1477 softime 8989 * @return string
1478     */
1479     function get_var_sql_forminc__sql_signataire_arrete() {
1480 softime 11585 return sprintf(
1481     "SELECT
1482     signataire_arrete.signataire_arrete,
1483     CONCAT_WS(
1484     ' - ',
1485     CONCAT_WS(' ', signataire_arrete.prenom, signataire_arrete.nom),
1486     signataire_habilitation.libelle,
1487     signataire_arrete.description
1488     )
1489     FROM
1490     %1\$ssignataire_arrete
1491     LEFT JOIN %1\$ssignataire_habilitation
1492     ON signataire_arrete.signataire_habilitation = signataire_habilitation.signataire_habilitation
1493     WHERE
1494     ((signataire_arrete.om_validite_debut IS NULL
1495     AND (signataire_arrete.om_validite_fin IS NULL
1496     OR signataire_arrete.om_validite_fin > CURRENT_DATE))
1497     OR (signataire_arrete.om_validite_debut <= CURRENT_DATE
1498     AND (signataire_arrete.om_validite_fin IS NULL
1499     OR signataire_arrete.om_validite_fin > CURRENT_DATE)))
1500     ORDER BY
1501     signataire_arrete.prenom,
1502     signataire_arrete.nom",
1503     DB_PREFIXE
1504     );
1505 softime 8989 }
1506    
1507     /**
1508     *
1509     * @return string
1510     */
1511     function get_var_sql_forminc__sql_signataire_arrete_by_id() {
1512 softime 11585 return sprintf(
1513     "SELECT
1514     signataire_arrete.signataire_arrete,
1515     CONCAT_WS(
1516     ' - ',
1517     CONCAT_WS(' ', signataire_arrete.prenom, signataire_arrete.nom),
1518     signataire_habilitation.libelle,
1519     signataire_arrete.description
1520     )
1521     FROM
1522     %1\$ssignataire_arrete
1523     LEFT JOIN %1\$ssignataire_habilitation
1524     ON signataire_arrete.signataire_habilitation = signataire_habilitation.signataire_habilitation
1525     WHERE
1526     signataire_arrete.signataire_arrete = <idx>",
1527     DB_PREFIXE
1528     );
1529 softime 8989 }
1530    
1531     /**
1532     *
1533     * @return string
1534     */
1535     function get_var_sql_forminc__sql_signataire_arrete_by_di() {
1536 softime 11585 return sprintf(
1537     "SELECT
1538     signataire_arrete.signataire_arrete,
1539     CONCAT_WS(
1540     ' - ',
1541     CONCAT_WS(' ', signataire_arrete.prenom, signataire_arrete.nom),
1542     signataire_habilitation.libelle,
1543     signataire_arrete.description
1544     )
1545     FROM
1546     %1\$ssignataire_arrete
1547     LEFT JOIN %1\$som_collectivite
1548     ON signataire_arrete.om_collectivite = om_collectivite.om_collectivite
1549     LEFT JOIN %1\$ssignataire_habilitation
1550     ON signataire_arrete.signataire_habilitation = signataire_habilitation.signataire_habilitation
1551     WHERE
1552     ((signataire_arrete.om_validite_debut IS NULL
1553     AND (signataire_arrete.om_validite_fin IS NULL
1554     OR signataire_arrete.om_validite_fin > CURRENT_DATE))
1555     OR (signataire_arrete.om_validite_debut <= CURRENT_DATE
1556     AND (signataire_arrete.om_validite_fin IS NULL
1557     OR signataire_arrete.om_validite_fin > CURRENT_DATE)))
1558     AND (om_collectivite.niveau = '2'
1559     OR signataire_arrete.om_collectivite = <collectivite_di>)
1560     ORDER BY
1561     signataire_arrete.prenom, signataire_arrete.nom",
1562     DB_PREFIXE
1563     );
1564 softime 8989 }
1565    
1566     /**
1567     *
1568     * @return string
1569     */
1570     function get_var_sql_forminc__sql_signataire_arrete_defaut() {
1571 softime 11585 return sprintf(
1572     "SELECT
1573     signataire_arrete.signataire_arrete,
1574     CONCAT_WS(
1575     ' - ',
1576     CONCAT_WS(' ', signataire_arrete.prenom, signataire_arrete.nom),
1577     signataire_habilitation.libelle,
1578     signataire_arrete.description
1579     )
1580     FROM
1581     %1\$ssignataire_arrete
1582     LEFT JOIN %1\$ssignataire_habilitation
1583     ON signataire_arrete.signataire_habilitation = signataire_habilitation.signataire_habilitation
1584     WHERE
1585     ((signataire_arrete.om_validite_debut IS NULL
1586     AND (signataire_arrete.om_validite_fin IS NULL
1587     OR signataire_arrete.om_validite_fin > CURRENT_DATE))
1588     OR (signataire_arrete.om_validite_debut <= CURRENT_DATE
1589     AND (signataire_arrete.om_validite_fin IS NULL
1590     OR signataire_arrete.om_validite_fin > CURRENT_DATE)))
1591     AND signataire_arrete.defaut IS TRUE
1592     ORDER BY
1593     signataire_arrete.prenom, signataire_arrete.nom",
1594     DB_PREFIXE
1595     );
1596 softime 8989 }
1597    
1598     /**
1599     *
1600     * @return string
1601     */
1602     function get_var_sql_forminc__sql_signataire_arrete_defaut_by_di() {
1603 softime 11585 return sprintf(
1604     "SELECT
1605     signataire_arrete.signataire_arrete,
1606     CONCAT_WS(
1607     ' - ',
1608     CONCAT_WS(' ', signataire_arrete.prenom, signataire_arrete.nom),
1609     signataire_habilitation.libelle,
1610     signataire_arrete.description
1611     )
1612     FROM
1613     %1\$ssignataire_arrete
1614     LEFT JOIN %1\$ssignataire_habilitation
1615     ON signataire_arrete.signataire_habilitation = signataire_habilitation.signataire_habilitation
1616     LEFT JOIN %1\$som_collectivite
1617     ON signataire_arrete.om_collectivite = om_collectivite.om_collectivite
1618     WHERE
1619     ((signataire_arrete.om_validite_debut IS NULL
1620     AND (signataire_arrete.om_validite_fin IS NULL
1621     OR signataire_arrete.om_validite_fin > CURRENT_DATE))
1622     OR (signataire_arrete.om_validite_debut <= CURRENT_DATE
1623     AND (signataire_arrete.om_validite_fin IS NULL
1624     OR signataire_arrete.om_validite_fin > CURRENT_DATE)))
1625     AND signataire_arrete.defaut IS TRUE
1626     AND (om_collectivite.niveau = '2'
1627     OR signataire_arrete.om_collectivite = <collectivite_di>)
1628     ORDER BY
1629     signataire_arrete.prenom,
1630     signataire_arrete.nom",
1631     DB_PREFIXE
1632     );
1633 softime 8989 }
1634    
1635     /**
1636     * SETTER_FORM - setSelect.
1637     *
1638     * @return void
1639     */
1640     function setSelect(&$form, $maj, &$dnu1 = null, $dnu2 = null) {
1641     //parent::setSelect($form, $maj);
1642 mbroquet 3730 /**
1643     * On ne surcharge pas la méthode parent car une requête sur la table
1644     * dossier est mauvaise pour les performances, car la requête qui
1645     * concerne evenement est plus complexe que celle générée et car les
1646     * champs action, avis_decision et etat ne sont pas utilisés comme des
1647     * select
1648     */
1649     //// action
1650 softime 8989 //$this->init_select($form, $this->f->db, $maj, null, "action",
1651 mbroquet 3730 // $sql_action, $sql_action_by_id, false);
1652    
1653     //// avis_decision
1654 softime 8989 //$this->init_select($form, $this->f->db, $maj, null, "avis_decision",
1655 mbroquet 3730 // $sql_avis_decision, $sql_avis_decision_by_id, false);
1656    
1657     //// dossier
1658 softime 8989 //$this->init_select($form, $this->f->db, $maj, null, "dossier",
1659 mbroquet 3730 // $sql_dossier, $sql_dossier_by_id, false);
1660    
1661     //// etat
1662 softime 8989 //$this->init_select($form, $this->f->db, $maj, null, "etat",
1663 mbroquet 3730 // $sql_etat, $sql_etat_by_id, false);
1664    
1665     //// evenement
1666 softime 8989 //$this->init_select($form, $this->f->db, $maj, null, "evenement",
1667 mbroquet 3730 // $sql_evenement, $sql_evenement_by_id, false);
1668    
1669     // signataire_arrete
1670     // si contexte DI
1671     if ($this->getParameter("retourformulaire") == "dossier"
1672 softime 12847 || $this->f->contexte_dossier_instruction()) {
1673 mbroquet 3730 // on recupère les signataires de la multicollectivité et de celle du DI
1674 softime 7996 $di = $this->f->get_inst__om_dbform(array(
1675     "obj" => "dossier_instruction",
1676     "idx" => $this->getParameter('idxformulaire'),
1677     ));
1678 softime 8989 $sql_signataire_arrete_by_di = str_replace(
1679     '<collectivite_di>',
1680     $di->getVal("om_collectivite"),
1681     $this->get_var_sql_forminc__sql("signataire_arrete_by_di")
1682     );
1683     $this->init_select(
1684     $form,
1685     $this->f->db,
1686     $maj,
1687     null,
1688     "signataire_arrete",
1689     $sql_signataire_arrete_by_di,
1690     $this->get_var_sql_forminc__sql("signataire_arrete_by_id"),
1691     true
1692     );
1693 mbroquet 3730 } else {
1694 softime 8989 $this->init_select(
1695     $form,
1696     $this->f->db,
1697     $maj,
1698     null,
1699     "signataire_arrete",
1700     $this->get_var_sql_forminc__sql("signataire_arrete"),
1701     $this->get_var_sql_forminc__sql("signataire_arrete_by_id"),
1702     true
1703     );
1704 mbroquet 3730 }
1705    
1706     /**
1707     * Gestion du filtre sur les événements de workflow disponibles
1708     * On récupère ici en fonction de l'état du dossier d'instruction en
1709     * cours et du type du dossier d'instruction en cours la liste
1710     * événements disponibles.
1711     */
1712     if ($maj == 0) {
1713     // Récupération des événements par une jointure entre la table dossier
1714     // et la table transition et la table evenement et la table
1715     // lien_dossier_instruction_type_evenement en fonction de l'identifiant
1716     // du dossier d'instruction en cours
1717     $sql = "SELECT
1718     evenement.evenement,
1719     evenement.libelle as lib
1720     FROM ".DB_PREFIXE."dossier
1721     INNER JOIN ".DB_PREFIXE."lien_dossier_instruction_type_evenement
1722     ON dossier.dossier_instruction_type=lien_dossier_instruction_type_evenement.dossier_instruction_type
1723     INNER JOIN ".DB_PREFIXE."evenement
1724     ON evenement.evenement=lien_dossier_instruction_type_evenement.evenement
1725     INNER JOIN ".DB_PREFIXE."transition
1726     ON evenement.evenement = transition.evenement
1727     AND dossier.etat=transition.etat
1728 softime 8989 WHERE dossier.dossier='".$this->getParameter("idxformulaire")."' ";
1729 mbroquet 3730
1730     // Si changement de décision par instructeur commune
1731     if($this->f->isUserInstructeur() === true
1732 softime 8989 && $this->getDivisionFromDossier($this->getParameter("idxformulaire")) != $_SESSION["division"]
1733     && $this->isInstrCanChangeDecision($this->getParameter("idxformulaire")) === true) {
1734 mbroquet 3730 $sql .= "AND evenement.type IN ('arrete', 'changement_decision') ";
1735     }
1736     $sql .= "ORDER BY evenement.libelle, evenement.action";
1737 softime 8989 $res = $this->f->db->query($sql);
1738 softime 12847 $this->addToLog(__METHOD__."(): db->query(\"".$sql."\");", VERBOSE_MODE);
1739     $this->f->isDatabaseError($res);
1740 mbroquet 3730 // Remplissage du tableau du select
1741     $contenu = array(
1742     0 => array("",),
1743     1 => array(_('choisir')." "._('evenement'),)
1744     );
1745     while ($row=& $res->fetchRow()) {
1746     $contenu[0][] = $row[0];
1747     $contenu[1][] = $row[1];
1748     }
1749     $form->setSelect("evenement", $contenu);
1750 softime 8593
1751 mbroquet 3730 } else {
1752     $sql = "SELECT
1753     evenement.libelle as lib
1754     FROM ".DB_PREFIXE."evenement
1755     WHERE evenement.evenement=".$this->getVal("evenement")."";
1756 softime 8989 $res = $this->f->db->getone($sql);
1757 softime 12847 $this->addToLog(__METHOD__."(): db->getone(\"".$sql."\");", VERBOSE_MODE);
1758     $this->f->isDatabaseError($res);
1759 mbroquet 3730 //
1760     $contenu = array(
1761     0 => array($this->getVal("evenement"),),
1762     1 => array($res,)
1763     );
1764     $form->setSelect("evenement", $contenu);
1765     }
1766    
1767     /**
1768     * Gesion des liens vers la bible
1769     */
1770     // lien bible_auto
1771     $contenu = array(_("automatique"));
1772     $form->setSelect("bible_auto",$contenu);
1773     // lien bible1
1774     $contenu = array(_("bible"));
1775     $form->setSelect("bible",$contenu);
1776     // lien bible2
1777     $contenu = array(_("bible"));
1778     $form->setSelect("bible2",$contenu);
1779     // lien bible3
1780     $contenu = array(_("bible"));
1781     $form->setSelect("bible3",$contenu);
1782     // lien bible4
1783     $contenu = array(_("bible"));
1784     $form->setSelect("bible4",$contenu);
1785 softime 7521
1786     if ($maj == 1) {
1787     $base64 = $this->init_pdf_temp();
1788     $form->setSelect('live_preview', array('base64'=>$base64));
1789 softime 8593 $form->setSelect("btn_refresh", array(_('Prévisualiser')));
1790     $form->setSelect("btn_preview", array(_('Prévisualiser >>')));
1791     $form->setSelect("btn_redaction", array(_('<< Rédiger')));
1792 softime 7521 }
1793 softime 8593
1794     // Selection du type de rédaction à l'ajout
1795     $content = array(
1796     0 => array('f', 't', ),
1797     1 => array(_('Rédaction par compléments'), _('Rédaction libre'), ),
1798     );
1799     $form->setSelect('flag_edition_integrale', $content);
1800 softime 10573
1801     $contenu = array();
1802     foreach(array('waiting', 'in_progress', 'canceled', 'expired', 'finished') as $value) {
1803     $contenu[0][] = $value;
1804     $contenu[1][] = $this->get_trad_for_statut($value);
1805     }
1806     $form->setSelect('statut_signature', $contenu);
1807    
1808    
1809     if ($maj == 401) {
1810     $file = $this->f->storage->get($this->getVal('om_fichier_instruction'));
1811 softime 11418 $form->setSelect('preview_edition', array(
1812     'base64' => base64_encode($file['file_content']),
1813     'mimetype' => $file['metadata']['mimetype'],
1814     'label' => 'instruction_'.$this->getVal($this->clePrimaire),
1815     'href' => sprintf(
1816     '../app/index.php?module=form&snippet=file&obj=instruction&champ=om_fichier_instruction&id=%1$s',
1817     $this->getVal($this->clePrimaire)
1818     )
1819     ));
1820 softime 10573 }
1821 mbroquet 3730 }
1822    
1823 softime 8989 function cleSecondaire($id, &$dnu1 = null, $val = array(), $dnu2 = null) {
1824 mbroquet 3730 //
1825 softime 11228 // Vérifie uniquementla cle secondaire : demande
1826     $this->rechercheTable($this->f->db, "demande", "instruction_recepisse", $id);
1827 mbroquet 3730
1828     $id = $this->getVal($this->clePrimaire);
1829    
1830    
1831     //Requête de vérification que cet événement d'instruction n'est pas lié
1832     //à la création d'un dossier d'instruction
1833     $sql = "SELECT demande_type.dossier_instruction_type
1834     FROM ".DB_PREFIXE."demande_type
1835     LEFT JOIN ".DB_PREFIXE."demande
1836     ON demande.demande_type = demande_type.demande_type
1837     WHERE demande.instruction_recepisse = ".$id;
1838 softime 12847 $res = $this->f->db->getone($sql);
1839     $this->addToLog(__METHOD__."(): db->getone(\"".$sql."\");", VERBOSE_MODE);
1840     $this->f->isDatabaseError($res);
1841 mbroquet 3730
1842     // Aucune clé secondaire n'a été trouvée ou c'est un événement sans
1843     //création de dossier d'instruction, l'événement d'instruction peut être
1844     //supprimé
1845     if ( $this->correct !== false || $res == null || $res == ""){
1846    
1847     // Requête de vérification que cet événement d'instruction est lié
1848     // à une demande
1849     $sql = "SELECT demande
1850     FROM ".DB_PREFIXE."demande
1851     WHERE instruction_recepisse = ".$id;
1852 softime 12847 $res = $this->f->db->getone($sql);
1853     $this->addToLog(__METHOD__."(): db->getone(\"".$sql."\");", VERBOSE_MODE);
1854     $this->f->isDatabaseError($res);
1855 mbroquet 3730
1856     //Si c'est un événement d'instruction lié à une demande
1857     if ($res != null || $res != ""){
1858 softime 7996 $demande = $this->f->get_inst__om_dbform(array(
1859     "obj" => "demande",
1860     "idx" => $res,
1861     ));
1862 mbroquet 3730
1863     //On met à jour la demande en supprimant la liaison vers
1864     //l'événement d'instruction
1865     $demande->setParameter("maj", 1);
1866     $valF = array();
1867     foreach($demande->champs as $identifiant => $champ) {
1868     $valF[$champ] = $demande->val[$identifiant];
1869     }
1870     $valF['date_demande']=$demande->dateDBToForm($valF['date_demande']);
1871     $valF['instruction_recepisse']=NULL;
1872 softime 8989 $ret = $demande->modifier($valF);
1873 mbroquet 3730 }
1874    
1875     /**
1876     * Vérification que l'élément supprimé est le dernier pour pouvoir
1877     * remodifier les données de manière itérative.
1878     */
1879     // Initialisation
1880     $dernierevenement = "";
1881     // Récupération du dernier élément de la table d'instruction qui
1882     // concerne le dossier en cours
1883     $sql = "SELECT max(instruction)
1884     FROM ".DB_PREFIXE."instruction
1885 softime 8989 WHERE dossier ='".$this->getParameter("idxformulaire")."'";
1886 softime 12847 $dernierevenement = $this->f->db->getone($sql);
1887     $this->addToLog(__METHOD__."(): db->getone(\"".$sql."\");", VERBOSE_MODE);
1888     $this->f->isDatabaseError($dernierevenement);
1889 mbroquet 3730 // Si on se trouve effectivement sur le dernier evenement d'instruction
1890     if ($dernierevenement == $id) {
1891     // Alors on valide la suppression
1892     $this->correct = true;
1893     $this->addToMessage(_('Destruction_chronologique'));
1894     } else {
1895     // Alors on annule la suppression
1896     $this->correct = false;
1897     $this->addToMessage(_("Seul le dernier evenement d'instruction peut etre supprime."));
1898     }
1899     }
1900     }
1901    
1902     /**
1903     * Vérification de la possibilité ou non de modifier des dates de suivi
1904     * @param string $champ champ date à vérifier
1905     */
1906     function updateDate($champ) {
1907    
1908     //Si le retourformulaire est "dossier_instruction"
1909     if ($this->getParameter("retourformulaire") == "dossier"
1910 softime 12847 || $this->f->contexte_dossier_instruction()) {
1911 mbroquet 3730
1912     // Vérification de la possibilité de modifier les dates si déjà éditées
1913     if($this->valF[$champ] != "" AND !$this->f->user_is_admin) {
1914     // si l'utilisateur n'est pas un admin
1915     if($this->getVal($champ) != "" AND $this->getVal($champ) != $this->valF[$champ]) {
1916     $this->correct = false;
1917     $this->addToMessage(_("Les dates de suivis ne peuvent etre modifiees"));
1918     }
1919     }
1920     }
1921    
1922     //
1923     return true;
1924     }
1925    
1926 softime 8989 /**
1927     * SETTER_FORM - setValsousformulaire (setVal).
1928     *
1929     * @return void
1930     */
1931     function setValsousformulaire(&$form, $maj, $validation, $idxformulaire, $retourformulaire, $typeformulaire, &$dnu1 = null, $dnu2 = null) {
1932     // parent::setValsousformulaire($form, $maj, $validation, $idxformulaire, $retourformulaire, $typeformulaire);
1933 mbroquet 3730 //
1934 softime 8989 $this->retourformulaire = $retourformulaire;
1935     //
1936 mbroquet 3730 if ($maj == 0) {
1937 softime 8989 $form->setVal("destinataire", $this->getParameter("idxformulaire"));
1938     $form->setVal("dossier", $this->getParameter("idxformulaire"));
1939 mbroquet 3730 }
1940 softime 12124
1941     // Si l'instruction a été envoyé au contrôle de légalité et que la
1942     // tâche envoi_cl lié n'a pas encore été traité il faut indiquer à
1943     // l'utilisateur que l'envoi au cl est en cours de traitement.
1944     if ($this->is_sent_to_cl() === true
1945     && empty($this->getVal('date_envoi_controle_legalite'))
1946     && $maj == 3) {
1947     $form->setVal("date_envoi_controle_legalite", __("En cours de traitement."));
1948     }
1949 mbroquet 3730 //
1950     $this->set_form_default_values($form, $maj, $validation);
1951     }
1952    
1953     /**
1954 softime 8989 * SETTER_FORM - set_form_default_values (setVal).
1955     *
1956     * @return void
1957 mbroquet 3730 */
1958     function set_form_default_values(&$form, $maj, $validation) {
1959 softime 8989 //
1960 mbroquet 3730 if ($maj == 0) {
1961     // si contexte DI
1962     if ($this->getParameter("retourformulaire") == "dossier"
1963 softime 12847 || $this->f->contexte_dossier_instruction()) {
1964 mbroquet 3730 // on recupère les signataires de la multicollectivité et de celle du DI
1965 softime 7996 $di = $this->f->get_inst__om_dbform(array(
1966     "obj" => "dossier_instruction",
1967 softime 8989 "idx" => $this->getParameter("idxformulaire"),
1968 softime 7996 ));
1969 softime 8989 $sql = str_replace(
1970     "<collectivite_di>",
1971     $di->getVal("om_collectivite"),
1972     $this->get_var_sql_forminc__sql("signataire_arrete_defaut_by_di")
1973     );
1974 mbroquet 3730 } else {
1975 softime 8989 $sql = $this->get_var_sql_forminc__sql("signataire_arrete_defaut");
1976 mbroquet 3730 }
1977     $res = $this->f->db->query($sql);
1978 softime 8989 $this->f->addToLog(__METHOD__."(): db->query(\"".$sql."\")", VERBOSE_MODE);
1979     $this->f->isDatabaseError($res);
1980 mbroquet 3730 $row = $res->fetchrow(DB_FETCHMODE_ASSOC);
1981 softime 8989 if (isset($row["signataire_arrete"])
1982     && is_numeric($row["signataire_arrete"])) {
1983     //
1984     $form->setVal("signataire_arrete", $row["signataire_arrete"]);
1985 mbroquet 3730 }
1986 softime 8989 // Date du jour
1987     $form->setVal("date_evenement", date("Y-m-d"));
1988 mbroquet 3730 }
1989 softime 8989 //
1990 mbroquet 3730 if ($maj == 0 || $maj == 1 || $maj == 125) {
1991 softime 8989 $form->setVal("bible_auto", "bible_auto()");
1992     $form->setVal("bible", "bible(1)");
1993     $form->setVal("bible2", "bible(2)");
1994     $form->setVal("bible3", "bible(3)");
1995     $form->setVal("bible4", "bible(4)");
1996 mbroquet 3730 }
1997 softime 8989 //
1998 softime 7521 $collectivite_di = $this->get_dossier_instruction_om_collectivite();
1999 softime 8989 if ($maj == 1
2000     && $this->f->is_option_preview_pdf_enabled($collectivite_di) === true
2001 softime 7521 && $this->has_an_edition() === true) {
2002 softime 8989 //
2003     $form->setVal("live_preview", $this->getVal($this->clePrimaire));
2004     $form->setVal("btn_refresh", "reload_pdf_viewer()");
2005     $form->setVal("btn_preview", "show_instr_preview()");
2006     $form->setVal("btn_redaction", "show_instr_redaction()");
2007 softime 7521 }
2008 softime 10808
2009 softime 12654 // Gestion de l'affichage des suivis de notification des demandeurs, des services, des tiers et
2010     // des communes
2011     if ($maj == 3) {
2012     if ($this->can_display_notification_demandeur()) {
2013     $typeNotification = array(
2014     'notification_recepisse',
2015     'notification_instruction',
2016     'notification_decision',
2017     );
2018     $form->setVal("suivi_notification", $this->get_json_suivi_notification($typeNotification, true));
2019     }
2020     if ($this->can_display_notification_service()) {
2021     $form->setVal("suivi_notification_service", $this->get_json_suivi_notification(array('notification_service_consulte')));
2022     }
2023     if ($this->can_display_notification_tiers()) {
2024     $form->setVal("suivi_notification_tiers", $this->get_json_suivi_notification(array('notification_tiers_consulte')));
2025     }
2026     if ($this->can_display_notification_commune()) {
2027     $form->setVal("suivi_notification_commune", $this->get_json_suivi_notification(array('notification_depot_demat', 'notification_commune')));
2028     }
2029 softime 10808 }
2030 mbroquet 3730 }
2031    
2032     function setLayout(&$form, $maj){
2033 softime 12124 // En consultation, pour les dossiers qui n'ont pas été transmis par le portail
2034     // citoyen, si la notification des demandeurs est activée sur l'évenement
2035     // d'instruction et que le paramétrage du demandeur principal n'est pas
2036     // correct alors un message a destination de l'instructeur est affiché.
2037     if ($maj == 3) {
2038 softime 12847 // Si le dossier n'a pas été déposé sur le portail citoyen (ou si
2039     // la requête permettant de savoir le type de demande à échouée) et si
2040     // la notification se fait par mail vérifie si il y a des erreurs de
2041     // paramétrage et si c'est le cas on affiche un message d'information
2042     $collectivite = $this->get_dossier_instruction_om_collectivite($this->getVal('dossier'));
2043     $categorieNotif = $this->f->get_param_option_notification($collectivite);
2044     if (($this->dossier_depose_sur_portail() == null ||
2045     ! $this->dossier_depose_sur_portail()) &&
2046     (! empty($categorieNotif) ||
2047     $categorieNotif == 'mail')) {
2048 softime 12124 $erreurParam = $this->get_info_notification_fail();
2049     // Récupération de l'évenement d'instruction
2050     $instEV = $this->get_inst_evenement();
2051     if (! empty($instEV->getVal('notification')) && $erreurParam != array()) {
2052     $class = 'text-info ui-state-highlight ui-state-info';
2053     $message = __("Attention l'envoi de notification automatique n'est pas possible.");
2054     $this->f->display_panel_information(
2055     $class,
2056     $message,
2057     $erreurParam,
2058     __('Veuillez corriger les informations suivantes.'),
2059     'erreur_param_notif'
2060     );
2061     }
2062     }
2063     }
2064 softime 8593 $form->setBloc('evenement','D',"","sousform-instruction-action-".$maj);
2065 mbroquet 3730
2066 softime 8593 $form->setFieldset('evenement','D',_('Evenement'));
2067     $form->setFieldset('om_final_instruction_utilisateur','F','');
2068    
2069     $form->setBloc('om_final_instruction_utilisateur','F');
2070 mbroquet 3730
2071 softime 8593 $form->setBloc('date_finalisation_courrier','D',"","");
2072 mbroquet 3730
2073 softime 8593 $form->setFieldset('date_finalisation_courrier','D',_('Dates'));
2074     $form->setBloc('date_finalisation_courrier','D',"","col_6");
2075     $form->setBloc('date_envoi_controle_legalite','F');
2076 mbroquet 3730
2077 softime 8593 $form->setBloc('date_retour_signature','D',"","col_6");
2078     $form->setBloc('date_retour_controle_legalite','F');
2079     $form->setFieldset('date_retour_controle_legalite','F','');
2080    
2081     $form->setBloc('date_retour_controle_legalite','F');
2082 mbroquet 3730
2083 softime 10573 $form->setBloc('statut_signature','D');
2084     $form->setFieldset('statut_signature','D','Suivi Parapheur');
2085     $form->setBloc('commentaire_signature','F');
2086     $form->setBloc('historique_signature','D');
2087     $form->setFieldset('historique_signature', 'DF', __("Historique"), "collapsible, startClosed");
2088     $form->setBloc('historique_signature','F');
2089     $form->setFieldset('historique_signature','F');
2090    
2091 softime 10808 $form->setFieldset('suivi_notification', 'D', __("Suivi notification"), "collapsible");
2092     $form->setFieldset('suivi_notification','F');
2093 softime 11585 $form->setFieldset('suivi_notification_service', 'D', __("Suivi notification service"), "collapsible");
2094     $form->setFieldset('suivi_notification_service','F');
2095     $form->setFieldset('suivi_notification_tiers', 'D', __("Suivi notification tiers"), "collapsible");
2096     $form->setFieldset('suivi_notification_tiers','F');
2097 softime 12654 $form->setFieldset('suivi_notification_commune', 'D', __("Suivi notification commune"), "collapsible");
2098     $form->setFieldset('suivi_notification_commune','F');
2099 softime 10808
2100 softime 8593 if ($maj == 1) {
2101     // Récupère la collectivité du dossier d'instruction
2102     $collectivite_di = $this->get_dossier_instruction_om_collectivite();
2103 mbroquet 3730
2104 softime 8593 //
2105     if ($this->f->is_option_preview_pdf_enabled($collectivite_di) === true
2106     && $this->has_an_edition() === true) {
2107 softime 7521 //
2108 softime 8593 $form->setBloc('complement_om_html','D',"","container_instr_edition");
2109     $form->setBloc('complement_om_html','D',"","hidelabel box_instr_edition redaction_instr_edition");
2110     $form->setBloc('complement_om_html','D',"","box_instr_edition_main");
2111     $form->setFieldset('complement_om_html','D',_('Complement'));
2112     $form->setFieldset('bible','F','');
2113     $form->setFieldset('complement2_om_html','D',_('Complement 2'));
2114     $form->setFieldset('bible2','F','');
2115     $form->setFieldset('complement3_om_html','D',_('Complement 3'));
2116     $form->setFieldset('bible3','F','');
2117     $form->setFieldset('complement4_om_html','D',_('Complement 4'));
2118     $form->setFieldset('bible4','F','');
2119     $form->setFieldset('titre_om_htmletat','DF',_('Titre'), 'startClosed');
2120     $form->setFieldset('corps_om_htmletatex','DF',_('Corps'));
2121     $form->setBloc('corps_om_htmletatex','F');
2122     $form->setBloc('btn_preview','DF',"","box_instr_edition_btn");
2123     $form->setBloc('btn_preview','F');
2124     $form->setBloc('btn_redaction','D', '',"hidelabel box_instr_edition preview_instr_edition");
2125     $form->setBloc('btn_redaction','DF',"","box_instr_edition_btn");
2126     $form->setFieldset('btn_refresh','D',_('Prévisualisation'), "box_instr_edition_main");
2127     $form->setFieldset('live_preview','F');
2128     $form->setBloc('live_preview','F');
2129     $form->setBloc('live_preview','F');
2130 softime 7521 } else {
2131 softime 8593 $form->setBloc('complement_om_html','D',"","hidelabel");
2132 softime 7521 $form->setFieldset('complement_om_html','D',_('Complement'));
2133     $form->setFieldset('bible','F','');
2134     $form->setFieldset('complement2_om_html','D',_('Complement 2'));
2135     $form->setFieldset('bible2','F','');
2136     $form->setFieldset('complement3_om_html','D',_('Complement 3'));
2137     $form->setFieldset('bible3','F','');
2138     $form->setFieldset('complement4_om_html','D',_('Complement 4'));
2139     $form->setFieldset('bible4','F','');
2140 softime 8593 $form->setFieldset('titre_om_htmletat','DF',_('Titre'), 'startClosed');
2141     $form->setFieldset('corps_om_htmletatex','DF',_('Corps'));
2142     $form->setBloc('corps_om_htmletatex','F');
2143 softime 7521 }
2144 softime 8593 } else {
2145     $form->setBloc('complement_om_html','D',"","hidelabel");
2146     $form->setFieldset('complement_om_html','D',_('Complement'));
2147     $form->setFieldset('bible','F','');
2148     $form->setFieldset('complement2_om_html','D',_('Complement 2'));
2149     $form->setFieldset('bible2','F','');
2150     $form->setFieldset('complement3_om_html','D',_('Complement 3'));
2151     $form->setFieldset('bible3','F','');
2152     $form->setFieldset('complement4_om_html','D',_('Complement 4'));
2153     $form->setFieldset('bible4','F','');
2154     $form->setFieldset('titre_om_htmletat','DF',_('Titre'), 'startClosed');
2155     $form->setFieldset('corps_om_htmletatex','DF',_('Corps'));
2156     $form->setBloc('corps_om_htmletatex','F');
2157 mbroquet 3730 }
2158     }
2159    
2160     function setLib(&$form, $maj) {
2161     //
2162     parent::setLib($form, $maj);
2163     //
2164     $form->setLib('bible_auto', "");
2165     $form->setLib('bible', "");
2166     $form->setLib('bible2', "");
2167     $form->setLib('bible3', "");
2168     $form->setLib('bible4', "");
2169 softime 7521 $form->setLib('btn_refresh', "");
2170 softime 8593 $form->setLib('btn_preview', "");
2171     $form->setLib('btn_redaction', "");
2172 softime 7521 $form->setLib('live_preview', "");
2173 mbroquet 3730 $form->setLib('om_final_instruction_utilisateur', _("finalise par"));
2174 softime 8989 $form->setLib('date_envoi_rar', __("date_envoi_ar"));
2175     $form->setLib('date_retour_rar', __("date_notification"));
2176 softime 10573 $form->setLib('statut_signature', __("statut"));
2177     $form->setLib('commentaire_signature', __("commentaire"));
2178     $form->setLib('historique_signature', '');
2179 softime 10808 $form->setLib('suivi_notification', '');
2180 softime 11585 $form->setLib('suivi_notification_service', '');
2181     $form->setLib('suivi_notification_tiers', '');
2182 softime 12654 $form->setLib('suivi_notification_commune', '');
2183 softime 10573 $form->setLib('preview_edition', "");
2184 softime 8593
2185     // Ajout d'une infobulle d'aide lorsque le formulaire est en mode
2186     // ajout et que l'option de rédaction libre est activée sur la
2187     // collectivité du dossier
2188     if ($maj === '0' && $this->is_option_redaction_libre_enabled() === true) {
2189     //
2190     $help_text_template = '%s <span class="info-16" title="%s"></span>';
2191     $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.");
2192     $form->setLib('flag_edition_integrale', sprintf($help_text_template, _("Type de rédaction"), $help_text));
2193     }
2194     else {
2195     $form->setLib('flag_edition_integrale', _("Type de rédaction"));
2196     }
2197    
2198     // Ajout d'une infobulle d'aide lorsque le formulaire est en mode
2199     // modification et que l'option de prévisualisation de l'édition est
2200     // activée sur la collectivité du dossier
2201     if ($maj === '1'
2202     && $this->f->is_option_preview_pdf_enabled($this->get_dossier_instruction_om_collectivite()) === true) {
2203     //
2204     $help_text_template = '%s <span class="info-16" title="%s"></span>';
2205     $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.");
2206     $form->setLib('date_evenement', sprintf($help_text_template, _('date_evenement'), $help_text));
2207     $form->setLib('signataire_arrete', sprintf($help_text_template, _('signataire_arrete'), $help_text));
2208     }
2209 mbroquet 3730 }
2210    
2211 softime 8989 /**
2212     * TRIGGER - triggerajouter.
2213     *
2214     * @return boolean
2215     */
2216     function triggerajouter($id, &$dnu1 = null, $val = array(), $dnu2 = null) {
2217     $this->addToLog(__METHOD__."(): start", EXTRA_VERBOSE_MODE);
2218 mbroquet 3730 /**
2219     * Le code suivant permet de récupérer des valeurs des tables evenement
2220     * et dossier pour les stocker dans l'instruction :
2221     * DEPUIS L'EVENEMENT
2222     * - action
2223     * - delai
2224     * - accord_tacite
2225     * - etat
2226     * - avis_decision
2227     * - delai_notification
2228     * - lettretype
2229     * - autorite_competente
2230 softime 10573 * - pec_metier
2231 softime 6565 * - complement_om_html
2232     * - complement2_om_html
2233     * - complement3_om_html
2234     * - complement4_om_html
2235     * - complement5_om_html
2236 mbroquet 3730 * DEPUIS LE DOSSIER D'INSTRUCTION
2237     * - archive_delai
2238     * - archive_accord_tacite
2239     * - archive_etat
2240     * - archive_avis
2241     * - date_complet
2242     * - date_rejet
2243     * - date_limite
2244     * - date_notification_delai
2245     * - date_decision
2246     * - date_validite
2247     * - date_achevement
2248     * - date_chantier
2249     * - date_conformite
2250     * - avis_decision
2251     */
2252     // Récupération de tous les paramètres de l'événement sélectionné
2253     $sql = "SELECT * FROM ".DB_PREFIXE."evenement
2254     WHERE evenement=".$this->valF['evenement'];
2255 softime 8989 $res = $this->f->db->query($sql);
2256     $this->addToLog(__METHOD__."(): db->query(\"".$sql."\");", VERBOSE_MODE);
2257 softime 12847 $this->f->isDatabaseError($res);
2258 mbroquet 3730 while ($row=& $res->fetchRow(DB_FETCHMODE_ASSOC)) {
2259     // Récupération de l'identifiant de l'action
2260     // si une action est paramétrée dans l'événement
2261     $this->valF['action'] = NULL;
2262     if (isset($row['action']) and !empty($row['action'])) {
2263     $this->valF['action']=$row['action'];
2264     }
2265     // Récupération de la valeur du délai
2266     $this->valF['delai'] = $row['delai'];
2267     // Récupération de l'identifiant de l'état
2268     // si un état est paramétré dans l'événement
2269     $this->valF['etat']=NULL;
2270     if (isset($row['etat']) and !empty($row['etat'])) {
2271     $this->valF['etat']=$row['etat'];
2272     }
2273     // Récupération de la valeur d'accord tacite
2274     $this->valF['accord_tacite']=$row['accord_tacite'];
2275     // Récupération de la valeur du délai de notification
2276     $this->valF['delai_notification']=$row['delai_notification'];
2277     // Récupération de l'identifiant de l'avis
2278     // si un avis est paramétré dans l'événement
2279     $this->valF['avis_decision'] = NULL;
2280     if(isset($row['avis_decision']) and !empty($row['avis_decision'])) {
2281     $this->valF['avis_decision']=$row['avis_decision'];
2282     }
2283     // Récupération de la valeur de l'autorité compétente
2284     // si l'autorité compétente est paramétré dans l'événement
2285     $this->valF['autorite_competente'] = NULL;
2286     if(isset($row['autorite_competente']) and !empty($row['autorite_competente'])) {
2287     $this->valF['autorite_competente']=$row['autorite_competente'];
2288     }
2289     // Récupération de la valeur de la lettre type
2290     $this->valF['lettretype']=$row['lettretype'];
2291 softime 10573 // Récupération de la valeur de la prise en compte métier
2292     // si la prise en compte métier est paramétrée dans l'événement
2293     $this->valF['pec_metier'] = NULL;
2294     if(isset($row['pec_metier']) === true and empty($row['pec_metier']) === false) {
2295     $this->valF['pec_metier'] = $row['pec_metier'];
2296     }
2297 mbroquet 3730 }
2298     // Récupération de toutes les valeurs du dossier d'instruction en cours
2299     $sql = "SELECT * FROM ".DB_PREFIXE."dossier
2300     WHERE dossier='".$this->valF['dossier']."'";
2301 softime 8989 $res = $this->f->db->query($sql);
2302     $this->addToLog(__METHOD__."(): db->query(\"".$sql."\");", VERBOSE_MODE);
2303 softime 12847 $this->f->isDatabaseError($res);
2304 mbroquet 3730 $row=& $res->fetchRow(DB_FETCHMODE_ASSOC);
2305     $this->updateArchiveData($row);
2306    
2307     // Récupération de la duree de validite du dossier d'autorisation
2308     $sql = "SELECT duree_validite_parametrage
2309     FROM ".DB_PREFIXE."dossier_autorisation_type_detaille
2310     LEFT JOIN ".DB_PREFIXE."dossier_autorisation
2311     ON dossier_autorisation.dossier_autorisation_type_detaille = dossier_autorisation_type_detaille.dossier_autorisation_type_detaille
2312     LEFT JOIN ".DB_PREFIXE."dossier
2313     ON dossier.dossier_autorisation = dossier_autorisation.dossier_autorisation
2314     WHERE dossier.dossier='".$this->valF['dossier']."'";
2315 softime 12847 $duree_validite_parametrage = $this->f->db->getone($sql);
2316     $this->addToLog(__METHOD__."(): db->getone(\"".$sql."\");", VERBOSE_MODE);
2317     $this->f->isDatabaseError($duree_validite_parametrage);
2318 mbroquet 3730 if ($duree_validite_parametrage != '') {
2319     $this->valF['duree_validite_parametrage']= $duree_validite_parametrage;
2320     }
2321    
2322     // Identifiant du type de courrier
2323     $idTypeCourrier = '11';
2324     $idCourrier = str_pad($this->valF["instruction"], 10, "0", STR_PAD_LEFT);
2325     // Code barres
2326     $this->valF["code_barres"] = $idTypeCourrier . $idCourrier;
2327     }
2328    
2329 softime 12124 /**
2330     * Test si une restriction est valide.
2331     *
2332     * @return boolean
2333     */
2334 mbroquet 3730 function restrictionIsValid($restriction){
2335     if($this->restriction_valid != null) {
2336     return $this->restriction_valid;
2337     }
2338     if(empty($restriction)) {
2339     $this->restriction_valid = true;
2340     return $this->restriction_valid;
2341     }
2342 nmeucci 3873 // Liste des opérateurs possibles sans espace
2343     $operateurs = array(">=", "<=", "+", "-", "&&", "||", "==", "!=");
2344     // Liste identique mais avec le marqueur §
2345     $mark = "§";
2346     $operateurs_marked = array();
2347     foreach ($operateurs as $operateur) {
2348     $operateurs_marked[] = $mark.$operateur.$mark;
2349     }
2350 mbroquet 3730
2351     // Supprime tous les espaces de la chaîne de caractère
2352 nmeucci 3873 $restriction = preg_replace('/\s+/', '', $restriction);
2353 mbroquet 3730
2354 nmeucci 3873 // Met un marqueur avant et après les opérateurs
2355     // puis transforme la chaine en un tableau
2356     $restriction = str_replace($operateurs, $operateurs_marked,
2357 mbroquet 3730 $restriction);
2358    
2359 nmeucci 3873 // Pour chaque opérateur logique
2360     foreach (array('&&', '||') as $operator) {
2361    
2362     // S'il est absent on ne fait aucun traitement
2363     if (strpos($restriction, $mark.$operator.$mark) === false) {
2364     continue;
2365     }
2366     // Sinon on vérifie les deux conditions avec le OU/ET logique
2367     $restrictions = explode($mark.$operator.$mark, $restriction);
2368     $restrictions[0] = explode($mark, $restrictions[0]);
2369     $restrictions[1] = explode($mark, $restrictions[1]);
2370     $res_bool = false;
2371     if ($operator == '&&') {
2372     if ($this->is_restriction_satisfied($restrictions[0], $operateurs)
2373     && $this->is_restriction_satisfied($restrictions[1], $operateurs)) {
2374     $res_bool = true;
2375     }
2376     }
2377     if ($operator == '||') {
2378     if ($this->is_restriction_satisfied($restrictions[0], $operateurs)
2379     || $this->is_restriction_satisfied($restrictions[1], $operateurs)) {
2380     $res_bool = true;
2381     }
2382     }
2383     return $res_bool;
2384     }
2385     $tabRestriction = explode($mark, $restriction);
2386     return $this->is_restriction_satisfied($tabRestriction, $operateurs);
2387    
2388     }
2389    
2390     function is_restriction_satisfied($restriction, $operateurs) {
2391 mbroquet 3730 // Tableau comprenant les résultat
2392     $res = array();
2393     // Compteur pour les résultat
2394     // commence à 1 car le 0 doit rester inchangé tout au long du traitement
2395     $j = 1;
2396     // Comparateur du calcul
2397     $comparateur = '';
2398     // Booléen retourné
2399     $res_bool = true;
2400    
2401     // S'il y a un comparateur
2402 nmeucci 3873 if (in_array(">=", $restriction)
2403     || in_array("<=", $restriction)
2404     || in_array("==", $restriction)
2405     || in_array("!=", $restriction)) {
2406 mbroquet 3730
2407     // Si le tableau n'est pas vide
2408 nmeucci 3873 if (count($restriction) > 0) {
2409 mbroquet 3730
2410     // Boucle dans le tableau pour récupérer seulement les valeurs
2411 nmeucci 3873 foreach ($restriction as $key => $value) {
2412 mbroquet 3730 //
2413     if (!in_array($value, $operateurs)) {
2414     if ($this->getRestrictionValue($value) != false) {
2415     $res[] = $this->getRestrictionValue($value);
2416     } else {
2417     // Message d'erreur
2418     $error_message = sprintf(_("Le champ %s de l'instruction %s est vide"), "<span class='bold'>".$value."</span>", "<span class='bold'>".$this->valF["instruction"]."</span>");
2419     $this->addToMessage($error_message);
2420     // Arrête le traitement
2421     return false;
2422     }
2423     }
2424     }
2425    
2426     // Boucle dans le tableau
2427     // commence à 1 car le 0 doit rester inchangé tout au long du
2428     // traitement
2429 nmeucci 3873 for ($i = 1; $i<count($restriction); $i++) {
2430 mbroquet 3730
2431     // Récupère le comparateur
2432 nmeucci 3873 if ($restriction[$i] === ">="
2433     || $restriction[$i] === "<="
2434     || $restriction[$i] === "=="
2435     || $restriction[$i] === "!=") {
2436     $comparateur = $restriction[$i];
2437 mbroquet 3730 }
2438    
2439     // Si l'opérateur qui suit est un "+"
2440 nmeucci 3873 if ($restriction[$i] === "+") {
2441 mbroquet 3730 $dateDep = $res[$j];
2442     unset($res[$j]);$j++;
2443     $duree = $res[$j];
2444     unset($res[$j]);
2445     $res[$j] = $this->f->mois_date($dateDep, $duree, "+");
2446     }
2447    
2448     // Si l'opérateur qui suit est un "-"
2449 nmeucci 3873 if ($restriction[$i] === "-") {
2450 mbroquet 3730 $dateDep = $res[$j];
2451     unset($res[$j]);$j++;
2452     $duree = $res[$j];
2453     unset($res[$j]);
2454     $res[$j] = $this->f->mois_date($dateDep, $duree, "-");
2455     }
2456     }
2457    
2458     }
2459    
2460     // Si les tableau des résultats n'est pas vide
2461     if (count($res) > 0) {
2462     //
2463     $res_bool = false;
2464     // Effectue le test
2465     if ($comparateur === ">=") {
2466     //
2467     if (strtotime($res[0]) >= strtotime($res[$j])) {
2468     $res_bool = true;
2469     }
2470     }
2471     if ($comparateur === "<=") {
2472 nmeucci 3873 //
2473 mbroquet 3730 if (strtotime($res[0]) <= strtotime($res[$j])) {
2474     $res_bool = true;
2475     }
2476     }
2477 nmeucci 3873 if ($comparateur === "==") {
2478     //
2479     if (strtotime($res[0]) == strtotime($res[$j])) {
2480     $res_bool = true;
2481     }
2482     }
2483     if ($comparateur === "!=") {
2484     //
2485     if (strtotime($res[0]) != strtotime($res[$j])) {
2486     $res_bool = true;
2487     }
2488     }
2489 mbroquet 3730 }
2490     // Sinon une erreur s'affiche
2491     } else {
2492    
2493     // Message d'erreur
2494     $error_message = _("Mauvais parametrage de la restriction.")." ".
2495     _("Contactez votre administrateur");
2496     $this->addToMessage($error_message);
2497     // Arrête le traitement
2498     return false;
2499     }
2500    
2501     return $res_bool;
2502    
2503     }
2504    
2505     /**
2506     * Permet de définir si l'événement passé en paramètre est un événement retour.
2507     * @param integer $evenement événement à tester
2508     *
2509     * @return boolean retourne true si événement retour sinon false
2510     */
2511     function is_evenement_retour($evenement) {
2512     if(empty($evenement) || !is_numeric($evenement)) {
2513     return "";
2514     }
2515     $sql = "SELECT retour
2516     FROM ".DB_PREFIXE."evenement
2517     WHERE evenement = ".$evenement;
2518 softime 12847 $retour = $this->f->db->getone($sql);
2519     $this->addToLog(__METHOD__."(): db->getone(\"".$sql."\");", VERBOSE_MODE);
2520     $this->f->isDatabaseError($retour);
2521 mbroquet 3730 if ($retour == 't') {
2522     return true;
2523     } else {
2524     return false;
2525     }
2526     }
2527    
2528     /**
2529     * Retourne le champ restriction de l'événement passé en paramètre.
2530     *
2531     * @param integer $evenement id de l'événement sur lequel récupérer la restriction
2532     *
2533     * @return string contenu du champ restriction
2534     */
2535     function get_restriction($evenement) {
2536     if(empty($evenement) || !is_numeric($evenement)) {
2537     return "";
2538     }
2539     //Récupère la restriction
2540     $sql= "SELECT
2541     restriction
2542     FROM
2543     ".DB_PREFIXE."evenement
2544     WHERE
2545     evenement =".$evenement;
2546    
2547 softime 12847 $restriction = $this->f->db->getone($sql);
2548     $this->addToLog(__METHOD__."(): db->getone(\"".$sql."\");", VERBOSE_MODE);
2549     $this->f->isDatabaseError($restriction);
2550 mbroquet 3730 return $restriction;
2551     }
2552    
2553     /**
2554     * Récupère la valeur du champ dans la restriction
2555     * @param string $restrictionValue Nom du champ
2556     * @return mixed Valeur du champ
2557     */
2558     function getRestrictionValue($restrictionValue){
2559    
2560     // Initialisation de la valeur de retour
2561     $return = false;
2562    
2563     // Récupére les valeurs du dossier
2564     $value_dossier = $this->get_dossier_actual();
2565    
2566     //
2567     if (is_numeric($restrictionValue)) {
2568     $return = $restrictionValue;
2569     }elseif (isset($value_dossier[$restrictionValue])) {
2570     $return = $value_dossier[$restrictionValue];
2571     }elseif (isset($this->valF[$restrictionValue])) {
2572     $return = $this->valF[$restrictionValue];
2573     }
2574    
2575     // Retourne la valeur du champ
2576     return $return;
2577     }
2578    
2579 softime 6565
2580 mbroquet 3730 /**
2581 softime 6565 * Calcul des règle d'action selon leur type.
2582     *
2583     * Types de règle :
2584     * - date
2585     * - numeric
2586     * - text
2587     * - bool
2588     * - specific
2589     * - technical_data
2590 mbroquet 3730 *
2591 softime 6565 * @param string $rule Règle d'action.
2592     * @param string $rule_name Nom de la règle.
2593     * @param string $type Type de la règle.
2594     *
2595 mbroquet 3730 * @return mixed Résultat de la règle
2596     */
2597 softime 6565 public function regle($rule, $rule_name, $type = null) {
2598 mbroquet 3730
2599     // Supprime tous les espaces de la chaîne de caractère
2600     $rule = str_replace(' ', '', $rule);
2601     // Coupe la chaîne au niveau de l'opérateur
2602     $operands = explode ("+", $rule);
2603     // Nombre d'opérande
2604     $nb_operands = count($operands);
2605    
2606     // Règle à null
2607     if ($rule == "null") {
2608     return null;
2609     }
2610    
2611     // Tableau des champs de type date
2612     $rule_type_date = array(
2613     "regle_date_limite",
2614     "regle_date_notification_delai",
2615     "regle_date_complet",
2616     "regle_date_validite",
2617     "regle_date_decision",
2618     "regle_date_chantier",
2619     "regle_date_achevement",
2620     "regle_date_conformite",
2621     "regle_date_rejet",
2622     "regle_date_dernier_depot",
2623     "regle_date_limite_incompletude",
2624 softime 6565 "regle_date_cloture_instruction",
2625     "regle_date_premiere_visite",
2626     "regle_date_derniere_visite",
2627     "regle_date_contradictoire",
2628     "regle_date_retour_contradictoire",
2629     "regle_date_ait",
2630     "regle_date_transmission_parquet",
2631 softime 8989 "regle_date_affichage",
2632 mbroquet 3730 );
2633     // Tableau des champs de type numérique
2634     $rule_type_numeric = array(
2635     "regle_delai",
2636     "regle_delai_incompletude",
2637     );
2638 softime 6565 // Tableau des champs de type text
2639     $rule_type_text = array(
2640     );
2641     // Tableau des champs de type booléen
2642     $rule_type_bool = array(
2643 softime 10573 "regle_a_qualifier",
2644     "regle_incompletude",
2645     "regle_incomplet_notifie",
2646     "regle_evenement_suivant_tacite_incompletude",
2647 softime 6565 );
2648     // Tableau des champs spécifiques
2649     $rule_type_specific = array(
2650     "regle_autorite_competente",
2651     "regle_etat",
2652     "regle_accord_tacite",
2653     "regle_avis",
2654 softime 10573 "regle_pec_metier",
2655     "regle_etat_pendant_incompletude",
2656 softime 6565 );
2657     // Tableau des champs de données techniques
2658     $rule_type_technical_data = array(
2659     'regle_donnees_techniques1',
2660     'regle_donnees_techniques2',
2661     'regle_donnees_techniques3',
2662     'regle_donnees_techniques4',
2663     'regle_donnees_techniques5',
2664     );
2665 softime 8593 // Tableau des champs simple
2666     $rule_type_simple = array(
2667     "regle_dossier_instruction_type",
2668     );
2669 mbroquet 3730
2670     // Définit le type du champ
2671     if (in_array($rule_name, $rule_type_date) == true) {
2672     $type = "date";
2673     }
2674     if (in_array($rule_name, $rule_type_numeric) == true) {
2675     $type = "numeric";
2676     }
2677 softime 6565 if (in_array($rule_name, $rule_type_text) === true) {
2678     $type = "text";
2679     }
2680     if (in_array($rule_name, $rule_type_bool) === true) {
2681     $type = "bool";
2682     }
2683     if (in_array($rule_name, $rule_type_specific) === true) {
2684     $type = "specific";
2685     }
2686     if (in_array($rule_name, $rule_type_technical_data) === true) {
2687     $type = 'text';
2688     }
2689 softime 8593 if (in_array($rule_name, $rule_type_simple) === true) {
2690     $type = 'simple';
2691     }
2692 mbroquet 3730
2693 softime 6565 // Si c'est un type spécifique ou booléen alors il n'a qu'un opérande
2694     // Récupère directement la valeur de l'opérande
2695 softime 10573 if ($type === 'specific') {
2696 softime 6565 //
2697     return $this->get_value_for_rule($rule);
2698     }
2699    
2700 mbroquet 3730 // Initialisation des variables
2701     $key_date = 0;
2702     $total_numeric = 0;
2703 softime 6565 $res_text = '';
2704 mbroquet 3730
2705     // Pour chaque opérande
2706     foreach ($operands as $key => $operand) {
2707    
2708     // Si c'est une règle de type date
2709     if ($type == 'date') {
2710     // Vérifie si au moins une des opérandes est une date
2711 softime 6565 if (is_numeric($operand) === false
2712     && $this->get_value_for_rule($operand) !== null
2713     && $this->f->check_date($this->get_value_for_rule($operand)) == true) {
2714 mbroquet 3730 // Récupère la position de la date
2715     $key_date = $key;
2716     }
2717     // Les autres opérandes doivent être que des numériques
2718     if (is_numeric($operand) == true) {
2719     // Ajoute l'opérande au total
2720     $total_numeric += $operand;
2721     }
2722 softime 6565 if (is_numeric($operand) === false
2723     && $this->get_value_for_rule($operand) !== null
2724     && is_numeric($this->get_value_for_rule($operand)) == true) {
2725 mbroquet 3730 // Ajoute l'opérande au total
2726 softime 6565 $total_numeric += $this->get_value_for_rule($operand);
2727 mbroquet 3730 }
2728     }
2729    
2730     // Si c'est une règle de type numérique
2731     if ($type == 'numeric') {
2732     // Les opérandes doivent être que des numériques
2733     if (is_numeric($operand) == true) {
2734     // Ajoute l'opérande au total
2735     $total_numeric += $operand;
2736     }
2737 softime 6565 if (is_numeric($operand) === false
2738     && $this->get_value_for_rule($operand) !== null
2739     && is_numeric($this->get_value_for_rule($operand)) == true) {
2740 mbroquet 3730 // Ajoute l'opérande au total
2741 softime 6565 $total_numeric += $this->get_value_for_rule($operand);
2742 mbroquet 3730 }
2743     }
2744 softime 6565
2745     // Si c'est une règle de type text
2746     if ($type === 'text') {
2747     // Concatène toutes les chaînes de caractère
2748     $res_text .= $this->get_value_for_rule($operand);
2749     }
2750 mbroquet 3730 }
2751    
2752     // Résultat pour une règle de type date
2753     if ($type == 'date') {
2754     // Retourne le calcul de la date
2755     return $this->f->mois_date($this->valF[$operands[$key_date]],
2756     $total_numeric, "+");
2757     }
2758    
2759     // Résultat pour une règle de type numérique
2760     if ($type == 'numeric') {
2761     // Retourne le calcul
2762     return $total_numeric;
2763     }
2764 softime 6565
2765     // Résultat pour une règle de type text
2766     if ($type === 'text') {
2767     // Retourne la chaîne de caractère
2768     return $res_text;
2769     }
2770 softime 10573 if ($type === 'simple' || $type === 'bool') {
2771 softime 8593 // Retourne la valeur du champs rule
2772     return $rule;
2773     }
2774 softime 6565 }
2775    
2776    
2777     /**
2778     * Récupère la valeur du champs dans l'instruction ou dans les données
2779     * techniques.
2780     * Spécifique au calcul des règles.
2781     *
2782     * @param string $field Champ
2783     *
2784     * @return mixed Valeur du champ
2785     */
2786     private function get_value_for_rule($field) {
2787     // Si le champ n'existe pas dans la table instruction
2788     if (array_key_exists($field, $this->valF) === false) {
2789     // Récupère l'instance de la classe donnees_techniques
2790     $inst_donnees_techniques = $this->get_inst_donnees_techniques();
2791     // Retourne la valeur de la donnée technique
2792     return $inst_donnees_techniques->getVal($field);
2793     }
2794    
2795     //
2796     return $this->valF[$field];
2797     }
2798    
2799    
2800     /**
2801     * [get_inst_donnees_techniques description]
2802     *
2803     * @param [type] $donnees_techniques [description]
2804     *
2805     * @return [type] [description]
2806     */
2807     function get_inst_donnees_techniques($donnees_techniques = null) {
2808     //
2809     if (isset($this->inst_donnees_techniques) === false or
2810     $this->inst_donnees_techniques === null) {
2811     //
2812     if (is_null($donnees_techniques)) {
2813     $donnees_techniques = $this->getDonneesTechniques();
2814     }
2815     //
2816 softime 7996 $this->inst_donnees_techniques = $this->f->get_inst__om_dbform(array(
2817     "obj" => "donnees_techniques",
2818     "idx" => $donnees_techniques,
2819     ));
2820 softime 6565 }
2821     //
2822     return $this->inst_donnees_techniques;
2823     }
2824    
2825    
2826     /**
2827     * Retourne l'identifiant des données techniques liées du dossier
2828     * @return string L'identifiant des données techniques liées du dossier
2829     */
2830     function getDonneesTechniques() {
2831 mbroquet 3730
2832 softime 6565 $donnees_techniques = '';
2833    
2834     $sql = "SELECT donnees_techniques
2835     FROM ".DB_PREFIXE."donnees_techniques
2836     WHERE dossier_instruction ='".$this->valF["dossier"]."'";
2837 softime 12847 $donnees_techniques = $this->f->db->getone($sql);
2838     $this->addToLog(__METHOD__."(): db->getone(\"".$sql."\")", VERBOSE_MODE);
2839     $this->f->isDatabaseError($donnees_techniques);
2840 softime 6565 return $donnees_techniques;
2841 mbroquet 3730 }
2842    
2843 fmichon 4708 /**
2844     * TRIGGER - triggerajouterapres.
2845     *
2846     * - Mise à jour des informations liées au workflow sur le dossier
2847     * - Interface avec le référentiel ERP [105][111]
2848     * - Mise à jour du DA
2849     * - Historisation de la vie du DI
2850     *
2851     * @return boolean
2852     */
2853 softime 8989 function triggerajouterapres($id, &$dnu1 = null, $val = array(), $dnu2 = null) {
2854     $this->addToLog(__METHOD__."(): start", EXTRA_VERBOSE_MODE);
2855 fmichon 4708
2856     // On a besoin de l'instance du dossier lié à l'événement d'instruction
2857     $inst_di = $this->get_inst_dossier($this->valF['dossier']);
2858     // Instance de la classe evenement
2859     $inst_evenement = $this->get_inst_evenement($this->valF['evenement']);
2860 softime 9245 // Instance de l'état courant du dossier d'instruction
2861     $inst_current_etat = $this->f->get_inst__om_dbform(array(
2862     "obj" => "etat",
2863     "idx" => $inst_di->get_id_etat(),
2864     ));
2865 fmichon 4708
2866 mbroquet 3730 /**
2867     * Mise à jour des valeurs du dossier en fonction des valeurs calculées
2868     * par l'action
2869     */
2870 fmichon 4708 // état de complétude actuel du dossier
2871     $incompletude = ($inst_di->getVal('incompletude') == 't' ? true : false);
2872 softime 10573 // L'événement suivant tacite paramétré est destiné à la gestion de l'incomplétude
2873     $ev_suiv_tacite_incompletude = false;
2874 mbroquet 3730 // Initialisation
2875 softime 9245 $valF = array();
2876     $valF_dt = array();
2877 fmichon 4708 //
2878 mbroquet 3730 // Récupération des paramètres de l'action
2879     $sql = "SELECT * FROM ".DB_PREFIXE."action
2880     WHERE action='".$this->valF['action']."'";
2881 softime 8989 $res = $this->f->db->query($sql);
2882     $this->addToLog(__METHOD__."(): db->query(\"".$sql."\");", VERBOSE_MODE);
2883 softime 12847 $this->f->isDatabaseError($res);
2884 mbroquet 3730 while ($row=& $res->fetchRow(DB_FETCHMODE_ASSOC)) {
2885    
2886     // pour chacune des regles, on applique la regle
2887 softime 6565 if ($row['regle_delai'] != '') {
2888 mbroquet 3730 $valF['delai'] = $this->regle($row['regle_delai'], 'regle_delai');
2889     }
2890 softime 6565 if ($row['regle_accord_tacite'] != '') {
2891 mbroquet 3730 $valF['accord_tacite'] = $this->regle($row['regle_accord_tacite'], 'regle_accord_tacite');
2892     }
2893 softime 6565 if ($row['regle_avis'] != '') {
2894 mbroquet 3730 $valF['avis_decision'] = $this->regle($row['regle_avis'], 'regle_avis');
2895     }
2896 softime 6565 if ($row['regle_date_limite'] != '') {
2897     $valF['date_limite'] = $this->regle($row['regle_date_limite'], 'regle_date_limite');
2898 mbroquet 3730 }
2899 softime 6565 if ($row['regle_date_complet'] != '') {
2900     $valF['date_complet'] = $this->regle($row['regle_date_complet'], 'regle_date_complet');
2901 mbroquet 3730 }
2902 softime 6565 if ($row['regle_date_dernier_depot'] != '') {
2903     $valF['date_dernier_depot'] = $this->regle($row['regle_date_dernier_depot'], 'regle_date_dernier_depot');
2904 mbroquet 3730 }
2905 softime 6565 if ($row['regle_date_notification_delai'] != '') {
2906     $valF['date_notification_delai'] = $this->regle($row['regle_date_notification_delai'], 'regle_date_notification_delai');
2907 mbroquet 3730 }
2908 softime 6565 if ($row['regle_date_decision'] != '') {
2909     $valF['date_decision'] = $this->regle($row['regle_date_decision'], 'regle_date_decision');
2910 mbroquet 3730 }
2911 softime 6565 if ($row['regle_date_rejet'] != '') {
2912     $valF['date_rejet'] = $this->regle($row['regle_date_rejet'], 'regle_date_rejet');
2913 mbroquet 3730 }
2914 softime 6565 if ($row['regle_date_validite'] != '') {
2915     $valF['date_validite'] = $this->regle($row['regle_date_validite'], 'regle_date_validite');
2916 mbroquet 3730 }
2917 softime 6565 if ($row['regle_date_chantier'] != '') {
2918     $valF['date_chantier'] = $this->regle($row['regle_date_chantier'], 'regle_date_chantier');
2919 mbroquet 3730 }
2920 softime 6565 if ($row['regle_date_achevement'] != '') {
2921     $valF['date_achevement'] = $this->regle($row['regle_date_achevement'], 'regle_date_achevement');
2922 mbroquet 3730 }
2923 softime 6565 if ($row['regle_date_conformite'] != '') {
2924     $valF['date_conformite'] = $this->regle($row['regle_date_conformite'], 'regle_date_conformite');
2925 mbroquet 3730 }
2926 softime 6565 if ($row['regle_date_limite_incompletude'] != '') {
2927     $valF['date_limite_incompletude'] = $this->regle($row['regle_date_limite_incompletude'], 'regle_date_limite_incompletude');
2928 mbroquet 3730 }
2929 softime 6565 if ($row['regle_delai_incompletude'] != '') {
2930     $valF['delai_incompletude'] = $this->regle($row['regle_delai_incompletude'], 'regle_delai_incompletude');
2931 mbroquet 3730 }
2932 softime 6565 if ($row['regle_autorite_competente'] != '') {
2933     $valF['autorite_competente'] = $this->regle($row['regle_autorite_competente'], 'regle_autorite_competente');
2934 mbroquet 3730 }
2935 softime 6565 if ($row['regle_etat'] != '') {
2936 softime 10573 $valF['etat'] = $this->regle($row['regle_etat'], 'regle_etat');
2937 mbroquet 3730 }
2938 softime 6565 if ($row['regle_date_cloture_instruction'] !== '') {
2939     $valF['date_cloture_instruction'] = $this->regle($row['regle_date_cloture_instruction'], 'regle_date_cloture_instruction');
2940     }
2941     if ($row['regle_date_premiere_visite'] !== '') {
2942     $valF['date_premiere_visite'] = $this->regle($row['regle_date_premiere_visite'], 'regle_date_premiere_visite');
2943     }
2944     if ($row['regle_date_derniere_visite'] !== '') {
2945     $valF['date_derniere_visite'] = $this->regle($row['regle_date_derniere_visite'], 'regle_date_derniere_visite');
2946     }
2947     if ($row['regle_date_contradictoire'] !== '') {
2948     $valF['date_contradictoire'] = $this->regle($row['regle_date_contradictoire'], 'regle_date_contradictoire');
2949     }
2950     if ($row['regle_date_retour_contradictoire'] !== '') {
2951     $valF['date_retour_contradictoire'] = $this->regle($row['regle_date_retour_contradictoire'], 'regle_date_retour_contradictoire');
2952     }
2953     if ($row['regle_date_ait'] !== '') {
2954     $valF['date_ait'] = $this->regle($row['regle_date_ait'], 'regle_date_ait');
2955     }
2956     if ($row['regle_donnees_techniques1'] !== '') {
2957     $valF_dt[$row['cible_regle_donnees_techniques1']] = $this->regle($row['regle_donnees_techniques1'], 'regle_donnees_techniques1');
2958     }
2959     if ($row['regle_donnees_techniques2'] !== '') {
2960     $valF_dt[$row['cible_regle_donnees_techniques2']] = $this->regle($row['regle_donnees_techniques2'], 'regle_donnees_techniques2');
2961     }
2962     if ($row['regle_donnees_techniques3'] !== '') {
2963     $valF_dt[$row['cible_regle_donnees_techniques3']] = $this->regle($row['regle_donnees_techniques3'], 'regle_donnees_techniques3');
2964     }
2965     if ($row['regle_donnees_techniques4'] !== '') {
2966     $valF_dt[$row['cible_regle_donnees_techniques4']] = $this->regle($row['regle_donnees_techniques4'], 'regle_donnees_techniques4');
2967     }
2968     if ($row['regle_donnees_techniques5'] !== '') {
2969     $valF_dt[$row['cible_regle_donnees_techniques5']] = $this->regle($row['regle_donnees_techniques5'], 'regle_donnees_techniques5');
2970     }
2971     if ($row['regle_date_transmission_parquet'] !== '') {
2972     $valF['date_transmission_parquet'] = $this->regle($row['regle_date_transmission_parquet'], 'regle_date_transmission_parquet');
2973     }
2974 softime 8593 if ($row['regle_dossier_instruction_type'] !== '') {
2975     $valF['dossier_instruction_type'] = $this->regle($row['regle_dossier_instruction_type'], 'regle_dossier_instruction_type');
2976     }
2977 softime 8989 // La date d'affichage est modifiée seulement si le champ n'est pas
2978     // renseigné
2979     if ($row['regle_date_affichage'] !== ''
2980     && ($inst_di->getVal('date_affichage') === ''
2981     || $inst_di->getVal('date_affichage') === null)) {
2982     //
2983     $valF['date_affichage'] = $this->regle($row['regle_date_affichage'], 'regle_date_affichage');
2984     }
2985 softime 10573 //
2986     if ($row['regle_pec_metier'] != '') {
2987     $valF['pec_metier'] = $this->regle($row['regle_pec_metier'], 'regle_pec_metier');
2988     }
2989     if ($row['regle_a_qualifier'] != '') {
2990     $valF['a_qualifier'] = $this->regle($row['regle_a_qualifier'], 'regle_a_qualifier');
2991     }
2992     //
2993     if ($row['regle_incompletude'] != '') {
2994     $valF['incompletude'] = $this->regle($row['regle_incompletude'], 'regle_incompletude');
2995     }
2996     if ($row['regle_incomplet_notifie'] != '') {
2997     $valF['incomplet_notifie'] = $this->regle($row['regle_incomplet_notifie'], 'regle_incomplet_notifie');
2998     }
2999     if ($row['regle_etat_pendant_incompletude'] != '') {
3000     $valF['etat_pendant_incompletude'] = $this->regle($row['regle_etat_pendant_incompletude'], 'regle_etat_pendant_incompletude');
3001     }
3002     if ($row['regle_evenement_suivant_tacite_incompletude'] != '') {
3003     $resti = $this->regle($row['regle_evenement_suivant_tacite_incompletude'], 'regle_evenement_suivant_tacite_incompletude');
3004     if (strtolower($resti) === 't' || strtolower($resti) === 'true') {
3005     $ev_suiv_tacite_incompletude = true;
3006     }
3007     }
3008 mbroquet 3730 }
3009 softime 6063
3010     // Si l'événement a un événement suivant tacite
3011     if($inst_evenement->getVal('evenement_suivant_tacite') != '') {
3012 softime 10573 // En fonction de l'action de l'événement, l'événement suivant tacite ne sera
3013     // pas associé de le même façon au dossier d'instruction
3014     if ($ev_suiv_tacite_incompletude === false) {
3015 softime 6063 $valF['evenement_suivant_tacite'] = $inst_evenement->getVal('evenement_suivant_tacite');
3016 softime 10573 }
3017     if ($ev_suiv_tacite_incompletude === true) {
3018 softime 6063 $valF['evenement_suivant_tacite_incompletude'] = $inst_evenement->getVal('evenement_suivant_tacite');
3019 nhaye 5254 }
3020 mbroquet 3730 }
3021 softime 6565 // Si des valeurs de données techniques ont été calculées alors on met à jour l'enregistrement
3022 softime 9245 if (count($valF_dt) > 0) {
3023 softime 6565 $dt_id = $this->getDonneesTechniques();
3024     // On met à jour le dossier
3025     $cle = " donnees_techniques='".$dt_id."'";
3026 softime 12847 $res1 = $this->f->db->autoexecute(DB_PREFIXE.'donnees_techniques', $valF_dt, DB_AUTOQUERY_UPDATE, $cle);
3027     $this->addToLog(
3028     __METHOD__."(): db->autoexecute(\"".DB_PREFIXE."donnees_techniques\", ".print_r($valF_dt, true).", DB_AUTOQUERY_UPDATE, \"".$cle."\");",
3029     VERBOSE_MODE
3030     );
3031     $this->f->isDatabaseError($res1);
3032 softime 6565 // Affichage d'informations à l'utilisateur
3033 softime 8989 $this->addToMessage(_('enregistrement')." ".$this->valF['dossier']." "._('table')." dossier [".$this->f->db->affectedRows()." "._('enregistrement')." "._('mis_a_jour')."]");
3034 softime 6565 }
3035 mbroquet 3730 // Si des valeurs ont été calculées alors on met à jour l'enregistrement
3036 softime 9245 if (count($valF) > 0) {
3037 softime 10573 //
3038     $inst_dossier = $this->f->get_inst__om_dbform(array(
3039     "obj" => "dossier",
3040     "idx" => $this->valF['dossier'],
3041     ));
3042     $valF['instruction'] = $id;
3043 softime 10968 $valF['crud'] = 'create';
3044 softime 10573 $update_by_instruction = $inst_dossier->update_by_instruction($valF);
3045     if ($update_by_instruction === false) {
3046     $this->cleanMessage();
3047     $this->addToMessage(sprintf('%s %s', __("Une erreur s'est produite lors de la mise à jour du dossier d'instruction."), __("Veuillez contacter votre administrateur.")));
3048     return false;
3049 mbroquet 3730 }
3050     // Affichage d'informations à l'utilisateur
3051 softime 8989 $this->addToMessage(_('enregistrement')." ".$this->valF['dossier']." "._('table')." dossier [".$this->f->db->affectedRows()." "._('enregistrement')." "._('mis_a_jour')."]");
3052 mbroquet 3730 }
3053    
3054     /**
3055 fmichon 4708 * Interface avec le référentiel ERP.
3056     *
3057     * (WS->ERP)[105] Arrêté d'un dossier PC effectué -> PC qui concerne un ERP
3058     * (WS->ERP)[111] Décision de conformité effectuée -> PC qui concerne un ERP
3059     * Déclencheur :
3060     * - L'option ERP est activée
3061     * - Le dossier est marqué comme "connecté au référentiel ERP"
3062     * - Le dossier est de type PC
3063     * - Le formulaire d'ajout d'un événement d'instruction est validé
3064     * avec un événement pour lequel les services ERP doivent être
3065     * informé
3066 mbroquet 3730 */
3067 fmichon 4708 //
3068 softime 7521 if ($this->f->is_option_referentiel_erp_enabled() === true
3069 fmichon 4708 && $inst_di->is_connected_to_referentiel_erp() === true
3070     && $this->f->getDATCode($this->valF['dossier']) == $this->f->getParameter('erp__dossier__nature__pc')
3071     && in_array($inst_evenement->getVal($inst_evenement->clePrimaire), explode(";", $this->f->getParameter('erp__evenements__decision__pc')))) {
3072 mbroquet 3730 //
3073 fmichon 4708 $infos = array(
3074     "dossier_instruction" => $this->valF['dossier'],
3075     "decision" => $inst_evenement->getVal("libelle"),
3076     );
3077 mbroquet 3730 //
3078 fmichon 4708 $ret = $this->f->send_message_to_referentiel_erp(105, $infos);
3079     if ($ret !== true) {
3080     $this->cleanMessage();
3081     $this->addToMessage(_("Une erreur s'est produite lors de la notification (105) du référentiel ERP. Contactez votre administrateur."));
3082     return false;
3083 mbroquet 3730 }
3084 fmichon 4708 $this->addToMessage(_("Notification (105) du référentiel ERP OK."));
3085     }
3086 mbroquet 3730
3087 softime 8989 // Si le mode en rédaction intégrale est activé
3088     if (isset($this->valF['flag_edition_integrale']) === true
3089     && $this->valF['flag_edition_integrale'] === true) {
3090     $redactionIntegraleValF = array();
3091    
3092     // Récupère la collectivite du dossier d'instruction
3093     $dossier_instruction_om_collectivite = $this->get_dossier_instruction_om_collectivite();
3094     $collectivite = $this->f->getCollectivite($dossier_instruction_om_collectivite);
3095     // Récupère le corps de la lettre type
3096     $params = array(
3097     "specific" => array(
3098     "corps" => array(
3099     "mode" => "get",
3100     )
3101     ),
3102     );
3103     $result = $this->compute_pdf_output('lettretype', $this->valF['lettretype'], $collectivite, $id, $params);
3104     $redactionIntegraleValF['corps_om_htmletatex'] = $result['pdf_output'];
3105     // Récupère le titre de la lettre type
3106     $params = array(
3107     "specific" => array(
3108     "titre" => array(
3109     "mode" => "get",
3110     )
3111     ),
3112     );
3113     $result = $this->compute_pdf_output('lettretype', $this->valF['lettretype'], $collectivite, $id, $params);
3114     $redactionIntegraleValF['titre_om_htmletat'] = $result['pdf_output'];
3115    
3116     // mise à jour en base de données
3117     $res = $this->f->db->autoExecute(
3118     DB_PREFIXE.$this->table,
3119     $redactionIntegraleValF,
3120     DB_AUTOQUERY_UPDATE,
3121     $this->clePrimaire."=".$id
3122     );
3123     $this->addToLog(__METHOD__."(): db->autoexecute(\"".DB_PREFIXE.'.'.$this->table."\", ".print_r($redactionIntegraleValF, true).", DB_AUTOQUERY_UPDATE, \"".$this->clePrimaire."=".$id."\");", VERBOSE_MODE);
3124     if ($this->f->isDatabaseError($res, true) === true) {
3125     return false;
3126     }
3127     }
3128    
3129 fmichon 4708 /**
3130 softime 7996 * Finalisation automatique de l'instruction si le paramétrage de l'événement l'autorise
3131     */
3132     // Si la finalisation automatique de l'événement est activée
3133     // ET si l'instruction n'a pas déjà été finalisée
3134     // ET s'il existe une lettre type associée
3135     if ($inst_evenement->getVal('finaliser_automatiquement') === 't'
3136     && $inst_evenement->getVal('om_final_instruction') !== 't'
3137     && $inst_evenement->getVal('lettretype') !== ''
3138     && $inst_evenement->getVal('lettretype') !== null) {
3139    
3140     // On instancie l'instruction
3141     $inst_instruction = $this->f->get_inst__om_dbform(array(
3142     "obj" => "instruction",
3143     "idx" => $this->valF[$this->clePrimaire],
3144     ));
3145    
3146     // On finalise l'instruction dans le contexte de finalisation : action 100
3147     $inst_instruction->setParameter('maj', 100);
3148     $finalize = $inst_instruction->finalize($inst_instruction->valF);
3149    
3150     // Une erreur de finalisation renvoie 'false' : ajout dans les logs
3151     // et dans le message d'erreur
3152     if ($finalize === false) {
3153     $this->f->addToLog(__METHOD__."() : ERROR - Impossible de finaliser l'instruction.", DEBUG_MODE);
3154     $this->addToMessage(_("Erreur lors de la finalisation de l'instruction. Contactez votre administrateur."));
3155     return false;
3156     }
3157     }
3158    
3159     /**
3160 softime 7521 * Finalisation automatique des instructions tacites ou retours.
3161     */
3162 softime 7685 // Si l'option de finalisation automatique des instructions tacites ou
3163     // retours est activée et l'événement d'instruction a une lettre type
3164     // associée
3165     $collectivite_di = $this->get_dossier_instruction_om_collectivite($val['dossier']);
3166     if ($this->f->is_option_finalisation_auto_enabled($collectivite_di) === true
3167     && $inst_evenement->getVal('lettretype') !== ''
3168 softime 7521 && $inst_evenement->getVal('lettretype') !== null) {
3169    
3170     // Rècupère l'identifiant de l'événement
3171     $evenement_id = $inst_evenement->getVal($inst_evenement->clePrimaire);
3172    
3173     // Si l'événement d'instruction est identifié comme un événement
3174     // retour
3175     // OU l'événement d'instruction est l'événement suivant tacite du
3176     // dossier d'instruction (incomplétude prise en compte)
3177 softime 7996 // ET l'événement d'instruction n'a pas déjà été finalisé
3178     if (($inst_evenement->getVal("retour") === 't'
3179 softime 7521 || ($inst_di->getVal('evenement_suivant_tacite_incompletude') === $evenement_id
3180 softime 7996 || $inst_di->getVal('evenement_suivant_tacite') === $evenement_id))
3181     && ($inst_evenement->getVal('om_final_instruction') !== 't')) {
3182 softime 7521
3183     // Finalise l'instruction
3184 softime 7996 $inst_instruction = $this->f->get_inst__om_dbform(array(
3185     "obj" => "instruction",
3186     "idx" => $this->valF[$this->clePrimaire],
3187     ));
3188 softime 7521 $inst_instruction->setParameter('maj', 100);
3189     $finalize = $inst_instruction->finalize($inst_instruction->valF);
3190     if ($finalize === false) {
3191     //
3192     return false;
3193     }
3194     }
3195     }
3196    
3197     /**
3198 softime 9245 * Mise à jour de la version de clôture *version_clos* du dossier si et
3199     * seulement si l'instruction met à jour l'état du dossier.
3200     */
3201     if (isset($valF['etat']) === true
3202     && $valF['etat'] !== null
3203     && $valF['etat'] !== '') {
3204     // Instanciation de l'état appliqué sur le dossier par l'instruction
3205     $inst_etat = $this->f->get_inst__om_dbform(array(
3206     "obj" => "etat",
3207     "idx" => $valF['etat'],
3208     ));
3209     //
3210     $update_version_clos = null;
3211     // En cas d'instruction qui clôture le dossier
3212     if ($inst_etat->getVal('statut') === 'cloture') {
3213     $update_version_clos = $inst_di->update_version_clos('up');
3214     }
3215     // En cas d'instruction qui rouvre le dossier
3216     if ($inst_current_etat->getVal('statut') === 'cloture'
3217     && $inst_etat->getVal('statut') !== 'cloture') {
3218     //
3219     $update_version_clos = $inst_di->update_version_clos('down');
3220     //
3221     $params = array(
3222     'di_reopened' => true,
3223     );
3224     }
3225     //
3226     if ($update_version_clos === false) {
3227     $this->f->addToLog(sprintf(
3228     "%s() : ERREUR - %s %s",
3229     __METHOD__,
3230     sprintf(
3231     __("Impossible de mettre à jour la version de clôture du dossier d'instruction %s."),
3232     $inst_di->getVal($inst_di->clePrimaire)
3233     ),
3234     sprintf(
3235     __("L'instruction tente d'appliquer l'état %s."),
3236     $inst_etat->getVal($inst_etat->clePrimaire)
3237     )
3238     ));
3239     $this->addToMessage(sprintf(
3240     "%s %s",
3241     __("Erreur lors de la mise à jour de la version de clôture du dossier d'instruction."),
3242     __("Veuillez contacter votre administrateur.")
3243     ));
3244     return false;
3245     }
3246     }
3247    
3248     /**
3249 softime 10808 * Notification automatique
3250     */
3251     // Notification automatique à l'ajout de l'instruction si la notification
3252     // automatique est choisie et qu'il n'y a pas de lettretype associée à l'événement
3253     if ($inst_evenement->getVal('notification') === 'notification_automatique' &&
3254     ($inst_evenement->getVal('lettretype') === null ||
3255     $inst_evenement->getVal('lettretype') === '')) {
3256 softime 13137 // Message à afficher dans les logs pour indiquer quelle notification a échouée
3257     $msgLog = __('Erreur lors de la notification automatique du(des) pétitionnaire(s).').
3258     ' '.
3259     __('Instruction notifiée : ').
3260     $id;
3261    
3262 softime 10808 // Récupération de la liste des demandeurs à notifier et de la catégorie
3263     $categorie = $this->f->get_param_option_notification($collectivite_di);
3264 softime 13137 $isPortal = $categorie == null || $categorie == '' || $categorie == PORTAL ? true : false;
3265 softime 10869 $demandeursANotifie = $this->get_demandeurs_notifiable(
3266     $this->valF['dossier'],
3267     $isPortal
3268     );
3269 softime 10808
3270     // Création d'une notification et d'une tâche pour chaque demandeur à notifier
3271 softime 12124 $demandeurPrincipalNotifie = false;
3272 softime 10808 foreach ($demandeursANotifie as $demandeur) {
3273 softime 12124 // Identifie si le demandeur principal a été notifié ou pas
3274     // et récupère ses informations
3275     if ($demandeur['petitionnaire_principal'] == 't') {
3276     $demandeurPrincipalNotifie = true;
3277     // Si le demandeur principal est notifiable mais qu'il y a des erreurs dans
3278     // son paramétrage, on effectue pas le traitement et on passe à l'itération
3279     // suivante. On le considère également comme non notifié pour gérer l'envoie
3280     // des messages d'erreurs
3281     // Si la demande a été déposée via le portail alors le paramétrage n'a pas
3282     // d'impact sur la notification
3283     $erreursParam = $this->get_info_notification_fail($val['dossier']);
3284     if (! $this->dossier_depose_sur_portail($val['dossier']) && $erreursParam != array()) {
3285     $demandeurPrincipalNotifie = false;
3286     continue;
3287     }
3288     }
3289 softime 10808 // Ajout de la notif et récupération de son id
3290     $idNotif = $this->ajouter_notification(
3291     $this->valF[$this->clePrimaire],
3292     $this->f->get_connected_user_login_name(),
3293 softime 10968 $demandeur,
3294     $collectivite_di,
3295 softime 12433 array(),
3296 softime 10968 true
3297 softime 10808 );
3298     if ($idNotif === false) {
3299 softime 13137 $this->addToLog(__METHOD__."(): ".$msgLog, DEBUG_MODE);
3300 softime 10808 return false;
3301     }
3302     // Création de la tache en lui donnant l'id de la notification
3303     $notification_by_task = $this->notification_by_task(
3304     $idNotif,
3305     $this->valF['dossier'],
3306     $categorie
3307     );
3308     if ($notification_by_task === false) {
3309 softime 13137 $this->addToLog(__METHOD__."(): ".$msgLog, DEBUG_MODE);
3310 softime 10808 $this->addToMessage(
3311     __("Erreur lors de la génération de la notification au(x) pétitionnaire(s).")
3312     );
3313     return false;
3314     }
3315     }
3316 softime 12847 // Pour la notification par mail ou la notification via portal si le dossier a
3317     // été déposés via portal, si le demandeur principal n'est pas notifiable,
3318     // on créé une nouvelle notification en erreur avec en commentaire la raison pour
3319     // laquelle le demandeur principal n'a pas pu être notifié
3320     $depotPortal = $this->dossier_depose_sur_portail();
3321     if (! $demandeurPrincipalNotifie && ($isPortal === false || $depotPortal === true)) {
3322 softime 13137 // Précision dans les logs que le pétitionnaire principal n'est pas notifiable.
3323     // ' ' permet de mettre un espace entre les 2 msg de log.
3324     $msgLog .= ' '.__('Le pétitionnaire principale n\'est pas notifiable.');
3325 softime 12124 // Analyse pour savoir pourquoi le demandeur principal n'est pas notifiable
3326     $erreursParam = $this->get_info_notification_fail($val['dossier']);
3327     $demandeurPrincipal = $this->get_info_petitionnaire_principal_dossier($val['dossier']);
3328     // Ajout de la notif et récupération de son id
3329     $idNotif = $this->ajouter_notification(
3330     $this->valF[$this->clePrimaire],
3331     $this->f->get_connected_user_login_name(),
3332     $demandeurPrincipal,
3333     $collectivite_di,
3334 softime 12433 array(),
3335 softime 12124 true,
3336     'Echec',
3337     implode(' ', $erreursParam)
3338     );
3339     if ($idNotif === false) {
3340 softime 13137 $this->addToLog(__METHOD__."(): ".$msgLog, DEBUG_MODE);
3341 softime 12124 $this->addToMessage(
3342     __('Erreur : la création de la notification a échouée.').
3343     __("Veuillez contacter votre administrateur.")
3344     );
3345     return false;
3346     }
3347     // Prépare un message d'alerte à destination de l'instructeur pour l'informer
3348     // de l'échec de la notification
3349     $dossier_message = $this->get_inst_dossier_message(0);
3350     $dossier_message_val = array(
3351     'dossier' => $val['dossier'],
3352     'type' => _('erreur expedition'),
3353     'emetteur' => $this->f->get_connected_user_login_name().' (automatique)',
3354     'login' => $_SESSION['login'],
3355     'date_emission' => date('Y-m-d H:i:s'),
3356     'contenu' => _('Échec lors de la notification de l\'instruction ').
3357     $inst_evenement->getVal('libelle').
3358     '.<br>'.
3359     implode("\n", $erreursParam).
3360     '<br>'.
3361     _('Veuillez corriger ces informations avant de renvoyer la notification.')
3362     );
3363     $add = $dossier_message->add_notification_message($dossier_message_val, true);
3364     // Si une erreur se produit pendant l'ajout
3365     if ($add !== true) {
3366     $this->addToLog(__METHOD__."(): Le message d'alerte concernant l'echec de l'envoi de la notification n'a pas pu être envoyé.", DEBUG_MODE);
3367     return false;
3368     }
3369     }
3370 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.")));
3371     }
3372    
3373 softime 12654 // Notification automatique en cas de dépôt de dossier dématérialisé
3374     // Vérifie si l'option de notification est active et si il s'agit bien d'une
3375     // instruction de récépissé
3376     if (
3377     $this->f->is_option_notification_depot_demat_enabled($collectivite_di)
3378     && $this->is_instruction_recepisse()
3379     ) {
3380 softime 13137 // Message à afficher dans les logs pour indiquer quelle notification a échouée
3381     $msgLog = __('Erreur lors de la notification de dépôt du dossier dématérialisé : ').
3382     $val['dossier'];
3383 softime 12654 // Récupère l'instance de la demande
3384     $demande = $inst_di->get_inst_demande();
3385 softime 13137 // Vérifie que le dossier a été déposé via platau ou portal
3386 softime 12654 if (
3387 softime 13137 ($demande->getVal('source_depot') == PLATAU ||
3388     $demande->getVal('source_depot') == PORTAL)
3389 softime 12654 ) {
3390 softime 13137 // Récupère la liste des mails fournis en paramètre. Si aucun adresse n'a été récupéré
3391     // l'envoi de la notification n'est pas effectué et un message d'erreur est affiché.
3392     $listeEmails = $this->f->get_param_courriel_de_notification_commune($collectivite_di);
3393     if (empty($listeEmails)) {
3394     $this->addToLog(
3395     __METHOD__."(): ".$msgLog.'. '.__('Aucun courriel paramétré.'),
3396     DEBUG_MODE
3397 softime 12654 );
3398 softime 13137 } else {
3399     foreach ($listeEmails as $email) {
3400     // Ajout de la notif et récupération de son id
3401     $destinataire = array(
3402     'destinataire' => $email,
3403     'courriel' => $email
3404 softime 12654 );
3405 softime 13137 $idNotif = $this->ajouter_notification(
3406     $this->valF[$this->clePrimaire],
3407     $this->f->get_connected_user_login_name(),
3408     $destinataire,
3409     $collectivite_di,
3410     array(),
3411     true
3412     );
3413     if ($idNotif === false) {
3414     $this->addToLog(__METHOD__."(): ".$msgLog, DEBUG_MODE);
3415     return false;
3416     }
3417     // Création de la tache en lui donnant l'id de la notification
3418     $notification_by_task = $this->notification_by_task(
3419     $idNotif,
3420     $this->valF['dossier'],
3421     'mail',
3422     'notification_depot_demat'
3423     );
3424     if ($notification_by_task === false) {
3425     $this->addToMessage(
3426     __("Erreur lors de la génération de la notification de dépot de dossier par voie dématérialisée.")
3427     );
3428     $this->addToLog(__METHOD__."(): ".$msgLog, DEBUG_MODE);
3429     return false;
3430     }
3431 softime 12654 }
3432     }
3433     }
3434     }
3435    
3436 softime 10808 /**
3437 softime 7996 * Mise à jour de la date de dernière modification du dossier
3438     */
3439     $inst_di->update_last_modification_date();
3440    
3441     /**
3442 softime 8640 * Mise à jour des données du DA.
3443     */
3444     $inst_da = $inst_di->get_inst_dossier_autorisation();
3445 softime 9245 $params['di_id'] = $this->valF['dossier'];
3446 softime 8640 if ($inst_da->majDossierAutorisation($params) === false) {
3447     $this->addToMessage(_("Erreur lors de la mise a jour des donnees du dossier d'autorisation. Contactez votre administrateur."));
3448     $this->correct = false;
3449     return false;
3450     }
3451    
3452     /**
3453 fmichon 4708 * Historisation de la vie du DI.
3454     */
3455     //
3456 nmeucci 3963 return $this->add_log_to_dossier($id, array_merge($val, $this->valF));
3457 nmeucci 3876 }
3458 mbroquet 3730
3459 softime 12124 /**
3460     * Cette méthode vérifie si toutes les conditions de l'envoi de la notification
3461     * sont remplies.
3462     * Les conditions vérifiées sont les suivantes :
3463     * - Le petitionnaire principal doit accepter les notifications
3464     * - Le pétitionnaire principal doit avoir une adresse mail renseignée
3465     * - Le pétitionnaire principal doit avoir une adresse mail correcte
3466     * Pour chaque vérification effectué un message d'erreur est ajouté si la
3467     * condition n'est pas remplie.
3468     * Renvoie le message d'erreur en sortie.
3469     *
3470     * @param string identifiant du dossier sur lequel les notifications ont échouée
3471     * @return string
3472     */
3473     protected function get_info_notification_fail($dossier = null) {
3474     // Utilise l'identifiant du dossier passé en paramètre et si aucun dossier n'a été récupéré
3475     // utilise celui associé à l'instruction
3476     if ($dossier == null) {
3477     $dossier = $this->getVal('dossier');
3478     }
3479     // Tableau contenant la liste des messages d'erreur
3480     $errorMessage = array();
3481     // Récupère les informations du demandeurs principal
3482     $infoPetitionnaire = $this->get_info_petitionnaire_principal_dossier($dossier);
3483     // Vérifie si le pétitionnaire principal à bien la case "accepte les notification" cochée
3484     if (isset($infoPetitionnaire['notification']) && $infoPetitionnaire['notification'] != 't') {
3485     $errorMessage[] = __('Le pétitionnaire principal n\'accepte pas les notifications.');
3486     }
3487     // Vérifie si l'adresse mail du pétitionnaire principale est renseignée
3488     if (isset($infoPetitionnaire['courriel']) && ! empty($infoPetitionnaire['courriel'])) {
3489     // Vérifie si le format de l'adresse mail est pas correct et, si ce n'est pas le cas, informe l'utilisateur
3490     // qu'il doit le corriger avant de pouvoir ajouter l'nstruction
3491     if (! $this->f->checkValidEmailAddress($infoPetitionnaire['courriel'])) {
3492     $errorMessage[] = __('Le courriel du pétitionnaire principal n\'est pas correct : ').
3493     $infoPetitionnaire['courriel'].
3494     '.';
3495     }
3496     } else {
3497     // Si le courriel du pétitionnaire principal
3498     $errorMessage[] = __('Le courriel du pétitionnaire principal n\'est pas renseigné.');
3499     }
3500 softime 11585
3501 softime 12124 return $errorMessage;
3502     }
3503    
3504     /**
3505     * Méthode servant à vérifier si un dossier a été déposé sur
3506     * le portail citoyen ou pas.
3507     * La verification se fait via une requête sql dans laquelle
3508     * on va chercher un dossier ayant pour id l'identifiant de
3509     * dossier associé à l'instruction et pour lequel la demande
3510     * associée la plus ancienne est une demande de création de
3511     * dossier via portail
3512     *
3513     * @param string identifiant du dossier. Si non renseigné c'est le dossier
3514     * associé à l'instruction qui est utilisé
3515     * @return boolean|void true : dossier déposé via portail, false : dossier
3516     * non déposé via portail et null : erreur de base de données.
3517     */
3518     protected function dossier_depose_sur_portail($dossier = null) {
3519     if (empty($dossier)) {
3520     $dossier = $this->getVal('dossier');
3521     }
3522 softime 13137 $qres = $this->f->get_one_result_from_db_query(
3523     sprintf(
3524     'SELECT
3525     dossier
3526     FROM
3527     %1$sdossier
3528     -- Récuperation de la première demande associée au dossier
3529     LEFT JOIN (
3530     SELECT
3531     demande,
3532     dossier_instruction,
3533     source_depot
3534     FROM
3535     %1$sdemande
3536     WHERE
3537     dossier_instruction = \'%2$s\'
3538     ORDER BY
3539     demande ASC
3540     LIMIT 1
3541     ) as demande ON dossier.dossier = demande.dossier_instruction
3542     WHERE
3543     dossier.dossier = \'%2$s\'
3544     AND demande.source_depot = \'portal\'',
3545     DB_PREFIXE,
3546     $this->f->db->escapeSimple($dossier)
3547     ),
3548     array(
3549     "origin" => __METHOD__,
3550     "force_return" => true,
3551     )
3552 softime 12124 );
3553 softime 13137 if ($qres["code"] !== "OK") {
3554 softime 12124 $this->addToMessage(__('Erreur : La vérification du mode de dépôt du dossier à échoué'));
3555     return;
3556     }
3557     // Si on a un résultat c'est que le dossier a été déposé via le portail
3558 softime 13137 return ! empty($qres["result"]);
3559 softime 12124 }
3560    
3561 softime 11585 public function is_service_notifiable() {
3562     $evenement = $this->get_inst_evenement($this->getVal('evenement'));
3563    
3564     // Si l'instruction a une édition non finalisé quel que soit
3565     // le type de notification, il n'est pas notifiable
3566     if ($this->has_an_edition() === true) {
3567     if ($this->is_unfinalizable_without_bypass() === false) {
3568     return false;
3569     }
3570     }
3571     // Vérifie si la notification des tiers est active pour l'évènement
3572     return $this->get_boolean_from_pgsql_value($evenement->getVal('notification_service'));
3573     }
3574    
3575     public function is_tiers_notifiable() {
3576     $evenement = $this->get_inst_evenement($this->getVal('evenement'));
3577    
3578     // Si l'instruction a une édition non finalisé quel que soit
3579     // le type de notification, il n'est pas notifiable
3580     if ($this->has_an_edition() === true) {
3581     if ($this->is_unfinalizable_without_bypass() === false) {
3582     return false;
3583     }
3584     }
3585     // Vérifie si la notification des tiers est active pour l'évènement
3586 softime 13137 return ! empty($evenement->getVal('notification_tiers'));
3587 softime 11585 }
3588    
3589 softime 12124 /**
3590     * Méthode permettant de savoir si une instruction peut
3591     * être notifiée manuellement selon les différents types
3592     * de notification.
3593     *
3594     * Si l'instruction a une édition non finalisée alors elle n'est pas
3595     * manuellement notifiable.
3596     * Si l'instruction est associé à un événement de notification pour
3597     * lequel un retour signature est recquis, elle n'est notifiable que
3598     * si la date de retour de signature est remplie.
3599     * Par défaut si le type de notification n'est pas connu alors l'instruction
3600     * n'est pas notifiable.
3601     * Pour tous les autres cas l'instruction est manuellement notifiable.
3602     *
3603     * @return boolean true : notifiable | false : non notifiable
3604     */
3605 softime 10808 public function is_notifiable_by_task_manual() {
3606     $ev = $this->get_inst_evenement($this->getVal('evenement'));
3607    
3608     // Si l'instruction a une édition non finalisé quel que soit
3609     // le type de notification, il n'est pas notifiable
3610     if ($this->has_an_edition() === true) {
3611     if ($this->is_unfinalizable_without_bypass() === false) {
3612     return false;
3613     }
3614     }
3615    
3616     // Gestion des différents cas selon la valeur du champs notification
3617 softime 12124 if ($ev->getVal('notification') == 'notification_manuelle' ||
3618     $ev->getVal('notification') == 'notification_manuelle_annexe' ||
3619     $ev->getVal('notification') == 'notification_automatique'
3620     ) {
3621     return true;
3622     } elseif (($ev->getVal('notification') == 'notification_auto_signature_requise' ||
3623     $ev->getVal('notification') == 'notification_manuelle_signature_requise' ||
3624     $ev->getVal('notification') == 'notification_manuelle_annexe_signature_requise') &&
3625     $this->getVal('date_retour_signature') != null &&
3626     $this->getVal('date_retour_signature') != ''
3627     ) {
3628     return true ;
3629 softime 10808 }
3630 softime 12124 return false;
3631 softime 10808 }
3632    
3633 softime 8989 /**
3634 softime 10808 * Crée une instance et une tache de notification pour le demandeur
3635     * principal.
3636     *
3637     * @return boolean true si le traitement à réussi
3638     */
3639     protected function notifier_demandeur_principal() {
3640     $this->begin_treatment(__METHOD__);
3641     $message = '';
3642     // Récupération des informations concernant le demandeur
3643     $dossier = $this->getVal('dossier');
3644 softime 10968 $collectivite_di = $this->get_dossier_instruction_om_collectivite($dossier);
3645 softime 10808 $demandeur = $this->get_demandeurs_notifiable(
3646     $dossier,
3647     true
3648     );
3649     if ($demandeur !== array()) {
3650 softime 10869 $destinataire = array_values($demandeur);
3651 softime 10808 // Ajout de la notif et récupération de son id
3652     $idNotification = $this->ajouter_notification(
3653     $this->getVal($this->clePrimaire),
3654     $this->f->get_connected_user_login_name(),
3655 softime 10968 $destinataire[0],
3656     $collectivite_di,
3657 softime 12433 array(),
3658 softime 10968 true
3659 softime 10808 );
3660     if ($idNotification === false) {
3661     return $this->end_treatment(__METHOD__, false);
3662     }
3663     // Création de la tâche en lui donnant l'id de la notification
3664     $notification_by_task = $this->notification_by_task($idNotification, $dossier);
3665     if ($notification_by_task === false) {
3666     $this->addToMessage(
3667     __("Erreur lors de la génération de la notification au(x) pétitionnaire(s).")
3668     );
3669     return $this->end_treatment(__METHOD__, false);
3670     }
3671     $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.")));
3672     return $this->end_treatment(__METHOD__, true);
3673     }
3674     $this->addToMessage( __("Le demandeur principal n'est pas notifiable."));
3675 softime 12124 return $this->end_treatment(__METHOD__, false);
3676 softime 10808 }
3677    
3678     public function notification_by_task($object_id, $dossier, $category = null, $type = null) {
3679     // Par défaut le type est portal
3680     if ($category === null) {
3681 softime 13137 $category = PORTAL;
3682 softime 10808 }
3683     // Si le type n'est pas correctement spécifié, alors il est calculé
3684 softime 11585 if ($type !== 'notification_recepisse'
3685     && $type !== 'notification_instruction'
3686     && $type !== 'notification_decision'
3687     && $type !== 'notification_service_consulte'
3688 softime 12654 && $type !== 'notification_tiers_consulte'
3689     && $type !== 'notification_depot_demat'
3690     && $type !== 'notification_commune') {
3691 softime 10808 //
3692     $type = 'notification_instruction';
3693     // Vérifie si l'instruction est un récépissé
3694 softime 12654 if ($this->is_instruction_recepisse()) {
3695     $type = 'notification_recepisse';
3696    
3697 softime 10808 }
3698     // Vérifie si l'instruction est une décision
3699     if ($type !== 'notification_recepisse') {
3700     $avis_decision = $this->getVal('avis_decision') !== null ? $this->getVal('avis_decision') : $this->valF['avis_decision'];
3701     if ($avis_decision !== null && $avis_decision !== '') {
3702     $type = 'notification_decision';
3703     }
3704     }
3705     }
3706     // Préparation de la tache de notification
3707     $inst_task = $this->f->get_inst__om_dbform(array(
3708     "obj" => "task",
3709     "idx" => 0,
3710     ));
3711     $task_val = array(
3712     'type' => $type,
3713     'object_id' => $object_id,
3714     'dossier' => $dossier,
3715     'category' => $category,
3716     );
3717    
3718     $add_task = $inst_task->add_task(array('val' => $task_val));
3719     if ($add_task === false) {
3720 softime 13137 $msgErreur = __('Echec de l\'ajout de la tâche de notification.').
3721     ' '.
3722     __('Paramétrage de la tâche : ').
3723     var_export($task_val, true);
3724     $this->addToLog(__METHOD__."(): ".$msgErreur, DEBUG_MODE);
3725 softime 10808 return false;
3726     }
3727    
3728     return true;
3729     }
3730    
3731 softime 10968 /**
3732 softime 12654 * Cette méthode permet de savoir si l'instruction est une instruction
3733     * de recepisse (instruction lié à l'ajout du dossier).
3734     *
3735     * Pour cela, on récupère la liste des actions qui ont menées à la création
3736     * de l'instruction. Si une de ces actions est lié à un objet "demande" on
3737     * en deduis que c'est l'ajout d'une demande qui a déclenché la création de
3738     * l'instruction et donc qu'il s'agit d'un recepisse.
3739     *
3740     * @return boolean
3741     */
3742     protected function is_instruction_recepisse() {
3743     // Récupère la liste des actions qui ont mené à la création de
3744     // l'instruction
3745     $trace = debug_backtrace();
3746     // Parcours la liste des actions et si une de ces actions est lié
3747     // à la classe demande on cosidère que l'instruction est un recepisse
3748     foreach ($trace as $key => $value) {
3749     if (isset($trace[$key]['class']) === true
3750     && empty($trace[$key]['class']) === false) {
3751     if (strtolower($trace[$key]['class']) === 'demande') {
3752     return true;
3753     }
3754     }
3755     }
3756     return false;
3757     }
3758    
3759     /**
3760 softime 10968 * A partir des informations passée en argument ajoute un nouvel élément
3761     * dans la table instruction_notification.
3762     * Avant l'ajout vérifie en utilisant l'id de la collectivité passée en
3763     * paramètre si le paramétrage attendus est ok.
3764     * Ajoute également un nouvel élement dans instruction_notification_document
3765     * si l'instruction possède une lettretype.
3766     * Si un identifiant d'une instruction annexe est donnée ajoute un deuxième
3767     * élement dans la table instruction_notification_document qui correspondra
3768     * à l'annexe de la notification.
3769     *
3770     * @param integer identifiant de l'instruction notifiée
3771     * @param string information concernant l'emetteur
3772     * @param array tableau contenant 2 entrées
3773     * - destinatire : nom, prenom ou raison sociale, dénomination et courriel
3774     * - courriel : adresse mail de la personne à notifier
3775     * @param integer identifiant de la collectivité permettant de récupèrer les
3776     * paramètres à valider
3777     * @param boolean indique si la notification est automatique ou manuelle
3778     * @param integer identifiant d'une instruction dont l'édition sera annexé
3779     * à la notification
3780     *
3781     * @return integer|boolean identifiant de la notification créée si le traitement
3782     * a réussie, false sinon.
3783     */
3784 softime 10869 protected function ajouter_notification(
3785     $idInstruction,
3786     $emetteur,
3787     $destinataire,
3788 softime 10968 $collectiviteId,
3789 softime 12433 $annexes = array(),
3790 softime 10968 $demandeAuto = false,
3791 softime 12124 $statut = 'en cours d\'envoi',
3792 softime 12433 $commentaire = 'Notification en cours de traitement'
3793 softime 10869 ) {
3794 softime 10968 // Vérification que les paramètres nécessaires à l'envoi de la notification existe avant
3795     // de créer la notification
3796     if (! $this->is_parametrage_notification_correct($collectiviteId)) {
3797 softime 13137 $msgErreur = __("Erreur de paramétrage. L'url d'accès au(x) document(s) notifié(s) n'est pas paramétrée.");
3798     $this->addToMessage($msgErreur);
3799     $this->addToLog(__METHOD__."(): ".$msgErreur, DEBUG_MODE);
3800 softime 10968 return false;
3801     }
3802 softime 10808 // Préparation de la notification
3803     $inst_notif = $this->f->get_inst__om_dbform(array(
3804     "obj" => "instruction_notification",
3805     "idx" => "]",
3806     ));
3807     $notif_val = array(
3808     'instruction_notification' => null,
3809     'instruction' => $idInstruction,
3810     'automatique' => $demandeAuto,
3811     'emetteur' => $emetteur,
3812     'date_envoi' => null,
3813 softime 10869 'destinataire' => $destinataire['destinataire'],
3814     'courriel' => $destinataire['courriel'],
3815 softime 10808 'date_premier_acces' => null,
3816 softime 12124 'statut' => $statut,
3817     'commentaire' => $commentaire
3818 softime 10808 );
3819    
3820     // Création de la notification
3821     $add_notif = $inst_notif->ajouter($notif_val);
3822     if ($add_notif === false) {
3823 softime 10968 $this->addToMessage(__("Erreur lors de la génération de la notification au(x) pétitionnaire(s)."));
3824 softime 13137 $msgErreur = __("Echec de l'ajout de la notification en base de données.").
3825     ' '.
3826     __('Paramétrage de la notification : ').
3827     var_export($notif_val, true);
3828     $this->addToLog(__METHOD__."(): ".$msgErreur, DEBUG_MODE);
3829 softime 10808 return false;
3830     }
3831    
3832 softime 10869 // Si il y a une lettretype finalisé stockage de la clé d'accès au documents
3833     if ($this->evenement_has_an_edition($this->getVal('evenement')) === true) {
3834 softime 12433 $add_notif_doc = $this->ajouter_notification_document(
3835     $inst_notif->getVal($inst_notif->clePrimaire),
3836 softime 10869 $this->getVal($this->clePrimaire),
3837 softime 12433 'instruction'
3838 softime 10808 );
3839     if ($add_notif_doc === false) {
3840 softime 10968 $this->addToMessage(__("Erreur lors de la génération de la notification du document."));
3841 softime 10808 return false;
3842     }
3843 softime 10869 }
3844     // Si une annexe a été choisie stockage de la clé d'accès à l'annexe
3845 softime 12433 if (! empty($annexes) && is_array($annexes)) {
3846     $add_notif_annexe = $this->ajouter_notification_document_multiple(
3847 softime 10869 $inst_notif->getVal($inst_notif->clePrimaire),
3848 softime 12433 $annexes
3849 softime 10869 );
3850     if ($add_notif_annexe === false) {
3851 softime 10968 $this->addToMessage(__("Erreur lors de la génération de la notification de l'annexe."));
3852 softime 10869 return false;
3853     }
3854     }
3855 softime 10808
3856     // Renvoie l'id de la nouvelle instance de instruction_notification
3857     return $inst_notif->getVal($inst_notif->clePrimaire);
3858     }
3859    
3860     /**
3861 softime 11585 * Pour chaque élément du tableau passé en paramètre ajoute une nouvelle
3862     * instance dans la table instruction_notification_document lié a la
3863     * notification dont l'id est passé en paramètre.
3864     *
3865     * @param array tableau contenant les informations nécessaires pour créer les annexes
3866     *
3867     * @return integer|boolean identifiant de la notification créée si le traitement
3868     * a réussie, false sinon.
3869     */
3870     protected function ajouter_notification_document_multiple($idNotification, $listeDocument) {
3871 softime 12433 foreach ($listeDocument as $paramDoc) {
3872     if (! $this->ajouter_notification_document($idNotification, $paramDoc['id'], $paramDoc['tableDocument'], $paramDoc['isAnnexe'])) {
3873 softime 11585 $this->addToMessage(__("Erreur lors de la génération des documents à notifier."));
3874     return false;
3875     }
3876     }
3877     return true;
3878     }
3879    
3880     /**
3881     * Ajoute un élément dans la table instruction_notification_document en utilisant
3882     * les éléments fourni en paramètre
3883     *
3884     * @param integer $idNotification : id de la notification à laquelle on associe le document
3885     * @param integer $idDocument : id de l'objet auquel est rattaché le document
3886     * @param string $tableDocument : nom de la table a laquelle est rattaché le document
3887     * @param boolean $isAnnexe : indique si le document est une annexe ou pas
3888     *
3889     * @return boolean indique si le traitement a réussi
3890     */
3891     protected function ajouter_notification_document($idNotification, $idDocument, $tableDocument, $isAnnexe = false) {
3892     $inst_notif_doc = $this->f->get_inst__om_dbform(array(
3893     "obj" => "instruction_notification_document",
3894     "idx" => "]",
3895     ));
3896     // l'attribut instruction doit obligatoirement être renseigné
3897     // pour éviter toutes confusion avec d'autres instruction l'id
3898     // 0 est donné au document n'appartenant pas aux instructions
3899     $notif_doc_val = array(
3900     'instruction_notification_document' => null,
3901     'instruction_notification' => $idNotification,
3902     'instruction' => $tableDocument == 'instruction' ? $idDocument : 0,
3903     'document_type' => $tableDocument,
3904     'document_id' => $idDocument,
3905     'cle' => $this->getCleAccesDocument(),
3906     'annexe' => $isAnnexe
3907     );
3908    
3909     $add_notif_doc = $inst_notif_doc->ajouter($notif_doc_val);
3910     if ($add_notif_doc === false) {
3911 softime 13137 $msgErreur = __('Echec de l\'ajout du paramétrage du document notifié en base de données.').
3912     ' '.
3913     __('Paramétrage du document : ').
3914     var_export($notif_doc_val, true);
3915     $this->addToLog(__METHOD__."(): ".$msgErreur, DEBUG_MODE);
3916 softime 11585 return false;
3917     }
3918     return true;
3919     }
3920    
3921     /**
3922 softime 10968 * Vérifie si le paramétrage de la notification des demandeurs est correct.
3923     *
3924     * @param integer identifiant de la collectivité
3925     * @return boolean
3926     */
3927     protected function is_parametrage_notification_correct($collectiviteId) {
3928     $categorie = $this->f->get_param_option_notification($collectiviteId);
3929     $urlAccesNotif = $this->f->get_parametre_notification_url_acces($collectiviteId);
3930     if ($categorie == 'mail' && $urlAccesNotif == null) {
3931     return false;
3932     }
3933     return true;
3934     }
3935    
3936     /**
3937 softime 8989 * TRIGGER - triggermodifierapres.
3938     *
3939     * @return boolean
3940     */
3941     function triggermodifierapres($id, &$dnu1 = null, $val = array(), $dnu2 = null) {
3942     $this->addToLog(__METHOD__."(): start", EXTRA_VERBOSE_MODE);
3943 softime 10808 $collectivite_di = $this->get_dossier_instruction_om_collectivite($val['dossier']);
3944     $message = '';
3945 mbroquet 3730
3946 softime 13137 // Définit si le dossier d'instruction doit être mis à jour
3947     $update_dossier = true;
3948     // Les actions de mise à jour des dates ne doivent pas appliquer
3949     // l'action de l'événement et donc ne pas mettre à jour le dossier
3950     if ($this->getParameter("maj") == 125
3951     || $this->getParameter("maj") == 170
3952     || $this->getParameter("maj") == 175) {
3953     //
3954     $update_dossier = false;
3955     }
3956    
3957     // Traitement en cas de mise à jour du dossier
3958     if ($update_dossier === true) {
3959     /**
3960     * L'objectif ici est d'effectuer les recalculs de date dans le dossier
3961     * si la date de l'evenement est modifiee
3962     */
3963     // Initialisation
3964     $valF = array();
3965     $valF_dt = array();
3966     // Initialisation du type d'événement
3967     $type_evmt = "";
3968     // Récupération de l'action correspondante à l'événement
3969     $sql = "SELECT action
3970     FROM ".DB_PREFIXE."evenement
3971     WHERE evenement=".$this->valF['evenement'];
3972     $action = $this->f->db->getone($sql);
3973     $this->addToLog(__METHOD__."(): db->getone(\"".$sql."\");", VERBOSE_MODE);
3974     $this->f->isDatabaseError($action);
3975    
3976     // Récupération des paramètres de l'action
3977     $sql = "SELECT * FROM ".DB_PREFIXE."action
3978     WHERE action='".$action."'";
3979     $res = $this->f->db->query($sql);
3980     $this->addToLog(__METHOD__."(): db->query(\"".$sql."\");", VERBOSE_MODE);
3981     $this->f->isDatabaseError($res);
3982     while ($row=& $res->fetchRow(DB_FETCHMODE_ASSOC)){
3983     // application des regles sur le courrier + delai
3984     if(preg_match("/date_evenement/",$row['regle_date_limite'])){
3985     $valF['date_limite']= $this->regle($row['regle_date_limite'], 'regle_date_limite');
3986     }
3987     if(preg_match("/date_evenement/",$row['regle_date_complet'])){
3988     $valF['date_complet']= $this->regle($row['regle_date_complet'], 'regle_date_complet');
3989     }
3990     if(preg_match("/date_evenement/",$row['regle_date_dernier_depot'])){
3991     $valF['date_dernier_depot']= $this->regle($row['regle_date_dernier_depot'], 'regle_date_dernier_depot');
3992     }
3993     if(preg_match("/date_evenement/",$row['regle_date_notification_delai'])){
3994     $valF['date_notification_delai']= $this->regle($row['regle_date_notification_delai'], 'regle_date_notification_delai');
3995     }
3996     if(preg_match("/date_evenement/",$row['regle_date_decision'])){
3997     $valF['date_decision']= $this->regle($row['regle_date_decision'], 'regle_date_decision');
3998     }
3999     if(preg_match("/date_evenement/",$row['regle_date_rejet'])){
4000     $valF['date_rejet']= $this->regle($row['regle_date_rejet'], 'regle_date_rejet');
4001     }
4002     if(preg_match("/date_evenement/",$row['regle_date_validite'])){
4003     $valF['date_validite']= $this->regle($row['regle_date_validite'], 'regle_date_validite');
4004     }
4005     if(preg_match("/date_evenement/",$row['regle_date_chantier'])){
4006     $valF['date_chantier']= $this->regle($row['regle_date_chantier'], 'regle_date_chantier');
4007     }
4008     if(preg_match("/date_evenement/",$row['regle_date_achevement'])){
4009     $valF['date_achevement']= $this->regle($row['regle_date_achevement'], 'regle_date_achevement');
4010     }
4011     if(preg_match("/date_evenement/",$row['regle_date_conformite'])){
4012     $valF['date_conformite']= $this->regle($row['regle_date_conformite'], 'regle_date_conformite');
4013     }
4014     if(preg_match("/date_evenement/",$row['regle_date_cloture_instruction'])){
4015     $valF['date_cloture_instruction']= $this->regle($row['regle_date_cloture_instruction'], 'regle_date_cloture_instruction');
4016     }
4017     if(preg_match("/date_evenement/",$row['regle_date_premiere_visite'])){
4018     $valF['date_premiere_visite']= $this->regle($row['regle_date_premiere_visite'], 'regle_date_premiere_visite');
4019     }
4020     if(preg_match("/date_evenement/",$row['regle_date_derniere_visite'])){
4021     $valF['date_derniere_visite']= $this->regle($row['regle_date_derniere_visite'], 'regle_date_derniere_visite');
4022     }
4023     if(preg_match("/date_evenement/",$row['regle_date_contradictoire'])){
4024     $valF['date_contradictoire']= $this->regle($row['regle_date_contradictoire'], 'regle_date_contradictoire');
4025     }
4026     if(preg_match("/date_evenement/",$row['regle_date_retour_contradictoire'])){
4027     $valF['date_retour_contradictoire']= $this->regle($row['regle_date_retour_contradictoire'], 'regle_date_retour_contradictoire');
4028     }
4029     if(preg_match("/date_evenement/",$row['regle_date_ait'])){
4030     $valF['date_ait']= $this->regle($row['regle_date_ait'], 'regle_date_ait');
4031     }
4032     if(preg_match("/date_evenement/",$row['regle_date_transmission_parquet'])){
4033     $valF['date_transmission_parquet']= $this->regle($row['regle_date_transmission_parquet'], 'regle_date_transmission_parquet');
4034     }
4035     if ($row['regle_donnees_techniques1'] !== '') {
4036     $valF_dt[$row['cible_regle_donnees_techniques1']] = $this->regle($row['regle_donnees_techniques1'], 'regle_donnees_techniques1');
4037     }
4038     if ($row['regle_donnees_techniques2'] !== '') {
4039     $valF_dt[$row['cible_regle_donnees_techniques2']] = $this->regle($row['regle_donnees_techniques2'], 'regle_donnees_techniques2');
4040     }
4041     if ($row['regle_donnees_techniques3'] !== '') {
4042     $valF_dt[$row['cible_regle_donnees_techniques3']] = $this->regle($row['regle_donnees_techniques3'], 'regle_donnees_techniques3');
4043     }
4044     if ($row['regle_donnees_techniques4'] !== '') {
4045     $valF_dt[$row['cible_regle_donnees_techniques4']] = $this->regle($row['regle_donnees_techniques4'], 'regle_donnees_techniques4');
4046     }
4047     if ($row['regle_donnees_techniques5'] !== '') {
4048     $valF_dt[$row['cible_regle_donnees_techniques5']] = $this->regle($row['regle_donnees_techniques5'], 'regle_donnees_techniques5');
4049     }
4050     if ($row['regle_dossier_instruction_type'] !== '') {
4051     $valF['dossier_instruction_type'] = $this->regle($row['regle_dossier_instruction_type'], 'regle_dossier_instruction_type');
4052     }
4053 mbroquet 3730 }
4054 softime 13137 // Si des valeurs de données techniques ont été calculées alors on met à jour l'enregistrement
4055     if (count($valF_dt) > 0) {
4056     $dt_id = $this->getDonneesTechniques();
4057     // On met à jour le dossier
4058     $cle = " donnees_techniques='".$dt_id."'";
4059     $res1 = $this->f->db->autoExecute(DB_PREFIXE.'donnees_techniques', $valF_dt, DB_AUTOQUERY_UPDATE, $cle);
4060     $this->addToLog(
4061     __METHOD__."(): db->autoexecute(\"".DB_PREFIXE."donnees_techniques\", ".print_r($valF_dt, true).", DB_AUTOQUERY_UPDATE, \"".$cle."\");",
4062     VERBOSE_MODE
4063     );
4064     $this->f->isDatabaseError($res1);
4065     // Affichage d'informations à l'utilisateur
4066     $this->addToMessage(_('enregistrement')." ".$this->valF['dossier']." "._('table')." dossier [".$this->f->db->affectedRows()." "._('enregistrement')." "._('mis_a_jour')."]");
4067 mbroquet 3730 }
4068 softime 13137 // Si des valeurs ont été calculées alors on met à jour l'enregistrement
4069     if (count($valF) > 0) {
4070     //
4071     $inst_dossier = $this->f->get_inst__om_dbform(array(
4072     "obj" => "dossier",
4073     "idx" => $this->valF['dossier'],
4074     ));
4075     $valF['instruction'] = $id;
4076     $valF['crud'] = 'update';
4077     $update_by_instruction = $inst_dossier->update_by_instruction($valF);
4078     if ($update_by_instruction === false) {
4079     $this->cleanMessage();
4080     $this->addToMessage(sprintf('%s %s', __("Une erreur s'est produite lors de la mise à jour du dossier d'instruction."), __("Veuillez contacter votre administrateur.")));
4081     return false;
4082     }
4083     // Affichage d'informations à l'utilisateur
4084     $this->addToMessage(_('enregistrement')." ".$this->valF['dossier']." "._('table')." dossier [".$this->f->db->affectedRows()." "._('enregistrement')." "._('mis_a_jour')."]");
4085 mbroquet 3730 }
4086     }
4087    
4088     $restriction = $this->get_restriction($val['evenement']);
4089     $this->restriction_valid = $this->restrictionIsValid($restriction);
4090    
4091     if($restriction == "" || $this->restriction_valid ){
4092     // Récupération de tous les paramètres de l'événement sélectionné
4093     $sql = "SELECT * FROM ".DB_PREFIXE."evenement
4094     WHERE evenement=".$this->valF['evenement'];
4095 softime 8989 $res = $this->f->db->query($sql);
4096     $this->addToLog(__METHOD__."(): db->query(\"".$sql."\");", VERBOSE_MODE);
4097 softime 12847 $this->f->isDatabaseError($res);
4098 nmeucci 3965 $current_id = $this->getVal($this->clePrimaire);
4099 mbroquet 3730 while ($row=& $res->fetchRow(DB_FETCHMODE_ASSOC)) {
4100     // Si la date de retour signature est éditée on vérifie si il existe un événement automatique
4101     if ($this->getVal('date_retour_signature') == "" AND
4102     $this->valF['date_retour_signature'] != "" AND
4103     $row['evenement_retour_signature'] != "") {
4104 softime 7996 $new_instruction = $this->f->get_inst__om_dbform(array(
4105     "obj" => "instruction",
4106     "idx" => "]",
4107     ));
4108 mbroquet 3730 // Création d'un tableau avec la liste des champs de l'instruction
4109     foreach($new_instruction->champs as $champ) {
4110     $valNewInstr[$champ] = "";
4111     }
4112     // Définition des valeurs de la nouvelle instruction
4113     $valNewInstr["evenement"] = $row['evenement_retour_signature'];
4114     $valNewInstr["destinataire"] = $this->valF['destinataire'];
4115     $valNewInstr["dossier"] = $this->valF['dossier'];
4116     $valNewInstr["date_evenement"] = $this->f->formatDate($this->valF['date_retour_signature']);
4117     $valNewInstr["date_envoi_signature"] = $this->f->formatDate($this->valF['date_envoi_signature']);
4118     $valNewInstr["date_retour_signature"] = $this->f->formatDate($this->valF['date_retour_signature']);
4119     $valNewInstr["date_envoi_rar"] = $this->f->formatDate($this->valF['date_envoi_rar']);
4120     $valNewInstr["date_retour_rar"] = $this->f->formatDate($this->valF['date_retour_rar']);
4121     $valNewInstr["date_envoi_controle_legalite"] = $this->f->formatDate($this->valF['date_envoi_controle_legalite']);
4122     $valNewInstr["date_retour_controle_legalite"] = $this->f->formatDate($this->valF['date_retour_controle_legalite']);
4123 nmeucci 3965 $new_instruction->setParameter("maj", 0);
4124     $new_instruction->class_actions[0]["identifier"] =
4125 softime 13137 sprintf(__("Ajout suite au retour signature de l'instruction %s"), $current_id);
4126 softime 8989 $retour = $new_instruction->ajouter($valNewInstr);
4127 mbroquet 3730
4128     //Si une erreur s'est produite et qu'il s'agit d'un problème
4129     //de restriction
4130     if ($retour == false && !$new_instruction->restriction_valid){
4131     $error_message = $this->get_restriction_error_message($restriction);
4132     $this->f->displayMessage("error", $error_message);
4133 softime 8989 $this->addToLog(__METHOD__."(): evenement retour ".
4134 mbroquet 3730 "instruction ".$this->valF[$this->clePrimaire]." : ".
4135     $new_instruction->msg);
4136     }
4137     //Si une erreur s'est produite après le test de la restriction
4138     elseif ($retour == false && $new_instruction->restriction_valid){
4139     $this->correct = false ;
4140     $this->msg .= $new_instruction->msg;
4141     return false;
4142     }
4143     }
4144     // Si la date de retour AR est éditée on vérifie si il existe un événement automatique
4145     if ($this->getVal('date_retour_rar') == "" AND
4146     $this->valF['date_retour_rar'] != "") {
4147    
4148     if($row['evenement_retour_ar'] != "") {
4149 softime 7996 $new_instruction = $this->f->get_inst__om_dbform(array(
4150     "obj" => "instruction",
4151     "idx" => "]",
4152     ));
4153 mbroquet 3730 // Création d'un tableau avec la liste des champs de l'instruction
4154     foreach($new_instruction->champs as $champ) {
4155     $valNewInstr[$champ] = "";
4156     }
4157     // Définition des valeurs de la nouvelle instruction
4158     $valNewInstr["evenement"] = $row['evenement_retour_ar'];
4159     $valNewInstr["destinataire"] = $this->valF['destinataire'];
4160     $valNewInstr["dossier"] = $this->valF['dossier'];
4161     $valNewInstr["date_evenement"] = $this->f->formatDate($this->valF['date_retour_rar']);
4162     $valNewInstr["date_envoi_signature"] = $this->f->formatDate($this->valF['date_envoi_signature']);
4163     $valNewInstr["date_retour_signature"] = $this->f->formatDate($this->valF['date_retour_signature']);
4164     $valNewInstr["date_envoi_rar"] = $this->f->formatDate($this->valF['date_envoi_rar']);
4165     $valNewInstr["date_retour_rar"] = $this->f->formatDate($this->valF['date_retour_rar']);
4166     $valNewInstr["date_envoi_controle_legalite"] = $this->f->formatDate($this->valF['date_envoi_controle_legalite']);
4167     $valNewInstr["date_retour_controle_legalite"] = $this->f->formatDate($this->valF['date_retour_controle_legalite']);
4168 nmeucci 3965 $new_instruction->setParameter("maj", 0);
4169     $new_instruction->class_actions[0]["identifier"] =
4170 softime 13137 sprintf(__("Ajout suite à la notification de l'instruction %s"), $current_id);
4171 softime 8989 $retour = $new_instruction->ajouter($valNewInstr);
4172 mbroquet 3730
4173     //Si une erreur s'est produite et qu'il s'agit d'un problème
4174     //de restriction
4175     if ($retour == false && !$new_instruction->restriction_valid) {
4176     $error_message = $this->get_restriction_error_message($restriction);
4177     $this->f->displayMessage("error", $error_message);
4178     $this->addToLog(
4179 softime 8989 __METHOD__."(): evenement retour instruction ".
4180 mbroquet 3730 $this->valF[$this->clePrimaire]." : ".
4181     $new_instruction->msg
4182     );
4183     }
4184     //Si une erreur s'est produite après le test de la restriction
4185     elseif ($retour == false && $new_instruction->restriction_valid){
4186     $this->correct = false ;
4187     $this->msg .= $new_instruction->msg;
4188     return false;
4189     }
4190     }
4191     }
4192     }
4193     }
4194    
4195 softime 13137 // Traitement en cas de mise à jour du dossier
4196     if ($update_dossier === true) {
4197     /**
4198     * Mise à jour de la date de dernière modification du dossier
4199     * d'instruction
4200     */
4201     $inst_di = $this->get_inst_dossier($this->getVal('dossier'));
4202     $inst_di->update_last_modification_date();
4203 softime 8640
4204 softime 13137 // Mise à jour des données du dossier d'autorisation
4205     $da = $this->f->get_inst__om_dbform(array(
4206     "obj" => "dossier_autorisation",
4207     "idx" => $this->getNumDemandeAutorFromDossier($this->valF['dossier']),
4208     ));
4209     $params = array(
4210     'di_id' => $this->getVal('dossier'),
4211     );
4212     if($da->majDossierAutorisation($params) === false) {
4213     $this->addToMessage(_("Erreur lors de la mise a jour des donnees du dossier d'autorisation. Contactez votre administrateur."));
4214     $this->correct = false;
4215     return false;
4216     }
4217 mbroquet 3730 }
4218 softime 7996
4219 softime 10573 // mise à jour des métadonnées issues des dates de suivi
4220     $dateRetourSignatureModified = ($this->valF['date_retour_signature'] != $this->getVal('date_retour_signature'));
4221     $dateRetourRARModified = ($this->valF['date_retour_rar'] != $this->getVal('date_retour_rar'));
4222     if ($dateRetourSignatureModified || $dateRetourRARModified) {
4223    
4224     // Calculs des nouvelles métadonnées
4225     $metadata = $this->getMetadata("om_fichier_instruction");
4226    
4227     // On vérifie si l'instruction à finaliser a un événement de type arrete
4228     $sql = "SELECT type FROM ".DB_PREFIXE."evenement WHERE evenement = ".$this->getVal("evenement");
4229     $typeEvenement = $this->f->db->getOne($sql);
4230     $this->addToLog(__METHOD__."(): db->getOne(\"".$sql."\");", VERBOSE_MODE);
4231     if ($this->f->isDatabaseError($typeEvenement, true) === true) {
4232     $this->correct = false;
4233     $this->addToMessage(__("Erreur de traitement de fichier."));
4234     $this->addToLog(__METHOD__."() erreur BDD: ".var_export($typeEvenement->getMessage(), true), DEBUG_MODE);
4235     return false;
4236     }
4237    
4238     // Si l'événement est de type arrete, on ajoute les métadonnées spécifiques
4239     if ($typeEvenement == 'arrete'){
4240     $metadata = array_merge($metadata, $this->getMetadata("arrete"));
4241     }
4242    
4243     // Filtre pour conserver uniquement les métadonnées liées aux dates
4244     $metadataToKeep = array(
4245     "statutAutorisation",
4246     "dateEvenementDocument",
4247     'date_cloture_metier',
4248     "NotificationArrete",
4249     "dateNotificationArrete",
4250     "controleLegalite",
4251     "dateSignature",
4252     "nomSignataire",
4253     "qualiteSignataire",
4254     "dateControleLegalite",
4255     );
4256     $metadata = array_filter(
4257     $metadata,
4258     function($key) use ($metadataToKeep) { return in_array($key, $metadataToKeep); },
4259     ARRAY_FILTER_USE_KEY
4260     );
4261    
4262     // Mise à jour des métadonnées du document en GED
4263     $docUid = $this->getVal("om_fichier_instruction");
4264     $operationOrUID = $this->f->storage->update_metadata($docUid, $metadata);
4265     if ($operationOrUID == 'OP_FAILURE') {
4266     $this->correct = false;
4267     $this->addToMessage(__("Erreur de traitement de fichier."));
4268     $this->addToLog(__METHOD__."() failed to update metadata: ".var_export($operationOrUID, true), DEBUG_MODE);
4269     return false;
4270     }
4271    
4272     // mise à jour de l'UID du document en BDD
4273     else {
4274     $valF = array('om_fichier_instruction' => $operationOrUID);
4275     $res = $this->f->db->autoExecute(DB_PREFIXE.$this->table, $valF, DB_AUTOQUERY_UPDATE, $this->getCle($id));
4276     $this->addToLog(__METHOD__.'() : db->autoExecute("'.DB_PREFIXE.$this->table.'", '.print_r($valF, true).', DB_AUTOQUERY_UPDATE, "'.$this->getCle($id).'")', VERBOSE_MODE);
4277     if ($this->f->isDatabaseError($res, true) === true) {
4278     $this->correct = false;
4279     $this->addToMessage(__("Erreur de traitement de fichier."));
4280     $this->addToLog(__METHOD__."() erreur BDD: ".var_export($res->getMessage(), true), DEBUG_MODE);
4281     return false;
4282     }
4283     $this->addToMessage(__("La mise a jour du document s'est effectuee avec succes."));
4284     }
4285     }
4286    
4287 softime 13137 // Déclenchement des notifications automatique après finalisation et
4288     // retour de signature
4289 softime 10808 if ($dateRetourSignatureModified === true
4290     && $this->valF['date_retour_signature'] !== ''
4291     && $this->valF['date_retour_signature'] !== null) {
4292 softime 13137
4293     // Message à afficher dans les logs pour indiquer quelle notification a échouée
4294     $msgLog = __('Erreur lors de la notification automatique du(des) pétitionnaire(s) après retour signature.').
4295     ' '.
4296     __('Instruction notifiée : ').
4297     $id;
4298    
4299     // Récupération de l'instance de l'événement pour accéder au paramètrage
4300     // des notifications
4301 softime 10808 $ev = $this->get_inst_evenement($this->valF['evenement']);
4302 softime 13137 // Si la notification automatique des tiers consulté est active
4303     // déclenche le traitement de notification.
4304     // Ce traitement va envoyer des courriels de notification à tous les tiers concernés
4305     $typeNotifTiers = $ev->getVal('notification_tiers');
4306     $inst_di = $this->get_inst_dossier($this->getVal('dossier'));
4307     if ($typeNotifTiers === 'notification_automatique') {
4308     if ($this->traitement_notification_automatique_tiers_consulte($ev, $inst_di) === false) {
4309     $this->addToMessage(__('Le traitement de la notification automatique de tiers à échoué.'));
4310     $this->correct = false;
4311     }
4312     }
4313    
4314 softime 10808 if ($ev->getVal('notification') === 'notification_auto_signature_requise') {
4315     // Récupération de la liste des demandeurs à notifier et de la catégorie
4316     $categorie = $this->f->get_param_option_notification($collectivite_di);
4317 softime 13137 $isPortal = $categorie == null || $categorie == '' || $categorie == PORTAL ? true : false;
4318 softime 10869 $demandeursANotifie = $this->get_demandeurs_notifiable(
4319     $this->valF['dossier'],
4320     $isPortal
4321     );
4322 softime 10808
4323     // Création d'une notification et d'une tâche pour chaque demandeur à notifier
4324 softime 12124 $demandeurPrincipalNotifie = false;
4325 softime 10808 foreach ($demandeursANotifie as $demandeur) {
4326 softime 12124 // Identifie si le demandeur principal a été notifié ou pas
4327     // et récupère ses informations
4328     if ($demandeur['petitionnaire_principal'] == 't') {
4329     $demandeurPrincipalNotifie = true;
4330     // Si le demandeur principal est notifiable mais qu'il y a des erreurs dans
4331     // son paramétrage, on effectue pas le traitement et on passe à l'itération
4332     // suivante. On le considère également comme non notifié pour gérer l'envoie
4333     // des messages d'erreurs
4334     // Si la demande a été déposée via le portail alors le paramétrage n'a pas
4335     // d'impact sur la notification
4336     $erreursParam = $this->get_info_notification_fail();
4337     if (! $this->dossier_depose_sur_portail() && $erreursParam != array()) {
4338     $demandeurPrincipalNotifie = false;
4339     continue;
4340     }
4341     }
4342 softime 10808 // Ajout de la notif et récupération de son id
4343     $idNotif = $this->ajouter_notification(
4344     $this->valF[$this->clePrimaire],
4345     $this->f->get_connected_user_login_name(),
4346 softime 10968 $demandeur,
4347     $collectivite_di,
4348 softime 12433 array(),
4349 softime 10968 true
4350 softime 10808 );
4351     if ($idNotif === false) {
4352 softime 13137 $this->addToLog(__METHOD__."(): ".$msgLog, DEBUG_MODE);
4353 softime 10808 return false;
4354     }
4355     // Création de la tache en lui donnant l'id de la notification
4356     $notification_by_task = $this->notification_by_task(
4357     $idNotif,
4358     $this->valF['dossier'],
4359     $categorie
4360     );
4361     if ($notification_by_task === false) {
4362 softime 13137 $this->addToLog(__METHOD__."(): ".$msgLog, DEBUG_MODE);
4363 softime 10808 $this->addToMessage(
4364     __("Erreur lors de la génération de la notification au(x) pétitionnaire(s).")
4365     );
4366     return false;
4367     }
4368     }
4369 softime 12847 // Pour la notification par mail ou la notification via portal si le dossier a
4370     // été déposés via portal, si le demandeur principal n'est pas notifiable,
4371     // on créé une nouvelle notification en erreur avec en commentaire la raison pour
4372     // laquelle le demandeur principal n'a pas pu être notifié
4373     $depotPortal = $this->dossier_depose_sur_portail();
4374     if (! $demandeurPrincipalNotifie && ($isPortal === false || $depotPortal === true)) {
4375 softime 13137 // Précise dans les logs que le pétitionnaire principal n'a pas été notifié
4376     $msgLog .= ' '.__('Le pétitionnaire principale n\'est pas notifiable.');
4377 softime 12124 // Analyse pour savoir pourquoi le demandeur principal n'est pas notifiable
4378     $erreursParam = $this->get_info_notification_fail();
4379     $demandeurPrincipal = $this->get_info_petitionnaire_principal_dossier($this->getVal('dossier'));
4380     // Ajout de la notif et récupération de son id
4381     $idNotif = $this->ajouter_notification(
4382     $this->valF[$this->clePrimaire],
4383     $this->f->get_connected_user_login_name(),
4384     $demandeurPrincipal,
4385     $collectivite_di,
4386 softime 12433 array(),
4387 softime 12124 true,
4388     'Echec',
4389     implode(' ', $erreursParam)
4390     );
4391     if ($idNotif === false) {
4392 softime 13137 $this->addToLog(__METHOD__."(): ".$msgLog, DEBUG_MODE);
4393 softime 12124 $this->addToMessage(
4394     __('Erreur : la création de la notification a échouée.').
4395     __("Veuillez contacter votre administrateur.")
4396     );
4397     return false;
4398     }
4399     // Prépare un message d'alerte à destination de l'instructeur pour l'informer
4400     // de l'échec de la notification
4401     $dossier_message = $this->get_inst_dossier_message(0);
4402     $dossier_message_val = array(
4403     'dossier' => $this->getVal('dossier'),
4404     'type' => _('erreur expedition'),
4405     'emetteur' => $this->f->get_connected_user_login_name(),
4406     'login' => $_SESSION['login'],
4407     'date_emission' => date('Y-m-d H:i:s'),
4408     'contenu' => _('Échec lors de la notification de l\'instruction ').
4409     $ev->getVal('libelle').
4410     '.<br>'.
4411     implode("\n", $erreursParam).
4412     '<br>'.
4413     _('Veuillez corriger ces informations avant de renvoyer la notification.')
4414     );
4415     $add = $dossier_message->add_notification_message($dossier_message_val, true);
4416     // Si une erreur se produit pendant l'ajout
4417     if ($add !== true) {
4418     $this->addToLog(__METHOD__."(): Le message d'alerte concernant l'echec de l'envoi de la notification n'a pas pu être envoyé.", DEBUG_MODE);
4419     return false;
4420     }
4421     }
4422 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.")));
4423     }
4424     }
4425    
4426 nmeucci 3933 return $this->add_log_to_dossier($id, $val);
4427 fmichon 4708 }
4428 mbroquet 3730
4429 softime 8989 /**
4430     * TRIGGER - triggersupprimer.
4431     *
4432     * @return boolean
4433     */
4434     function triggersupprimer($id, &$dnu1 = null, $val = array(), $dnu2 = null) {
4435     $this->addToLog(__METHOD__."(): start", EXTRA_VERBOSE_MODE);
4436 mbroquet 3730 /**
4437     * L'objectif ici est de repositionner les valeurs récupérées en
4438     * archive dans le dossier d'instruction avant de supprimer l'événement
4439 softime 10573 * d'instruction si les valeurs du dossier sont différentes
4440 mbroquet 3730 */
4441 softime 10573 $valF = array();
4442     $inst_di = $this->get_inst_dossier($this->getVal('dossier'));
4443     foreach ($inst_di->champs as $key => $champ) {
4444     // Si le champ du DI à une archive dans l'instruction
4445     if (isset($val[sprintf('archive_%s', $champ)]) === true) {
4446     // Si la valeur entre le champ du DI et son archive dans instruction
4447     // est différente
4448     if ($inst_di->getVal($champ) !== $val[sprintf('archive_%s', $champ)]) {
4449     $val[sprintf('archive_%s', $champ)] === '' ? $valF[$champ] = null : $valF[$champ] = $val[sprintf('archive_%s', $champ)];
4450     }
4451     }
4452 softime 5024 }
4453 softime 10573 // Spécificité du champ avis_decision dont le champ archive est nommé
4454     // différemment
4455     if ($inst_di->getVal('avis_decision') !== $val['archive_avis']) {
4456     $val['archive_avis'] === '' ? $valF['avis_decision'] = null : $valF['avis_decision'] = $val['archive_avis'];
4457 softime 5024 }
4458 softime 10573 // Spécificité de la date d'affichage dont la valeur n'ai jamais modifiée
4459     // par l'archive
4460     unset($valF['date_affichage']);
4461 softime 6565
4462 softime 9245 /**
4463     * Mise à jour de la version de clôture *version_clos* du dossier si et
4464     * seulement si l'instruction met à jour l'état du dossier.
4465     */
4466 softime 10573 if (isset($valF['etat']) === true
4467     && $valF['etat'] !== null
4468 softime 9245 && $valF['etat'] !== '') {
4469 softime 10573 // Récupère l'état actuel du dossier d'instruction
4470     $inst_current_etat = $this->f->get_inst__om_dbform(array(
4471     "obj" => "etat",
4472     "idx" => $inst_di->get_id_etat(),
4473     ));
4474 softime 9245 // Instanciation de l'état archivé appliqué sur le dossier
4475     $inst_etat = $this->f->get_inst__om_dbform(array(
4476     "obj" => "etat",
4477     "idx" => $valF['etat'],
4478     ));
4479     //
4480     $update_version_clos = null;
4481     // En cas de clôture du dossier par l'état archivé
4482     if ($inst_etat->getVal('statut') === 'cloture') {
4483     $update_version_clos = $inst_di->update_version_clos('up');
4484     }
4485     // En cas de réouverture du dossier par l'état archivé
4486     if ($inst_current_etat->getVal('statut') === 'cloture'
4487     && $inst_etat->getVal('statut') !== 'cloture') {
4488     //
4489     $update_version_clos = $inst_di->update_version_clos('down');
4490     //
4491     $this->set_att_di_reopened(true);
4492     }
4493     //
4494     if ($update_version_clos === false) {
4495     $this->f->addToLog(sprintf(
4496     "%s() : ERREUR - %s %s",
4497     __METHOD__,
4498     sprintf(
4499     __("Impossible de mettre à jour la version de clôture du dossier d'instruction %s."),
4500     $inst_di->getVal($inst_di->clePrimaire)
4501     ),
4502     sprintf(
4503     __("L'instruction tente d'appliquer l'état %s."),
4504     $inst_etat->getVal($inst_etat->clePrimaire)
4505     )
4506     ));
4507     $this->addToMessage(sprintf(
4508     "%s %s",
4509     __("Erreur lors de la mise à jour de la version de clôture du dossier d'instruction."),
4510     __("Veuillez contacter votre administrateur.")
4511     ));
4512     return false;
4513     }
4514     }
4515 softime 10808 // On supprime toutes les notications liées à l'instruction
4516 softime 12654 $notifASupprimer = $this->get_instruction_notification(
4517     $this->getVal($this->clePrimaire),
4518     array(
4519     'notification_recepisse',
4520     'notification_instruction',
4521     'notification_decision',
4522     'notification_service_consulte',
4523     'notification_tiers_consulte',
4524 softime 13137 'notification_depot_demat',
4525     'notification_commune'
4526 softime 12654 ),
4527     true
4528     );
4529    
4530 softime 10808 foreach ($notifASupprimer as $idNotif) {
4531     $inst_notif = $this->f->get_inst__om_dbform(array(
4532     "obj" => "instruction_notification",
4533     "idx" => $idNotif,
4534     ));
4535     $val_notif = array();
4536     foreach ($inst_notif->champs as $champ) {
4537     $val_notif[$champ] = $inst_notif->getVal($champ);
4538     }
4539     // La suppression des notifications entrainera la suppression des tâches qui y sont
4540     // liées
4541     $supprNotif = $inst_notif->supprimer($val_notif);
4542     if ($supprNotif == false) {
4543     $this->addToMessage(sprintf(
4544     "%s %s",
4545     __("Erreur lors de la suppression des notifications de l'instruction."),
4546     __("Veuillez contacter votre administrateur.")
4547     ));
4548     return false;
4549     }
4550     }
4551 softime 9245
4552 softime 10573 // On met à jour le dossier
4553     $valF['instruction'] = $id;
4554 softime 10968 $valF['crud'] = 'delete';
4555 softime 10573 $update_by_instruction = $inst_di->update_by_instruction($valF);
4556     if ($update_by_instruction === false) {
4557     $this->cleanMessage();
4558     $this->addToMessage(sprintf('%s %s', __("Une erreur s'est produite lors de la mise à jour du dossier d'instruction."), __("Veuillez contacter votre administrateur.")));
4559     return false;
4560     }
4561    
4562 softime 5024 // Affichage d'informations à l'utilisateur
4563 softime 8989 $this->addToMessage(_("Suppression de l'instruction")." [".$this->f->db->affectedRows()." "._('enregistrement')." "._('mis_a_jour')."]");
4564 softime 5024
4565     // Mise à jour de la demande si un récépissé d'instruction correspond à l'instruction à supprimer
4566 mbroquet 3730 }
4567    
4568 softime 8989 /**
4569     * TRIGGER - triggersupprimerapres.
4570     *
4571     * @return boolean
4572     */
4573     function triggersupprimerapres($id, &$dnu1 = null, $val = array(), $dnu2 = null) {
4574     $this->addToLog(__METHOD__."(): start", EXTRA_VERBOSE_MODE);
4575 softime 8640 /**
4576     * Mise à jour de la date de dernière modification du dossier
4577     * d'instruction
4578     */
4579     $inst_di = $this->get_inst_dossier($this->getVal('dossier'));
4580     $inst_di->update_last_modification_date();
4581    
4582     /**
4583     * Mise à jour des données du dossier d'autorisation
4584     */
4585 softime 7996 $da = $this->f->get_inst__om_dbform(array(
4586     "obj" => "dossier_autorisation",
4587     "idx" => $this->getNumDemandeAutorFromDossier($val["dossier"]),
4588     ));
4589 softime 8640 $params = array(
4590     'di_id' => $this->getVal('dossier'),
4591 softime 9245 'di_reopened' => $this->get_att_di_reopened(),
4592 softime 8640 );
4593     if($da->majDossierAutorisation($params) === false) {
4594 mbroquet 3730 $this->addToMessage(_("Erreur lors de la mise a jour des donnees du dossier d'autorisation. Contactez votre administrateur."));
4595     $this->correct = false;
4596     return false;
4597     }
4598 softime 7996
4599 softime 10573 /**
4600     * Gestion des tâches pour la dématérialisation
4601     */
4602     $inst_task_empty = $this->f->get_inst__om_dbform(array(
4603     "obj" => "task",
4604     "idx" => 0,
4605     ));
4606     foreach ($inst_di->task_types as $task_type) {
4607     $task_exists = $inst_task_empty->task_exists($task_type, $id);
4608     if ($task_exists !== false) {
4609     $inst_task = $this->f->get_inst__om_dbform(array(
4610     "obj" => "task",
4611     "idx" => $task_exists,
4612     ));
4613     if ($inst_task->getVal('state') === $inst_task::STATUS_NEW || $inst_task->getVal('state') === $inst_task::STATUS_DRAFT) {
4614     $task_val = array(
4615     'state' => $inst_task::STATUS_CANCELED,
4616     );
4617     $update_task = $inst_task->update_task(array('val' => $task_val));
4618     if ($update_task === false) {
4619     $this->addToMessage(sprintf('%s %s',
4620     sprintf(__("Une erreur s'est produite lors de la modification de la tâche %."), $inst_task->getVal($inst_task->clePrimaire)),
4621     __("Veuillez contacter votre administrateur.")
4622     ));
4623     $this->correct = false;
4624     return false;
4625     }
4626     }
4627     }
4628     }
4629    
4630 softime 7996 //
4631 softime 8640 $val['evenement'] = $this->getVal('evenement');
4632 nmeucci 3933 return $this->add_log_to_dossier($id, $val);
4633 mbroquet 3730 }
4634    
4635     /**
4636 softime 9245 * Permet de mettre la valeur passée en paramètre dans l'attribut de classe
4637     * "di_reopened".
4638     *
4639     * @param boolean $val
4640     */
4641     function set_att_di_reopened($val) {
4642     $this->di_reopened = $val;
4643     }
4644    
4645     /**
4646     * Permet de récupérer la valeur de l'attribut de classe "di_reopened".
4647     *
4648     * @return boolean
4649     */
4650     function get_att_di_reopened() {
4651     return $this->di_reopened;
4652     }
4653    
4654     /**
4655 mbroquet 3730 * Permet de composer un message d'erreur sur restriction non valide en
4656     * fonction du contexte.
4657     *
4658     * @param string $restriction formule de la restriction
4659     *
4660     * @return string message d'erreur
4661     */
4662     function get_restriction_error_message($restriction) {
4663     // Affichage du message si la restriction s'applique
4664     // Contexte du suivi des dates (message simple)
4665     $message_restrict = _("Probleme de dates :");
4666     // Split restriction
4667     $champs_restrict = preg_split(
4668     '/(\W+)/',
4669     $restriction,
4670     null,
4671     PREG_SPLIT_NO_EMPTY|PREG_SPLIT_DELIM_CAPTURE
4672     );
4673     $formated_restrict = "";
4674     // Ajout des chaînes à traduire
4675     foreach ($champs_restrict as $value) {
4676     $formated_restrict .= _($value)." ";
4677     }
4678     $formated_restrict = substr($formated_restrict, 0, -1);
4679     // Message d'erreur dans le contexte du suivi des dates
4680     if($this->getParameter("maj") == 170) {
4681     $message_restrict .= " "._("contactez l'instructeur du dossier");
4682     $message_restrict .= "<br/>(".$formated_restrict.")";
4683     } else {
4684     // Affichage du message si la restriction s'applique
4685     // Contexte instruction
4686     $message_restrict .= "<br/>".$formated_restrict;
4687     }
4688    
4689     return $message_restrict;
4690     }
4691    
4692     /**
4693 softime 12124 * Surcharge de la méthode verifier() de la classe om_dbform pour y ajouter
4694     * les vérifications suivantes :
4695     * - Si l'instruction à un événement associé et que cet événement à des restrictions :
4696     * 1. vérifie si la restriction est valide, si ce n'est pas le cas récupère et affiche
4697     * le message d'erreur associé à la restriction
4698     * 2. vérifie si les restrictions sont respectées. Si ce n'est pas le cas bloque l'ajout
4699     * et / ou la modification et affiche un message d'erreur
4700     * -
4701     * -
4702     * -
4703     * -
4704     * -
4705     * -
4706     *
4707     * @param array val : tableau contenant les valeurs issues du formulaire.
4708     * @param - dnu1 : Paramètre déprécié et non utilisé.
4709     * @param - dnu2 : Paramètre déprécié et non utilisé.
4710     *
4711 softime 8989 * @return void
4712 mbroquet 3730 */
4713 softime 8989 function verifier($val = array(), &$dnu1 = null, $dnu2 = null) {
4714     parent::verifier($val);
4715     //
4716 mbroquet 3730 if ( isset($val['evenement']) && is_numeric($val['evenement'])){
4717     $restriction = $this->get_restriction($val['evenement']);
4718    
4719     //Test qu'une restriction est présente
4720     if ($restriction != "" ){
4721    
4722     //Test si la restriction est valide
4723     $this->restriction_valid = $this->restrictionIsValid($restriction);
4724     if ( !$this->restriction_valid ){
4725    
4726     // Affichage du message si la restriction s'applique
4727     $this->addToMessage(
4728     $this->get_restriction_error_message($restriction)
4729     );
4730     $this->correct=false;
4731     return false;
4732     }
4733    
4734     // Liste des opérateurs possible
4735 nmeucci 3873 $operateurs = array(">=", "<=", "+", "-", "&&", "||", "==", "!=");
4736 mbroquet 3730 // Supprime tous les espaces de la chaîne de caractère
4737     $restriction = str_replace(' ', '', $restriction);
4738    
4739     // Met des espace avant et après les opérateurs puis transforme la
4740     // chaine en un tableau
4741     $tabRestriction = str_replace($operateurs, " ", $restriction);
4742     // Tableau des champ
4743     $tabRestriction = explode(" ", $tabRestriction);
4744     // Supprime les numériques du tableau
4745     foreach ($tabRestriction as $key => $value) {
4746     if (is_numeric($value)) {
4747     unset($tabRestriction[$key]);
4748     }
4749     }
4750    
4751     // Vérifie les champs utilisés pour la restriction
4752     $check_field_exist = $this->f->check_field_exist($tabRestriction, 'instruction');
4753     if ($check_field_exist !== true) {
4754    
4755     // Liste des champs en erreur
4756     $string_error_fields = implode(", ", $check_field_exist);
4757    
4758     // Message d'erreur
4759     $error_message = _("Le champ %s n'est pas utilisable pour le champ %s");
4760     if (count($check_field_exist) > 1) {
4761     $error_message = _("Les champs %s ne sont pas utilisable pour le champ %s");
4762     }
4763    
4764     // Affiche l'erreur
4765     $this->correct=false;
4766     $this->addToMessage(sprintf($error_message, $string_error_fields, _("restriction")));
4767     $this->addToMessage(_("Veuillez contacter votre administrateur."));
4768     }
4769     }
4770    
4771     }
4772     if(!$this->updateDate("date_envoi_signature")) {
4773     return false;
4774     }
4775     if(!$this->updateDate("date_retour_signature")) {
4776     return false;
4777     }
4778     if(!$this->updateDate("date_envoi_rar")) {
4779     return false;
4780     }
4781     if(!$this->updateDate("date_retour_rar")) {
4782     return false;
4783     }
4784     if(!$this->updateDate("date_envoi_controle_legalite")) {
4785     return false;
4786     }
4787     if(!$this->updateDate("date_retour_controle_legalite")) {
4788     return false;
4789     }
4790    
4791     }
4792 softime 12124
4793     /**
4794     * Récupère et stocket dans un tableau toutes les infos du pétitionnaire
4795     * principal du dossier auquel appartiens l'instruction.
4796     * Renvoie un tableau contenant les informations du pétitionnaire principal.
4797     *
4798     * Si l'identifiant de l'instruction n'a pas pu etre récupéré renvoie false
4799     * et affiche un message dans les logs.
4800     * En cas d'erreur de base de donnée renvoie false et affiche un message d'erreur.
4801     *
4802     * @param string identifiant du dossier
4803     * @return array|boolean
4804     */
4805     protected function get_info_petitionnaire_principal_dossier($dossier = null) {
4806     // Si l'identifiant de l'instruction n'a pas été fournit on récupère celui de
4807     // l'objet courant
4808     if (empty($dossier)) {
4809     $dossier = $this->getVal('dossier');
4810     // Si la récupération de l'identifiant de l'instruction a échoué la méthode renvoie
4811     // false et on affiche un message d'erreur dans les logs
4812     if (empty($dossier)) {
4813     $this->addToLog(__METHOD__.' : L\'identifiant du dossier n\'a pas pu être récupéré');
4814     return false;
4815     }
4816     }
4817    
4818     // Requête sql servant à récupérer toutes les informations relatives au demandeurs
4819     // principal
4820 softime 13137 $qres = $this->f->get_all_results_from_db_query(
4821     sprintf(
4822     'SELECT
4823     -- Récupère toutes les informations du demandeur principal
4824     demandeur.*,
4825     CASE
4826     WHEN demandeur.qualite=\'particulier\'
4827     THEN TRIM(CONCAT(demandeur.particulier_nom, \' \', demandeur.particulier_prenom, \' \', demandeur.courriel))
4828     ELSE
4829     TRIM(CONCAT(demandeur.personne_morale_raison_sociale, \' \', demandeur.personne_morale_denomination, \' \', demandeur.courriel))
4830     END AS destinataire
4831     FROM
4832     %1$sdossier
4833     LEFT JOIN %1$slien_dossier_demandeur
4834     ON lien_dossier_demandeur.dossier = dossier.dossier
4835     LEFT JOIN %1$sdemandeur
4836     ON demandeur.demandeur = lien_dossier_demandeur.demandeur
4837     WHERE
4838     dossier.dossier = \'%2$s\'
4839     AND lien_dossier_demandeur.petitionnaire_principal IS TRUE',
4840     DB_PREFIXE,
4841     $this->f->db->escapeSimple($dossier)
4842     ),
4843     array(
4844     "origin" => __METHOD__,
4845     )
4846 softime 12124 );
4847 softime 13137 if (is_array($qres["result"]) === true
4848     && array_key_exists(0, $qres["result"]) === true) {
4849     //
4850     return $qres["result"][0];
4851 softime 12124 }
4852 softime 13137 return null;
4853 softime 12124 }
4854    
4855    
4856 mbroquet 3730
4857     /**
4858     * Finalisation des documents.
4859     * @param string $champ champ du fichier à finaliser
4860     * @param booleen $status permet de définir si on finalise ou définalise
4861     * @param string $sousform permet de savoir si se trouve dans un sousformulaire (passé au javascript)
4862     */
4863     function manage_finalizing($mode = null, $val = array()) {
4864 softime 5024 //
4865     $this->begin_treatment(__METHOD__);
4866 mbroquet 3730
4867 softime 5024 //
4868     $id_inst = $this->getVal($this->clePrimaire);
4869 mbroquet 3730
4870 softime 5024 //
4871     $admin_msg_error = _("Veuillez contacter votre administrateur.");
4872     $file_msg_error = _("Erreur de traitement de fichier.")
4873     ." ".$admin_msg_error;
4874     $bdd_msg_error = _("Erreur de base de données.")
4875     ." ".$admin_msg_error;
4876 softime 5169 $log_msg_error = "Finalisation non enregistrée - id instruction = %s - uid fichier = %s";
4877 mbroquet 3730
4878     // Si on finalise le document
4879     if ($mode == "finalize"){
4880 softime 5024 //
4881     $etat = _('finalisation');
4882 mbroquet 3730
4883     // Récupère la collectivite du dossier d'instruction
4884     $dossier_instruction_om_collectivite = $this->get_dossier_instruction_om_collectivite();
4885    
4886     //
4887     $collectivite = $this->f->getCollectivite($dossier_instruction_om_collectivite);
4888 softime 8593
4889     //
4890     $params = array(
4891     "specific" => array(),
4892     );
4893     // Si la rédaction libre est activée sur l'instruction
4894     if ($this->getVal("flag_edition_integrale") == 't') {
4895     $params["specific"]["corps"] = array(
4896     "mode" => "set",
4897     "value" => $this->getVal("corps_om_htmletatex"),
4898     );
4899     $params["specific"]["titre"] = array(
4900     "mode" => "set",
4901     "value" => $this->getVal("titre_om_htmletat"),
4902     );
4903     }
4904 mbroquet 3730 // Génération du PDF
4905 softime 8593 $result = $this->compute_pdf_output('lettretype', $this->getVal('lettretype'), $collectivite, null, $params);
4906 mbroquet 3730 $pdf_output = $result['pdf_output'];
4907 softime 10573
4908 mbroquet 3730 //Métadonnées du document
4909     $metadata = array(
4910 softime 5024 'filename' => 'instruction_'.$id_inst.'.pdf',
4911 mbroquet 3730 'mimetype' => 'application/pdf',
4912     'size' => strlen($pdf_output)
4913     );
4914    
4915     // Récupération des métadonnées calculées après validation
4916     $spe_metadata = $this->getMetadata("om_fichier_instruction");
4917    
4918     //On vérifie si l'instruction à finaliser a un événement de type arrete
4919     $sql = "SELECT type
4920     FROM ".DB_PREFIXE."evenement
4921     WHERE evenement = ".$this->getVal("evenement");
4922 softime 8989 $typeEvenement = $this->f->db->getOne($sql);
4923 mbroquet 3730 $this->addToLog(__METHOD__."(): db->getOne(\"".$sql."\");", VERBOSE_MODE);
4924 softime 5024 if ($this->f->isDatabaseError($typeEvenement, true) === true) {
4925     $this->correct = false;
4926     $this->addToMessage($bdd_msg_error);
4927     return $this->end_treatment(__METHOD__, false);
4928 mbroquet 3730 }
4929    
4930     //Initialisation de la variable
4931     $arrete_metadata = array();
4932     // Si l'événement est de type arrete, on ajoute les métadonnées spécifiques
4933     if ( $typeEvenement === 'arrete' ){
4934     $arrete_metadata = $this->getMetadata("arrete");
4935     }
4936    
4937     $metadata = array_merge($metadata, $spe_metadata, $arrete_metadata);
4938    
4939 softime 10573 /*
4940     // transforme le tableau de métadonnées en objet
4941     $mdf = new MetadataFactory();
4942     $md = $mdf->build('Instruction', $metadata);
4943     */
4944    
4945 softime 5024 // Si le document a déjà été finalisé on le met à jour
4946     // en conservant son UID
4947 mbroquet 3730 if ($this->getVal("om_fichier_instruction") != ''){
4948     $uid = $this->f->storage->update(
4949     $this->getVal("om_fichier_instruction"), $pdf_output, $metadata);
4950     }
4951 softime 5024 // Sinon on crée un nouveau document et dont on récupère l'UID
4952 mbroquet 3730 else {
4953 softime 10573 $uid = $this->f->storage->create($pdf_output, $metadata, "from_content", $this->table.".om_fichier_instruction");
4954 mbroquet 3730 }
4955     }
4956    
4957 softime 5024 // Si on définalise le document
4958 mbroquet 3730 if ($mode == "unfinalize") {
4959 softime 5024 //
4960     $etat = _('définalisation');
4961 mbroquet 3730 // Récupération de l'uid du document finalisé
4962     $uid = $this->getVal("om_fichier_instruction");
4963     }
4964 softime 5024
4965     // Si on définalise l'UID doit être défini
4966     // Si on finalise la création/modification du fichier doit avoir réussi
4967 mbroquet 3730 if ($uid == '' || $uid == 'OP_FAILURE' ) {
4968 softime 5024 $this->correct = false;
4969     $this->addToMessage($file_msg_error);
4970 softime 8989 $this->addToLog(sprintf($log_msg_error, $id_inst, $uid), DEBUG_MODE);
4971 softime 5024 return $this->end_treatment(__METHOD__, false);
4972 mbroquet 3730 }
4973    
4974     //
4975     foreach ($this->champs as $key => $champ) {
4976     //
4977     $val[$champ] = $this->val[$key];
4978     }
4979    
4980     //
4981 softime 6565 $val['date_evenement'] = $this->dateDBToForm($val['date_evenement']);
4982     $val['archive_date_complet'] = $this->dateDBToForm($val['archive_date_complet']);
4983     $val['archive_date_rejet'] = $this->dateDBToForm($val['archive_date_rejet']);
4984     $val['archive_date_limite'] = $this->dateDBToForm($val['archive_date_limite']);
4985     $val['archive_date_notification_delai'] = $this->dateDBToForm($val['archive_date_notification_delai']);
4986     $val['archive_date_decision'] = $this->dateDBToForm($val['archive_date_decision']);
4987     $val['archive_date_validite'] = $this->dateDBToForm($val['archive_date_validite']);
4988     $val['archive_date_achevement'] = $this->dateDBToForm($val['archive_date_achevement']);
4989     $val['archive_date_chantier'] = $this->dateDBToForm($val['archive_date_chantier']);
4990     $val['archive_date_conformite'] = $this->dateDBToForm($val['archive_date_conformite']);
4991     $val['archive_date_dernier_depot'] = $this->dateDBToForm($val['archive_date_dernier_depot']);
4992     $val['archive_date_limite_incompletude'] = $this->dateDBToForm($val['archive_date_limite_incompletude']);
4993     $val['date_finalisation_courrier'] = $this->dateDBToForm($val['date_finalisation_courrier']);
4994     $val['date_envoi_signature'] = $this->dateDBToForm($val['date_envoi_signature']);
4995     $val['date_retour_signature'] = $this->dateDBToForm($val['date_retour_signature']);
4996     $val['date_envoi_rar'] = $this->dateDBToForm($val['date_envoi_rar']);
4997     $val['date_retour_rar'] = $this->dateDBToForm($val['date_retour_rar']);
4998     $val['date_envoi_controle_legalite'] = $this->dateDBToForm($val['date_envoi_controle_legalite']);
4999     $val['date_retour_controle_legalite'] = $this->dateDBToForm($val['date_retour_controle_legalite']);
5000     $val['archive_date_cloture_instruction'] = $this->dateDBToForm($val['archive_date_cloture_instruction']);
5001     $val['archive_date_premiere_visite'] = $this->dateDBToForm($val['archive_date_premiere_visite']);
5002     $val['archive_date_derniere_visite'] = $this->dateDBToForm($val['archive_date_derniere_visite']);
5003     $val['archive_date_contradictoire'] = $this->dateDBToForm($val['archive_date_contradictoire']);
5004     $val['archive_date_retour_contradictoire'] = $this->dateDBToForm($val['archive_date_retour_contradictoire']);
5005     $val['archive_date_ait'] = $this->dateDBToForm($val['archive_date_ait']);
5006     $val['archive_date_transmission_parquet'] = $this->dateDBToForm($val['archive_date_transmission_parquet']);
5007 softime 8989 $val['archive_date_affichage'] = $this->dateDBToForm($val['archive_date_affichage']);
5008 mbroquet 3730 $this->setvalF($val);
5009    
5010     // Verification de la validite des donnees
5011 softime 8989 $this->verifier($this->val);
5012 mbroquet 3730 // Si les verifications precedentes sont correctes, on procede a
5013     // la modification, sinon on ne fait rien et on retourne une erreur
5014 softime 5024 if ($this->correct === true) {
5015 mbroquet 3730 //
5016     $valF = array(
5017     "om_fichier_instruction" => $uid,
5018     "date_finalisation_courrier" => date('Y-m-d')
5019     );
5020     //
5021     if($mode=="finalize") {
5022     // état finalisé vrai
5023 softime 5024 $valF["om_final_instruction"] = true;
5024 mbroquet 3730 // ajout log utilisateur
5025     $login = $_SESSION['login'];
5026     $nom = "";
5027     $this->f->getUserInfos();
5028     if (isset($this->f->om_utilisateur["nom"])
5029     && !empty($this->f->om_utilisateur["nom"])) {
5030     $nom = $this->f->om_utilisateur["nom"];
5031     }
5032     $valF["om_final_instruction_utilisateur"] = $_SESSION['login'];
5033     if ($nom != "") {
5034     $valF["om_final_instruction_utilisateur"] .= " (".$nom.")";
5035     }
5036     } else {
5037     // état finalisé faux
5038 softime 5024 $valF["om_final_instruction"] = false;
5039 mbroquet 3730 // suppression log utilisateur
5040     $valF["om_final_instruction_utilisateur"] = '';
5041     }
5042    
5043     // Execution de la requête de modification des donnees de l'attribut
5044     // valF de l'objet dans l'attribut table de l'objet
5045 softime 8989 $res = $this->f->db->autoExecute(DB_PREFIXE.$this->table, $valF,
5046 softime 5024 DB_AUTOQUERY_UPDATE, $this->getCle($id_inst));
5047     $this->addToLog(__METHOD__."() : db->autoExecute(\"".DB_PREFIXE.$this->table."\", ".print_r($valF, true).", DB_AUTOQUERY_UPDATE, \"".$this->getCle($id_inst)."\")", VERBOSE_MODE);
5048     //
5049     if ($this->f->isDatabaseError($res, true) === true) {
5050     $this->correct = false;
5051     $this->addToMessage($bdd_msg_error);
5052     return $this->end_treatment(__METHOD__, false);
5053     }
5054 mbroquet 3730
5055 softime 5024 //
5056     $this->addToMessage(sprintf(_("La %s du document s'est effectuee avec succes."), $etat));
5057     //
5058     if ($this->add_log_to_dossier($id_inst, $val) === false) {
5059     return $this->end_treatment(__METHOD__, false);
5060     }
5061     //
5062     return $this->end_treatment(__METHOD__, true);
5063 mbroquet 3730 }
5064 softime 5024 // L'appel de verifier() a déjà positionné correct à false
5065     // et défini un message d'erreur.
5066 softime 8989 $this->addToLog(sprintf($log_msg_error, $id_inst, $uid), DEBUG_MODE);
5067 softime 5024 return $this->end_treatment(__METHOD__, false);
5068 mbroquet 3730 }
5069    
5070     /**
5071     * Récupération du numéro de dossier d'instruction à ajouter aux métadonnées
5072     * @return string numéro de dossier d'instruction
5073     */
5074 softime 10573 protected function getDossier($champ = null) {
5075 mbroquet 3730 if(empty($this->specificMetadata)) {
5076     $this->getSpecificMetadata();
5077     }
5078     return $this->specificMetadata->dossier;
5079     }
5080     /**
5081     * Récupération la version du dossier d'instruction à ajouter aux métadonnées
5082     * @return int Version
5083     */
5084     protected function getDossierVersion() {
5085     if(empty($this->specificMetadata)) {
5086     $this->getSpecificMetadata();
5087     }
5088     return $this->specificMetadata->version;
5089     }
5090     /**
5091     * Récupération du numéro de dossier d'autorisation à ajouter aux métadonnées
5092     * @return string numéro de dossier d'autorisation
5093     */
5094     protected function getNumDemandeAutor() {
5095     if(empty($this->specificMetadata)) {
5096     $this->getSpecificMetadata();
5097     }
5098     return $this->specificMetadata->dossier_autorisation;
5099     }
5100     /**
5101     * Récupération de la date de demande initiale du dossier à ajouter aux métadonnées
5102     * @return date de la demande initiale
5103     */
5104     protected function getAnneemoisDemandeAutor() {
5105     if(empty($this->specificMetadata)) {
5106     $this->getSpecificMetadata();
5107     }
5108     return $this->specificMetadata->date_demande_initiale;
5109     }
5110     /**
5111     * Récupération du type de dossier d'instruction à ajouter aux métadonnées
5112     * @return string type du dossier d'instruction
5113     */
5114     protected function getTypeInstruction() {
5115     if(empty($this->specificMetadata)) {
5116     $this->getSpecificMetadata();
5117     }
5118     return $this->specificMetadata->dossier_instruction_type;
5119     }
5120     /**
5121     * Récupération du statut du dossier d'autorisation à ajouter aux métadonnées
5122     * @return string avis
5123     */
5124     protected function getStatutAutorisation() {
5125     if(empty($this->specificMetadata)) {
5126     $this->getSpecificMetadata();
5127     }
5128     return $this->specificMetadata->statut;
5129     }
5130     /**
5131     * Récupération du type de dossier d'autorisation à ajouter aux métadonnées
5132     * @return string type du dossier d'autorisation
5133     */
5134     protected function getTypeAutorisation() {
5135     if(empty($this->specificMetadata)) {
5136     $this->getSpecificMetadata();
5137     }
5138     return $this->specificMetadata->dossier_autorisation_type;
5139     }
5140     /**
5141     * Récupération de la date d'ajout de document à ajouter aux métadonnées
5142     * @return date de l'évènement
5143     */
5144     protected function getDateEvenementDocument() {
5145     return date("Y-m-d");
5146     }
5147     /**
5148     * Récupération du groupe d'instruction à ajouter aux métadonnées
5149     * @return string Groupe d'instruction
5150     */
5151     protected function getGroupeInstruction() {
5152     if(empty($this->specificMetadata)) {
5153     $this->getSpecificMetadata();
5154     }
5155     return $this->specificMetadata->groupe_instruction;
5156     }
5157     /**
5158     * Récupération du libellé du type du document à ajouter aux métadonnées
5159     * @return string Groupe d'instruction
5160     */
5161     protected function getTitle() {
5162    
5163     // Récupère le champ événement
5164     if (isset($this->valF["evenement"]) AND $this->valF["evenement"] != "") {
5165     $evenement = $this->valF["evenement"];
5166     } else {
5167     $evenement = $this->getVal("evenement");
5168     }
5169    
5170     // Requête sql
5171     $sql = "SELECT libelle FROM ".DB_PREFIXE."evenement
5172     WHERE evenement=".$evenement;
5173 softime 12847 $evenement_libelle = $this->f->db->getone($sql);
5174     $this->addToLog(__METHOD__."(): db->getone(\"".$sql."\");", VERBOSE_MODE);
5175     $this->f->isDatabaseError($evenement_libelle);
5176 mbroquet 3730 // Retourne le libelle de l'événement
5177     return $evenement_libelle;
5178     }
5179    
5180 softime 6272
5181 mbroquet 3730 /**
5182 softime 6272 * Récupération du champ ERP du dossier d'instruction.
5183     *
5184     * @return boolean
5185     */
5186     public function get_concerne_erp() {
5187     //
5188     if(empty($this->specificMetadata)) {
5189     $this->getSpecificMetadata();
5190     }
5191     //
5192     return $this->specificMetadata->erp;
5193     }
5194    
5195    
5196     /**
5197 mbroquet 3730 * Cette méthode permet de stocker en attribut toutes les métadonnées
5198     * nécessaire à l'ajout d'un document.
5199     */
5200     public function getSpecificMetadata() {
5201     if (isset($this->valF["dossier"]) AND $this->valF["dossier"] != "") {
5202     $dossier = $this->valF["dossier"];
5203     } else {
5204     $dossier = $this->getVal("dossier");
5205     }
5206     //Requête pour récupérer les informations essentiels sur le dossier d'instruction
5207     $sql = "SELECT dossier.dossier as dossier,
5208     dossier_autorisation.dossier_autorisation as dossier_autorisation,
5209     to_char(dossier.date_demande, 'YYYY/MM') as date_demande_initiale,
5210     dossier_instruction_type.code as dossier_instruction_type,
5211     etat_dossier_autorisation.libelle as statut,
5212     dossier_autorisation_type.code as dossier_autorisation_type,
5213 softime 6272 groupe.code as groupe_instruction,
5214     CASE WHEN dossier.erp IS TRUE
5215     THEN 'true'
5216     ELSE 'false'
5217     END as erp
5218 mbroquet 3730 FROM ".DB_PREFIXE."dossier
5219     LEFT JOIN ".DB_PREFIXE."dossier_instruction_type
5220     ON dossier.dossier_instruction_type = dossier_instruction_type.dossier_instruction_type
5221     LEFT JOIN ".DB_PREFIXE."dossier_autorisation
5222     ON dossier.dossier_autorisation = dossier_autorisation.dossier_autorisation
5223     LEFT JOIN ".DB_PREFIXE."etat_dossier_autorisation
5224     ON dossier_autorisation.etat_dossier_autorisation = etat_dossier_autorisation.etat_dossier_autorisation
5225     LEFT JOIN ".DB_PREFIXE."dossier_autorisation_type_detaille
5226     ON dossier_autorisation.dossier_autorisation_type_detaille = dossier_autorisation_type_detaille.dossier_autorisation_type_detaille
5227     LEFT JOIN ".DB_PREFIXE."dossier_autorisation_type
5228     ON dossier_autorisation_type_detaille.dossier_autorisation_type = dossier_autorisation_type.dossier_autorisation_type
5229     LEFT JOIN ".DB_PREFIXE."groupe
5230     ON dossier_autorisation_type.groupe = groupe.groupe
5231     WHERE dossier.dossier = '".$dossier."'";
5232 softime 8989 $res = $this->f->db->query($sql);
5233 softime 12847 $this->addToLog(__METHOD__."(): db->query(\"".$sql."\");", VERBOSE_MODE);
5234     $this->f->isDatabaseError($res);
5235 mbroquet 3730 //Le résultat est récupéré dans un objet
5236     $row =& $res->fetchRow(DB_FETCHMODE_OBJECT);
5237    
5238     //Si il y a un résultat
5239     if ($row !== null) {
5240    
5241 fmichon 3892 // Instrance de la classe dossier
5242     $inst_dossier = $this->get_inst_dossier($dossier);
5243    
5244     // Insère l'attribut version à l'objet
5245     $row->version = $inst_dossier->get_dossier_instruction_version();
5246    
5247 mbroquet 3730 //Alors on créé l'objet dossier_instruction
5248     $this->specificMetadata = $row;
5249    
5250     }
5251     }
5252    
5253     /**
5254     * Retourne le statut du dossier d'instruction
5255     * @param string $idx Identifiant du dossier d'instruction
5256     * @return string Le statut du dossier d'instruction
5257     */
5258     function getStatutAutorisationDossier($idx){
5259    
5260     $statut = '';
5261    
5262     //Si l'identifiant du dossier d'instruction fourni est correct
5263     if ( $idx != '' ){
5264    
5265     //On récupère le statut de l'état du dossier à partir de l'identifiant du
5266     //dossier
5267     $sql = "SELECT etat.statut
5268     FROM ".DB_PREFIXE."dossier
5269     LEFT JOIN
5270     ".DB_PREFIXE."etat
5271     ON
5272     dossier.etat = etat.etat
5273     WHERE dossier ='".$idx."'";
5274 softime 12847 $statut = $this->f->db->getone($sql);
5275     $this->addToLog(__METHOD__."(): db->getone(\"".$sql."\")", VERBOSE_MODE);
5276     $this->f->isDatabaseError($statut);
5277 mbroquet 3730 }
5278     return $statut;
5279     }
5280    
5281     /**
5282     * Récupère les données du dossier
5283     * @return array
5284     */
5285     function get_dossier_actual() {
5286    
5287     // Initialisation de la valeur de retour
5288     $return = array();
5289    
5290     // Récupération de toutes les valeurs du dossier d'instruction en cours
5291     $sql = "SELECT * FROM ".DB_PREFIXE."dossier
5292     WHERE dossier='".$this->valF['dossier']."'";
5293 softime 8989 $res = $this->f->db->query($sql);
5294 softime 12847 $this->addToLog(__METHOD__."(): db->query(\"".$sql."\");", VERBOSE_MODE);
5295 mbroquet 3730 $this->f->isDatabaseError($res);
5296    
5297     //
5298     while ($row=& $res->fetchRow(DB_FETCHMODE_ASSOC)) {
5299    
5300     // Récupération de la valeur actuelle du délai, de l'accord tacite,
5301     // de l'état et de l'avis du dossier d'instruction
5302 softime 6565 $return['archive_delai'] = $row['delai'];
5303     $return['archive_accord_tacite'] = $row['accord_tacite'];
5304     $return['archive_etat'] = $row['etat'];
5305     $return['archive_avis'] = $row['avis_decision'];
5306     // Récupération de la valeur actuelle des dates du dossier
5307 mbroquet 3730 // d'instruction
5308 softime 6565 $return['archive_date_complet'] = $row['date_complet'];
5309     $return['archive_date_dernier_depot'] = $row['date_dernier_depot'];
5310     $return['archive_date_rejet'] = $row['date_rejet'];
5311     $return['archive_date_limite'] = $row['date_limite'];
5312     $return['archive_date_notification_delai'] = $row['date_notification_delai'];
5313     $return['archive_date_decision'] = $row['date_decision'];
5314     $return['archive_date_validite'] = $row['date_validite'];
5315     $return['archive_date_achevement'] = $row['date_achevement'];
5316     $return['archive_date_chantier'] = $row['date_chantier'];
5317     $return['archive_date_conformite'] = $row['date_conformite'];
5318     $return['archive_incompletude'] = $row['incompletude'];
5319     $return['archive_incomplet_notifie'] = $row['incomplet_notifie'];
5320     $return['archive_evenement_suivant_tacite'] = $row['evenement_suivant_tacite'];
5321     $return['archive_evenement_suivant_tacite_incompletude'] = $row['evenement_suivant_tacite_incompletude'];
5322     $return['archive_etat_pendant_incompletude'] = $row['etat_pendant_incompletude'];
5323     $return['archive_date_limite_incompletude'] = $row['date_limite_incompletude'];
5324     $return['archive_delai_incompletude'] = $row['delai_incompletude'];
5325     $return['archive_autorite_competente'] = $row['autorite_competente'];
5326 softime 8593 $return['archive_dossier_instruction_type'] = $row['dossier_instruction_type'];
5327 softime 6565 $return['duree_validite'] = $row['duree_validite'];
5328     $return['date_depot'] = $row['date_depot'];
5329 softime 10573 $return['date_depot_mairie'] = $row['date_depot_mairie'];
5330 softime 6565 $return['archive_date_cloture_instruction'] = $row['date_cloture_instruction'];
5331     $return['archive_date_premiere_visite'] = $row['date_premiere_visite'];
5332     $return['archive_date_derniere_visite'] = $row['date_derniere_visite'];
5333     $return['archive_date_contradictoire'] = $row['date_contradictoire'];
5334     $return['archive_date_retour_contradictoire'] = $row['date_retour_contradictoire'];
5335     $return['archive_date_ait'] = $row['date_ait'];
5336     $return['archive_date_transmission_parquet'] = $row['date_transmission_parquet'];
5337 softime 8989 $return['archive_date_affichage'] = $row['date_affichage'];
5338 softime 10573 $return['archive_pec_metier'] = $row['pec_metier'];
5339     $return['archive_a_qualifier'] = $row['a_qualifier'];
5340 mbroquet 3730 }
5341    
5342     // Retour de la fonction
5343     return $return;
5344    
5345     }
5346    
5347     /**
5348     * Permet de vérifier qu'un événement est verrouillable
5349     * @param integer $idx Identifiant de l'instruction
5350     * @return boolean
5351     */
5352     function checkEvenementNonVerrouillable($idx) {
5353    
5354     // Initialisation du résultat
5355     $non_verrouillable = false;
5356    
5357     // Si la condition n'est pas vide
5358     if ($idx != "") {
5359    
5360     // Requête SQL
5361     $sql = "SELECT evenement.non_verrouillable
5362     FROM ".DB_PREFIXE."evenement
5363     LEFT JOIN ".DB_PREFIXE."instruction
5364     ON instruction.evenement = evenement.evenement
5365     WHERE instruction.instruction = $idx";
5366     $this->f->addToLog("checkEvenementNonVerrouillable() : db->getOne(\"".$sql."\")", VERBOSE_MODE);
5367 softime 8989 $res = $this->f->db->getOne($sql);
5368 mbroquet 3730 $this->f->isDatabaseError($res);
5369    
5370     // Si le retour de la requête est true
5371     if ($res == 't') {
5372     //
5373     $non_verrouillable = true;
5374     }
5375     }
5376    
5377     // Retourne résultat
5378     return $non_verrouillable;
5379     }
5380    
5381     /**
5382     * Mise à jour des champs archive_*
5383     * @param mixed $row La ligne de données
5384     */
5385     public function updateArchiveData($row){
5386    
5387     // Récupération de la valeur actuelle du délai, de l'accord tacite,
5388     // de l'état et de l'avis du dossier d'instruction
5389     $this->valF['archive_delai']=$row['delai'];
5390     $this->valF['archive_accord_tacite']=$row['accord_tacite'];
5391     $this->valF['archive_etat']=$row['etat'];
5392     $this->valF['archive_avis']=$row['avis_decision'];
5393     // Récupération de la valeur actuelle des 9 dates du dossier
5394     // d'instruction
5395     if ($row['date_complet'] != '') {
5396     $this->valF['archive_date_complet']=$row['date_complet'];
5397     }
5398     if ($row['date_dernier_depot'] != '') {
5399     $this->valF['archive_date_dernier_depot']=$row['date_dernier_depot'];
5400     }
5401 softime 6565 if ($row['date_rejet'] != '') {
5402 mbroquet 3730 $this->valF['archive_date_rejet']= $row['date_rejet'];
5403     }
5404 softime 6565 if ($row['date_limite'] != '') {
5405 mbroquet 3730 $this->valF['archive_date_limite']= $row['date_limite'];
5406     }
5407 softime 6565 if ($row['date_notification_delai'] != '') {
5408 mbroquet 3730 $this->valF['archive_date_notification_delai']= $row['date_notification_delai'];
5409     }
5410 softime 6565 if ($row['date_decision'] != '') {
5411 mbroquet 3730 $this->valF['archive_date_decision']= $row['date_decision'];
5412     }
5413 softime 6565 if ($row['date_validite'] != '') {
5414 mbroquet 3730 $this->valF['archive_date_validite']= $row['date_validite'];
5415     }
5416 softime 6565 if ($row['date_achevement'] != '') {
5417 mbroquet 3730 $this->valF['archive_date_achevement']= $row['date_achevement'];
5418     }
5419 softime 6565 if ($row['date_chantier'] != '') {
5420 mbroquet 3730 $this->valF['archive_date_chantier']= $row['date_chantier'];
5421     }
5422 softime 6565 if ($row['date_conformite'] != '') {
5423 mbroquet 3730 $this->valF['archive_date_conformite']= $row['date_conformite'];
5424     }
5425 softime 6565 if ($row['incompletude'] != '') {
5426 mbroquet 3730 $this->valF['archive_incompletude']= $row['incompletude'];
5427     }
5428 softime 6565 if ($row['incomplet_notifie'] != '') {
5429 mbroquet 3730 $this->valF['archive_incomplet_notifie']= $row['incomplet_notifie'];
5430     }
5431 softime 6565 if ($row['evenement_suivant_tacite'] != '') {
5432 mbroquet 3730 $this->valF['archive_evenement_suivant_tacite']= $row['evenement_suivant_tacite'];
5433     }
5434 softime 6565 if ($row['evenement_suivant_tacite_incompletude'] != '') {
5435 mbroquet 3730 $this->valF['archive_evenement_suivant_tacite_incompletude']= $row['evenement_suivant_tacite_incompletude'];
5436     }
5437 softime 6565 if ($row['etat_pendant_incompletude'] != '') {
5438 mbroquet 3730 $this->valF['archive_etat_pendant_incompletude']= $row['etat_pendant_incompletude'];
5439     }
5440 softime 6565 if ($row['date_limite_incompletude'] != '') {
5441 mbroquet 3730 $this->valF['archive_date_limite_incompletude']= $row['date_limite_incompletude'];
5442     }
5443 softime 6565 if ($row['delai_incompletude'] != '') {
5444 mbroquet 3730 $this->valF['archive_delai_incompletude']= $row['delai_incompletude'];
5445     }
5446 softime 6565 if ($row['autorite_competente'] != '') {
5447 mbroquet 3730 $this->valF['archive_autorite_competente']= $row['autorite_competente'];
5448     }
5449 softime 6565 if ($row['duree_validite'] != '') {
5450 mbroquet 3730 $this->valF['duree_validite']= $row['duree_validite'];
5451     }
5452 softime 6565 if ($row['date_depot'] != '') {
5453 nmeucci 3873 $this->valF['date_depot']= $row['date_depot'];
5454     }
5455 softime 10573 if ($row['date_depot_mairie'] != '') {
5456     $this->valF['date_depot_mairie']= $row['date_depot_mairie'];
5457     }
5458 softime 6565 // Dates concernant les dossiers contentieux
5459     if ($row['date_cloture_instruction'] != '') {
5460     $this->valF['archive_date_cloture_instruction']= $row['date_cloture_instruction'];
5461     }
5462     if ($row['date_premiere_visite'] != '') {
5463     $this->valF['archive_date_premiere_visite']= $row['date_premiere_visite'];
5464     }
5465     if ($row['date_derniere_visite'] != '') {
5466     $this->valF['archive_date_derniere_visite']= $row['date_derniere_visite'];
5467     }
5468     if ($row['date_contradictoire'] != '') {
5469     $this->valF['archive_date_contradictoire']= $row['date_contradictoire'];
5470     }
5471     if ($row['date_retour_contradictoire'] != '') {
5472     $this->valF['archive_date_retour_contradictoire']= $row['date_retour_contradictoire'];
5473     }
5474     if ($row['date_ait'] != '') {
5475     $this->valF['archive_date_ait']= $row['date_ait'];
5476     }
5477     if ($row['date_transmission_parquet'] != '') {
5478     $this->valF['archive_date_transmission_parquet']= $row['date_transmission_parquet'];
5479     }
5480 softime 8989 //
5481 softime 8593 if ($row['dossier_instruction_type'] != '') {
5482     $this->valF['archive_dossier_instruction_type']= $row['dossier_instruction_type'];
5483     }
5484 softime 8989 if ($row['date_affichage'] != '') {
5485     $this->valF['archive_date_affichage']= $row['date_affichage'];
5486     }
5487 softime 10573 if (isset($row['pec_metier']) === true && $row['pec_metier'] != '') {
5488     $this->valF['archive_pec_metier']= $row['pec_metier'];
5489     }
5490     if (isset($row['a_qualifier']) === true && $row['a_qualifier'] != '') {
5491     $this->valF['archive_a_qualifier']= $row['a_qualifier'];
5492     }
5493 mbroquet 3730 }
5494    
5495     // {{{
5496     // Méthodes de récupération des métadonnées arrêté
5497     /**
5498     * @return string Retourne le numéro d'arrêté
5499     */
5500     function getNumArrete() {
5501     return $this->getVal("numero_arrete");
5502     }
5503     /**
5504     * @return chaîne vide
5505     */
5506     function getReglementaireArrete() {
5507     return 'true';
5508     }
5509     /**
5510     * @return boolean de notification au pétitionnaire
5511     */
5512     function getNotificationArrete() {
5513     return 'true';
5514     }
5515     /**
5516     * @return date de notification au pétitionnaire
5517     */
5518     function getDateNotificationArrete() {
5519     if (empty($this->metadonneesArrete)) {
5520     $this->getArreteMetadata();
5521     }
5522     return $this->metadonneesArrete["datenotification"];
5523     }
5524     /**
5525     * @return boolean check si le document est passé au contrôle de légalité
5526     */
5527     function getControleLegalite() {
5528     return 'true';
5529     }
5530     /**
5531     * @return date de signature de l'arrêté
5532     */
5533     function getDateSignature() {
5534     if (empty($this->metadonneesArrete)) {
5535     $this->getArreteMetadata();
5536     }
5537     return $this->metadonneesArrete["datesignaturearrete"];
5538     }
5539     /**
5540     * @return string nom du signataire
5541     */
5542     function getNomSignataire() {
5543     if (empty($this->metadonneesArrete)) {
5544     $this->getArreteMetadata();
5545     }
5546     return $this->metadonneesArrete["nomsignataire"];
5547     }
5548     /**
5549     * @return string qualité du signataire
5550     */
5551     function getQualiteSignataire() {
5552     if (empty($this->metadonneesArrete)) {
5553     $this->getArreteMetadata();
5554     }
5555     return $this->metadonneesArrete["qualitesignataire"];
5556     }
5557     /**
5558     * @return string numéro du terrain
5559     */
5560     function getAp_numRue() {
5561     if (empty($this->metadonneesArrete)) {
5562     $this->getArreteMetadata();
5563     }
5564     return $this->metadonneesArrete["ap_numrue"];
5565     }
5566     /**
5567     * @return string nom de la rue du terrain
5568     */
5569     function getAp_nomDeLaVoie() {
5570     if (empty($this->metadonneesArrete)) {
5571     $this->getArreteMetadata();
5572     }
5573     return $this->metadonneesArrete["ap_nomdelavoie"];
5574     }
5575     /**
5576     * @return string code postal du terrain
5577     */
5578     function getAp_codePostal() {
5579     if (empty($this->metadonneesArrete)) {
5580     $this->getArreteMetadata();
5581     }
5582     return $this->metadonneesArrete["ap_codepostal"];
5583     }
5584     /**
5585     * @return string ville du terrain
5586     */
5587     function getAp_ville() {
5588     if (empty($this->metadonneesArrete)) {
5589     $this->getArreteMetadata();
5590     }
5591     return $this->metadonneesArrete["ap_ville"];
5592     }
5593     /**
5594     * @return string activité
5595     */
5596     function getActivite() {
5597     return "Droit du sol";
5598     }
5599     /**
5600     * @return string date du retour de controle légalité
5601     */
5602     function getDateControleLegalite() {
5603     if (empty($this->metadonneesArrete)) {
5604     $this->getArreteMetadata();
5605     }
5606     return $this->metadonneesArrete["datecontrolelegalite"];
5607     }
5608    
5609     // Fin des méthodes de récupération des métadonnées
5610     // }}}
5611    
5612     /**
5613     * Méthode de récupération des métadonnées arrêtés dans la base de données,
5614     * les données sont stockés dans l'attribut $this->metadonneesArrete
5615     */
5616     function getArreteMetadata() {
5617    
5618     //Récupération de la dernière instruction dont l'événement est de type 'arrete'
5619     $this->metadonneesArrete = array("nomsignataire"=>"", "qualitesignataire"=>"",
5620     "decisionarrete"=>"", "datenotification"=>"", "datesignaturearrete"=>"",
5621     "datecontrolelegalite"=>"", "ap_numrue"=>"", "ap_nomdelavoie"=>"",
5622     "ap_codepostal"=>"", "ap_ville"=>"");
5623    
5624 softime 10573 $sqlArrete = "SELECT
5625     signataire_arrete.prenom || ' ' ||signataire_arrete.nom as \"nomsignataire\",
5626 mbroquet 3730 signataire_arrete.qualite as \"qualitesignataire\",
5627     instruction.etat as \"decisionarrete\",
5628     instruction.date_retour_rar as \"datenotification\",
5629     instruction.date_retour_signature as \"datesignaturearrete\",
5630     instruction.date_retour_controle_legalite as \"datecontrolelegalite\",
5631     dossier.terrain_adresse_voie_numero as \"ap_numrue\",
5632     dossier.terrain_adresse_voie as \"ap_nomdelavoie\",
5633     dossier.terrain_adresse_code_postal as \"ap_codepostal\",
5634     dossier.terrain_adresse_localite as \"ap_ville\"
5635     FROM ".DB_PREFIXE."instruction
5636     LEFT JOIN ".DB_PREFIXE."signataire_arrete ON
5637     instruction.signataire_arrete = signataire_arrete.signataire_arrete
5638     LEFT JOIN ".DB_PREFIXE."dossier ON
5639     instruction.dossier = dossier.dossier
5640     LEFT JOIN ".DB_PREFIXE."donnees_techniques ON
5641     donnees_techniques.dossier_instruction = dossier.dossier
5642     WHERE instruction.instruction = ".$this->getVal("instruction");
5643 softime 8989 $resArrete = $this->f->db->query($sqlArrete);
5644 softime 12847 $this->addToLog(__METHOD__."(): db->query(\"".$sqlArrete."\");", VERBOSE_MODE);
5645     $this->f->isDatabaseError($resArrete);
5646 mbroquet 3730 $this->metadonneesArrete = $resArrete->fetchRow(DB_FETCHMODE_ASSOC);
5647     }
5648    
5649     /**
5650     * CONDITION - has_an_edition.
5651     *
5652     * Condition pour afficher le bouton de visualisation de l'édition.
5653     *
5654     * @return boolean
5655     */
5656     function has_an_edition() {
5657     // Récupère la valeur du champ lettretype
5658     $lettretype = $this->getVal("lettretype");
5659     // Si le champ est vide
5660 softime 7521 if ($lettretype !== '' && $lettretype !== null) {
5661 mbroquet 3730 //
5662 softime 7521 return true;
5663 mbroquet 3730 }
5664    
5665     //
5666 softime 7521 return false;
5667 mbroquet 3730 }
5668    
5669     /**
5670 softime 10573 * CONDITION - is_modifiable.
5671     *
5672     * Controle si l'évenement est modifiable.
5673     *
5674     * @return boolean
5675     */
5676     function is_evenement_modifiable() {
5677     $evenement = $this->get_inst_evenement($this->getVal('evenement'));
5678     return ! $this->get_boolean_from_pgsql_value($evenement->getVal('non_modifiable'));
5679     }
5680    
5681     /**
5682 mbroquet 3730 * CONDITION - is_editable.
5683     *
5684     * Condition pour la modification.
5685     *
5686     * @return boolean
5687     */
5688     function is_editable() {
5689 softime 10573
5690     // XXX
5691     // 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é)
5692     // Si cette tâche identifiée est DONE alors la suppression/modification de cette intruction est impossible
5693    
5694 mbroquet 3730 // Contrôle si l'utilisateur possède un bypass
5695 softime 7996 $bypass = $this->f->isAccredited($this->get_absolute_class_name()."_modifier_bypass");
5696 mbroquet 3730 //
5697     if ($bypass == true) {
5698     //
5699     return true;
5700     }
5701 softime 6565
5702 mbroquet 3730 // Si l'utilisateur est un instructeur, que le dossier est cloturé et
5703     // que l'événement n'est pas identifié comme non verrouillable
5704     if ($this->f->isUserInstructeur()
5705     && $this->getStatutAutorisationDossier($this->getParameter("idxformulaire")) == "cloture"
5706     && $this->checkEvenementNonVerrouillable($this->getVal("instruction")) === false) {
5707     //
5708     return false;
5709     }
5710    
5711 softime 6565 // Si l'utilisateur est un intructeur qui correspond à la division du
5712     // dossier
5713     if ($this->is_instructeur_from_division_dossier() === true) {
5714     //
5715     return true;
5716     }
5717    
5718     // Si l'utilisateur est instructeur de la commune du dossier et que
5719     // l'instruction est créée par un instructeur de la commune
5720     if ($this->is_instructeur_from_collectivite_dossier() === true and
5721     $this->getVal('created_by_commune') === 't') {
5722     return true;
5723     }
5724    
5725 mbroquet 3730 //
5726 softime 6565 return false;
5727 mbroquet 3730 }
5728    
5729     /**
5730 softime 10573 * Vérifie si l'événement est supprimable ou pas.
5731     *
5732     * @return boolean
5733     */
5734     function is_evenement_supprimable() {
5735     // Controle si l'évenement est supprimable
5736     $evenement = $this->get_inst_evenement($this->getVal('evenement'));
5737     return ! $this->get_boolean_from_pgsql_value($evenement->getVal('non_supprimable'));
5738     }
5739    
5740     /**
5741 mbroquet 3730 * CONDITION - is_deletable.
5742     *
5743 softime 6864 * Condition pour la suppression.
5744 mbroquet 3730 *
5745     * @return boolean
5746     */
5747     function is_deletable() {
5748 softime 10573
5749     // XXX
5750     // 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é)
5751     // Si cette tâche identifiée est DONE alors la suppression/modification de cette intruction est impossible
5752    
5753 softime 6864 // Contrôle si l'utilisateur possède un bypass intégral
5754 softime 7996 $bypass = $this->f->isAccredited($this->get_absolute_class_name()."_supprimer_bypass");
5755 mbroquet 3730 //
5756     if ($bypass == true) {
5757    
5758     //
5759     return true;
5760     }
5761    
5762     // Si l'utilisateur est un intructeur qui ne correspond pas à la
5763 softime 6864 // division du dossier et si l'utilisateur n'a pas la permission bypass
5764     // de la division
5765     if ($this->is_instructeur_from_division_dossier() === false
5766 softime 7996 && $this->f->isAccredited($this->get_absolute_class_name()."_supprimer_bypass_division") === false) {
5767 mbroquet 3730
5768     //
5769     return false;
5770     }
5771 softime 5024
5772     // l'événement est-il le dernier ?
5773     $dernier_evenement = false;
5774     // instanciation dossier
5775 softime 7996 $dossier = $this->f->get_inst__om_dbform(array(
5776     "obj" => "dossier",
5777     "idx" => $this->getVal('dossier'),
5778     ));
5779 softime 5024 // récupération dernier événement
5780     $id_dernier_evenement = $dossier->get_dernier_evenement();
5781     if ($id_dernier_evenement == $this->getVal($this->clePrimaire)) {
5782     $dernier_evenement = true;
5783     }
5784 mbroquet 3730
5785 softime 5024 // Si dossier cloturé ou si pas dernier événement
5786     // ou de type retour ou si une date est renseignée
5787     // ET utilisateur non administrateur
5788     if ($this->getStatutAutorisationDossier($this->getVal('dossier')) == 'cloture'
5789     || $dernier_evenement == false
5790     || $this->is_evenement_retour($this->getVal("evenement")) == true
5791     || $this->getVal('date_envoi_signature') != ''
5792     || $this->getVal('date_retour_signature') != ''
5793     || $this->getVal('date_envoi_rar') != ''
5794     || $this->getVal('date_retour_rar') != ''
5795     || $this->getVal('date_envoi_controle_legalite') != ''
5796     || $this->getVal('date_retour_controle_legalite') != '') {
5797     // pas le droit de supprimer
5798     return false;;
5799     }
5800    
5801 mbroquet 3730 //
5802     return true;
5803     }
5804 softime 6565
5805    
5806 mbroquet 3730 /**
5807 softime 6565 * Vérifie que l'utilisateur est instructeur et qu'il est de la division du
5808     * dossier.
5809     *
5810     * @return, boolean true/false
5811     */
5812     function is_instructeur_from_collectivite_dossier() {
5813     if ($this->f->isUserInstructeur() === true and
5814     $this->f->om_utilisateur["om_collectivite"] == $this->get_dossier_instruction_om_collectivite()) {
5815     return true;
5816     }
5817     return false;
5818     }
5819    
5820     /**
5821 mbroquet 3730 * CONDITION - is_addable.
5822     *
5823     * Condition pour afficher les boutons modifier et supprimer.
5824     *
5825     * @return boolean
5826     */
5827     function is_addable() {
5828     // Contrôle si l'utilisateur possède un bypass
5829 softime 7996 $bypass = $this->f->isAccredited($this->get_absolute_class_name()."_ajouter_bypass");
5830 mbroquet 3730 //
5831     if ($bypass == true) {
5832    
5833     //
5834     return true;
5835     }
5836 softime 6565 // Si l'utilisateur est un intructeur qui correspond à la
5837     // division du dossier ou qu'il peut changer la décision
5838     if ($this->is_instructeur_from_division_dossier() === true or
5839     $this->isInstrCanChangeDecision($this->getParameter('idxformulaire')) === true) {
5840 mbroquet 3730 //
5841 softime 6565 return true;
5842 mbroquet 3730 }
5843    
5844     //
5845 softime 6565 return false;
5846 mbroquet 3730 }
5847    
5848     /**
5849     * CONDITION - is_finalizable.
5850     *
5851     * Condition pour afficher le bouton.
5852     *
5853     * @return boolean
5854     */
5855     function is_finalizable() {
5856     // Contrôle si l'utilisateur possède un bypass
5857 softime 7996 $bypass = $this->f->isAccredited($this->get_absolute_class_name()."_finaliser_bypass");
5858 mbroquet 3730 //
5859     if ($bypass == true) {
5860     //
5861     return true;
5862     }
5863 softime 6565
5864 mbroquet 3730 // Si l'utilisateur est un instructeur, que le dossier est cloturé et
5865     // que l'événement n'est pas identifié comme non verrouillable
5866     if ($this->f->isUserInstructeur()
5867     && $this->getStatutAutorisationDossier($this->getParameter("idxformulaire")) == "cloture"
5868     && $this->checkEvenementNonVerrouillable($this->getVal("instruction")) === false) {
5869     //
5870     return false;
5871     }
5872 softime 6565
5873     // Si l'utilisateur est un intructeur qui correspond à la division du
5874     // dossier
5875     if ($this->is_instructeur_from_division_dossier() === true) {
5876     //
5877     return true;
5878     }
5879 mbroquet 3730
5880 softime 6565 // Si l'utilisateur est instructeur de la commune du dossier et que
5881     // l'instruction est créée par un instructeur de la commune
5882     if ($this->is_instructeur_from_collectivite_dossier() === true and
5883     $this->getVal('created_by_commune') === 't') {
5884     return true;
5885     }
5886    
5887 mbroquet 3730 //
5888 softime 6565 return false;
5889 mbroquet 3730 }
5890    
5891     /**
5892     * CONDITION - is_finalize_without_bypass.
5893     *
5894     * Condition pour afficher le bouton sans le bypass.
5895     *
5896     * @return boolean [description]
5897     */
5898     function is_finalizable_without_bypass() {
5899     // Récupère la valeur du champ finalisé
5900     $om_final_instruction = $this->getVal('om_final_instruction');
5901    
5902     // Si le rapport n'est pas finalisé
5903     if (empty($om_final_instruction)
5904     || $om_final_instruction == 'f') {
5905     //
5906     return true;
5907     }
5908    
5909     //
5910     return false;
5911     }
5912    
5913     /**
5914     * CONDITION - is_unfinalizable.
5915     *
5916     * Condition pour afficher le bouton.
5917     *
5918     * @return boolean
5919     */
5920     function is_unfinalizable(){
5921     // Contrôle si l'utilisateur possède un bypass
5922 softime 7996 $bypass = $this->f->isAccredited($this->get_absolute_class_name()."_definaliser_bypass");
5923 mbroquet 3730 //
5924     if ($bypass == true) {
5925     //
5926     return true;
5927     }
5928 softime 6565
5929     // Si l'utilisateur est un instructeur, que le dossier est cloturé et
5930     // que l'événement n'est pas identifié comme non verrouillable
5931 mbroquet 3730 if ($this->f->isUserInstructeur()
5932 softime 6565 && $this->getStatutAutorisationDossier($this->getParameter("idxformulaire")) == "cloture"
5933     && $this->checkEvenementNonVerrouillable($this->getVal("instruction")) === false) {
5934 mbroquet 3730 //
5935     return false;
5936     }
5937    
5938 softime 6565 // Si l'utilisateur est un intructeur qui correspond à la division du
5939     // dossier
5940     if ($this->is_instructeur_from_division_dossier() === true) {
5941     //
5942     return true;
5943 mbroquet 3730 }
5944    
5945 softime 6565 // Si l'utilisateur est instructeur de la commune du dossier et que
5946     // l'instruction est créée par un instructeur de la commune
5947     if ($this->is_instructeur_from_collectivite_dossier() === true and
5948     $this->getVal('created_by_commune') === 't') {
5949     return true;
5950 mbroquet 3730 }
5951    
5952     //
5953 softime 6565 return false;
5954 mbroquet 3730 }
5955    
5956     /**
5957     * CONDITION - is_unfinalizable_without_bypass.
5958     *
5959     * Condition pour afficher le bouton sans le bypass.
5960     *
5961     * @return boolean
5962     */
5963     function is_unfinalizable_without_bypass() {
5964     // Récupère la valeur du champ finalisé
5965     $om_final_instruction = $this->getVal('om_final_instruction');
5966    
5967     // Si l'instruction est finalisée
5968     if ($om_final_instruction == 't') {
5969     //
5970     return true;
5971     }
5972    
5973     //
5974     return false;
5975     }
5976    
5977 softime 5169
5978 mbroquet 3730 /**
5979 softime 6565 * Permet de définir si un instructeur commune peut editer une instruction
5980     *
5981     * @return boolean true si il peut
5982     */
5983     function isInstrCanChangeDecision($idx) {
5984    
5985     if ($this->f->isAccredited(array("instruction", "instruction_changer_decision"), "OR") !== true or
5986     $this->f->isUserInstructeur() !== true) {
5987     return false;
5988     }
5989    
5990    
5991    
5992     // Sinon on vérifie l'éligibilité du dossier au changement de décision
5993 softime 11876 // /!\ Requête lié à celles du widget indiquant les dossiers éligible au changement
5994     // de décision :
5995     // * dossier_instruction.class.php : view_widget_dossiers_evenement_retour_finalise()
5996     // * dossier_instruction.inc.php : si le paramètre filtre_decision = true
5997     $sql = sprintf(
5998     'SELECT
5999 softime 6565 dossier.dossier
6000     FROM
6001 softime 11876 %1$sdossier
6002     JOIN %1$setat
6003     ON dossier.etat = etat.etat AND etat.statut = \'encours\'
6004     JOIN %1$slien_dossier_demandeur
6005     ON dossier.dossier = lien_dossier_demandeur.dossier AND lien_dossier_demandeur.petitionnaire_principal IS TRUE
6006     JOIN %1$sdossier_instruction_type
6007     ON dossier.dossier_instruction_type=dossier_instruction_type.dossier_instruction_type
6008     JOIN %1$sinstruction
6009     -- Recherche de la dernière instruction qui ne soit pas liée à un événement retour
6010     ON instruction.instruction = (
6011     SELECT instruction
6012     FROM %1$sinstruction
6013     JOIN %1$sevenement ON instruction.evenement=evenement.evenement
6014     AND evenement.retour IS FALSE
6015     WHERE instruction.dossier = dossier.dossier
6016     ORDER BY date_evenement DESC, instruction DESC
6017     LIMIT 1
6018     )
6019     -- On ne garde que les dossiers pour lesquels la dernière instruction est finalisée
6020     -- ou alors pour laquelle l instruction a été ajouté par la commune et est
6021     -- non signée, non notifié, etc.
6022     AND (instruction.om_final_instruction IS TRUE
6023     OR instruction.created_by_commune IS TRUE)
6024     AND instruction.date_retour_signature IS NULL
6025     AND instruction.date_envoi_rar IS NULL
6026     AND instruction.date_retour_rar IS NULL
6027     AND instruction.date_envoi_controle_legalite IS NULL
6028     AND instruction.date_retour_controle_legalite IS NULL
6029     -- On vérifie que l instruction soit un arrêté ou un changement de décision
6030     JOIN %1$sevenement
6031     ON instruction.evenement=evenement.evenement
6032     AND (evenement.type = \'arrete\'
6033     OR evenement.type = \'changement_decision\')
6034     -- Recherche les informations du pétitionnaire principal pour l affichage
6035     JOIN %1$sdemandeur
6036     ON lien_dossier_demandeur.demandeur = demandeur.demandeur
6037     -- Recherche la collectivité rattachée à l instructeur
6038     JOIN %1$sinstructeur
6039     ON dossier.instructeur=instructeur.instructeur
6040     JOIN %1$sdivision
6041     ON instructeur.division=division.division
6042     JOIN %1$sdirection
6043     ON division.direction=direction.direction
6044     JOIN %1$som_collectivite
6045     ON direction.om_collectivite=om_collectivite.om_collectivite
6046 softime 6565 WHERE
6047 softime 11876 -- Vérification que la décision a été prise par l agglo
6048     om_collectivite.niveau = \'2\'
6049     AND dossier.dossier = \'%2$s\'
6050     ',
6051     DB_PREFIXE,
6052     $idx
6053     );
6054 softime 6565
6055    
6056     // Si collectivité de l'utilisateur niveau mono alors filtre sur celle-ci
6057     if ($this->f->isCollectiviteMono($_SESSION['collectivite']) === true) {
6058 softime 11876 $sql .= sprintf(
6059     ' AND dossier.om_collectivite=%1$s',
6060     $_SESSION['collectivite']
6061     );
6062 softime 6565 }
6063 softime 8989 $res = $this->f->db->getone($sql);
6064 softime 12847 $this->addToLog(__METHOD__."(): db->getone(\"".$sql."\");", VERBOSE_MODE);
6065     $this->f->isDatabaseError($res);
6066 softime 6565 // Si le dossier n'est pas sujet au changement de decision
6067     if($res == null) {
6068     return false;
6069     }
6070     return true;
6071     }
6072    
6073    
6074     /**
6075 softime 5169 * CONDITION - can_monitoring_dates.
6076     *
6077     * Condition pour afficher le bouton de suivi des dates.
6078     *
6079     * @return boolean
6080     */
6081     public function can_monitoring_dates() {
6082     // Récupère la valeur du champ finalisé
6083     $om_final_instruction = $this->getVal('om_final_instruction');
6084    
6085     // Si l'instruction n'est pas finalisée
6086     if ($om_final_instruction !== 't') {
6087     //
6088     return false;
6089     }
6090    
6091     // Contrôle si l'utilisateur possède un bypass
6092 softime 7996 $bypass = $this->f->isAccredited($this->get_absolute_class_name()."_modification_dates_bypass");
6093 softime 5169 if ($bypass === true) {
6094     return true;
6095     }
6096    
6097 softime 8989 // Permission de modifier le suivi des dates sur un dossier cloturé pour
6098     // un utilisateur lié à un instructeur
6099     $perm_moni_dates_d_closed = $this->f->isAccredited($this->get_absolute_class_name()."_modification_dates_cloture");
6100    
6101     // On vérifie en premier lieu que le DI n'est pas clôturé et que
6102     // l'utilisateur ne possède pas la permission de modifier le suivi des
6103     // dates sur un dossier clôturé
6104 softime 5169 $inst_dossier = $this->get_inst_dossier();
6105 softime 8989 if ($inst_dossier->getStatut() === 'cloture'
6106     && $perm_moni_dates_d_closed === false) {
6107 softime 5169 //
6108     return false;
6109     }
6110     // On récupère ses infos
6111     $coll_di = $inst_dossier->getVal('om_collectivite');
6112     $div_di = $this->getDivisionFromDossier();
6113     // et celles de son éventuel instructeur
6114     $instr_di = $inst_dossier->getVal('instructeur');
6115    
6116 softime 6565 // Il faut disposer d'une entrée instructeur
6117     if ($this->f->isUserInstructeur() === false) {
6118     return false;
6119     }
6120    
6121 softime 5169 // Par défaut on prétend que l'instructeur n'est pas multi
6122     $instr_di_coll_multi = false;
6123     // Si un instructeur est affecté au dossier
6124     if ($instr_di !== '' && $instr_di !== null) {
6125     // Vérifie si l'instructeur est de la collectivité de niveau 2
6126 softime 5295 $instr_di_coll = $this->get_instructeur_om_collectivite($instr_di);
6127 softime 5169 if ($this->f->isCollectiviteMono($instr_di_coll) === false) {
6128     //
6129     $instr_di_coll_multi = true;
6130     }
6131     }
6132    
6133 softime 6565 // Il faut qu'il instruise le dossier ou soit de la même division
6134     if ($this->f->om_utilisateur['instructeur'] === $instr_di
6135     || $this->f->om_utilisateur['division'] === $div_di) {
6136 softime 5169 //
6137     return true;
6138     }
6139    
6140 softime 6565 // On donne également le droit s'il est de la même collectivité que
6141     // le dossier ET si l'instruction est déléguée à la communauté
6142     if ($this->f->isCollectiviteMono($this->f->om_utilisateur['om_collectivite']) === true
6143     && $this->f->om_utilisateur['om_collectivite'] === $coll_di
6144     && $instr_di_coll_multi === true) {
6145 softime 5169 //
6146     return true;
6147     }
6148    
6149 softime 6565 // Si l'instructeur ne rentre pas dans les deux cas précédents
6150 softime 5169 return false;
6151     }
6152    
6153    
6154     /**
6155 softime 12847 * CONDITION - is_finalized.
6156     *
6157     * Condition pour vérifier si une instruction est finalisée.
6158     *
6159     * @return boolean
6160     */
6161     public function is_finalized() {
6162    
6163     return $this->getVal('om_final_instruction') === "t";
6164     }
6165    
6166     /**
6167     * CONDITION - is_not_date_retour_signature_set.
6168     *
6169     * Condition pour vérifier si une date de retour signature n'est pas définie.
6170     *
6171     * @return boolean
6172     */
6173     public function is_not_date_retour_signature_set() {
6174    
6175     return $this->getVal('date_retour_signature') == null;
6176    
6177     }
6178    
6179    
6180     /**
6181 mbroquet 3730 * TREATMENT - finalize.
6182     *
6183     * Permet de finaliser un enregistrement.
6184     *
6185     * @param array $val valeurs soumises par le formulaire
6186     *
6187     * @return boolean
6188     */
6189     function finalize($val = array()) {
6190    
6191     // Cette méthode permet d'exécuter une routine en début des méthodes
6192     // dites de TREATMENT.
6193     $this->begin_treatment(__METHOD__);
6194 softime 10808 $message = '';
6195 softime 11585 $ev = $this->get_inst_evenement($this->getVal('evenement'));
6196 mbroquet 3730
6197 softime 11585 // Controle du signataire
6198     if (! $this->controle_signataire($ev)) {
6199     $this->addToMessage(__("Le document ne peut pas être finalisé car aucun signataire n'a été sélectionné."));
6200     // Termine le traitement
6201     return $this->end_treatment(__METHOD__, false);
6202     }
6203    
6204 mbroquet 3730 // Traitement de la finalisation
6205     $ret = $this->manage_finalizing("finalize", $val);
6206    
6207     // Si le traitement retourne une erreur
6208     if ($ret !== true) {
6209    
6210     // Termine le traitement
6211 softime 5024 return $this->end_treatment(__METHOD__, false);
6212 mbroquet 3730 }
6213    
6214 softime 10808 // Envoi des notifications aux demandeurs si la notification est automatique
6215     // et que la signature n'est pas requise
6216     if ($ev->getVal('notification') === 'notification_automatique') {
6217 softime 13137 // Préparation du message de log en cas d'erreur de notification
6218     $msgLog = __('Erreur lors de la notification automatique du(des) pétitionnaire(s) suite à la finalisation de l\'instruction.').
6219     ' '.
6220     __('Instruction notifiée : ').
6221     $this->getVal($this->clePrimaire);
6222 softime 10808 // Récupération de la catégorie et envoie des notifications au(x) demandeur(s)
6223     $collectivite_di = $this->get_dossier_instruction_om_collectivite($this->getVal('dossier'));
6224     // Récupération de la liste des demandeurs à notifier et de la catégorie
6225     $categorie = $this->f->get_param_option_notification($collectivite_di);
6226 softime 13137 $isPortal = $categorie == null || $categorie == '' || $categorie == PORTAL ? true : false;
6227 softime 10869 $demandeursANotifie = $this->get_demandeurs_notifiable(
6228     $this->getVal('dossier'),
6229     $isPortal
6230     );
6231 softime 10808
6232     // Création d'une notification et d'une tâche pour chaque demandeur à notifier
6233 softime 12124 $demandeurPrincipalNotifie = false;
6234 softime 10813 if (count($demandeursANotifie) > 0) {
6235     foreach ($demandeursANotifie as $demandeur) {
6236 softime 12124 // Identifie si le demandeur principal a été notifié ou pas
6237     // et récupère ses informations
6238     if ($demandeur['petitionnaire_principal'] == 't') {
6239     $demandeurPrincipalNotifie = true;
6240     // Si le demandeur principal est notifiable mais qu'il y a des erreurs dans
6241     // son paramétrage, on effectue pas le traitement et on passe à l'itération
6242     // suivante. On le considère également comme non notifié pour gérer l'envoie
6243     // des messages d'erreurs
6244     // Si la demande a été déposée via le portail alors le paramétrage n'a pas
6245     // d'impact sur la notification
6246     $erreursParam = $this->get_info_notification_fail();
6247     if (! $this->dossier_depose_sur_portail() && $erreursParam != array()) {
6248     $demandeurPrincipalNotifie = false;
6249     continue;
6250     }
6251     }
6252 softime 10813 // Ajout de la notif et récupération de son id
6253     $idNotif = $this->ajouter_notification(
6254     $this->getVal($this->clePrimaire),
6255     $this->f->get_connected_user_login_name(),
6256 softime 10968 $demandeur,
6257     $collectivite_di,
6258 softime 12433 array(),
6259 softime 10968 true
6260 softime 10808 );
6261 softime 10813 if ($idNotif === false) {
6262     // Termine le traitement
6263 softime 13137 $this->addToLog(__METHOD__."(): ".$msgLog, DEBUG_MODE);
6264 softime 10813 return $this->end_treatment(__METHOD__, false);
6265     }
6266     $notification_by_task = $this->notification_by_task(
6267     $idNotif,
6268     $this->getVal('dossier'),
6269     $categorie
6270 softime 10808 );
6271 softime 10813 if ($notification_by_task === false) {
6272 softime 13137 $this->addToLog(__METHOD__."(): ".$msgLog, DEBUG_MODE);
6273 softime 10813 $this->addToMessage(
6274     __("Erreur lors de la génération de la notification au(x) pétitionnaire(s).")
6275     );
6276     // Termine le traitement
6277     return $this->end_treatment(__METHOD__, false);
6278     }
6279 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.")));
6280 softime 10808 }
6281     }
6282 softime 12847 // Pour la notification par mail ou la notification via portal si le dossier a
6283     // été déposés via portal, si le demandeur principal n'est pas notifiable,
6284     // on créé une nouvelle notification en erreur avec en commentaire la raison pour
6285     // laquelle le demandeur principal n'a pas pu être notifié
6286     $depotPortal = $this->dossier_depose_sur_portail();
6287     if (! $demandeurPrincipalNotifie && ($isPortal === false || $depotPortal === true)) {
6288 softime 13137 // Préparation des logs pour indiquer que le pétitionnaire principale n'est pas notifiable
6289     $msgLog .= ' '.__('Le pétitionnaire principale n\'est pas notifiable.');
6290 softime 12124 // Analyse pour savoir pourquoi le demandeur principal n'est pas notifiable
6291     $erreursParam = $this->get_info_notification_fail();
6292     $demandeurPrincipal = $this->get_info_petitionnaire_principal_dossier($this->getVal('dossier'));
6293     // Ajout de la notif et récupération de son id
6294     $idNotif = $this->ajouter_notification(
6295     $this->valF[$this->clePrimaire],
6296     $this->f->get_connected_user_login_name(),
6297     $demandeurPrincipal,
6298     $collectivite_di,
6299 softime 12433 array(),
6300 softime 12124 true,
6301     'Echec',
6302     implode(' ', $erreursParam)
6303     );
6304     if ($idNotif === false) {
6305     $this->addToMessage(
6306     __('Erreur : la création de la notification a échouée.').
6307     __("Veuillez contacter votre administrateur.")
6308     );
6309 softime 13137 $this->addToLog(__METHOD__."(): ".$msgLog, DEBUG_MODE);
6310 softime 12124 return false;
6311     }
6312     // Prépare un message d'alerte à destination de l'instructeur pour l'informer
6313     // de l'échec de la notification
6314     $dossier_message = $this->get_inst_dossier_message(0);
6315     $dossier_message_val = array(
6316     'dossier' => $this->getVal('dossier'),
6317     'type' => _('erreur expedition'),
6318     'emetteur' => $this->f->get_connected_user_login_name(),
6319     'login' => $_SESSION['login'],
6320     'date_emission' => date('Y-m-d H:i:s'),
6321     'contenu' => _('Échec lors de la notification de l\'instruction ').
6322     $ev->getVal('libelle').
6323     '.<br>'.
6324     implode("\n", $erreursParam).
6325     '<br>'.
6326     _('Veuillez corriger ces informations avant de renvoyer la notification.')
6327     );
6328     $add = $dossier_message->add_notification_message($dossier_message_val, true);
6329     // Si une erreur se produit pendant l'ajout
6330     if ($add !== true) {
6331     $this->addToLog(__METHOD__."(): Le message d'alerte concernant l'echec de l'envoi de la notification n'a pas pu être envoyé.", DEBUG_MODE);
6332     return false;
6333     }
6334     }
6335 softime 10808 }
6336    
6337 mbroquet 3730 // Termine le traitement
6338     return $this->end_treatment(__METHOD__, true);
6339     }
6340    
6341     /**
6342 softime 12124 * Récupère l'instance de dossier message.
6343     *
6344     * @param string $dossier_message Identifiant du message.
6345     *
6346     * @return object
6347     */
6348     private function get_inst_dossier_message($dossier_message = null) {
6349     //
6350     return $this->get_inst_common("dossier_message", $dossier_message);
6351     }
6352    
6353     /**
6354 softime 11585 * Vérifie si le signataire est obligatoire pour finaliser
6355     * le document apartir du paramétrage de l'événement.
6356     * Si c'est le cas, vérifie si il y a bien un signataire
6357     * renseigné.
6358     * Si c'est le cas renvoie true, sinon renvoie false.
6359     *
6360     * @param evenement évenement de l'instruction permettant de
6361     * récupérer le paramétrage
6362     * @return boolean
6363     */
6364     protected function controle_signataire($evenement) {
6365     // Vérifie si le signataire est obligatoire et si c'est le cas
6366     // vérifie si il y a bien un signataire pour le document
6367     if ($evenement->is_signataire_obligatoire() &&
6368     ($this->getVal('signataire_arrete') === null ||
6369     $this->getVal('signataire_arrete') === '')) {
6370     return false;
6371     }
6372     return true;
6373     }
6374    
6375     /**
6376 mbroquet 3730 * TREATMENT - unfinalize.
6377     *
6378     * Permet de définaliser un enregistrement.
6379     *
6380     * @param array $val valeurs soumises par le formulaire
6381     *
6382     * @return boolean
6383     */
6384     function unfinalize($val = array()) {
6385    
6386     // Cette méthode permet d'exécuter une routine en début des méthodes
6387     // dites de TREATMENT.
6388     $this->begin_treatment(__METHOD__);
6389    
6390     // Traitement de la finalisation
6391     $ret = $this->manage_finalizing("unfinalize", $val);
6392    
6393     // Si le traitement retourne une erreur
6394     if ($ret !== true) {
6395    
6396     // Termine le traitement
6397 softime 5024 return $this->end_treatment(__METHOD__, false);
6398 mbroquet 3730 }
6399    
6400     // Termine le traitement
6401     return $this->end_treatment(__METHOD__, true);
6402     }
6403    
6404     /**
6405     * VIEW - view_edition
6406     *
6407     * Edite l'édition de l'instruction ou affiche celle contenue dans le stockage.
6408     *
6409     * @return null Si l'action est incorrecte
6410     */
6411     function view_edition() {
6412    
6413     // Si l'instruction est finalisée
6414     if($this->getVal("om_final_instruction") == 't'
6415     && $this->getVal("om_final_instruction") != null) {
6416    
6417     // Ouvre le document
6418 softime 7996 $lien = '../app/index.php?module=form&snippet=file&obj='.$this->table.'&'.
6419 mbroquet 3730 'champ=om_fichier_instruction&id='.$this->getVal($this->clePrimaire);
6420     //
6421     header("Location: ".$lien);
6422     } else {
6423    
6424     // Récupère la collectivite du dossier d'instruction
6425     $dossier_instruction_om_collectivite = $this->get_dossier_instruction_om_collectivite();
6426    
6427     //
6428     $collectivite = $this->f->getCollectivite($dossier_instruction_om_collectivite);
6429    
6430     // Paramètre du PDF
6431     $params = array(
6432     "watermark" => true,
6433     "specific" => array(
6434     "mode" => "previsualisation",
6435     ),
6436     );
6437 softime 8593 // Si la rédaction libre est activée sur l'instruction
6438     if ($this->getVal("flag_edition_integrale") == 't') {
6439     $params["specific"]["corps"] = array(
6440     "mode" => "set",
6441     "value" => $this->getVal("corps_om_htmletatex"),
6442     );
6443     $params["specific"]["titre"] = array(
6444     "mode" => "set",
6445     "value" => $this->getVal("titre_om_htmletat"),
6446     );
6447     }
6448 mbroquet 3730
6449     // Génération du PDF
6450     $result = $this->compute_pdf_output('lettretype', $this->getVal("lettretype"), $collectivite, null, $params);
6451     // Affichage du PDF
6452     $this->expose_pdf_output(
6453     $result['pdf_output'],
6454     $result['filename']
6455     );
6456     }
6457     }
6458    
6459     /**
6460     * Récupère la collectivité du dossier d'instruction.
6461     *
6462 softime 7685 * @param string $dossier_instruction_id Identifiant du DI.
6463     *
6464 mbroquet 3730 * @return integer
6465     */
6466 softime 7685 function get_dossier_instruction_om_collectivite($dossier_instruction_id = null) {
6467 mbroquet 3730
6468 softime 7685 // Si l'identifiant n'est pas renseigné
6469     if ($dossier_instruction_id === null) {
6470 softime 8593 // Récupère la valeur
6471     if ($this->getVal('dossier') !== null && $this->getVal('dossier') !== '') {
6472     $dossier_instruction_id = $this->getVal('dossier');
6473     } elseif ($this->getParameter('idxformulaire') !== null
6474     && $this->getParameter('idxformulaire') !== '') {
6475     //
6476     $dossier_instruction_id = $this->getParameter('idxformulaire');
6477     } elseif ($this->f->get_submitted_get_value('idxformulaire') !== null
6478     && $this->f->get_submitted_get_value('idxformulaire') !== '') {
6479     //
6480     $dossier_instruction_id = $this->f->get_submitted_get_value('idxformulaire');
6481     }
6482 softime 7685 }
6483    
6484 mbroquet 3730 //
6485 softime 7996 $dossier_instruction = $this->f->get_inst__om_dbform(array(
6486     "obj" => "dossier_instruction",
6487     "idx" => $dossier_instruction_id,
6488     ));
6489 mbroquet 3730
6490     //
6491     return $dossier_instruction->getVal('om_collectivite');
6492     }
6493    
6494     /**
6495     * VIEW - view_bible
6496     *
6497     * Affiche la bible manuelle.
6498     *
6499     * @return void
6500     */
6501     function view_bible() {
6502     // Vérification de l'accessibilité sur l'élément
6503     $this->checkAccessibility();
6504    
6505     /**
6506     * Affichage de la structure HTML
6507     */
6508     //
6509 softime 8989 if ($this->f->isAjaxRequest()) {
6510 mbroquet 3730 //
6511     header("Content-type: text/html; charset=".HTTPCHARSET."");
6512     } else {
6513     //
6514 softime 8989 $this->f->setFlag("htmlonly");
6515     $this->f->display();
6516 mbroquet 3730 }
6517     //
6518 softime 8989 $this->f->displayStartContent();
6519 mbroquet 3730 //
6520 softime 8989 $this->f->setTitle(_("Liste des éléments de la bible en lien avec un evenement"));
6521     $this->f->displayTitle();
6522 mbroquet 3730
6523     /**
6524     *
6525     */
6526     //
6527 softime 8989 ($this->f->get_submitted_get_value("ev") ? $evenement = $this->f->get_submitted_get_value("ev") : $evenement = "");
6528 mbroquet 3730 $evenement = intval($evenement);
6529     //
6530 softime 8989 ($this->f->get_submitted_get_value("idx") ? $idx = $this->f->get_submitted_get_value("idx") : $idx = "");
6531 softime 5169 // Récupération du code du type de DA
6532     $code_da_type = '';
6533     if (preg_match('/[A-Za-z]{2,3}/', $idx, $matches) !== false) {
6534     $code_da_type = $matches[0];
6535     }
6536 mbroquet 3730 //
6537 softime 8989 ($this->f->get_submitted_get_value("complement") ? $complement = $this->f->get_submitted_get_value("complement") : $complement = "1");
6538 mbroquet 3730
6539     // Récupération de la collectivité du dossier
6540 softime 7996 $dossier = $this->f->get_inst__om_dbform(array(
6541     "obj" => "dossier",
6542     "idx" => $idx,
6543     ));
6544 mbroquet 3730
6545     /**
6546     *
6547     */
6548     //
6549     $sql = "SELECT *, bible.libelle as bible_lib
6550     FROM ".DB_PREFIXE."bible
6551     LEFT OUTER JOIN ".DB_PREFIXE."dossier_autorisation_type
6552     ON bible.dossier_autorisation_type=dossier_autorisation_type.dossier_autorisation_type
6553     LEFT JOIN ".DB_PREFIXE."om_collectivite
6554     ON bible.om_collectivite = om_collectivite.om_collectivite
6555 softime 7366 WHERE (evenement=".$evenement." OR evenement IS NULL)
6556 softime 8989 AND (complement=".$complement." OR complement IS NULL)
6557 mbroquet 3730 AND (bible.dossier_autorisation_type IS NULL
6558 softime 5169 OR dossier_autorisation_type.code ='".$code_da_type."')
6559 mbroquet 3730 AND (om_collectivite.niveau = '2'
6560     OR bible.om_collectivite = ".$dossier->getVal("om_collectivite").")
6561     ORDER BY bible_lib ASC";
6562 softime 8989 $res = $this->f->db->query($sql);
6563     $this->f->addToLog(__METHOD__.": db->query(\"".$sql."\");", VERBOSE_MODE);
6564     $this->f->isDatabaseError($res);
6565 mbroquet 3730 //
6566     echo "<form method=\"post\" name=\"f3\" action=\"#\">\n";
6567     //
6568     if ($res->numrows() > 0) {
6569     //
6570     echo "\t<table id='tab-bible' width='100%'>\n";
6571     //
6572     echo "\t\t<tr class=\"ui-tabs-nav ui-accordion ui-state-default tab-title\">";
6573     echo "<th>"._("Choisir")."</th>";
6574     echo "<th>"._("Libelle")."</th>";
6575     echo "</tr>\n";
6576     //
6577     $i = 0;
6578     //
6579     while ($row=& $res->fetchRow(DB_FETCHMODE_ASSOC)) {
6580     //
6581     echo "\t\t<tr";
6582     echo " class=\"".($i % 2 == 0 ? "odd" : "even")."\"";
6583     echo ">";
6584     //
6585     echo "<td class=\"center\"><input type=\"checkbox\" name=\"choix[]\" value=\"".$i."\" id=\"checkbox".$i."\" /></td>";
6586     // XXX utilisation de l'attribut titre pour afficher une infobulle
6587     echo "<td><span class=\"content\" title=\"".htmlentities($row['contenu'])."\" id=\"content".$i."\">".$row['bible_lib']."</span></td>";
6588     //
6589     echo "</tr>\n";
6590     //
6591     $i++;
6592     }
6593     echo "\t</table>\n";
6594     //
6595     echo "<div class=\"formControls\">\n";
6596 softime 8989 $this->f->layout->display_form_button(array(
6597 mbroquet 3730 "value" => _("Valider"),
6598     "onclick" => "bible_return('f2', 'complement".($complement == "1" ? "" : $complement)."_om_html'); return false;",
6599     ));
6600 softime 8989 $this->f->displayLinkJsCloseWindow();
6601 mbroquet 3730 echo "</div>\n";
6602    
6603     } else {
6604     //
6605     $message_class = "error";
6606     $message = _("Aucun element dans la bible pour l'evenement")." : ".$evenement;
6607 softime 8989 $this->f->displayMessage($message_class, $message);
6608 mbroquet 3730 //
6609     echo "<div class=\"formControls\">\n";
6610 softime 8989 $this->f->displayLinkJsCloseWindow();
6611 mbroquet 3730 echo "</div>\n";
6612     }
6613     //
6614     echo "</form>\n";
6615    
6616     /**
6617     * Affichage de la structure HTML
6618     */
6619     //
6620 softime 8989 $this->f->displayEndContent();
6621 mbroquet 3730 }
6622    
6623     /**
6624 softime 5169 * VIEW - view_bible_auto
6625 mbroquet 3730 *
6626 softime 5169 * Renvoie les valeurs de la bible à placer dans les compléments de l'instruction.
6627 mbroquet 3730 *
6628     * @return void
6629     */
6630     function view_bible_auto() {
6631     // Vérification de l'accessibilité sur l'élément
6632     $this->checkAccessibility();
6633     //
6634 softime 8989 $this->f->disableLog();
6635 mbroquet 3730
6636     $formatDate="AAAA-MM-JJ";
6637    
6638     // Récupération des paramètres
6639 softime 8989 $idx = $this->f->get_submitted_get_value('idx');
6640     $evenement = $this->f->get_submitted_get_value('ev');
6641 mbroquet 3730
6642     // Initialisation de la variable de retour
6643     $retour['complement_om_html'] = '';
6644     $retour['complement2_om_html'] = '';
6645     $retour['complement3_om_html'] = '';
6646     $retour['complement4_om_html'] = '';
6647     // Vérification d'une consultation liée à l'événement
6648 softime 8989 $consultation = $this->f->db->getOne(
6649 mbroquet 3730 "select consultation from ".DB_PREFIXE."evenement where evenement=".$evenement
6650     );
6651 softime 8989 $this->f->isDatabaseError($consultation);
6652 mbroquet 3730 // Si consultation liée, récupération du retour d'avis
6653     if($consultation=='Oui'){
6654 softime 11876 $sql = sprintf(
6655     '(SELECT
6656     date_retour,
6657     avis_consultation.libelle as avis_consultation,
6658     COALESCE(service.libelle, tiers_consulte.libelle) as service
6659     FROM
6660     %1$sconsultation
6661     LEFT JOIN %1$stiers_consulte ON consultation.tiers_consulte = tiers_consulte.tiers_consulte
6662     LEFT JOIN %1$sservice ON consultation.service = service.service
6663     LEFT JOIN %1$savis_consultation ON consultation.avis_consultation = avis_consultation.avis_consultation
6664     WHERE
6665     dossier = \'%2$s\'
6666     AND consultation.visible)',
6667     DB_PREFIXE,
6668     $this->f->db->escapeSimple($idx)
6669     );
6670 softime 8989 $res = $this->f->db->query($sql);
6671     $this->f->isDatabaseError($res);
6672 mbroquet 3730 // Récupération des consultations
6673     while ($row=& $res->fetchRow(DB_FETCHMODE_ASSOC)){
6674     $correct=false;
6675     // date retour
6676     if ($row['date_retour']<>""){
6677     if ($formatDate=="AAAA-MM-JJ"){
6678     $date = explode("-", $row['date_retour']);
6679     // controle de date
6680     if (count($date) == 3 and
6681     checkdate($date[1], $date[2], $date[0])) {
6682     $date_retour_f= $date[2]."/".$date[1]."/".$date[0];
6683     $correct=true;
6684     }else{
6685     $msg= $msg."<br>La date ".$row['date_retour']." n'est pas une date.";
6686     $correct=false;
6687     }
6688     }
6689     }
6690     //
6691     $temp="Vu l'avis ".$row['avis_consultation']." du service ".$row['service'];
6692     if($correct == true){
6693     $temp=$temp." du ".$date_retour_f;
6694     }
6695     // Concaténation des retours d'avis de consultation
6696 softime 7067 $retour['complement_om_html'] .= $temp . "<br/><br/>";
6697 mbroquet 3730 } // while
6698    
6699     } // consultation
6700     // Récupération des bibles automatiques pour le champ complement_om_html
6701 softime 8989 $retour['complement_om_html'] .= $this->getBible($evenement, $idx, '1');
6702 mbroquet 3730 // Récupération des bibles automatiques pour le champ complement2_om_html
6703 softime 8989 $retour['complement2_om_html'] .= $this->getBible($evenement, $idx, '2');
6704 mbroquet 3730 // Récupération des bibles automatiques pour le champ complement3_om_html
6705 softime 8989 $retour['complement3_om_html'] .= $this->getBible($evenement, $idx, '3');
6706 mbroquet 3730 // Récupération des bibles automatiques pour le champ complement4_om_html
6707 softime 8989 $retour['complement4_om_html'] .= $this->getBible($evenement, $idx, '4');
6708 mbroquet 3730
6709    
6710    
6711     echo json_encode($retour);
6712     }
6713    
6714     /**
6715 softime 7521 * VIEW - view_pdf_temp
6716     *
6717     * @return void
6718     */
6719     function view_pdf_temp() {
6720     $this->checkAccessibility();
6721 softime 8593 // Utilisation de $_POST pour ne pas que les textes soient altérés.
6722 softime 7521 $this->f->set_submitted_value();
6723 softime 8593 $merge_fields = array();
6724     //
6725     if (array_key_exists('c1', $_POST) === true) {
6726 softime 11876 $merge_fields['[complement_instruction]'] = $_POST['c1'];
6727     $merge_fields['[complement1_instruction]'] = $_POST['c1'];
6728 softime 8593 }
6729     if (array_key_exists('c2', $_POST) === true) {
6730 softime 11876 $merge_fields['[complement2_instruction]'] = $_POST['c2'];
6731 softime 8593 }
6732     if (array_key_exists('c3', $_POST) === true) {
6733 softime 11876 $merge_fields['[complement3_instruction]'] = $_POST['c3'];
6734 softime 8593 }
6735     if (array_key_exists('c4', $_POST) === true) {
6736 softime 11876 $merge_fields['[complement4_instruction]'] = $_POST['c4'];
6737 softime 8593 }
6738 softime 7521 $params = array(
6739     "watermark" => true,
6740     "specific" => array(
6741     "merge_fields" => $merge_fields,
6742     ),
6743     );
6744 softime 8593 //
6745     if (array_key_exists('corps', $_POST) === true) {
6746     $params["specific"]["corps"] = array(
6747     "mode" => "set",
6748 softime 11876 "value" => $_POST['corps'],
6749 softime 8593 );
6750     }
6751     if (array_key_exists('titre', $_POST) === true) {
6752     $params["specific"]["titre"] = array(
6753     "mode" => "set",
6754 softime 11876 "value" => $_POST['titre'],
6755 softime 8593 );
6756     }
6757 softime 7521 $dossier_instruction_om_collectivite = $this->get_dossier_instruction_om_collectivite();
6758     $collectivite = $this->f->getCollectivite($dossier_instruction_om_collectivite);
6759     $result = $this->compute_pdf_output('lettretype', $this->getVal('lettretype'), $collectivite, null, $params);
6760     $retour = array(
6761     'base' => base64_encode($result['pdf_output']),
6762     );
6763     echo json_encode($retour);
6764     }
6765    
6766     /**
6767     * Dans le contexte de prévisualisation des éditions, génère le rendu du
6768     * PDF sans prise en compte de la valeur des compléments et le retourne en
6769     * base 64.
6770     *
6771     * @return string Rendu PDF converti en base 64.
6772     */
6773     function init_pdf_temp() {
6774     $params = array(
6775     "watermark" => true,
6776     );
6777 softime 8593 // Si la rédaction libre est activée sur l'instruction
6778     if ($this->getVal("flag_edition_integrale") == 't') {
6779     $params["specific"]["corps"] = array(
6780     "mode" => "set",
6781     "value" => $this->getVal("corps_om_htmletatex"),
6782     );
6783     $params["specific"]["titre"] = array(
6784     "mode" => "set",
6785     "value" => $this->getVal("titre_om_htmletat"),
6786     );
6787     }
6788 softime 7521 $dossier_instruction_om_collectivite = $this->get_dossier_instruction_om_collectivite();
6789     $collectivite = $this->f->getCollectivite($dossier_instruction_om_collectivite);
6790     $result = $this->compute_pdf_output('lettretype', $this->getVal('lettretype'), $collectivite, null, $params);
6791    
6792     return base64_encode($result['pdf_output']);
6793     }
6794    
6795     /**
6796 mbroquet 3730 * Récupération des éléments de bible.
6797     *
6798     * @param integer $event id de l'événement
6799     * @param string $idx id du dossier
6800     * @param integer $compnb numéro du champ complement
6801     *
6802     * @return string Chaîne de texte à insérer dans le champ complement
6803     */
6804 softime 8989 function getBible($event, $idx, $compnb) {
6805 mbroquet 3730 // Récupération de la collectivité du dossier
6806 softime 7996 $dossier = $this->f->get_inst__om_dbform(array(
6807     "obj" => "dossier",
6808     "idx" => $idx,
6809     ));
6810 softime 5169 // Récupération du code du type de DA
6811     $code_da_type = '';
6812     if (preg_match('/[A-Za-z]{2,3}/', $idx, $matches) !== false) {
6813     $code_da_type = $matches[0];
6814     }
6815 mbroquet 3730 //
6816     $sql = "SELECT * FROM ".DB_PREFIXE."bible
6817     LEFT OUTER JOIN ".DB_PREFIXE."dossier_autorisation_type
6818     ON bible.dossier_autorisation_type=
6819     dossier_autorisation_type.dossier_autorisation_type
6820     LEFT JOIN
6821     ".DB_PREFIXE."om_collectivite
6822     ON bible.om_collectivite = om_collectivite.om_collectivite
6823 softime 7366 WHERE (evenement =".$event." or evenement IS NULL) and
6824 softime 8989 (complement=".$compnb." OR complement IS NULL) and
6825 mbroquet 3730 automatique='Oui' and
6826 softime 5169 (dossier_autorisation_type.code ='".$code_da_type."' or
6827 mbroquet 3730 bible.dossier_autorisation_type IS NULL) and
6828     (om_collectivite.niveau = '2' OR bible.om_collectivite = ".$dossier->getVal("om_collectivite").")";
6829    
6830 softime 8989 $res = $this->f->db->query($sql);
6831     $this->f->isDatabaseError($res);
6832 mbroquet 3730 $temp = "";
6833     while ($row=& $res->fetchRow(DB_FETCHMODE_ASSOC)){
6834     // Remplacement des retours à la ligne par des br
6835     $temp .= preg_replace(
6836     '#(\\\r|\\\r\\\n|\\\n)#', '<br/>', $row['contenu']
6837     );
6838 softime 7521 // Ajout d'un saut de ligne entre chaque bible.
6839     $temp .= '<br/>';
6840 mbroquet 3730 } // fin while
6841     return $temp;
6842     }
6843    
6844     /**
6845     * VIEW - view_suivi_bordereaux.
6846     *
6847 nmeucci 4317 * Formulaire de choix du bordereau de suivi, permettant de générer les 4 bordereaux.
6848     * Si l'utilisateur est d'une collectivité de niveau 2 il a le choix de la
6849     * collectivité des dossiers affichés.
6850 mbroquet 3730 *
6851     * @return void
6852     */
6853     function view_suivi_bordereaux() {
6854     // Vérification de l'accessibilité sur l'élément
6855     $this->checkAccessibility();
6856    
6857     /**
6858     * Validation du formulaire
6859     */
6860     // Si le formulaire a été validé
6861 softime 8989 if ($this->f->get_submitted_post_value("validation") !== null) {
6862 mbroquet 3730 // Si un bordereau à été sélectionné
6863 softime 8989 if ($this->f->get_submitted_post_value("bordereau") !== null && $this->f->get_submitted_post_value("bordereau") == "" ) {
6864 mbroquet 3730 // Si aucun bordereau n'a été sélectionné
6865     $message_class = "error";
6866     $message = _("Veuillez selectionner un bordereau.");
6867     }
6868     // Sinon si les dates ne sont pas valide
6869 softime 8989 elseif (($this->f->get_submitted_post_value("date_bordereau_debut") !== null
6870     && $this->f->get_submitted_post_value("date_bordereau_debut") == "")
6871     || ($this->f->get_submitted_post_value("date_bordereau_fin") !== null
6872     && $this->f->get_submitted_post_value("date_bordereau_fin") == "")) {
6873 mbroquet 3730 // Si aucune date n'a été saisie
6874     $message_class = "error";
6875     $message = _("Veuillez saisir une date valide.");
6876     }
6877 softime 7366 // Sinon si les dates ne sont pas valides
6878 softime 8989 elseif ($this->f->get_submitted_post_value("bordereau") === "bordereau_avis_maire_prefet"
6879     && $this->f->getParameter("id_evenement_bordereau_avis_maire_prefet") == null) {
6880 softime 7366 // Si aucune date n'a été saisie
6881     $message_class = "error";
6882     $message = _("Erreur de parametrage. Contactez votre administrateur.");
6883     }
6884 mbroquet 3730 // Affiche le message de validation
6885     else {
6886     // On récupère le libellé du bordereau pour l'afficher à l'utilisateur
6887     $sql = "SELECT om_etat.libelle
6888     FROM ".DB_PREFIXE."om_etat
6889 softime 8989 WHERE om_etat.id = '".$this->f->get_submitted_post_value("bordereau")."'";
6890     $res = $this->f->db->getone($sql);
6891     $this->f->addToLog(__METHOD__.": db->getone(\"".$sql."\")", VERBOSE_MODE);
6892     $this->f->isDatabaseError($res);
6893 mbroquet 3730 //
6894     $message_class = "valid";
6895     $message = _("Cliquez sur le lien ci-dessous pour telecharger votre bordereau");
6896     $message .= " : <br/><br/>";
6897     $message .= "<a class='om-prev-icon pdf-16'";
6898     $message .= " title=\""._("Bordereau")."\"";
6899 softime 7996 $message .= "href='".OM_ROUTE_FORM."&obj=instruction";
6900 nmeucci 4317 $message .= "&action=220";
6901     $message .= "&idx=0";
6902 softime 8989 $message .= "&type_bordereau=".$this->f->get_submitted_post_value("bordereau");
6903     $message .= "&date_bordereau_debut=".$this->f->get_submitted_post_value("date_bordereau_debut");
6904     $message .= "&date_bordereau_fin=".$this->f->get_submitted_post_value("date_bordereau_fin");
6905 mbroquet 3730 // Si l'utilisateur est MULTI alors on ajoute le paramètre collectivite
6906 softime 8989 if ($this->f->get_submitted_post_value("om_collectivite") !== null) {
6907     $message .= "&collectivite=".$this->f->get_submitted_post_value("om_collectivite");
6908 mbroquet 3730 }
6909     $message .= "'"." target='_blank'>";
6910 softime 8989 $message .= $res." "._("du")." ".$this->f->get_submitted_post_value("date_bordereau_debut")
6911     ." "._("au")." ".$this->f->get_submitted_post_value("date_bordereau_fin");
6912 mbroquet 3730 $message .= "</a>";
6913     }
6914     }
6915    
6916     /**
6917     * Affichage des messages et du formulaire
6918     */
6919     // Affichage du message de validation ou d'erreur
6920     if (isset($message) && isset($message_class) && $message != "") {
6921 softime 8989 $this->f->displayMessage($message_class, $message);
6922 mbroquet 3730 }
6923     // Ouverture du formulaire
6924     printf("\t<form");
6925     printf(" method=\"post\"");
6926     printf(" id=\"suivi_bordereaux_form\"");
6927     printf(" action=\"\"");
6928     printf(">\n");
6929     // Paramétrage des champs du formulaire
6930     $champs = array("date_bordereau_debut", "date_bordereau_fin", "bordereau");
6931 softime 8989 // Si l'utilisateur est d'une collectivité de niveau 2 on affiche un select
6932 mbroquet 3730 // collectivité dans le formulaire
6933 softime 8989 if ($_SESSION["niveau"] == 2) {
6934 mbroquet 3730 array_push($champs, "om_collectivite");
6935     }
6936     // Création d'un nouvel objet de type formulaire
6937 softime 7996 $form = $this->f->get_inst__om_formulaire(array(
6938     "validation" => 0,
6939     "maj" => 0,
6940     "champs" => $champs,
6941     ));
6942 mbroquet 3730 // Paramétrage du champ date_bordereau_debut
6943     $form->setLib("date_bordereau_debut", _("date_bordereau_debut"));
6944     $form->setType("date_bordereau_debut", "date");
6945     $form->setTaille("date_bordereau_debut", 12);
6946     $form->setMax("date_bordereau_debut", 12);
6947     $form->setRequired("date_bordereau_debut");
6948     $form->setOnchange("date_bordereau_debut", "fdate(this)");
6949     $form->setVal("date_bordereau_debut", date("d/m/Y"));
6950     // Paramétrage du champ date_bordereau_fin
6951     $form->setLib("date_bordereau_fin", _("date_bordereau_fin"));
6952     $form->setType("date_bordereau_fin", "date");
6953     $form->setTaille("date_bordereau_fin", 12);
6954     $form->setMax("date_bordereau_fin", 12);
6955     $form->setRequired("date_bordereau_fin");
6956     $form->setOnchange("date_bordereau_fin", "fdate(this)");
6957     $form->setVal("date_bordereau_fin", date("d/m/Y"));
6958     // Paramétrage du champ bordereau
6959     $form->setLib("bordereau", _("bordereau"));
6960     $form->setType("bordereau", "select");
6961     $form->setRequired("bordereau");
6962     // Valeurs des champs
6963 softime 8989 if ($this->f->get_submitted_post_value("validation") !== null) {
6964     $form->setVal("date_bordereau_debut", $this->f->get_submitted_post_value("date_bordereau_debut"));
6965     $form->setVal("date_bordereau_fin", $this->f->get_submitted_post_value("date_bordereau_fin"));
6966     $form->setVal("bordereau", $this->f->get_submitted_post_value("bordereau"));
6967     $form->setVal("om_collectivite", $this->f->get_submitted_post_value("om_collectivite"));
6968 mbroquet 3730 }
6969     // Données du select - On récupère ici la liste de tous les états disponibles
6970     // dans la table om_etat qui ont un id qui commence par la cahine de caractères
6971     // 'bordereau_'
6972     $sql = "SELECT om_etat.id, om_etat.libelle
6973     FROM ".DB_PREFIXE."om_etat
6974     WHERE om_etat.id LIKE 'bordereau_%'
6975     ORDER BY om_etat.id";
6976 softime 8989 $res = $this->f->db->query($sql);
6977     $this->f->addToLog(__METHOD__.": db->query(\"".$sql."\")", VERBOSE_MODE);
6978     $this->f->isDatabaseError($res);
6979 mbroquet 3730 // Données du select
6980     $contenu = array(
6981     0 => array("", ),
6982     1 => array(_("choisir bordereau")),
6983     );
6984     while ($row =& $res->fetchRow(DB_FETCHMODE_ASSOC)) {
6985     $contenu[0][] = $row['id'];
6986     $contenu[1][] = $row['libelle'];
6987     }
6988     $form->setSelect("bordereau", $contenu);
6989 softime 8989 //
6990     if ($_SESSION["niveau"] == 2) {
6991     $form->setLib("om_collectivite", _("collectivite"));
6992     $form->setType("om_collectivite", "select");
6993 mbroquet 3730
6994 softime 8989 // Données du select - On récupère ici la liste de tous toutes les collectivités
6995     // de niveau 1
6996     $sql = "SELECT om_collectivite, libelle
6997     FROM ".DB_PREFIXE."om_collectivite
6998     WHERE niveau = '1' ORDER BY libelle";
6999     $res = $this->f->db->query($sql);
7000     $this->f->addToLog(__METHOD__.": db->query(\"".$sql."\")", VERBOSE_MODE);
7001     $this->f->isDatabaseError($res);
7002     // La valeur par défaut du select est Toutes
7003     $list_collectivites = array(
7004     0 => array("", ),
7005     1 => array(_("toutes"))
7006     );
7007 mbroquet 3730
7008 softime 8989 $id_colls = "";
7009     // On stocke dans $id_colls l'id de toutes les collectivités de niveau 1 séparées
7010     // par des virgules, pour un traitement plus facile dans la requête de sous-état
7011     while ($row =& $res->fetchRow(DB_FETCHMODE_ASSOC)) {
7012     if ($id_colls != "") {
7013     $id_colls .= ",";
7014     }
7015     $id_colls .= $row['om_collectivite'];
7016     $list_collectivites[0][] = $row['om_collectivite'];
7017     $list_collectivites[1][] = $row['libelle'];
7018 mbroquet 3730 }
7019 softime 8989 // On affecte la liste d'identifiants à l'option Toutes
7020     $list_collectivites[0][0] = $id_colls ;
7021     $form->setSelect("om_collectivite", $list_collectivites);
7022 mbroquet 3730 }
7023     // Affichage du formulaire
7024     $form->entete();
7025     $form->afficher($champs, 0, false, false);
7026     $form->enpied();
7027     // Affichage du bouton
7028     printf("\t<div class=\"formControls\">\n");
7029 softime 8989 $this->f->layout->display_form_button(array("value" => _("Valider"), "name" => "validation"));
7030 mbroquet 3730 printf("\t</div>\n");
7031     // Fermeture du formulaire
7032     printf("\t</form>\n");
7033     }
7034    
7035 nmeucci 4317
7036     /**
7037     * VIEW - view_generate_suivi_bordereaux.
7038     *
7039     * Génère et affiche les bordereaux de suivi.
7040     *
7041     * @return [void]
7042     */
7043     function view_generate_suivi_bordereaux() {
7044     // Vérification de l'accessibilité sur l'élément
7045     $this->checkAccessibility();
7046     // Récupération du type de bordereau
7047     $bordereau = $this->f->get_submitted_get_value('type_bordereau');
7048     // Génération du PDF
7049     $result = $this->compute_pdf_output('etat', $bordereau, null, $this->getVal($this->clePrimaire));
7050     // Affichage du PDF
7051     $this->expose_pdf_output(
7052     $result['pdf_output'],
7053     $result['filename']
7054     );
7055     }
7056    
7057    
7058 mbroquet 3730 /**
7059     * VIEW - view_suivi_envoi_lettre_rar.
7060     *
7061 softime 8989 * Vue pour imprimer les AR.
7062 mbroquet 3730 *
7063     * @return void
7064     */
7065     function view_suivi_envoi_lettre_rar() {
7066     // Vérification de l'accessibilité sur l'élément
7067     $this->checkAccessibility();
7068    
7069     //
7070 softime 8989 if ($this->f->get_submitted_post_value("date") !== null) {
7071     $date = $this->f->get_submitted_post_value("date");
7072 mbroquet 3730 } else {
7073     $date = "";
7074     }
7075     //
7076 softime 8989 if ($this->f->get_submitted_post_value("liste_code_barres_instruction") !== null) {
7077     $liste_code_barres_instruction = $this->f->get_submitted_post_value("liste_code_barres_instruction");
7078 mbroquet 3730 } else {
7079     $liste_code_barres_instruction = "";
7080     }
7081    
7082     // Compteur du nombre de page générées
7083     $nbLettres = 0;
7084     // Liste d'id des instructions
7085     $id4Gen = array();
7086     //
7087     $error = "";
7088    
7089 softime 5504 // Initialisation du tableau qui va contenir les DI pour lister les liens
7090     $dossierTab = array();
7091     // On vérifie que l'utilisateur ait les droits pour afficher des consultations
7092     $isAccredited = $this->f->isAccredited(array("dossier_instruction","dossier_instruction_consulter"), "OR");
7093     $hasHidden = true;
7094     // S'il ne peut pas les consulter il aura des dossiers caché
7095     if ($isAccredited === true) {
7096     $hasHidden = false;
7097     }
7098    
7099 mbroquet 3730 /**
7100     * Validation du formulaire
7101     */
7102     // Si le formulaire a été validé
7103 softime 8989 if ($this->f->get_submitted_post_value('validation') !== null) {
7104 mbroquet 3730 //
7105     if (empty($date) || empty($liste_code_barres_instruction)) {
7106     //
7107     $message_class = "error";
7108     $message = _("Tous les champs doivent etre remplis.");
7109     } else {
7110     // Création d'un tableau d'instruction
7111 softime 8989 $liste = explode("\r\n", $this->f->get_submitted_post_value("liste_code_barres_instruction"));
7112 mbroquet 3730 //
7113     foreach ($liste as $code_barres) {
7114     // On enlève les éventuels espaces saisis
7115     $code_barres = trim($code_barres);
7116     // Vérification de l'existence de l'instruction
7117     if ($code_barres != "") {
7118     // Si la valeur transmise est numérique
7119     if (is_numeric($code_barres)) {
7120     //
7121 softime 6565 $sql = "SELECT count(*)
7122     FROM ".DB_PREFIXE."instruction
7123     INNER JOIN ".DB_PREFIXE."dossier
7124     ON dossier.dossier=instruction.dossier
7125     INNER JOIN ".DB_PREFIXE."dossier_instruction_type
7126     ON dossier.dossier_instruction_type = dossier_instruction_type.dossier_instruction_type
7127     INNER JOIN ".DB_PREFIXE."dossier_autorisation_type_detaille
7128     ON dossier_instruction_type.dossier_autorisation_type_detaille = dossier_autorisation_type_detaille.dossier_autorisation_type_detaille
7129     INNER JOIN ".DB_PREFIXE."dossier_autorisation_type
7130     ON dossier_autorisation_type_detaille.dossier_autorisation_type = dossier_autorisation_type.dossier_autorisation_type
7131     INNER JOIN ".DB_PREFIXE."groupe
7132     ON dossier_autorisation_type.groupe = groupe.groupe
7133     WHERE code_barres='".$this->f->db->escapesimple($code_barres)."'";
7134 softime 7067
7135     // Ajout d'un filtre sur les groupes auxquels l'utilisateur a accès
7136     $group_clause = array();
7137     foreach ($_SESSION["groupe"] as $key => $value) {
7138     $group_clause[$key] = "(groupe.code = '".$key."'";
7139     if($value["confidentiel"] !== true) {
7140     $group_clause[$key] .= " AND dossier_autorisation_type.confidentiel IS NOT TRUE";
7141     }
7142     $group_clause[$key] .= ")";
7143     }
7144     $conditions = implode(" OR ", $group_clause);
7145     $sql .= " AND (" . $conditions . ")";
7146    
7147 softime 8989 $nbInstr = $this->f->db->getone($sql);
7148     $this->f->addToLog(__METHOD__.": db->getone(\"".$sql."\")", VERBOSE_MODE);
7149     $this->f->isDatabaseError($nbInstr);
7150 mbroquet 3730 //
7151     if ($nbInstr == "1") {
7152     // Récupération de la date d'envoi de l'instruction bippé
7153     $sql = "SELECT to_char(date_envoi_rar,'DD/MM/YYYY') as date_envoi_rar, instruction FROM ".DB_PREFIXE."instruction WHERE code_barres='".$code_barres."'";
7154 softime 8989 $res = $this->f->db->query($sql);
7155     $this->f->addToLog(__METHOD__.": db->query(\"".$sql."\")", VERBOSE_MODE);
7156     $this->f->isDatabaseError($res);
7157 mbroquet 3730 $row =& $res->fetchRow(DB_FETCHMODE_ASSOC);
7158     // Si pas de date ou correspond à la date du formulaire on
7159     // effectue le traitement
7160     if ($row["date_envoi_rar"] == "" || $row["date_envoi_rar"] == $date) {
7161 softime 7996 $instr = $this->f->get_inst__om_dbform(array(
7162     "obj" => "instruction",
7163     "idx" => $row['instruction'],
7164     ));
7165 mbroquet 3730 $valF = array();
7166     foreach($instr->champs as $id => $champ) {
7167     $valF[$champ] = $instr->val[$id];
7168     }
7169 softime 5504
7170     # Si on peut consulter les dossiers et que le dossier n'existe pas déjà dans la liste
7171     if ($isAccredited === true
7172     && array_key_exists($instr->getVal("dossier"), $dossierTab) === false) {
7173 softime 7996 $dossier = $this->f->get_inst__om_dbform(array(
7174     "obj" => "dossier",
7175     "idx" => $instr->getVal("dossier"),
7176     ));
7177 softime 5504 if ($dossier->is_user_from_allowed_collectivite()){
7178     $dossierTab[$instr->getVal("dossier")] = $dossier;
7179     } else {
7180     $hasHidden = true;
7181     }
7182     }
7183    
7184 mbroquet 3730 $valF['date_evenement']=
7185     $instr->dateDBToForm($valF['date_evenement']);
7186     $valF['archive_date_complet']=
7187     $instr->dateDBToForm($valF['archive_date_complet']);
7188     $valF['archive_date_rejet']=
7189     $instr->dateDBToForm($valF['archive_date_rejet']);
7190     $valF['archive_date_limite']=
7191     $instr->dateDBToForm($valF['archive_date_limite']);
7192     $valF['archive_date_notification_delai']=
7193     $instr->dateDBToForm($valF['archive_date_notification_delai']);
7194     $valF['archive_date_decision']=
7195     $instr->dateDBToForm($valF['archive_date_decision']);
7196     $valF['archive_date_validite']=
7197     $instr->dateDBToForm($valF['archive_date_validite']);
7198     $valF['archive_date_achevement']=
7199     $instr->dateDBToForm($valF['archive_date_achevement']);
7200     $valF['archive_date_chantier']=
7201     $instr->dateDBToForm($valF['archive_date_chantier']);
7202     $valF['archive_date_conformite']=
7203     $instr->dateDBToForm($valF['archive_date_conformite']);
7204     $valF['archive_date_dernier_depot']=
7205     $instr->dateDBToForm($valF['archive_date_dernier_depot']);
7206     $valF['archive_date_limite_incompletude']=
7207     $instr->dateDBToForm($valF['archive_date_limite_incompletude']);
7208     $valF['date_finalisation_courrier']=
7209     $instr->dateDBToForm($valF['date_finalisation_courrier']);
7210     $valF['date_envoi_signature']=
7211     $instr->dateDBToForm($valF['date_envoi_signature']);
7212     $valF['date_retour_signature']=
7213     $instr->dateDBToForm($valF['date_retour_signature']);
7214     $valF['date_envoi_rar']=
7215     $instr->dateDBToForm($valF['date_envoi_rar']);
7216     $valF['date_retour_rar']=
7217     $instr->dateDBToForm($valF['date_retour_rar']);
7218     $valF['date_envoi_controle_legalite']=
7219     $instr->dateDBToForm($valF['date_envoi_controle_legalite']);
7220     $valF['date_retour_controle_legalite']=
7221     $instr->dateDBToForm($valF['date_retour_controle_legalite']);
7222     $valF['date_envoi_rar'] = $date;
7223    
7224     // Vérification de la finalisation du document
7225     // correspondant au code barres
7226     if($instr->getVal("om_final_instruction") === 't') {
7227     $instr->setParameter('maj', 1);
7228 nmeucci 3971 $instr->class_actions[1]["identifier"] =
7229     "envoi lettre RAR (depuis le menu suivi des pièces)";
7230 softime 8989 if ($instr->modifier($valF) == true) {
7231 mbroquet 3730 $id4Gen[] = $code_barres;
7232     $nbLettres ++;
7233     } else {
7234     //
7235     if ($error != "") {
7236     $error .= "<br/>";
7237     }
7238     $error .= sprintf(_("Une erreur s'est produite lors de la modification de l'instruction %s."),
7239     $code_barres);
7240     $error .= " ";
7241     $error .= _("Veuillez contacter votre administrateur.");
7242     }
7243     } else {
7244     //
7245     if ($error != "") {
7246     $error .= "<br/>";
7247     }
7248     $error .= sprintf(_("Le document correspondant au
7249     code barres %s n'est pas finalise,
7250     le bordereau ne sera pas genere."),
7251     $code_barres);
7252     }
7253    
7254     } else {
7255     //
7256     if ($error != "") {
7257     $error .= "<br/>";
7258     }
7259     $error .= _("Une lettre correspondante a l'instruction ayant pour code barres")." ".$code_barres." "._("a deja ete envoyee, le bordereau ne sera pas genere.");
7260     }
7261     } else {
7262     //
7263     if ($error != "") {
7264     $error .= "<br/>";
7265     }
7266     $error .= _("Le numero")." ".$code_barres." "._("ne correspond a aucun code barres d'instruction.");
7267     }
7268     } else {
7269     //
7270     if ($error != "") {
7271     $error .= "<br/>";
7272     }
7273     $error .= _("Le code barres d'instruction")." ".$code_barres." "._("n'est pas valide.");
7274     }
7275     }
7276     }
7277     }
7278     }
7279    
7280     /**
7281     * Affichage des messages et du formulaire
7282     */
7283     // Affichage du message de validation ou d'erreur
7284     if (isset($message) && isset($message_class) && $message != "") {
7285 softime 8989 $this->f->displayMessage($message_class, $message);
7286 mbroquet 3730 }
7287     // Affichage du message d'erreur
7288     if(!empty($error)) {
7289 softime 8989 $this->f->displayMessage("error", $error);
7290 mbroquet 3730 }
7291     // Affichage du message de validation de la saisie
7292     if ($nbLettres > 0) {
7293     //
7294 softime 5504 echo "\n<div class=\"message ui-widget ui-corner-all ui-state-highlight ui-state-valid\" >";
7295     echo "\n<p>";
7296     echo "\n<span class=\"ui-icon ui-icon-info\"></span>";
7297     echo "\n<span class=\"text\">";
7298     echo _("Cliquez sur le lien ci-dessous pour telecharger votre document");
7299     echo " : \n<br/><br/>";
7300     echo "\n<a class='om-prev-icon pdf-16'";
7301 softime 8989 echo "\n title=\""._("imprimer les AR")."\"";
7302 softime 7996 echo "\n href=\"".OM_ROUTE_FORM."&obj=instruction&action=180&idx=0&liste=".implode(",",$id4Gen)."\"";
7303 softime 5504 echo "\n target='_blank'>";
7304 softime 8989 echo _("Telecharger le document pour")." ".$nbLettres." "._("AR");
7305 softime 5504 echo "\n</a>";
7306     echo "\n</span>";
7307     echo "\n</p>";
7308     echo "\n<br/>\n";
7309     if ($isAccredited === true) {
7310     echo '<fieldset id="fieldset-form-rar-lien_di" class="cadre ui-corner-all startClosed" style="background-color: inherite;">';
7311     echo "\n<legend class=\"ui-corner-all ui-widget-content ui-state-active\" style=\"background-color: transparent; color: inherit;\">\n";
7312     echo _('Dossiers concernés par ce traitement');
7313     echo "\n</legend>";
7314     echo "\n<div class=\"fieldsetContent\" style=\"display: none;background-color: inherite\">";
7315    
7316     if ($hasHidden === true) {
7317     echo "\n<br/>";
7318     echo "\n<p>";
7319     echo "\n<span class='text'>";
7320     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.");
7321     echo "</span>";
7322     echo "\n</p>";
7323     echo "\n<br/>";
7324     }
7325     foreach ($dossierTab as $dossier) {
7326 softime 7067
7327     $inst_da = $this->get_inst_common("dossier_autorisation", $dossier->getVal('dossier_autorisation'));
7328     $inst_datd = $this->get_inst_common("dossier_autorisation_type_detaille", $inst_da->getVal('dossier_autorisation_type_detaille'));
7329     $code_datd = $inst_datd->getVal('code');
7330    
7331     $obj = "dossier_instruction";
7332     if ($code_datd === 'REC' OR $code_datd === 'REG') {
7333     $obj = "dossier_contentieux_tous_recours";
7334     }
7335     if ($code_datd === 'IN') {
7336     $obj = "dossier_contentieux_toutes_infractions";
7337     }
7338    
7339 softime 5504 echo "\n<div class=\"bloc group\">";
7340     echo "\n<div class=\"field field-type-text\">";
7341    
7342     echo "\n<p>";
7343     echo "\n<span class='text'>";
7344     echo "\n<a class=\"om-icon om-icon-16 consult-16\" title=\"" . _('Consulter') . "\"";
7345 softime 7996 echo "\n href=\"".OM_ROUTE_FORM."&obj=dossier_instruction&action=3&idx=";
7346 softime 5504 echo $dossier->getVal("dossier");
7347     echo "\">";
7348     echo "\n</a>";
7349    
7350     echo "\n<a title=\""._("Consulter")."\" style=\"vertical-align:middle;\"";
7351 softime 7996 echo " href=\"".OM_ROUTE_FORM."&obj=";
7352 softime 7067 echo $obj;
7353     echo "&action=3&idx=";
7354 softime 5504 echo $dossier->getVal("dossier");
7355     echo "\">";
7356     echo $dossier->getVal("dossier_libelle");
7357     echo "\n</a>";
7358     echo "\n</span>";
7359     echo "\n</p>";
7360    
7361     echo "\n</div>";
7362     echo "\n</div>";
7363     }
7364     echo "\n</div>";
7365     echo "\n</fieldset>";
7366     }
7367     echo "\n</div>";
7368     echo "\n</div>";
7369 mbroquet 3730 }
7370     // Ouverture du formulaire
7371     echo "\t<form";
7372     echo " method=\"post\"";
7373     echo " id=\"suivi_envoi_lettre_rar_form\"";
7374     echo " action=\"\"";
7375     echo ">\n";
7376     // Paramétrage des champs du formulaire
7377     $champs = array("date", "liste_code_barres_instruction");
7378     // Création d'un nouvel objet de type formulaire
7379 softime 7996 $form = $this->f->get_inst__om_formulaire(array(
7380     "validation" => 0,
7381     "maj" => 0,
7382     "champs" => $champs,
7383     ));
7384 mbroquet 3730 // Paramétrage du champ date du formulaire
7385     $form->setLib("date", _("Date")."* :");
7386     $form->setType("date", "date");
7387     $form->setOnchange("date", "fdate(this)");
7388     $form->setVal("date", ($date == "" ? date("d/m/Y") : $date));
7389     $form->setTaille("date", 10);
7390     $form->setMax("date", 10);
7391     // Paramétrage du champ liste_code_barres_instruction du formulaire
7392     $form->setLib("liste_code_barres_instruction", _("Liste des codes barres d'instructions scannes")."* :");
7393     $form->setType("liste_code_barres_instruction", "textarea");
7394     $form->setVal("liste_code_barres_instruction", $liste_code_barres_instruction);
7395     $form->setTaille("liste_code_barres_instruction", 20);
7396     $form->setMax("liste_code_barres_instruction", 20);
7397     // Affichage du formulaire
7398     $form->entete();
7399     $form->afficher($champs, 0, false, false);
7400     $form->enpied();
7401     // Affichage du bouton
7402     echo "\t<div class=\"formControls\">\n";
7403 softime 8989 $this->f->layout->display_form_button(array("value" => _("Valider"), "name" => "validation"));
7404 mbroquet 3730 echo "\t</div>\n";
7405     // Fermeture du formulaire
7406     echo "\t</form>\n";
7407     }
7408    
7409     /**
7410     * VIEW - view_suivi_mise_a_jour_des_dates.
7411     *
7412     * Vu pour mettre à jour les dates de suivi de l'instruction.
7413     *
7414     * @return void
7415     */
7416     function view_suivi_mise_a_jour_des_dates() {
7417     // Vérification de l'accessibilité sur l'élément
7418     $this->checkAccessibility();
7419    
7420     // Récupération des valeur passées en POST ou GET
7421 softime 8989 if($this->f->get_submitted_post_value("type_mise_a_jour") !== null) {
7422     $type_mise_a_jour = $this->f->get_submitted_post_value("type_mise_a_jour");
7423     } elseif($this->f->get_submitted_get_value('type_mise_a_jour') !== null) {
7424     $type_mise_a_jour = $this->f->get_submitted_get_value('type_mise_a_jour');
7425 mbroquet 3730 } else {
7426     $type_mise_a_jour = "";
7427     }
7428 softime 8989 if($this->f->get_submitted_post_value('date') !== null) {
7429     $date = $this->f->get_submitted_post_value('date');
7430     } elseif($this->f->get_submitted_get_value('date') !== null) {
7431     $date = $this->f->get_submitted_get_value('date');
7432 mbroquet 3730 } else {
7433     $date = "";
7434     }
7435 softime 8989 if($this->f->get_submitted_post_value('code_barres') !== null) {
7436     $code_barres = $this->f->get_submitted_post_value('code_barres');
7437     } elseif($this->f->get_submitted_get_value('code_barres') !== null) {
7438     $code_barres = $this->f->get_submitted_get_value('code_barres');
7439 mbroquet 3730 } else {
7440     $code_barres = "";
7441     }
7442     // Booléen permettant de définir si un enregistrement à eu lieu
7443     $correct = false;
7444     // Booléen permettant de définir si les dates peuvent êtres enregistrées
7445     $date_error = false;
7446     // Champs date à mettre à jour
7447     $liste_champs=array();
7448    
7449     // Si le formulaire a été validé
7450 softime 8989 if ($this->f->get_submitted_post_value('validation') !== null) {
7451 mbroquet 3730 if(!empty($type_mise_a_jour) and !empty($date) and !empty($code_barres)) {
7452    
7453 softime 6565 // Vérification de l'existence de l'instruction
7454     $sql = "SELECT instruction
7455     FROM ".DB_PREFIXE."instruction
7456     INNER JOIN ".DB_PREFIXE."dossier
7457     ON dossier.dossier=instruction.dossier
7458     INNER JOIN ".DB_PREFIXE."dossier_instruction_type
7459     ON dossier.dossier_instruction_type = dossier_instruction_type.dossier_instruction_type
7460     INNER JOIN ".DB_PREFIXE."dossier_autorisation_type_detaille
7461     ON dossier_instruction_type.dossier_autorisation_type_detaille = dossier_autorisation_type_detaille.dossier_autorisation_type_detaille
7462     INNER JOIN ".DB_PREFIXE."dossier_autorisation_type
7463     ON dossier_autorisation_type_detaille.dossier_autorisation_type = dossier_autorisation_type.dossier_autorisation_type
7464     INNER JOIN ".DB_PREFIXE."groupe
7465     ON dossier_autorisation_type.groupe = groupe.groupe
7466     WHERE code_barres='".$this->f->db->escapesimple($code_barres)."'";
7467 softime 7067
7468     // Ajout d'un filtre sur les groupes auxquels l'utilisateur a accès
7469     $group_clause = array();
7470     foreach ($_SESSION["groupe"] as $key => $value) {
7471     $group_clause[$key] = "(groupe.code = '".$key."'";
7472     if($value["confidentiel"] !== true) {
7473     $group_clause[$key] .= " AND dossier_autorisation_type.confidentiel IS NOT TRUE";
7474     }
7475     $group_clause[$key] .= ")";
7476     }
7477     $conditions = implode(" OR ", $group_clause);
7478     $sql .= " AND (" . $conditions . ")";
7479    
7480    
7481 softime 8989 $res = $this->f->db->query($sql);
7482     $this->f->addToLog(__METHOD__.": db->query(\"".$sql."\")", VERBOSE_MODE);
7483     $this->f->isDatabaseError($res);
7484 mbroquet 3730
7485     if($res->numrows() == 1) {
7486     $liste_champs = explode(";", $type_mise_a_jour);
7487 softime 11418 $row =& $res->fetchRow(DB_FETCHMODE_ASSOC);
7488     $instr = $this->f->get_inst__om_dbform(array(
7489     "obj" => "instruction",
7490     "idx" => $row['instruction'],
7491     ));
7492 mbroquet 3730 // Mise à jour des dates après l'écran de verification
7493 softime 8989 if($this->f->get_submitted_post_value('is_valid') !== null and $this->f->get_submitted_post_value('is_valid') == "true") {
7494 mbroquet 3730 $valF = array();
7495     foreach($instr->champs as $id => $champ) {
7496     $valF[$champ] = $instr->val[$id];
7497     }
7498 softime 6565 $valF['date_evenement'] = $instr->dateDBToForm($valF['date_evenement']);
7499     $valF['archive_date_complet'] = $instr->dateDBToForm($valF['archive_date_complet']);
7500     $valF['archive_date_rejet'] = $instr->dateDBToForm($valF['archive_date_rejet']);
7501     $valF['archive_date_limite'] = $instr->dateDBToForm($valF['archive_date_limite']);
7502     $valF['archive_date_notification_delai'] = $instr->dateDBToForm($valF['archive_date_notification_delai']);
7503     $valF['archive_date_decision'] = $instr->dateDBToForm($valF['archive_date_decision']);
7504     $valF['archive_date_validite'] = $instr->dateDBToForm($valF['archive_date_validite']);
7505     $valF['archive_date_achevement'] = $instr->dateDBToForm($valF['archive_date_achevement']);
7506     $valF['archive_date_chantier'] = $instr->dateDBToForm($valF['archive_date_chantier']);
7507     $valF['archive_date_conformite'] = $instr->dateDBToForm($valF['archive_date_conformite']);
7508     $valF['archive_date_dernier_depot'] = $instr->dateDBToForm($valF['archive_date_dernier_depot']);
7509     $valF['archive_date_limite_incompletude'] = $instr->dateDBToForm($valF['archive_date_limite_incompletude']);
7510     $valF['date_finalisation_courrier'] = $instr->dateDBToForm($valF['date_finalisation_courrier']);
7511     $valF['date_envoi_signature'] = $instr->dateDBToForm($valF['date_envoi_signature']);
7512     $valF['date_retour_signature'] = $instr->dateDBToForm($valF['date_retour_signature']);
7513     $valF['date_envoi_rar'] = $instr->dateDBToForm($valF['date_envoi_rar']);
7514     $valF['date_retour_rar'] = $instr->dateDBToForm($valF['date_retour_rar']);
7515     $valF['date_envoi_controle_legalite'] = $instr->dateDBToForm($valF['date_envoi_controle_legalite']);
7516     $valF['date_retour_controle_legalite'] = $instr->dateDBToForm($valF['date_retour_controle_legalite']);
7517     $valF['archive_date_cloture_instruction'] = $instr->dateDBToForm($valF['archive_date_cloture_instruction']);
7518     $valF['archive_date_premiere_visite'] = $instr->dateDBToForm($valF['archive_date_premiere_visite']);
7519     $valF['archive_date_derniere_visite'] = $instr->dateDBToForm($valF['archive_date_derniere_visite']);
7520     $valF['archive_date_contradictoire'] = $instr->dateDBToForm($valF['archive_date_contradictoire']);
7521     $valF['archive_date_retour_contradictoire'] = $instr->dateDBToForm($valF['archive_date_retour_contradictoire']);
7522     $valF['archive_date_ait'] = $instr->dateDBToForm($valF['archive_date_ait']);
7523     $valF['archive_date_transmission_parquet'] = $instr->dateDBToForm($valF['archive_date_transmission_parquet']);
7524 mbroquet 3730
7525     foreach(explode(";", $type_mise_a_jour) as $maj_date) {
7526     $valF[$maj_date]=$date;
7527     }
7528    
7529     // Vérification de la finalisation du document
7530     // correspondant au code barres
7531     if($valF["om_final_instruction"] === 't' or
7532     $valF["lettretype"] == '') {
7533     $code_barres = "";
7534    
7535     //Désactivation de l'autocommit
7536 softime 8989 $this->f->db->autoCommit(false);
7537 mbroquet 3730
7538     //On modifie les valeurs de l'instruction
7539     $instr->setParameter('maj', 170);
7540 nmeucci 3965 $instr->class_actions[170]["identifier"] =
7541 nmeucci 3972 "mise à jour des dates (depuis le menu suivi des pièces)";
7542 softime 8989 $retour = $instr->modifier($valF);
7543 mbroquet 3730
7544     //Si une erreur s'est produite, on défait les modifications
7545     //qui ont été faites
7546     if (!$retour){
7547     $instr->undoValidation();
7548     }
7549     //Sinon, on valide en base de données les modifications
7550     else {
7551 softime 8989 $this->f->db->commit();
7552 mbroquet 3730 }
7553    
7554     // Variable correct retourné depuis la classe instruction
7555     $correct = $instr->correct;
7556    
7557     // Si la modification sur l'instruction a échoué
7558     if ($correct === false) {
7559    
7560     // Message d'erreur de la classe instruction
7561     $error = $instr->msg;
7562     }
7563    
7564     } else {
7565     // Indique que le traitement est en erreur
7566     $correct = false;
7567     // Message d'erreur
7568     $error = sprintf(_("Le document n'est pas finalise."),
7569     "<span class='bold'>".$code_barres."</span>");
7570     }
7571     } else {
7572     // Récupération des infos du dossier
7573     $sqlInfo = "SELECT dossier.dossier_libelle,
7574     evenement.libelle as evenement,
7575     autorite_competente.code as autorite_competente_code,
7576     autorite_competente.libelle as autorite_competente,
7577     evenement.type as evenement_type,
7578     to_char(date_envoi_signature,'DD/MM/YYYY') as date_envoi_signature,
7579     to_char(date_retour_signature,'DD/MM/YYYY') as date_retour_signature,
7580     to_char(date_envoi_controle_legalite,'DD/MM/YYYY') as date_envoi_controle_legalite,
7581     to_char(date_retour_controle_legalite,'DD/MM/YYYY') as date_retour_controle_legalite,
7582     to_char(date_envoi_rar,'DD/MM/YYYY') as date_envoi_rar,
7583     to_char(date_retour_rar,'DD/MM/YYYY') as date_retour_rar
7584     FROM ".DB_PREFIXE."instruction
7585     INNER JOIN ".DB_PREFIXE."dossier ON
7586     dossier.dossier=instruction.dossier
7587     LEFT JOIN ".DB_PREFIXE."autorite_competente ON
7588     dossier.autorite_competente=autorite_competente.autorite_competente
7589     INNER JOIN ".DB_PREFIXE."evenement ON
7590     instruction.evenement=evenement.evenement
7591     WHERE code_barres='".$code_barres."'";
7592 softime 8989 $resInfo = $this->f->db->query($sqlInfo);
7593     $this->f->isDatabaseError($resInfo);
7594 mbroquet 3730 $infos = $resInfo->fetchRow(DB_FETCHMODE_ASSOC);
7595    
7596     // Vérification de la non modification des dates de suivi
7597     foreach(explode(";", $type_mise_a_jour) as $champ) {
7598 softime 11418 if ($champ === 'date_envoi_controle_legalite') {
7599     if ($instr->is_sent_to_cl() === true) {
7600     $error = __("Les dates de suivis ne peuvent etre modifiees");
7601     $date_error = true;
7602     break;
7603     }
7604     }
7605 mbroquet 3730 if($infos[$champ] != "" AND $infos[$champ] != $date) {
7606     $error = _("Les dates de suivis ne peuvent etre modifiees");
7607     $date_error = true;
7608 softime 11418 break;
7609 mbroquet 3730 }
7610     }
7611     }
7612     } else {
7613     $error = _("Le numero saisi ne correspond a aucun code barres d'instruction.");
7614     }
7615    
7616     } else {
7617     $error = _("Tous les champs doivent etre remplis.");
7618     }
7619     }
7620    
7621     /**
7622     * Affichage des messages et du formulaire
7623     */
7624     // Affichage du message de validation ou d'erreur
7625     if (isset($message) && isset($message_class) && $message != "") {
7626 softime 8989 $this->f->displayMessage($message_class, $message);
7627 mbroquet 3730 }
7628     // Affichage du message d'erreur
7629     if(!empty($error)) {
7630 softime 8989 $this->f->displayMessage("error", $error);
7631 mbroquet 3730 }
7632    
7633     // Affichage du message de validation de la saisie
7634     if($correct === true) {
7635 softime 8989 $this->f->displayMessage("ok", _("Saisie enregistree"));
7636 mbroquet 3730 }
7637     // Ouverture du formulaire
7638     echo "\t<form";
7639     echo " method=\"post\"";
7640     echo " id=\"suivi_mise_a_jour_des_dates_form\"";
7641     echo " action=\"\"";
7642     echo ">\n";
7643     // Paramétrage des champs du formulaire
7644     if(isset($infos)) {
7645     $champs = array("type_mise_a_jour", "date", "code_barres", "dossier_libelle", "evenement"
7646     , "autorite_competente", "date_envoi_signature",
7647     "date_retour_signature", "date_envoi_controle_legalite",
7648     "date_retour_controle_legalite", "date_envoi_rar",
7649     "date_retour_rar", "is_valid");
7650     } else {
7651     $champs = array("type_mise_a_jour", "date", "code_barres");
7652     }
7653     // Création d'un nouvel objet de type formulaire
7654 softime 7996 $form = $this->f->get_inst__om_formulaire(array(
7655     "validation" => 0,
7656     "maj" => 0,
7657     "champs" => $champs,
7658     ));
7659 mbroquet 3730 // Paramétrage des champs du formulaire
7660     // Parametrage du champ type_mise_a_jour
7661     $form->setLib("type_mise_a_jour", _("Date a mettre a jour")."* :");
7662     if(isset($infos)) {
7663     $form->setType("type_mise_a_jour", "selecthiddenstatic");
7664    
7665     } else {
7666     $form->setType("type_mise_a_jour", "select");
7667    
7668     }
7669     $form->setVal("type_mise_a_jour", $type_mise_a_jour);
7670     $contenu = array();
7671    
7672     $contenu[0][0] = "date_envoi_signature";
7673     $contenu[1][0] = _("date d'envoi pour signature Mairie/Prefet");
7674    
7675     $contenu[0][1] = "date_retour_signature";
7676     $contenu[1][1] = _("date de retour de signature Mairie/Prefet");
7677    
7678     $contenu[0][2] = "date_retour_signature;date_envoi_controle_legalite";
7679     $contenu[1][2] = _("date de retour de signature + Envoi controle legalite");
7680    
7681     $contenu[0][3] = "date_envoi_controle_legalite";
7682     $contenu[1][3] = _("date d'envoi au controle de legalite");
7683    
7684     $contenu[0][4] = "date_retour_controle_legalite";
7685     $contenu[1][4] = _("date de retour de controle de legalite");
7686    
7687     $contenu[0][5] = "date_retour_rar";
7688 softime 8989 $contenu[1][5] = __("date de notification du correspondant");
7689 mbroquet 3730
7690     $form->setSelect("type_mise_a_jour", $contenu);
7691    
7692     // Parametrage du champ date
7693     $form->setLib("date", _("Date")."* :");
7694     if(isset($infos)) {
7695     $form->setType("date", "hiddenstaticdate");
7696    
7697     } else {
7698     $form->setType("date", "date");
7699     }
7700     $form->setVal("date", $date);
7701     $form->setTaille("date", 10);
7702     $form->setMax("date", 10);
7703    
7704     // Parametrage du champ code_barres
7705     $form->setLib("code_barres", _("Code barres d'instruction")."* :");
7706     if(isset($infos)) {
7707     $form->setType("code_barres", "hiddenstatic");
7708     } else {
7709     $form->setType("code_barres", "text");
7710     }
7711     $form->setVal("code_barres", $code_barres);
7712     $form->setTaille("code_barres", 20);
7713     $form->setMax("code_barres", 20);
7714    
7715     // Ajout des infos du dossier correspondantes à l'instruction séléctionnée
7716     if(isset($infos)) {
7717    
7718     // Tous les champs sont défini par defaut à static
7719     foreach ($infos as $key => $value) {
7720     $form->setType($key, "static");
7721     if(in_array($key, $liste_champs)) {
7722     $form->setVal($key, $date);
7723     } else {
7724     $form->setVal($key, $value);
7725     }
7726     }
7727    
7728     // Les champs dont on viens de définir la valeur sont en gras
7729     foreach ($liste_champs as $value) {
7730     $form->setBloc($value,'DF',"",'bold');
7731     }
7732    
7733     // Parametrage du champ dossier
7734     $form->setLib("dossier_libelle", _("dossier_libelle")." :");
7735     $form->setType("dossier_libelle", "static");
7736     $form->setVal("dossier_libelle", $infos['dossier_libelle']);
7737    
7738     // Parametrage du champ evenement
7739     $form->setLib("evenement", _("evenement")." :");
7740     $form->setType("evenement", "static");
7741     $form->setVal("evenement", $infos['evenement']);
7742    
7743     // Parametrage du champ autorite_competente
7744     $form->setLib("autorite_competente", _("Autorite competente")." :");
7745     $form->setType("autorite_competente", "static");
7746     $form->setVal("autorite_competente", $infos['autorite_competente']);
7747    
7748 softime 8989 // Parametrage des libellés d'envoi avec AR
7749     $form->setLib("date_envoi_rar", __("date_envoi_ar")." :");
7750     $form->setLib("date_retour_rar", __("date_notification")." :");
7751 mbroquet 3730
7752     $form->setLib("date_envoi_signature", _("date_envoi_signature")." :");
7753     $form->setLib("date_retour_signature", _("date_retour_signature")." :");
7754     $form->setLib("date_envoi_controle_legalite", _("date_envoi_controle_legalite")." :");
7755     $form->setLib("date_retour_controle_legalite", _("date_retour_controle_legalite")." :");
7756     // Configuration des libellé en fonction de l'autorité compétente
7757     if($infos['autorite_competente_code'] == 'ETAT') {
7758     $form->setType("date_envoi_controle_legalite", "hiddendate");
7759     $form->setType("date_retour_controle_legalite", "hiddendate");
7760     }
7761    
7762     // Ajout d'un champ hidden permettant de savoir que le formulaire précédant est celui de vérification
7763     $form->setLib("is_valid", _("Valide")." :");
7764     $form->setType("is_valid", "hidden");
7765     $form->setVal("is_valid", 'true');
7766    
7767     $form->setFieldset('dossier_libelle','D',_('Synthese'));
7768     $form->setFieldset('is_valid','F');
7769    
7770     }
7771    
7772    
7773     // Création du fieldset regroupant les champs permettant la mise à jour des date
7774     $form->setFieldset('type_mise_a_jour','D',_('Mise a jour'));
7775     $form->setFieldset('code_barres','F');
7776     // Affichage du formulaire
7777     $form->entete();
7778     $form->afficher($champs, 0, false, false);
7779     $form->enpied();
7780     // Affichage du bouton
7781     echo "\t<div class=\"formControls\">\n";
7782     //
7783     if(!$date_error) {
7784 softime 8989 $this->f->layout->display_form_button(array("value" => _("Valider"), "name" => "validation"));
7785 mbroquet 3730 }
7786     // Si pas sur l'écran de validation
7787     if(isset($infos)) {
7788 softime 7996 echo "<a class=\"retour\" href=\"".OM_ROUTE_FORM."&obj=instruction_suivi_mise_a_jour_des_dates&action=170&idx=0";
7789 mbroquet 3730 echo "&amp;type_mise_a_jour=".$type_mise_a_jour."&amp;date=".$date."&amp;code_barres=".$code_barres;
7790     echo "\">Retour</a>";
7791     }
7792     echo "\t</div>\n";
7793     // Fermeture du formulaire
7794     echo "\t</form>\n";
7795     }
7796    
7797     /**
7798     * [view_pdf_lettre_rar description]
7799     *
7800     * @return [type] [description]
7801     */
7802     function view_pdf_lettre_rar() {
7803     // Vérification de l'accessibilité sur l'élément
7804     $this->checkAccessibility();
7805 softime 8989 //
7806     $this->f->disableLog();
7807 mbroquet 3730
7808 softime 8989 if($this->f->get_submitted_get_value('liste') != null) {
7809     $listeCodeBarres = explode(',',$this->f->get_submitted_get_value('liste'));
7810 mbroquet 3730
7811     // Classe permettant la mise en page de l'édition pdf
7812     require_once "../obj/pdf_lettre_rar.class.php";
7813     $pdf_lettre_rar = new pdf_lettre_rar('P', 'mm', 'A4');
7814     // Initialisation de la mise en page
7815 softime 8989 $pdf_lettre_rar->init($this->f);
7816 mbroquet 3730
7817     foreach ($listeCodeBarres as $code_barres) {
7818    
7819 softime 7067 // On récupère le dossier
7820     $sql = "SELECT dossier
7821     FROM " . DB_PREFIXE . "instruction
7822     WHERE code_barres = '" . $code_barres . "'";
7823 softime 8989 $dossier = $this->f->db->getOne($sql);
7824 softime 7067 $this->f->addToLog(__METHOD__."(): db->getOne(\"".$sql."\")", VERBOSE_MODE);
7825     $this->f->isDatabaseError($dossier);
7826 softime 7996 $inst_dossier = $this->f->get_inst__om_dbform(array(
7827     "obj" => "dossier",
7828     "idx" => $dossier,
7829     ));
7830 softime 7067
7831     // En fonction du type de dossier, on récupère un demandeur différent dans les requêtes
7832     $groupe = $inst_dossier->get_type_affichage_formulaire();
7833     switch ($groupe) {
7834     case 'CTX IN':
7835     $sql_demandeur = "(lien_dossier_demandeur.petitionnaire_principal IS TRUE AND demandeur.type_demandeur='plaignant')";
7836     break;
7837     case 'CTX RE':
7838     $sql_demandeur = "(lien_dossier_demandeur.petitionnaire_principal IS TRUE AND demandeur.type_demandeur='requerant')";
7839     break;
7840     case 'ADS':
7841     case 'DPC':
7842 softime 10573 case 'CONSULTATION ENTRANTE':
7843 softime 7067 default:
7844     $sql_demandeur = "((lien_dossier_demandeur.petitionnaire_principal IS TRUE AND demandeur.type_demandeur='petitionnaire') OR demandeur.type_demandeur='delegataire')";
7845     break;
7846     }
7847    
7848 mbroquet 3730 // Test si l'evenement est de type arrete et si un délégataire a été nommé
7849     $sql = "SELECT
7850     dossier.dossier_libelle,
7851     evenement.type,
7852 softime 3834 count(lien_dossier_demandeur) as nbdemandeur,
7853     CASE
7854     WHEN division.libelle IS NOT NULL AND phase.code IS NOT NULL
7855     THEN CONCAT(phase.code, ' - ', division.libelle)
7856     ELSE
7857     phase.code
7858     END AS code_phase
7859 mbroquet 3730 FROM ".DB_PREFIXE."instruction
7860     LEFT JOIN ".DB_PREFIXE."dossier
7861     ON instruction.dossier = dossier.dossier
7862 softime 3834 LEFT JOIN ".DB_PREFIXE."division
7863     ON dossier.division = division.division
7864 mbroquet 3730 INNER JOIN ".DB_PREFIXE."evenement ON
7865 softime 3834 instruction.evenement=evenement.evenement
7866     LEFT JOIN ".DB_PREFIXE."phase
7867     ON evenement.phase = phase.phase
7868 mbroquet 3730 inner JOIN ".DB_PREFIXE."lien_dossier_demandeur ON
7869     instruction.dossier=lien_dossier_demandeur.dossier
7870     inner join ".DB_PREFIXE."demandeur on
7871     demandeur.demandeur=lien_dossier_demandeur.demandeur
7872     WHERE code_barres='".$code_barres."'
7873 softime 7067 AND " . $sql_demandeur . "
7874 softime 3834 GROUP BY dossier.dossier_libelle, evenement.type, phase.code, division.libelle";
7875 mbroquet 3730
7876 softime 8989 $res = $this->f->db->query($sql);
7877     $this->f->addToLog(__METHOD__.": db->query(\"".$sql."\")", VERBOSE_MODE);
7878     $this->f->isDatabaseError($res);
7879 mbroquet 3730 $testDemandeur = $res->fetchrow(DB_FETCHMODE_ASSOC);
7880    
7881    
7882     // Recuperation de l'adresse de destination
7883     $sqlAdresse = "SELECT
7884     CASE WHEN demandeur.qualite='particulier'
7885     THEN TRIM(CONCAT_WS(' ', pc.libelle, demandeur.particulier_nom, demandeur.particulier_prenom))
7886     ELSE TRIM(demandeur.personne_morale_denomination)
7887     END as ligne1,
7888     CASE WHEN demandeur.qualite='personne_morale'
7889     THEN TRIM(demandeur.personne_morale_raison_sociale)
7890     ELSE ''
7891     END as ligne1_1,
7892     CASE WHEN demandeur.qualite='personne_morale' AND (demandeur.personne_morale_nom IS NOT NULL OR demandeur.personne_morale_prenom IS NOT NULL)
7893     THEN TRIM(CONCAT_WS(' ', 'rep. par', demandeur.personne_morale_nom, demandeur.personne_morale_prenom))
7894     ELSE ''
7895     END as ligne1_2,
7896     trim(concat(demandeur.numero,' ',demandeur.voie)) as ligne2,
7897     CASE demandeur.complement
7898     WHEN null THEN ''
7899     ELSE trim(demandeur.complement)
7900     END as ligne3,
7901     CASE demandeur.lieu_dit
7902     WHEN null THEN ''
7903     ELSE trim(demandeur.lieu_dit)
7904     END as ligne4,
7905     CONCAT_WS(' ', demandeur.code_postal, demandeur.localite,
7906     (CASE WHEN demandeur.bp IS NOT NULL
7907     THEN CONCAT_WS(' ', 'BP', demandeur.bp)
7908     ELSE ''
7909     END),
7910     (CASE WHEN demandeur.cedex IS NOT NULL
7911     THEN CONCAT_WS(' ', 'CEDEX', demandeur.cedex)
7912     ELSE ''
7913     END))
7914     as ligne5,
7915     code_barres as code_barres
7916     FROM ".DB_PREFIXE."instruction
7917     INNER JOIN ".DB_PREFIXE."dossier ON dossier.dossier = instruction.dossier
7918     INNER JOIN ".DB_PREFIXE."lien_dossier_demandeur ON dossier.dossier = lien_dossier_demandeur.dossier
7919     INNER JOIN ".DB_PREFIXE."demandeur ON lien_dossier_demandeur.demandeur = demandeur.demandeur
7920     LEFT OUTER JOIN ".DB_PREFIXE."civilite as pc ON demandeur.particulier_civilite = pc.civilite OR demandeur.personne_morale_civilite = pc.civilite
7921     WHERE instruction.code_barres ='".$code_barres."'";
7922    
7923     // Envoi pour delegataire ou petitionnaire principal selon le type d'evenement
7924     if($testDemandeur['type'] != 'arrete' AND $testDemandeur['nbdemandeur'] > 1) {
7925     $sqlAdresse .= " AND demandeur.type_demandeur='delegataire'";
7926     } else {
7927 softime 7996 $sqlAdresse .= " AND demandeur.type_demandeur='petitionnaire' AND lien_dossier_demandeur.petitionnaire_principal IS TRUE";
7928 mbroquet 3730 }
7929    
7930 softime 8989 $resAdresse = $this->f->db->query($sqlAdresse);
7931 mbroquet 3730 $adresse_dest = $resAdresse->fetchrow(DB_FETCHMODE_ASSOC);
7932 softime 8989 $this->f->addToLog(__METHOD__.": db->query(\"".$sqlAdresse."\")", VERBOSE_MODE);
7933     $this->f->isDatabaseError($resAdresse);
7934 mbroquet 3730
7935     // Création adresse destinataire sans ligne vide
7936     $adresse_destinataire = array();
7937     if (!empty($adresse_dest['ligne1'])) {
7938     $adresse_destinataire[] = $adresse_dest['ligne1'];
7939     }
7940     if (!empty($adresse_dest['ligne1_1'])) {
7941     $adresse_destinataire[] = $adresse_dest['ligne1_1'];
7942     }
7943     if (!empty($adresse_dest['ligne1_2'])) {
7944     $adresse_destinataire[] = $adresse_dest['ligne1_2'];
7945     }
7946     $adresse_destinataire[] = $adresse_dest['ligne2'];
7947     if (!empty($adresse_dest['ligne3'])) {
7948     $adresse_destinataire[] = $adresse_dest['ligne3'];
7949     }
7950     if (!empty($adresse_dest['ligne4'])) {
7951     $adresse_destinataire[] = $adresse_dest['ligne4'];
7952     }
7953     $adresse_destinataire[] = $adresse_dest['ligne5'];
7954    
7955     // Création du champ specifique
7956     $specifique_content = array();
7957     $specifique_content[] = $adresse_dest['ligne1'];
7958     $specifique_content[] = $adresse_dest['ligne1_1'];
7959     $specifique_content[] = $adresse_dest['ligne1_2'];
7960     $specifique_content[] = $testDemandeur['dossier_libelle'];
7961     $specifique_content[] = "|||||".$adresse_dest['code_barres']."|||||";
7962     unset($adresse_dest['code_barres']);
7963     // Ajout d'une page aux pdf
7964 softime 3834 $pdf_lettre_rar->addLetter($adresse_destinataire, $specifique_content, $testDemandeur['code_phase']);
7965 mbroquet 3730
7966     }
7967     $pdf_output = $pdf_lettre_rar->output("lettre_rar".date("dmYHis").".pdf","S");
7968 softime 7685 $om_edition = $this->f->get_inst__om_edition();
7969 mbroquet 3730 $om_edition->expose_pdf_output($pdf_output, "lettre_rar".date("dmYHis").".pdf");
7970     }
7971     }
7972    
7973     /**
7974     * VIEW - view_bordereau_envoi_maire.
7975     *
7976     * Formulaire demandant :
7977     * - le code-barres de l'événement d'instruction
7978     * - la date d'envoi du courrier pour signature par le maire
7979     *
7980     * Lors de la validation :
7981     * => met à jour cette date dans l'événement d'instruction
7982     * => crée un lien permettant de générer en PDF le bordereau
7983     *
7984     * @return void
7985     */
7986     function view_bordereau_envoi_maire() {
7987     // Vérification de l'accessibilité sur l'élément
7988     $this->checkAccessibility();
7989    
7990     // Récupération des valeur passées en POST ou GET
7991     $code_barres = "";
7992     if($this->f->get_submitted_post_value('code_barres') !== null) {
7993     $code_barres = $this->f->get_submitted_post_value('code_barres');
7994     } elseif($this->f->get_submitted_get_value('code_barres')!==null) {
7995     $code_barres = $this->f->get_submitted_get_value('code_barres');
7996     }
7997     $date = "";
7998     if($this->f->get_submitted_post_value('date') !== null) {
7999     $date = $this->f->get_submitted_post_value('date');
8000     } elseif($this->f->get_submitted_get_value('date') !== null) {
8001     $date = $this->f->get_submitted_get_value('date');
8002     }
8003     $validation = 0;
8004     if($this->f->get_submitted_post_value('validation') !== null) {
8005     $validation = $this->f->get_submitted_post_value('validation');
8006     } elseif($this->f->get_submitted_get_value('validation') !== null) {
8007     $validation = $this->f->get_submitted_get_value('validation');
8008     }
8009    
8010     // Si le formulaire a été validé
8011     if ($this->f->get_submitted_post_value('validation') !== null) {
8012     // Tous les champs doivent obligatoirement être remplis
8013     if (!empty($date) && !empty($code_barres)) {
8014     $date_en = $this->dateDB($date);
8015     // Si date valide
8016     if ($date_en != "") {
8017     $id_instruction = $this->get_instruction_by_barcode($code_barres);
8018     // Si un événement d'instruction a été trouvé pour ce code-barres
8019     if ($id_instruction !== null) {
8020     $ret = $this->update_date_envoi_signature($id_instruction, $date_en);
8021     // Si mise à jour réussie de la date d'envoi du courrier
8022     // pour signature par l'autorité compétente
8023     if($ret === true) {
8024     // Message de validation avec lien PDF
8025     $message_class = "valid";
8026     $message = '&bullet; '._("Veuillez cliquer sur le lien ci-dessous pour telecharger votre bordereau");
8027     $message .= " : <br/><br/>";
8028     $message .= "<a class='om-prev-icon pdf-16'";
8029     $message .= " id=\"generer_bordereau_envoi_maire\"";
8030     $message .= " title=\""._("Bordereau")."\"";
8031 softime 7996 $message .= " href='".OM_ROUTE_FORM."&obj=instruction";
8032 mbroquet 3730 $message .= "&action=200";
8033     $message .= "&idx=".$id_instruction."'";
8034     $message .= " target='_blank'>";
8035     $message .= _("Bordereau d'envoi au maire");
8036     $message .= "</a><br/><br/>";
8037     $message .= '&bullet; '._("Rappel des informations saisies")." :<br/><br/>";
8038     $message .= _("Code du courrier")." : ".$code_barres."<br/>";
8039     $message .= _("Date d'envoi du courrier pour signature par le maire")." : ".$date;
8040    
8041     } else {
8042     // Message d'erreur
8043     $message_class = "error";
8044     $message = sprintf(_("Erreur lors de la mise a jour de l'evenement d'instruction correspondant au code barres %s."),
8045     $code_barres);
8046     }
8047     }
8048     else {
8049     $message_class = "error";
8050     $message = _("Le numero saisi ne correspond a aucun code-barres d'evenement d'instruction.");
8051     }
8052     }
8053     else {
8054     $message_class = "error";
8055     $message = _("La date est invalide.");
8056     }
8057     } else {
8058     $message_class = "error";
8059     $message = _("Tous les champs doivent etre remplis.");
8060     }
8061     }
8062    
8063     /**
8064     * Affichage des messages et du formulaire
8065     */
8066    
8067     // Affichage du message de validation ou d'erreur
8068     if (isset($message) && isset($message_class) && $message != "") {
8069     $this->f->displayMessage($message_class, $message);
8070     }
8071    
8072     // Ouverture du formulaire
8073     $datasubmit = $this->getDataSubmit();
8074     echo "\n<!-- ########## START DBFORM ########## -->\n";
8075     echo "<form";
8076     echo " id=\"bordereau_envoi_maire\"";
8077     echo " method=\"post\"";
8078     echo " name=\"f1\"";
8079     echo " action=\"";
8080     echo $datasubmit;
8081     echo "\"";
8082     echo ">\n";
8083    
8084     // Paramétrage des champs du formulaire
8085     $champs = array("code_barres","date");
8086    
8087     // Création d'un nouvel objet de type formulaire
8088 softime 7996 $form = $this->f->get_inst__om_formulaire(array(
8089     "validation" => 0,
8090     "maj" => 0,
8091     "champs" => $champs,
8092     ));
8093 mbroquet 3730
8094     $template_required_label = '%s *';
8095     // Parametrage du champ code_barres
8096     $form->setLib("code_barres", sprintf($template_required_label,_("Code du courrier")));
8097     $form->setType("code_barres", "text");
8098     $form->setVal("code_barres", $code_barres);
8099     $form->setTaille("code_barres", 20);
8100     $form->setMax("code_barres", 20);
8101     // Parametrage du champ date
8102     $form->setLib("date", sprintf($template_required_label,_("Date d'envoi du courrier pour signature par le maire")));
8103     $form->setType("date", "date") ;
8104     if (empty($date)) {
8105     $date = date('d/m/Y');
8106     }
8107     $form->setVal("date", $date);
8108     $form->setTaille("date", 10);
8109     $form->setMax("date", 10);
8110    
8111     // Création du bloc regroupant les champs
8112     $form->setBloc('code_barres','D');
8113     $form->setBloc('date','F');
8114     // Affichage du formulaire
8115     $form->entete();
8116     $form->afficher($champs, 0, false, false);
8117     $form->enpied();
8118     // Affichage du bouton
8119     printf("\t<div class=\"formControls\">\n");
8120     //
8121     $this->f->layout->display_form_button(array("value" => _("Valider"), "name" => "validation"));
8122     printf("\t</div>\n");
8123     // Fermeture du formulaire
8124     printf("\t</form>\n");
8125     }
8126    
8127     /**
8128     * VIEW - view_bordereau_envoi_maire.
8129     *
8130     * PDF de bordereau d'envoi au maire pour l'événement d'instruction instancié
8131     *
8132     * @return [void]
8133     */
8134     function view_generate_bordereau_envoi_maire() {
8135     // Vérification de l'accessibilité sur l'élément
8136     $this->checkAccessibility();
8137     // Récupération de la collectivité du dossier d'instruction
8138     $collectivite_di = $this->get_dossier_instruction_om_collectivite();
8139     // Récupération de ses paramètres
8140     $collectivite = $this->f->getCollectivite($collectivite_di);
8141     // Génération du PDF
8142     $result = $this->compute_pdf_output('etat', 'communaute_bordereau_envoi_maire', $collectivite, $this->getVal(($this->clePrimaire)));
8143     // Affichage du PDF
8144     $this->expose_pdf_output(
8145     $result['pdf_output'],
8146     $result['filename']
8147     );
8148     }
8149    
8150     /**
8151 softime 10808 * VIEW - view_rapport_instruction.
8152     *
8153     * Ouvre le sous-formulaire en ajaxIt dans un overlay.
8154     * Cette action est bindée pour utiliser la fonction popUpIt.
8155     *
8156     * @return void
8157     */
8158     function view_overlay_notification_manuelle() {
8159    
8160     // Vérification de l'accessibilité sur l'élément
8161     $this->checkAccessibility();
8162    
8163     printf(
8164     '<script type="text/javascript" >
8165     overlayIt(\'%1$s\',\'%2$s&objsf=%1$s&idxformulaire=%4$s&retourformulaire=dossier_instruction&obj=%1$s&action=411&idx=%3$s\', 1);
8166     </script>',
8167     'instruction_notification_manuelle',
8168     OM_ROUTE_SOUSFORM,
8169     $this->getVal($this->clePrimaire),
8170     $this->getVal('dossier')
8171     );
8172     }
8173    
8174     /**
8175 softime 11585 * VIEW - view_overlay_notification_service_consulte.
8176     *
8177     * Ouvre le sous-formulaire de notification des services consulte
8178     * en ajaxIt dans un overlay.
8179     * Cette action est bindée pour utiliser la fonction popUpIt.
8180     *
8181     * @return void
8182     */
8183     function view_overlay_notification_service_consulte() {
8184    
8185     // Vérification de l'accessibilité sur l'élément
8186     $this->checkAccessibility();
8187    
8188     printf(
8189     '<script type="text/javascript" >
8190     overlayIt(\'%1$s\',\'%2$s&objsf=%1$s&idxformulaire=%4$s&retourformulaire=dossier_instruction&obj=%1$s&action=420&idx=%3$s\', 1);
8191     </script>',
8192     'instruction_notification_manuelle',
8193     OM_ROUTE_SOUSFORM,
8194     $this->getVal($this->clePrimaire),
8195     $this->getVal('dossier')
8196     );
8197     }
8198    
8199     /**
8200     * VIEW - overlay_notification_tiers_consulte.
8201     *
8202     * Ouvre le sous-formulaire de notification des tiers consulte
8203     * en ajaxIt dans un overlay.
8204     * Cette action est bindée pour utiliser la fonction popUpIt.
8205     *
8206     * @return void
8207     */
8208     function view_overlay_notification_tiers_consulte() {
8209    
8210     // Vérification de l'accessibilité sur l'élément
8211     $this->checkAccessibility();
8212    
8213     printf(
8214     '<script type="text/javascript" >
8215     overlayIt(\'%1$s\',\'%2$s&objsf=%1$s&idxformulaire=%4$s&retourformulaire=dossier_instruction&obj=%1$s&action=430&idx=%3$s\', 1);
8216     </script>',
8217     'instruction_notification_manuelle',
8218     OM_ROUTE_SOUSFORM,
8219     $this->getVal($this->clePrimaire),
8220     $this->getVal('dossier')
8221     );
8222     }
8223 softime 12847
8224 softime 11585 /**
8225 softime 12847 * VIEW - view_modale_selection_document_signe
8226     *
8227     * Ouvre le sous-formulaire de notification des services consulte
8228     * en ajaxIt dans un overlay.
8229     * Cette action est bindée pour utiliser la fonction popUpIt.
8230     *
8231     * @return void
8232     */
8233     function view_modale_selection_document_signe() {
8234    
8235     // Vérification de l'accessibilité sur l'élément
8236     $this->checkAccessibility();
8237    
8238     printf(
8239     '<script type="text/javascript" >
8240     overlayIt(\'%1$s\',\'%2$s&objsf=%1$s&idxformulaire=%4$s&retourformulaire=dossier_instruction&obj=%1$s&action=115&idx=%3$s\', 1);
8241     </script>',
8242     'instruction_modale',
8243     OM_ROUTE_SOUSFORM,
8244     $this->getVal($this->clePrimaire),
8245     $this->getVal('dossier')
8246     );
8247     }
8248    
8249     /**
8250 softime 6565 * Retourne l'événement d'instruction dont on donne le code-barres, avec un filtre
8251     * pour exclure les dossiers du groupe contentieux.
8252 mbroquet 3730 *
8253     * @param [string] $barcode numéro du code-barres
8254     * @return [mixed] ID de son instruction ou null si aucun code
8255     */
8256     function get_instruction_by_barcode($barcode) {
8257     // Begin
8258     $this->begin_treatment(__METHOD__);
8259     // Vérification de l'existence de l'événement d'instruction
8260 softime 6565 // pour le code-barres donné, en excluant les dossiers liés au groupe CTX
8261 mbroquet 3730 $sql = "SELECT instruction
8262 softime 6565 FROM ".DB_PREFIXE."instruction
8263     INNER JOIN ".DB_PREFIXE."dossier
8264     ON dossier.dossier=instruction.dossier
8265     INNER JOIN ".DB_PREFIXE."dossier_instruction_type
8266     ON dossier.dossier_instruction_type = dossier_instruction_type.dossier_instruction_type
8267     INNER JOIN ".DB_PREFIXE."dossier_autorisation_type_detaille
8268     ON dossier_instruction_type.dossier_autorisation_type_detaille = dossier_autorisation_type_detaille.dossier_autorisation_type_detaille
8269     INNER JOIN ".DB_PREFIXE."dossier_autorisation_type
8270     ON dossier_autorisation_type_detaille.dossier_autorisation_type = dossier_autorisation_type.dossier_autorisation_type
8271     INNER JOIN ".DB_PREFIXE."groupe
8272     ON dossier_autorisation_type.groupe = groupe.groupe
8273     AND groupe.code != 'CTX'
8274     WHERE code_barres = '".$this->f->db->escapesimple($barcode)."'";
8275 mbroquet 3730 $res = $this->f->db->getOne($sql);
8276     $this->f->addToLog(__METHOD__." : db->getOne(\"".$sql."\")", VERBOSE_MODE);
8277     $this->f->isDatabaseError($res);
8278     // Retourne résultat
8279     return $this->end_treatment(__METHOD__, $res);
8280     }
8281    
8282     /**
8283     * Met à jour le champ date d'envoi signature
8284     * avec la date fournie et pour l'instruction donnée
8285     *
8286     * @param [string] $id ID de l'événement d'instruction
8287     * @param [string] $date date au format EN
8288     * @return [boolean] true si mise à jour avec succès
8289     */
8290     function update_date_envoi_signature($id, $date) {
8291     // Préparation du tableau
8292     $valF = array();
8293     $valF['date_envoi_signature'] = $date;
8294     // Begin
8295     $this->begin_treatment(__METHOD__);
8296     // Requête
8297 softime 12847 $res = $this->f->db->autoexecute(
8298 mbroquet 3730 DB_PREFIXE.$this->table,
8299     $valF,
8300     DB_AUTOQUERY_UPDATE,
8301     $this->getCle($id)
8302     );
8303 softime 12847 $this->addToLog(
8304     __METHOD__."(): db->autoexecute(\"".DB_PREFIXE.'.'.$this->table."\", ".print_r($valF, true).", DB_AUTOQUERY_UPDATE, \"".$this->getCle($id)."\");",
8305     VERBOSE_MODE
8306     );
8307     if ($this->f->isDatabaseError($res, true) !== false) {
8308 mbroquet 3730 $this->end_treatment(__METHOD__, false);
8309     }
8310     //
8311     return $this->end_treatment(__METHOD__, true);
8312     }
8313    
8314     /**
8315     * Méthode permettant de définir des valeurs à envoyer en base après
8316     * validation du formulaire d'ajout.
8317     * @param array $val tableau des valeurs retournées par le formulaire
8318     */
8319 softime 6929 function setValFAjout($val = array()) {
8320 mbroquet 3730 // Mise à jour du flag created_by_commune lors d'un changement de décision
8321     // par un utilisateur de commune sur un dossier instruit par la comcom
8322 softime 6565 if ($this->isInstrCanChangeDecision($this->valF["dossier"])) {
8323 mbroquet 3730 $this->valF['created_by_commune'] = true;
8324     }
8325 softime 8593
8326     //
8327     if ($this->evenement_has_an_edition($this->valF['evenement']) === false) {
8328     if (isset($this->valF['flag_edition_integrale']) === true) {
8329     unset($this->valF['flag_edition_integrale']);
8330     }
8331     if (isset($this->valF['signataire_arrete']) === true) {
8332     unset($this->valF['signataire_arrete']);
8333     }
8334     }
8335 mbroquet 3730 }
8336 nmeucci 3876
8337 fmichon 3892
8338 fmichon 4708 /**
8339     * Récupère l'instance d'un événement de workflow.
8340     *
8341     * @param mixed $evenement Identifiant de l'événement.
8342     *
8343     * @return object
8344     */
8345     function get_inst_evenement($evenement = null) {
8346     //
8347     return $this->get_inst_common("evenement", $evenement);
8348     }
8349 softime 3976
8350 fmichon 3892 /**
8351 softime 3976 * Logue l'action de l'instruction dans son DI.
8352 nmeucci 3933 *
8353 softime 3976 * @param string $id Clé primaire de l'instruction.
8354     * @param array $val Valeurs de l'instruction.
8355     *
8356     * @return bool Vrai si traitement effectué avec succès
8357 nmeucci 3876 */
8358 softime 3976 private function add_log_to_dossier($id, array $val) {
8359 nmeucci 3933 $maj = $this->getParameter("maj");
8360 nmeucci 3943 // Action = Trace par défaut
8361     $action = $this->get_backtrace();
8362     // Action = Identifant de l'action si contexte connu
8363     if (empty($maj) === false
8364     || (empty($maj) === true && $maj === 0)) {
8365     $action = $this->get_action_param($maj, 'identifier');
8366 nmeucci 3965 if ($action === 'modifier_suivi') {
8367     $action = "modifier (via l'action suivi des dates)";
8368     }
8369 nmeucci 4108 if ($action === 'notifier_commune'
8370     && isset($val['mails_destinataires']) === true) {
8371     $action = "notification de la commune (courriels : ";
8372     $action .= $val['mails_destinataires'].")";
8373     }
8374 nmeucci 3943 }
8375 nmeucci 3876 // Création du log
8376     $log = array(
8377     'date' => date('Y-m-d H:i:s'),
8378     'user' => $_SESSION['login'],
8379     'action' => $action,
8380     'values' => array(
8381     'date_evenement' => $this->dateDB($val['date_evenement']),
8382     'date_retour_rar' => $this->dateDB($val['date_retour_rar']),
8383     'date_retour_signature' => $this->dateDB($val['date_retour_signature']),
8384     'evenement' => $val['evenement'],
8385     'action' => $val['action'],
8386 nmeucci 3963 'instruction' => $id,
8387 nmeucci 3876 'etat' => $val['etat'],
8388     ),
8389     );
8390     // Ajout du log
8391 softime 3976 $di = $this->get_inst_dossier($val['dossier']);
8392 nmeucci 3876 $ret = $di->add_log_instructions($log);
8393     if ($ret === false) {
8394     $this->correct = false;
8395     $this->msg = '';
8396     $this->addToMessage($di->msg);
8397     }
8398     return $ret;
8399     }
8400 nmeucci 3943
8401 softime 3976
8402 nmeucci 3943 /**
8403 softime 3976 * Retourne le contexte de déboguage formaté en HTML.
8404 nmeucci 3943 *
8405 softime 3976 * @return string Une ligne par trace
8406 nmeucci 3943 */
8407     private function get_backtrace() {
8408     $trace = debug_backtrace();
8409 nmeucci 3957 $backtrace = '';
8410     $i = 1;
8411 nmeucci 3943 foreach ($trace as $key => $value) {
8412 nmeucci 3957 $func = $trace[$key]['function'];
8413     // On ne s'autolog pas
8414     if ($func === 'get_backtrace'
8415     || $func === 'add_log_to_dossier') {
8416     continue;
8417     }
8418     $backtrace .= $i.') ';
8419     // Si dans une classe
8420     if (isset($trace[$key]['class']) === true
8421     && empty($trace[$key]['class']) === false) {
8422 nmeucci 3963 $backtrace .= $trace[$key]['class'].'->'.$func;
8423 nmeucci 3957 }
8424     // Si procédural
8425     else {
8426     $file = $trace[$key]['file'];
8427 nmeucci 3963 $line = $trace[$key]['line'];
8428 softime 3976 $truncated_file = $this->f->get_relative_path($file);
8429 nmeucci 3963 if ($truncated_file !== false) {
8430     $file = $truncated_file;
8431     }
8432     $backtrace .= $func.' IN<br/>&nbsp;&nbsp;&nbsp;&nbsp; '.$file.':'.$line;
8433 nmeucci 3957 }
8434     $backtrace .= '<br/>';
8435     $i++;
8436 nmeucci 3943 }
8437 nmeucci 3957 return $backtrace;
8438 nmeucci 3943 }
8439 nmeucci 3963
8440 nmeucci 4108 /**
8441     * CONDITION - is_notifiable.
8442     *
8443     * Condition pour afficher l'action notifier_commune.
8444     *
8445     * @return boolean
8446     */
8447     public function is_notifiable() {
8448     // L'instruction doit être finalisée, ce qui revient à dire
8449     // définalisable sans bypass
8450     if ($this->is_unfinalizable_without_bypass() === false) {
8451     return false;
8452     }
8453     // La collectivité de l'utilisateur doit être de niveau multi
8454     if ($this->f->has_collectivite_multi() === false) {
8455     return false;
8456     }
8457     // Le paramètre multi de l'objet du courriel doit exister
8458     if ($this->f->getParameter('param_courriel_de_notification_commune_objet_depuis_instruction') === NULL) {
8459     return false;
8460     }
8461     // Le paramètre multi du modèle du courriel doit exister
8462     if ($this->f->getParameter('param_courriel_de_notification_commune_modele_depuis_instruction') === NULL) {
8463     return false;
8464     }
8465     // A ce stade toutes les conditions sont satisfaites
8466     return true;
8467     }
8468 nmeucci 3963
8469 nmeucci 4108 /**
8470     * TREATMENT - notifier_commune.
8471     *
8472     * Notifie aux communes et par courriel la finalisation d'une instruction.
8473     *
8474     * @return boolean
8475     */
8476     public function notifier_commune() {
8477     // Cette méthode permet d'exécuter une routine en début des méthodes
8478     // dites de TREATMENT.
8479     $this->begin_treatment(__METHOD__);
8480 softime 12654 $message = __('Erreur de paramétrage :');
8481     $erreurParametrage = false;
8482     // Récupération du paramétrage de la collectivité du dossier
8483 nmeucci 4108 $id_di = $this->getVal('dossier');
8484     $di = $this->get_inst_dossier($id_di);
8485     $collectivite_di = $di->getVal('om_collectivite');
8486 softime 12654 // Récupération de l'url permettant d'accèder à l'instruction et au dossier
8487     $urlAcces = $this->f->get_parametre_notification_url_acces($collectivite_di);
8488     if (empty($urlAcces) && empty(PATH_BASE_URL)) {
8489     $erreurParametrage = true;
8490     $message .= '<br>'.__("* l'url de notification n'est pas correctement paramétré");
8491 nmeucci 4108 }
8492 softime 12654
8493     // Récupération de la liste des mails
8494     $adresses = $this->f->get_param_courriel_de_notification_commune($collectivite_di);
8495     if (empty($adresses)) {
8496     $erreurParametrage = true;
8497     $message .= '<br>'.__("* aucun courriel valide de destinataire de la commune");
8498 nmeucci 4108 }
8499 softime 12654
8500     // Vérification du paramétrage des mails
8501     $paramMail = $this->f->get_notification_commune_parametre_courriel_type($collectivite_di);
8502     if (empty($paramMail) || empty($paramMail['parametre_courriel_type_message'])) {
8503     $erreurParametrage = true;
8504     $message .= '<br>'.__("* le modèle du courriel envoyé aux communes est vide");
8505 nmeucci 4108 }
8506 softime 12654 if (empty($paramMail) || empty($paramMail['parametre_courriel_type_titre'])) {
8507     $erreurParametrage = true;
8508     $message .= '<br>'.__("* l'objet du courriel envoyé aux communes est vide");
8509 nmeucci 4108 }
8510 softime 12654
8511     // Si il y a des erreurs de paramétrage on ne déclenche pas la notification et
8512     // un message a destination de l'utilisateur est affiché
8513     if ($erreurParametrage) {
8514     $message .= '<br>'.__("Veuillez contacter votre administrateur.");
8515     $this->addToMessage($message);
8516 nmeucci 4108 return $this->end_treatment(__METHOD__, false);
8517     }
8518 softime 12654
8519     // Création d'un notification et de sa tâche associé pour chaque mail
8520     foreach ($adresses as $adresse) {
8521     // Ajout de la notif et récupération de son id
8522     $destinataire = array(
8523     'destinataire' => $adresse,
8524     'courriel' => $adresse
8525     );
8526     $idNotif = $this->ajouter_notification(
8527     $this->getVal($this->clePrimaire),
8528     $this->f->get_connected_user_login_name(),
8529     $destinataire,
8530     $collectivite_di
8531     );
8532     if ($idNotif === false) {
8533     $this->addToMessage(__("Veuillez contacter votre administrateur."));
8534     return $this->end_treatment(__METHOD__, false);
8535 nmeucci 4108 }
8536 softime 12654 // Création de la tache en lui donnant l'id de la notification
8537     $notification_by_task = $this->notification_by_task(
8538     $idNotif,
8539     $this->getVal('dossier'),
8540     'mail',
8541     'notification_commune'
8542     );
8543     if ($notification_by_task === false) {
8544     $this->addToMessage(__("Erreur lors de la préparation de la notification des communes."));
8545     $this->addToMessage(__("Veuillez contacter votre administrateur."));
8546     return $this->end_treatment(__METHOD__, false);
8547     }
8548 nmeucci 4108 }
8549 softime 12654 $this->addToMessage(__('La commune a été notifiée.'));
8550 nmeucci 4108 return $this->end_treatment(__METHOD__, true);
8551     }
8552    
8553     /**
8554 softime 5169 * Récupère l'instance de l'instructeur
8555     *
8556     * @param integer $instructeur Identifiant de l'instructeur.
8557     *
8558     * @return object
8559     */
8560     protected function get_inst_instructeur($instructeur) {
8561     //
8562     return $this->get_inst_common("instructeur", $instructeur);
8563     }
8564    
8565    
8566     /**
8567     * Récupère l'instance de l'utilisateur
8568     *
8569     * @param integer $om_utilisateur Identifiant de l'utilisateur.
8570     *
8571     * @return object
8572     */
8573     protected function get_inst_om_utilisateur($om_utilisateur) {
8574     //
8575     return $this->get_inst_common("om_utilisateur", $om_utilisateur);
8576     }
8577    
8578    
8579 softime 6565 /**
8580 softime 5295 * Récupère l'instance de la division.
8581     *
8582     * @param integer $division Identifiant de la division.
8583     *
8584     * @return object
8585     */
8586     protected function get_inst_division($division) {
8587     //
8588     return $this->get_inst_common("division", $division);
8589     }
8590    
8591    
8592     /**
8593     * Récupère l'instance de la direction.
8594     *
8595     * @param integer $direction Identifiant de la direction.
8596     *
8597     * @return object
8598     */
8599     protected function get_inst_direction($direction) {
8600     //
8601     return $this->get_inst_common("direction", $direction);
8602     }
8603    
8604    
8605     /**
8606     * Récupère la collectivité d'un instructeur en passant par sa division puis
8607     * par sa direction.
8608     *
8609     * @param integer $instructeur Identifiant de l'instructeur.
8610     *
8611     * @return integer
8612     */
8613     protected function get_instructeur_om_collectivite($instructeur) {
8614     // Chemin vers la collectivité d'un instructeur
8615     $inst_instr = $this->get_inst_instructeur($instructeur);
8616     $inst_division = $this->get_inst_division($inst_instr->getVal('division'));
8617     $inst_direction = $this->get_inst_direction($inst_division->getVal('direction'));
8618    
8619     // Collectivité
8620     $om_collectivite = $inst_direction->getVal('om_collectivite');
8621    
8622     //
8623     return $om_collectivite;
8624     }
8625    
8626 softime 6565 /*
8627     * CONDITION - can_user_access_dossier_contexte_ajout
8628     *
8629     * Vérifie que l'utilisateur a bien accès au dossier d'instruction passé dans le
8630     * formulaire d'ajout.
8631     * Cette méthode vérifie que l'utilisateur est lié au groupe du dossier, et si le
8632     * dossier est confidentiel qu'il a accès aux confidentiels de ce groupe.
8633     *
8634     */
8635     function can_user_access_dossier_contexte_ajout() {
8636 softime 5295
8637 softime 6565 ($this->f->get_submitted_get_value('idxformulaire') !== null ? $id_dossier =
8638     $this->f->get_submitted_get_value('idxformulaire') : $id_dossier = "");
8639     //
8640     if ($id_dossier !== "") {
8641 softime 7996 $dossier = $this->f->get_inst__om_dbform(array(
8642     "obj" => "dossier_instruction",
8643     "idx" => $id_dossier,
8644     ));
8645 softime 6565 //
8646     return $dossier->can_user_access_dossier();
8647     }
8648     return false;
8649     }
8650    
8651     /*
8652     * CONDITION - can_user_access_dossier
8653     *
8654     * Vérifie que l'utilisateur a bien accès au dossier lié à l'instruction instanciée.
8655     * Cette méthode vérifie que l'utilisateur est lié au groupe du dossier, et si le
8656     * dossier est confidentiel qu'il a accès aux confidentiels de ce groupe.
8657     *
8658     */
8659     function can_user_access_dossier_contexte_modification() {
8660    
8661     $id_dossier = $this->getVal('dossier');
8662     //
8663     if ($id_dossier !== "" && $id_dossier !== null) {
8664 softime 7996 $dossier = $this->f->get_inst__om_dbform(array(
8665     "obj" => "dossier_instruction",
8666     "idx" => $id_dossier,
8667     ));
8668 softime 6565 //
8669     return $dossier->can_user_access_dossier();
8670     }
8671     return false;
8672     }
8673    
8674 softime 8593 /**
8675 softime 10713 * TREATMENT - envoyer_a_signature_sans_relecture
8676     *
8677     * Permet d'envoyer le document de l'instruction au parapheur pour signature sans relecture
8678     *
8679     * @return boolean true si l'envoi a été effectué avec succès false sinon
8680     */
8681     function envoyer_a_signature_sans_relecture() {
8682     return $this->envoyer_a_signature();
8683     }
8684    
8685     /**
8686     * TREATMENT - envoyer_a_signature_avec_relecture
8687     *
8688     * Permet d'envoyer le document de l'instruction au parapheur pour signature avec relecture
8689     *
8690     * @return boolean true si l'envoi a été effectué avec succès false sinon
8691     */
8692     function envoyer_a_signature_avec_relecture() {
8693 softime 10808 $is_forced_view_files = true;
8694     return $this->envoyer_a_signature($is_forced_view_files);
8695 softime 10713 }
8696    
8697     /**
8698 softime 10573 * TREATMENT - envoyer_a_signature
8699     *
8700     * Permet d'envoyer le document de l'instruction au parapheur pour signature
8701 softime 10713 *
8702     * @param boolean $is_forced_view_files Indique si il y a une relecture (true) ou non (false)
8703 softime 10573 *
8704     * @return boolean true si l'envoi a été effectué avec succès false sinon
8705     */
8706 softime 10713 function envoyer_a_signature($is_forced_view_files = false) {
8707 softime 10573 $this->begin_treatment(__METHOD__);
8708     $this->correct = true;
8709    
8710     // Instanciation de l'objet signataire_arrete
8711     $inst_signataire_arrete = $this->f->get_inst__om_dbform(array(
8712     'obj' => 'signataire_arrete',
8713     'idx' => $this->getVal('signataire_arrete'),
8714     ));
8715    
8716     // Instanciation de l'objet dossier
8717     $inst_dossier = $this->f->get_inst__om_dbform(array(
8718     'obj' => 'dossier',
8719     'idx' => $this->getVal('dossier'),
8720     ));
8721    
8722     // Récupération du document à signer
8723     $file = $this->f->storage->get($this->getVal('om_fichier_instruction'));
8724     if ($file === OP_FAILURE) {
8725     $this->correct = false;
8726     $this->addToMessage(__("Une erreur est survenue lors de la récupération du contenu du document de l'instruction."));
8727     // Termine le traitement
8728     return $this->end_treatment(__METHOD__, false);
8729     }
8730    
8731     // Initialisation des paramètre à passer pour l'envoi en signature
8732 softime 10808 $data = array(
8733 softime 10573 "om_utilisateur_email" => $this->f->om_utilisateur['email'],
8734     "om_utilisateur_nom" => $this->f->om_utilisateur['nom'],
8735     "signataire_arrete_email" => $inst_signataire_arrete->getVal('email'),
8736     "signataire_arrete_nom" => $inst_signataire_arrete->getVal('nom'),
8737     "signataire_arrete_prenom" => $inst_signataire_arrete->getVal('prenom'),
8738 softime 11876 // Permet d'envoyer en signature l'instruction le jour de la date limite
8739     "date_limite_instruction" => $this->compute_date_limite(1),
8740 softime 10573 "dossier" => $this->getVal('dossier'),
8741 softime 10713 "is_forced_view_files" => $is_forced_view_files,
8742     'commentaire_signature' => $is_forced_view_files === true ? __('relecture demandee.') : null
8743 softime 10573 );
8744    
8745 softime 10808 // Initialisation des métadonnées
8746     $metadonnee_dossier = $file['metadata'];
8747 softime 11228 // récupération de l'extension du fichier
8748     $extension = substr($metadonnee_dossier['filename'], strrpos($metadonnee_dossier['filename'], '.'));
8749     // Modification du libellé du document transmis au parapheur
8750     // pour le mettre sous la forme : instruction_xxx_libelle_lettretype.extension
8751     $metadonnee_dossier['filename'] = $this->getDocumentLibelle().$extension;
8752     $metadonnee_dossier['titre_document'] = $this->getDocumentTitre();
8753 softime 10808
8754     $metadonnee_dossier['url_di'] = sprintf(
8755     '%sapp/index.php?module=form&direct_link=true&obj=dossier_instruction&action=3&direct_field=dossier&direct_form=instruction&direct_action=3&direct_idx=%s',
8756 softime 11418 $this->f->get_param_base_path_metadata_url_di() !== null ? $this->f->get_param_base_path_metadata_url_di() : PATH_BASE_URL,
8757 softime 10808 $this->getVal($this->clePrimaire)
8758     );
8759    
8760     $optional_data = null;
8761     // Si il y a des paramètres supplémentaire spécifié dans le signataire alors on les récupère
8762     if ($inst_signataire_arrete->getVal('parametre_parapheur') !== null && $inst_signataire_arrete->getVal('parametre_parapheur') !== '') {
8763     $optional_data = json_decode($inst_signataire_arrete->getVal('parametre_parapheur'), true);
8764     if (json_last_error() !== JSON_ERROR_NONE) {
8765     $this->correct = false;
8766     $this->addToMessage(__("Les paramètres supplémentaires envoyés au parapheur ne sont pas au bon format."));
8767     $this->addToLog(__METHOD__."(): ".
8768     __("Erreur lors du décodage du format json des paramètres supplémentaires envoyé au parapheur.
8769     Tableau : ").var_export($inst_signataire_arrete->getVal('parametre_parapheur'), true)
8770     );
8771     // Termine le traitement
8772     return $this->end_treatment(__METHOD__, false);
8773     }
8774     }
8775    
8776 softime 10573 //Instanciation de la classe electronicsignature
8777     $inst_es = $this->get_electronicsignature_instance();
8778     if ($inst_es === false) {
8779     $this->correct = false;
8780     return $this->end_treatment(__METHOD__, false);
8781     }
8782    
8783     // Appel de la méthode de l'abstracteur send_for_signature()
8784     // Cette méthode doit retourner un tableau de valeur
8785     try {
8786 softime 10808 $result = $inst_es->send_for_signature($data, $file['file_content'], $metadonnee_dossier, $optional_data);
8787 softime 10573 } catch (electronicsignature_exception $e) {
8788     $this->handle_electronicsignature_exception($e);
8789     return $this->end_treatment(__METHOD__, false);
8790     }
8791    
8792     // Après avoir reçu le résultat du parapheur, il faut mettre à jour les champs
8793     $valF = array();
8794    
8795     // Pour appeler la fonction modifier il faut traiter tous les champs de l'objet
8796     foreach($this->champs as $identifiant => $champ) {
8797     $valF[$champ] = $this->val[$identifiant];
8798     }
8799     // On fait ensuite nos modifications spécifiques
8800     $valF['id_parapheur_signature'] = $result['id_parapheur_signature'];
8801     $valF['statut_signature'] = $result['statut'];
8802     $valF['commentaire_signature'] = isset($result['commentaire_signature']) == true ? $result['commentaire_signature'] : null;
8803     $valF['date_envoi_signature'] = date("Y-m-d", strtotime($result['date_envoi_signature']));
8804     $valF['historique_signature'] = $this->get_updated_historique_signature($result);
8805    
8806     $ret = $this->modifier($valF);
8807    
8808     if ($ret === false) {
8809     $this->correct = false;
8810     $this->addToMessage(__("Une erreur est survenue lors de la mise à jour des champs."));
8811     // Termine le traitement
8812     return $this->end_treatment(__METHOD__, false);
8813     }
8814    
8815     // Message
8816     $this->addToMessage(__("Le document a été envoyé pour signature dans le parapheur."));
8817     if (array_key_exists('signature_page_url', $result) === true) {
8818     $this->addToMessage(sprintf(
8819 softime 11228 '<br> > <a href="%1$s" title="%2$s" target="_blank">%2$s</a>',
8820     $result['signature_page_url'],
8821     __("Signez directement le document")
8822 softime 10573 ));
8823     }
8824    
8825     // Tout s'est bien passé, on termine le traitement
8826     return $this->end_treatment(__METHOD__, true);
8827     }
8828    
8829     /**
8830 softime 11876 * Permet de récupérer la bonne date limite en fonction de si l'instruction
8831     * est en incomplet notifié ou non.
8832     * On peut ajouter des jours à cette date grâce au paramètre "delay".
8833     * Cette fonction est utilisée dans un cas spécifique où on veut envoyer
8834     * l'instruction en signature le jour de la date limite.
8835     *
8836     * @param int $delay Le nombre de jour à ajouter à la date limite.
8837     *
8838     * @return string $date_limite la date limite calculé ou false
8839     */
8840     private function compute_date_limite($delay) {
8841     // Instanciation de l'objet dossier
8842     $inst_dossier = $this->f->get_inst__om_dbform(array(
8843     'obj' => 'dossier',
8844     'idx' => $this->getVal('dossier'),
8845     ));
8846    
8847     $date_to_compute = null;
8848     if ($inst_dossier->getVal('incomplet_notifie') === 't') {
8849     $date_to_compute = $inst_dossier->getVal('date_limite_incompletude');
8850     } else {
8851     $date_to_compute = $inst_dossier->getVal('date_limite');
8852     }
8853    
8854     $date_limite = date("Y-m-d", strtotime($date_to_compute."+ $delay days"));
8855    
8856     return $date_limite;
8857     }
8858    
8859     /**
8860 softime 10573 * Permet de récupérer la traduction de la valeur de statut_signature
8861     *
8862     * @return string la valeur de statut_signature traduite | false
8863     */
8864     function get_trad_for_statut($value_to_trad){
8865     $statut_signature_tab = array(
8866     'waiting' => __('en préparation'),
8867     'in_progress' => __('en cours de signature'),
8868     'canceled' => __('signature annulée'),
8869 softime 10808 'expired' => __('délai de signature expiré'),
8870 softime 10573 'finished' => __('signé')
8871     );
8872     if (array_key_exists($value_to_trad, $statut_signature_tab) === true) {
8873     return $statut_signature_tab[$value_to_trad];
8874     }
8875    
8876     return false;
8877     }
8878    
8879     /**
8880     * Permet de mettre à jour le tableau json sotcké dans le champ historique_signature
8881     *
8882     * @return string (json) la valeur de historique_signature mis à jour | false
8883     */
8884     function get_updated_historique_signature($historique_signature_values) {
8885    
8886     $historique_signature_value_tab = $this->get_historique_signature_decoded();
8887    
8888     if ($historique_signature_value_tab === false) {
8889     $this->addToLog(__METHOD__."(): erreur historique signature", DEBUG_MODE);
8890     return false;
8891     }
8892    
8893     $last_val_historique_signature = array();
8894    
8895     // Si la tableau récupéré n'est pas vide alors
8896     // on récupère la dernière ligne du tableau
8897     if (empty($historique_signature_value_tab) === false) {
8898     $last_val_historique_signature = end($historique_signature_value_tab);
8899     }
8900    
8901     $format_date = '';
8902     $format_date_hour = '';
8903     $date_converted=array();
8904    
8905     $date_to_convert = array(
8906     'date_envoi_signature' => $historique_signature_values['date_envoi_signature'],
8907 softime 11876 'date_limite_instruction' => $this->compute_date_limite(0),
8908 softime 10573 'date_retour_signature' => $historique_signature_values['date_retour_signature']
8909     );
8910    
8911     // Conversion des dates en fonction de leur format
8912     foreach ($date_to_convert as $key => $value) {
8913     $date_converted[$key] = null;
8914     if ($value != null) {
8915     $format_date = 'd/m/Y';
8916     $format_date_hour = 'd/m/Y H:i:s';
8917     $date_converted[$key] = empty(date_parse($value)['hour']) === false ? date($format_date_hour, strtotime($value)) : date($format_date, strtotime($value));
8918     }
8919     }
8920    
8921     // Ce tableau permet de lister les colonnes de historique_signature et de les rendre traduisibles.
8922     // Il faut en effet mettre les gettext avec l'intitulé explicite au moins
8923     // une fois afin qu'il puisse être reconnu par le logiciel de traduction.
8924     $tab_for_columns_trad = array(
8925     __('entry_date'),
8926     __('id_parapheur_signature'),
8927     __('emetteur'),
8928     __('signataire'),
8929     __('date_envoi'),
8930     __('date_limite'),
8931     __('date_retour'),
8932     __('statut_signature'),
8933     __('commentaire_signature')
8934     );
8935    
8936     array_push($historique_signature_value_tab, array(
8937     'entry_date' => date('d/m/Y H:i:s'),
8938     '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'],
8939     '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'],
8940     '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'],
8941     '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'],
8942     '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'],
8943     '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'],
8944     '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']),
8945     'commentaire_signature' => isset($historique_signature_values['commentaire_signature']) === false || $historique_signature_values['commentaire_signature'] == null ? null : $historique_signature_values['commentaire_signature'],
8946     ));
8947    
8948     return json_encode($historique_signature_value_tab, JSON_HEX_APOS);
8949     }
8950 softime 11876
8951     /**
8952     * TREATMENT - annuler_envoi_en_signature
8953     *
8954     * Permet d'annuler l'envoi du document de l'instruction au parapheur pour signature
8955     *
8956     * @return boolean true si l'annulation a été effectué avec succès false sinon
8957     */
8958     function annuler_envoi_en_signature() {
8959     $this->begin_treatment(__METHOD__);
8960     $this->correct = true;
8961 softime 10573
8962 softime 11876 //Instanciation de la classe electronicsignature
8963     $inst_es = $this->get_electronicsignature_instance();
8964     if ($inst_es === false) {
8965     $this->correct = false;
8966     return $this->end_treatment(__METHOD__, false);
8967     }
8968 softime 10573
8969 softime 11876 $data = array();
8970     if (! empty($this->getVal('id_parapheur_signature'))) {
8971     $data['id_parapheur_signature'] = $this->getVal('id_parapheur_signature');
8972     } else {
8973     $this->correct = false;
8974     $this->addToMessage(__("Il n'y a pas d'identifiant de parapheur."));
8975     return $this->end_treatment(__METHOD__, false);
8976     }
8977    
8978     // Appel de la méthode de l'abstracteur cancel_send_for_signature()
8979     // Cette méthode doit retourner un tableau de valeur
8980     try {
8981     $result = $inst_es->cancel_send_for_signature($data);
8982     } catch (electronicsignature_exception $e) {
8983     $this->handle_electronicsignature_exception($e);
8984     return $this->end_treatment(__METHOD__, false);
8985     }
8986    
8987     // Après avoir reçu le résultat du parapheur, il faut mettre à jour les champs
8988     $valF = array();
8989    
8990     // Pour appeler la fonction modifier il faut traiter tous les champs de l'objet
8991     foreach($this->champs as $identifiant => $champ) {
8992     $valF[$champ] = $this->val[$identifiant];
8993     }
8994     // On fait ensuite nos modifications spécifiques
8995     $valF['id_parapheur_signature'] = null;
8996     $valF['statut_signature'] = $result['statut'];
8997     $valF['commentaire_signature'] = isset($result['commentaire_signature']) == true ? $result['commentaire_signature'] : null;
8998     $valF['date_envoi_signature'] = null;
8999     $valF['historique_signature'] = $this->get_updated_historique_signature($result);
9000    
9001     $ret = $this->modifier($valF);
9002    
9003     if ($ret === false) {
9004     $this->correct = false;
9005     $this->addToMessage(__("Une erreur est survenue lors de la mise à jour des champs."));
9006     // Termine le traitement
9007     return $this->end_treatment(__METHOD__, false);
9008     }
9009    
9010     // Message
9011     $this->addToMessage(__("L'annulation a été effectuée avec succès."));
9012    
9013     // Tout s'est bien passé, on termine le traitement
9014     return $this->end_treatment(__METHOD__, true);
9015     }
9016    
9017    
9018 softime 10573 /**
9019     * Récupère le contenu du champ historique_signature et le converti en tableau
9020     *
9021     * @return array sinon false en cas d'erreur
9022     */
9023     protected function get_historique_signature_decoded() {
9024 softime 11876 $val = str_replace("'", '"', $this->getVal('historique_signature'));
9025     if ($val === '' || $val == 'false') {
9026 softime 10573 $val = json_encode(array());
9027     }
9028     if($this->isJson($val) === false) {
9029     return false;
9030     }
9031     return json_decode($val, true);
9032     }
9033    
9034 softime 10808 /**
9035     * Récupère les informations à afficher dans le tableau de suivi à l'aide
9036     * d'une requête sql. Stocke ces informations dans un tableau.
9037 softime 12433 * Converti le tableau au format json et renvoi le json obtenu.
9038 softime 10808 *
9039 softime 12433 * Pour identifier quel suivi est affiché (notification des demandeurs, des services ou
9040     * de tiers) ce sont les tâches liées aux notifications qui sont utilisés.
9041     * La clause where de la requête est construite à partir du tableau contenant les types
9042     * de tâches fourni en paramètre.
9043     * Il est également possible d'afficher les notifications n'étant pas lié à des tâches.
9044     *
9045     * Si le suivi concerne la notification des demandeurs via le portail citoyen,
9046     * la date de premier accès ne sera pas affichée.
9047     *
9048     * @param array liste des tâches permettant d'identifier quelles notification afficher
9049     * @param boolean permet d'afficher les notifications non liées à des tâches
9050 softime 10808 * @return json
9051     */
9052 softime 12124 protected function get_json_suivi_notification($typeTache, $nonLieTache = false) {
9053 softime 11585 $whereTypeTache = '';
9054 softime 12124 $sqlTaskNull = '';
9055 softime 12654
9056     // Liste des champs à afficher. Permet également la traduction des noms de colonnes.
9057     $listeChampsTrad = array(
9058     __('emetteur'),
9059     __('date_envoi'),
9060     __('destinataire'),
9061     __('date_premier_acces'),
9062     __('instruction'),
9063     __('annexes'),
9064     __('statut'),
9065     __('commentaire')
9066     );
9067     $listeChamps = array(
9068     'emetteur',
9069     'date_envoi',
9070     'destinataire',
9071     'date_premier_acces',
9072     'instruction',
9073     'annexes',
9074     'statut',
9075     'commentaire'
9076     );
9077    
9078 softime 12124 // Défini si on veux que la requête récupère également les notifications qui n'ont pas
9079     // de tâches associées. C'est le cas pour les notifications de demandeurs lorsque la
9080     // notification du demandeur principal n'a pas pu être envoyée à cause d'un mauvais
9081     // paramétrage
9082     if(is_bool($nonLieTache) && $nonLieTache === true) {
9083     $sqlTaskNull = 'OR task.type is null';
9084     }
9085     // Prépare la clause where pour ne récupérer que les notifications liées à certain type de tâches
9086     // Permet de différencier les notifications des demandeurs de celle des services et de celles des
9087     // tiers consulté
9088 softime 12433 if (is_array($typeTache) && $typeTache != array()) {
9089 softime 11585 if (is_array($typeTache)) {
9090     $whereTypeTache = sprintf(
9091 softime 12124 'AND (task.type IN (%1$s) %2$s)',
9092     "'".implode("', '", $typeTache)."'",
9093     $sqlTaskNull
9094 softime 11585 );
9095     }
9096 softime 12433 // La date de premier accès n'a pas besoin d'être renseigné pour
9097     // les notifications des demandeurs via le portail citoyen.
9098     // Les notifications des demandeurs sont liés à 3 types de tâches
9099     // notification_recepisse, notification_instruction, notification_decision
9100     // Si le suivi de la notification concerne un de ces types de tâches on
9101     // considère que c'est une notification de demandeurs.
9102     // Dans ce cas on vérifie si cette notification est paramétrée pour passer
9103     // via le portail. Par défaut si rien n'est paramétré on considère que la
9104     // notification est faite via le portail
9105     if ((in_array('notification_recepisse', $typeTache) ||
9106     in_array('notification_instruction', $typeTache) ||
9107     in_array('notification_decision', $typeTache))) {
9108     $dossier = $this->getVal('dossier');
9109     $collectivite_di = $this->get_dossier_instruction_om_collectivite($dossier);
9110     $modeNotification = $this->f->get_param_option_notification($collectivite_di);
9111 softime 13137 if (empty($modeNotification) || $modeNotification == PORTAL) {
9112 softime 12654 $listeChamps = array(
9113     'emetteur',
9114     'date_envoi',
9115     'destinataire',
9116     'instruction',
9117     'annexes',
9118     'statut',
9119     'commentaire'
9120     );
9121 softime 12433 }
9122     }
9123 softime 12654 // Il n'y a pas d'annexe pour la notification des communes donc pas besoin
9124     // de les afficher dans le suivi
9125     if (in_array('notification_depot_demat', $typeTache)) {
9126     $listeChamps = array(
9127     'emetteur',
9128     'date_envoi',
9129     'destinataire',
9130     'instruction',
9131     'statut',
9132     'commentaire'
9133     );
9134     }
9135 softime 11585 }
9136 softime 12433
9137 softime 10808 $valSuivi = array();
9138     // Récupération des infos nécessaires à l'affichage du tableau
9139     $sql = sprintf(
9140 softime 11585 'SELECT DISTINCT
9141 softime 10869 instruction_notification.instruction_notification,
9142 softime 12124 -- Affiche la mention automatique avec le nom de l emetteur si la notification a été envoyé automatiquement
9143 softime 10869 CASE WHEN instruction_notification.automatique = TRUE
9144     THEN TRIM(CONCAT(instruction_notification.emetteur, \' \', \'(automatique)\'))
9145     ELSE instruction_notification.emetteur
9146     END as emetteur,
9147 softime 10808 date_envoi,
9148     instruction_notification.destinataire,
9149 softime 10869 instruction_notification.date_premier_acces,
9150 softime 10808 evenement.libelle as instruction,
9151 softime 10869 instruction_notification.statut,
9152     instruction_notification.commentaire,
9153 softime 12433 annexes.instruction_annexe as annexes
9154 softime 10808 FROM
9155     %1$sinstruction_notification
9156     LEFT JOIN %1$sinstruction
9157     ON instruction.instruction = instruction_notification.instruction
9158     LEFT JOIN %1$sevenement
9159     ON instruction.evenement = evenement.evenement
9160 softime 10869 LEFT JOIN %1$sinstruction_notification_document
9161     ON instruction_notification.instruction_notification = instruction_notification_document.instruction_notification
9162     AND instruction_notification_document.annexe = true
9163 softime 12124 -- Récupère les tâches liées au notification pour pouvoir par la suite identifier le type de notification
9164 softime 11585 LEFT JOIN %1$stask
9165     ON instruction_notification.instruction_notification::CHARACTER VARYING = task.object_id
9166 softime 12124 -- Récupération de la liste des annexes sous la forme d une liste
9167 softime 11585 LEFT JOIN (
9168     SELECT
9169     instruction_notification,
9170 softime 12124 -- Récupère la liste des annexes de la notification
9171 softime 12433 -- sous la forme d un json pour récupérer toutes les informatiosn nécessaire
9172     -- à l affichage du lien vers les annexes
9173     CONCAT(
9174     \'[\',
9175     STRING_AGG(
9176     -- Affiche le nom du fichier selon le type de document/pièce
9177     CASE
9178     WHEN instruction_notification_document.document_type = \'instruction\'
9179     THEN CONCAT(
9180     \'{
9181     "obj" : "instruction",
9182     "champs" : "om_fichier_instruction",
9183     "label" : "\', evenement.libelle, \'",
9184     "id" : "\', instruction.instruction,\'"
9185     }\'
9186     )
9187     WHEN instruction_notification_document.document_type = \'consultation\'
9188     THEN CONCAT(
9189     \'{
9190     "obj" : "consultation",
9191     "champs" : "fichier",
9192     "label" : "Avis - \', service.libelle, \'",
9193     "id" : "\', consultation.consultation,\'"
9194     }\'
9195     )
9196     ELSE
9197     CONCAT(
9198     \'{
9199     "obj" : "document_numerise",
9200     "champs" : "uid",
9201     "label" : "\', document_numerise.nom_fichier, \' - \', document_numerise_type.libelle, \'",
9202     "id" : "\', document_numerise.document_numerise,\'"
9203     }\'
9204     )
9205     END,
9206     \', \'),
9207     \']\'
9208 softime 11585 ) AS instruction_annexe
9209     FROM
9210     %1$sinstruction_notification_document
9211     LEFT JOIN %1$sinstruction
9212     ON instruction_notification_document.instruction = instruction.instruction
9213     LEFT JOIN %1$sevenement
9214     ON instruction.evenement = evenement.evenement
9215     LEFT JOIN %1$sconsultation
9216     ON instruction_notification_document.document_id = consultation.consultation
9217     LEFT JOIN %1$sservice
9218     ON consultation.service = service.service
9219 softime 12433 LEFT JOIN %1$sdocument_numerise
9220     ON instruction_notification_document.document_id = document_numerise.document_numerise
9221     LEFT JOIN %1$sdocument_numerise_type
9222     ON document_numerise.document_numerise_type = document_numerise_type.document_numerise_type
9223 softime 11585 WHERE
9224     instruction_notification_document.annexe = \'t\'
9225     GROUP BY
9226     instruction_notification
9227     ) AS annexes
9228     ON
9229     annexes.instruction_notification = instruction_notification.instruction_notification
9230 softime 10808 WHERE
9231 softime 10869 instruction.instruction = %2$s
9232 softime 11585 %3$s
9233 softime 10869 ORDER BY
9234     date_envoi ASC, instruction_notification.destinataire ASC',
9235 softime 10808 DB_PREFIXE,
9236 softime 11585 $this->getVal('instruction'),
9237     $whereTypeTache
9238 softime 10808 );
9239     $res = $this->f->db->query($sql);
9240     $this->f->addToLog(__METHOD__."(): db->query(\"".$sql."\")", VERBOSE_MODE);
9241     $this->f->isDatabaseError($res);
9242 softime 12433 // Préparation du lien de téléchargement des annexes
9243     $htmlList =
9244     '<style>
9245     #content .gridjs-td a.lien_annexe {
9246     text-decoration : underline dotted 1px;
9247     }
9248     #content a.lien_annexe:hover {
9249     text-decoration : underline solid 1px;
9250     color : #46aede;
9251     }
9252     ol {padding-left : 10px;}
9253     </style>
9254     <ol>%1$s</ol>';
9255     $lienTelechargement =
9256     '<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">
9257     Annexe
9258     </a>';
9259 softime 10808 // Stockage des infos de chaque notification dans un tableau
9260     while( $row =& $res->fetchrow(DB_FETCHMODE_ASSOC) ) {
9261     $valNotif = array();
9262     foreach($listeChamps as $champ) {
9263     $valNotif[$champ] = $row[$champ];
9264 softime 10815 if (($champ === 'date_envoi'
9265     || $champ === 'date_premier_acces')
9266     && $row[$champ] !== null
9267     && $row[$champ] !== '') {
9268 softime 10814 //
9269     $valNotif[$champ] = date('d/m/Y H:i:s', strtotime($row[$champ]));
9270 softime 12433 } else if ($champ === 'annexes') {
9271     $listeAnnexe = '';
9272     $infoAnnexes = json_decode($row[$champ], true);
9273     if (! empty($infoAnnexes) && json_last_error() === JSON_ERROR_NONE) {
9274     // A partir des infos récupérées prépare le code html du lien vers chacune
9275     // des annexes et ajoute un élément de liste par annexe
9276     foreach($infoAnnexes as $annexe) {
9277     $listeAnnexe .= sprintf(
9278     '<li>%s</li>',
9279     sprintf($lienTelechargement,
9280     $annexe['obj'],
9281     $annexe['champs'],
9282     $annexe['id'],
9283     $annexe['label']
9284     )
9285     );
9286     }
9287     // Construction de la liste des annexes
9288     $valNotif[$champ] = sprintf(
9289     $htmlList,
9290     $listeAnnexe
9291     );
9292     }
9293 softime 10814 }
9294 softime 10808 }
9295     array_push($valSuivi, $valNotif);
9296     }
9297    
9298     // Passage du tableau au format json
9299     return json_encode($valSuivi, JSON_HEX_APOS);
9300     }
9301    
9302 softime 10573 /**
9303     * Traitement des erreurs retournées par l'abstracteur electronicsignature.
9304     *
9305     * @param electronicsignature_exception $exception Exception retournée par l'abstracteur.
9306     *
9307     * @return void
9308     */
9309     public function handle_electronicsignature_exception(electronicsignature_exception $exception) {
9310     $this->f->displayMessage('error', $exception->getMessage());
9311     }
9312    
9313    
9314     /**
9315     * Retourne une instance du connecteur electronicsignature, et la créer si elle n'existe pas.
9316     *
9317     * @param boolean $with_handle_error Flag pour afficher ou non le message d'erreur à l'utilisateur.
9318     * @return electronicsignature Instance de l'abstracteur.
9319     */
9320     public function get_electronicsignature_instance($with_handle_error = true) {
9321     if(isset($this->electronicsignature_instance)) {
9322     return $this->electronicsignature_instance;
9323     }
9324     // Instanciation du connecteur electronicsignature
9325     try {
9326     require_once "electronicsignature.class.php";
9327     $collectivites = array("collectivite_idx" => $this->get_dossier_instruction_om_collectivite(), "collectivite_multi_idx" => $this->f->get_idx_collectivite_multi());
9328     $this->electronicsignature_instance = new electronicsignature($collectivites);
9329     } catch (electronicsignature_exception $e) {
9330     if ($with_handle_error === true) {
9331     $this->handle_electronicsignature_exception($e);
9332     }
9333     return false;
9334     }
9335     return $this->electronicsignature_instance;
9336     }
9337    
9338     /**
9339 softime 11418 * TREATMENT - envoyer_au_controle_de_legalite
9340     *
9341     * Ajoute la tâche envoi_CL.
9342     * C'est le traitement de la tâche qui mettra à jour la date d'envoi au contrôle de légalité.
9343     *
9344     * @return [type] [description]
9345     */
9346     function envoyer_au_controle_de_legalite() {
9347     $this->begin_treatment(__METHOD__);
9348     $this->correct = true;
9349    
9350     //
9351     if ($this->can_be_sended_to_cl() === true) {
9352     // Création de la task 'envoi_CL'
9353     $inst_task = $this->f->get_inst__om_dbform(array(
9354     "obj" => "task",
9355     "idx" => 0,
9356     ));
9357     $task_val = array(
9358     'type' => 'envoi_CL',
9359     'object_id' => $this->getVal('instruction'),
9360     'dossier' => $this->getVal('dossier'),
9361     );
9362     // Change l'état de la tâche de notification en fonction de l'état de
9363     // transmission du dossier d'instruction
9364     $inst_di = $this->get_inst_dossier($this->getVal('dossier'));
9365     if ($this->f->is_option_mode_service_consulte_enabled() === false
9366     && ($inst_di->getVal('etat_transmission_platau') == 'non_transmissible'
9367     || $inst_di->getVal('etat_transmission_platau') == 'transmis_mais_non_transmissible')) {
9368     //
9369     $task_val['state'] = $inst_task::STATUS_DRAFT;
9370     }
9371     $add_task = $inst_task->add_task(array('val' => $task_val));
9372     if ($add_task === false) {
9373     $this->addToMessage(sprintf('%s %s',
9374     __("Une erreur s'est produite lors de la création tâche."),
9375     __("Veuillez contacter votre administrateur.")
9376     ));
9377     $this->correct = false;
9378     return $this->end_treatment(__METHOD__, false);
9379     }
9380     // Mise à jour du champs 'envoye_cl_platau'
9381     $instr_val = array(
9382     'envoye_cl_platau' => 't',
9383     );
9384     $res = $this->f->db->autoExecute(
9385     DB_PREFIXE.$this->table,
9386     $instr_val,
9387     DB_AUTOQUERY_UPDATE,
9388     $this->getCle($this->getVal($this->clePrimaire))
9389     );
9390 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);
9391 softime 11418 if ($this->f->isDatabaseError($res, true) === true) {
9392     $this->addToMessage(sprintf('%s %s',
9393     __("Une erreur s'est produite lors de la mise à jour de l'instruction."),
9394     __("Veuillez contacter votre administrateur.")
9395     ));
9396     $this->correct = false;
9397     return $this->end_treatment(__METHOD__, false);
9398     }
9399     // Message de validation à l'utilisateur
9400     $this->addToMessage(__('Votre demande de transfert au contrôle de légalité à bien été prise en compte.'));
9401     $this->addToMessage(__("La date d'envoi au contrôle de légalité sera mise à jour ultérieurement."));
9402     }
9403     //
9404     return $this->end_treatment(__METHOD__, true);
9405     }
9406    
9407    
9408     /**
9409 softime 8593 * Retourne le lien de retour (VIEW formulaire et VIEW sousformulaire).
9410     *
9411     * @param string $view Appel dans le contexte de la vue 'formulaire' ou de
9412     * la vue 'sousformulaire'.
9413     *
9414     * @return string
9415     */
9416     function get_back_link($view = "formulaire") {
9417     //
9418     $href = parent::get_back_link($view);
9419     //
9420     $crud = $this->get_action_crud();
9421 mbroquet 3730
9422 softime 8593 // Redirection vers le formulaire de modification à la validation du
9423     // formulaire d'ajout si l'événement associé possède une lettre type
9424     if (($crud === 'create'
9425     || ($crud === null
9426     && $this->getParameter('maj') == 0))
9427     && $this->correct == true
9428     && $this->evenement_has_an_edition($this->valF['evenement']) === true) {
9429 softime 7996
9430 softime 8593 // On instancie l'instruction
9431     $inst_instruction = $this->f->get_inst__om_dbform(array(
9432     "obj" => "instruction",
9433     "idx" => $this->valF[$this->clePrimaire],
9434     ));
9435    
9436     // Si l'instruction n'est pas finalisée automatiquement
9437     if ($inst_instruction->getVal('om_final_instruction') !== 't') {
9438     $href = str_replace("&action=3", "&action=1", $href);
9439     //
9440     if (strpos($href, "&retour=tab") !== false) {
9441     $href = str_replace("&retour=tab", "&retour= form", $href);
9442     } else {
9443     $href .= "&retour=form";
9444     }
9445     }
9446     }
9447    
9448     //
9449     return $href;
9450     }
9451    
9452 softime 10573 public function view_json_data() {
9453     $this->checkAccessibility();
9454     $this->f->disableLog();
9455     $view = $this->get_json_data();
9456     printf(json_encode($view));
9457     }
9458    
9459     public function get_json_data() {
9460     $val = array_combine($this->champs, $this->val);
9461     foreach ($val as $key => $value) {
9462     $val[$key] = strip_tags($value);
9463     }
9464     $val['tacite'] = 'f';
9465     $inst_ad = $this->f->get_inst__om_dbform(array(
9466     "obj" => "avis_decision",
9467     "idx" => $val['avis_decision'],
9468     ));
9469     if (preg_match('/[tT]acite/', $inst_ad->getVal('libelle')) === 1) {
9470     $val['tacite'] = 't';
9471     }
9472     return $val;
9473     }
9474    
9475 softime 11418 public function get_related_instructions_next($next_type = 'retour_signature', $instruction = null) {
9476     if (in_array($next_type, array('retour_signature', 'retour_ar', 'suivant_tacite', )) === false) {
9477     return false;
9478     }
9479     $result = array();
9480     $evenements = array();
9481     if ($instruction === null) {
9482     $instruction = $this->getVal($this->clePrimaire);
9483     $evenement = $this->getVal('evenement');
9484     $dossier = $this->getVal('dossier');
9485     } else {
9486     $inst = $this->f->get_inst__om_dbform(array(
9487     "obj" => "instruction",
9488     "idx" => $instruction,
9489     ));
9490     $evenement = $inst->getVal('evenement');
9491     $dossier = $inst->getVal('dossier');
9492     }
9493     //
9494 softime 13137 $qres = $this->f->get_one_result_from_db_query(
9495     sprintf(
9496     'SELECT
9497     evenement_%3$s
9498     FROM
9499     %1$sevenement
9500     WHERE
9501     evenement = %2$s',
9502     DB_PREFIXE,
9503     intval($evenement),
9504     $next_type
9505     ),
9506     array(
9507     "origin" => __METHOD__,
9508     "force_return" => true,
9509     )
9510 softime 11418 );
9511 softime 13137 if ($qres["code"] !== "OK") {
9512 softime 11418 return false;
9513     }
9514 softime 13137 $ev_next = $qres["result"];
9515 softime 11418 //
9516 softime 13137 $res = $this->f->get_one_result_from_db_query(
9517     sprintf(
9518     'SELECT
9519     MAX(instruction.instruction) as instruction
9520     FROM
9521     %1$sinstruction
9522     WHERE
9523     dossier = \'%3$s\'
9524     AND evenement = %2$s',
9525     DB_PREFIXE,
9526     intval($ev_next),
9527     $dossier
9528     ),
9529     array(
9530     "origin" => __METHOD__,
9531     "force_return" => true,
9532     )
9533 softime 11418 );
9534 softime 13137 if ($qres["code"] !== "OK") {
9535 softime 11418 return false;
9536     }
9537 softime 13137 return $qres["result"];
9538 softime 11418 }
9539    
9540 softime 10573 public function get_related_instructions($instruction = null) {
9541     $result = array();
9542     $evenements = array();
9543     if ($instruction === null) {
9544     $instruction = $this->getVal($this->clePrimaire);
9545     $evenement = $this->getVal('evenement');
9546     $dossier = $this->getVal('dossier');
9547     } else {
9548     $inst = $this->f->get_inst__om_dbform(array(
9549     "obj" => "instruction",
9550     "idx" => $instruction,
9551     ));
9552     $evenement = $inst->getVal('evenement');
9553     $dossier = $inst->getVal('dossier');
9554     }
9555     //
9556 softime 13137 $qres = $this->f->get_one_result_from_db_query(
9557     sprintf(
9558     'SELECT
9559     evenement
9560     FROM
9561     %1$sevenement
9562     WHERE
9563     evenement_retour_ar = %2$s
9564     OR evenement_retour_signature = %2$s',
9565     DB_PREFIXE,
9566     intval($evenement)
9567     ),
9568     array(
9569     "origin" => __METHOD__,
9570     "force_return" => true,
9571     )
9572 softime 10573 );
9573 softime 13137 if ($qres["code"] !== "OK") {
9574 softime 10573 return false;
9575     }
9576 softime 13137 $ev_parent = $qres["result"];
9577 softime 10573 //
9578 softime 13137 $qres = $this->f->get_one_result_from_db_query(
9579     sprintf(
9580     'SELECT
9581     MAX(instruction.instruction) as instruction
9582     FROM
9583     %1$sinstruction
9584     WHERE
9585     dossier = \'%3$s\'
9586     AND evenement = %2$s',
9587     DB_PREFIXE,
9588     intval($ev_parent),
9589     $this->f->db->escapeSimple($dossier)
9590     ),
9591     array(
9592     "origin" => __METHOD__,
9593     "force_return" => true,
9594     )
9595 softime 10573 );
9596 softime 13137 if ($qres["code"] !== "OK") {
9597 softime 10573 return false;
9598     }
9599 softime 13137 $result[] = $qres["result"];
9600 softime 10573 //
9601 softime 13137 $qres = $this->f->get_one_result_from_db_query(
9602     sprintf(
9603     'SELECT
9604     evenement_retour_ar
9605     FROM
9606     %1$sevenement
9607     WHERE
9608     evenement = %2$s
9609     AND evenement_retour_ar != %3$s',
9610     DB_PREFIXE,
9611     intval($ev_parent),
9612     intval($evenement)
9613     ),
9614     array(
9615     "origin" => __METHOD__,
9616     "force_return" => true,
9617     )
9618 softime 10573 );
9619 softime 13137 if ($qres["code"] !== "OK") {
9620 softime 10573 return false;
9621     }
9622 softime 13137 $evenements[] = $qres["result"];
9623 softime 10573 //
9624 softime 13137 $qres = $this->f->get_one_result_from_db_query(
9625     sprintf(
9626     'SELECT
9627     evenement_retour_signature
9628     FROM
9629     %1$sevenement
9630     WHERE
9631     evenement = %2$s
9632     AND evenement_retour_signature != %3$s
9633     ',
9634     DB_PREFIXE,
9635     intval($ev_parent),
9636     intval($evenement)
9637     ),
9638     array(
9639     "origin" => __METHOD__,
9640     "force_return" => true,
9641     )
9642 softime 10573 );
9643 softime 13137 if ($qres["code"] !== "OK") {
9644 softime 10573 return false;
9645     }
9646 softime 13137 $evenements[] = $qres["result"];
9647 softime 10573 foreach ($evenements as $value) {
9648     if ($value !== null) {
9649 softime 13137 $qres = $this->f->get_one_result_from_db_query(
9650     sprintf(
9651     'SELECT
9652     MAX(instruction.instruction) as instruction
9653     FROM
9654     %1$sinstruction
9655     WHERE
9656     dossier = \'%3$s\'
9657     AND evenement = %2$s',
9658     DB_PREFIXE,
9659     intval($value),
9660     $this->f->db->escapeSimple($dossier)
9661     ),
9662     array(
9663     "origin" => __METHOD__,
9664     "force_return" => true,
9665     )
9666 softime 10573 );
9667 softime 13137 if ($qres["code"] !== "OK") {
9668 softime 10573 return false;
9669     }
9670 softime 13137 $result[] = $qres["result"];
9671 softime 10573 }
9672     }
9673     return $result;
9674     }
9675    
9676     protected function getDocumentType($champ = null) {
9677     $evenementId = $this->getVal('evenement');
9678     if (! empty($evenementId)) {
9679     $evenement = $this->f->findObjectById('evenement', $evenementId);
9680     if (! empty($evenement)) {
9681     return __("Instruction").':'.$evenement->getVal('libelle');
9682     }
9683     }
9684     return parent::getDocumentType();
9685     }
9686    
9687 softime 10808 /**
9688     * Récupère à l'aide d'une requête sql la liste des demandeurs
9689     * pouvant être notifié. C'est à dire les demandeurs acceptant
9690     * les notifications et pour lesquels une adresse mail existe.
9691     *
9692     * Dans le cas, d'une notification pour le portail citoyen, seul
9693     * le pétitionnaire principal doit être notifier et uniquement si
9694     * il a une adress mail et qu'il accepte les notifications.
9695     *
9696     * @param string identifiant du dossier
9697     * @param boolean true si il faut récupérer la liste des demandeurs notifiable
9698     * pour une notification de categorie portail
9699     * @return array liste des demandeurs pouvant être notifié
9700     */
9701     protected function get_demandeurs_notifiable($idDossier = null, $portail = false) {
9702     if ($idDossier === null) {
9703     $idDossier = $this->getVal('dossier');
9704     }
9705     // Ajoute une condition sur le where pour ne récupérer que le pétitionnaire principal
9706     // pour une notification depuis le portail citoyen
9707     $sqlPetitionnairePrincipal = '';
9708 softime 12124 // Gestion des champs nécessaires pour la notification d'un demandeur
9709     $condition_demandeur = "AND demandeur.notification = 't'
9710     AND demandeur.courriel IS NOT NULL";
9711 softime 10808 if ($portail === true) {
9712     $sqlPetitionnairePrincipal = 'AND lien_dossier_demandeur.petitionnaire_principal = true';
9713 softime 12124 $condition_demandeur = "AND (
9714     (notification = 't' AND courriel IS NOT NULL)
9715     OR demande.source_depot = 'portal'
9716     )";
9717 softime 10808 }
9718    
9719     $listeDemandeursNotifiable = array();
9720    
9721     // Requête de récupération des demandeurs
9722     $sql = sprintf(
9723     'SELECT
9724     demandeur.demandeur,
9725 softime 10869 CASE
9726     WHEN demandeur.qualite=\'particulier\'
9727     THEN TRIM(CONCAT(demandeur.particulier_nom, \' \', demandeur.particulier_prenom, \' \', demandeur.courriel))
9728     ELSE
9729     TRIM(CONCAT(demandeur.personne_morale_raison_sociale, \' \', demandeur.personne_morale_denomination, \' \', demandeur.courriel))
9730     END AS destinataire,
9731 softime 12124 demandeur.courriel,
9732     petitionnaire_principal
9733 softime 10808 FROM
9734     %1$sdossier
9735     INNER JOIN %1$slien_dossier_demandeur
9736     ON dossier.dossier = lien_dossier_demandeur.dossier
9737     INNER JOIN %1$sdemandeur
9738     ON lien_dossier_demandeur.demandeur = demandeur.demandeur
9739 softime 12124 -- Récupération de la plus ancienne demande associée au dossier (la demande
9740     -- de création du dossier)
9741     INNER JOIN (
9742     SELECT
9743     demande,
9744     dossier_instruction,
9745     source_depot
9746     FROM
9747     %1$sdemande
9748     WHERE
9749     dossier_instruction = \'%2$s\'
9750     ORDER BY
9751     demande ASC
9752     LIMIT 1
9753     ) as demande
9754     ON dossier.dossier = demande.dossier_instruction
9755 softime 10808 WHERE
9756 softime 12124 dossier.dossier = \'%2$s\'
9757     %3$s
9758     %4$s',
9759 softime 10808 DB_PREFIXE,
9760     $idDossier,
9761 softime 12124 $condition_demandeur,
9762 softime 10808 $sqlPetitionnairePrincipal
9763     );
9764     $res = $this->f->db->query($sql);
9765     $this->f->addToLog(__METHOD__."(): db->query(\"".$sql."\")", VERBOSE_MODE);
9766     $this->f->isDatabaseError($res);
9767     // Récupération des infos des demandeurs et stockage dans un tableau
9768     // ayant pour clé les id des demandeurs
9769     while($row = $res->fetchrow(DB_FETCHMODE_ASSOC)) {
9770 softime 10869 $listeDemandeursNotifiable[$row['demandeur']] = $row;
9771 softime 10808 }
9772    
9773     return $listeDemandeursNotifiable;
9774     }
9775    
9776     /**
9777     * Renvoie la liste des notifications liées à l'instruction
9778     *
9779     * @param integer id de l'instruction dont on cherche les notifications
9780     * @return array liste des instruction_notification liés à l'instruction
9781     */
9782 softime 12124 public function get_instruction_notification($id_instruction, $typeNotification = null, $nonLieTache = false) {
9783 softime 11585 $whereTypeTache = '';
9784 softime 12124 $sqlTaskNull = '';
9785     // Défini si on veux que la requête récupère également les notifications qui n'ont pas
9786     // de tâches associées. C'est le cas pour les notifications de demandeurs lorsque la
9787     // notification du demandeur principal n'a pas pu être envoyée à cause d'un mauvais
9788     // paramétrage
9789     if(is_bool($nonLieTache) && $nonLieTache === true) {
9790     $sqlTaskNull = 'OR task.type is null';
9791     }
9792 softime 11585 if ($typeNotification != null) {
9793     if (is_array($typeNotification)) {
9794     $whereTypeTache = sprintf(
9795 softime 12124 'AND (task.type IN (%1$s) %2$s)',
9796     "'".implode("', '", $typeNotification)."'",
9797     $sqlTaskNull
9798 softime 11585 );
9799     } else {
9800     $whereTypeTache = sprintf(
9801 softime 12124 'AND (task.type = \'%1$s\' %2$s)',
9802     $typeNotification,
9803     $sqlTaskNull
9804 softime 11585 );
9805     }
9806     }
9807 softime 10808 $listeInstrNotif = array();
9808     $sql = sprintf('
9809     SELECT
9810     instruction_notification.instruction_notification
9811     FROM
9812     %1$sinstruction_notification
9813 softime 11585 LEFT JOIN %1$stask
9814     ON instruction_notification.instruction_notification::CHARACTER VARYING = task.object_id
9815 softime 10808 WHERE
9816 softime 11585 instruction = %2$s
9817     %3$s',
9818 softime 10808 DB_PREFIXE,
9819 softime 11585 $id_instruction,
9820     $whereTypeTache
9821 softime 10808 );
9822     $res = $this->f->db->query($sql);
9823     $this->f->addToLog(__METHOD__."(): db->query(\"".$sql."\")", VERBOSE_MODE);
9824     $this->f->isDatabaseError($res);
9825     while ($row = $res->fetchrow(DB_FETCHMODE_ASSOC)) {
9826     $listeInstrNotif[] = $row['instruction_notification'];
9827     }
9828     return $listeInstrNotif;
9829     }
9830    
9831     /**
9832     * Crée une clé d'accès unique permettant à un utilisateur
9833     * anonyme de récupérer le document.
9834     *
9835     * @return string clé d'accès du document
9836     */
9837     protected function getCleAccesDocument() {
9838 softime 10869 // Initialisation d'un tableau
9839     $number_list = array();
9840    
9841     // Génération aléatoire d'un nombre sur 4 caractères, 4 fois
9842     for ($i = 0; $i < 4; $i++) {
9843     $number_list[] = str_pad(mt_rand(0, 9999), 4, 0, STR_PAD_LEFT);
9844     }
9845    
9846     // Transformation en chaîne tout en séparant les nombres par un "-"
9847     $result = implode('-', $number_list);
9848    
9849     // Vérifie si la clé existe déjà et si c'est le cas génére une nouvelle clé
9850     if ($this->getUidDocumentInstructionWithKey($result) != null) {
9851     return $this->getCleAccesDocument();
9852     }
9853    
9854     //
9855     return $result;
9856 softime 10808 }
9857    
9858     /**
9859 softime 10869 * Récupère une clé et renvoie l'uid du document liée à cette
9860     * clé. Si la clé n'existe pas renvoie null.
9861     *
9862     * @param string $cleGen clé dont on cherche l'instruction
9863     * @return integer|null
9864     */
9865     protected function getUidDocumentInstructionWithKey($cleGen) {
9866     $query = sprintf(
9867     'SELECT
9868     instruction.om_fichier_instruction
9869     FROM
9870     %1$sinstruction_notification_document
9871     LEFT JOIN %1$sinstruction ON instruction_notification_document.instruction = instruction.instruction
9872     WHERE
9873     instruction_notification_document.cle = \'%2$s\'',
9874     DB_PREFIXE,
9875     $this->f->db->escapeSimple($cleGen)
9876     );
9877    
9878     $res = $this->f->db->getOne($query);
9879     $this->addToLog(__METHOD__.": db->getOne(\"".$query."\");", VERBOSE_MODE);
9880     $this->f->isDatabaseError($res);
9881     return $res;
9882     }
9883    
9884     /**
9885     * Récupère une clé, fait une requête pour récupérer l'id de la notification liée a cette clé.
9886     * Récupère l'instance de instruction_notification dont l'id a été récupéré et la renvoie.
9887     *
9888     * @param string $cleGen
9889     * @return instruction_notification
9890     */
9891     protected function getInstanceNotificationWithKey($key) {
9892     $sql = sprintf(
9893     "SELECT
9894     instruction_notification
9895     FROM
9896     %1\$sinstruction_notification_document
9897     WHERE
9898     cle = '%2\$s'",
9899     DB_PREFIXE,
9900     $this->f->db->escapeSimple($key)
9901     );
9902     $res = $this->f->db->getOne($sql);
9903     $this->addToLog(__METHOD__.": db->getOne(\"".$sql."\");", VERBOSE_MODE);
9904     $this->f->isDatabaseError($res);
9905    
9906     // Récupération de l'instance de notification
9907     $instNotif = $this->f->get_inst__om_dbform(array(
9908     "obj" => "instruction_notification",
9909     "idx" => $res,
9910     ));
9911     return $instNotif;
9912     }
9913    
9914    
9915     /**
9916 softime 10808 * Affiche la page de téléchargement du document de la notification.
9917     *
9918     * @param boolean $content_only Affiche le contenu seulement.
9919     *
9920     * @return void
9921     */
9922 softime 10869 public function view_telecharger_document_anonym() {
9923 softime 10808 // Par défaut on considère qu'on va afficher le formulaire
9924     $idx = 0;
9925     // Flag d'erreur
9926     $error = false;
9927     // Message d'erreur
9928     $message = '';
9929    
9930 softime 10869 // Paramètres GET : récupération de la clé d'accès
9931     $cle_acces_document = $this->f->get_submitted_get_value('key');
9932 softime 10808 $cle_acces_document = $this->f->db->escapeSimple($cle_acces_document);
9933 softime 10869 // Vérification de l'existence de la clé et récupération de l'uid du fichier
9934     $uidFichier = $this->getUidDocumentInstructionWithKey($cle_acces_document);
9935     if ($uidFichier != null) {
9936     // Récupération du document
9937     $file = $this->f->storage->get($uidFichier);
9938 softime 10808
9939 softime 10869 // Headers
9940     header("Cache-Control: no-cache, must-revalidate"); // HTTP/1.1
9941     header("Expires: Sat, 26 Jul 1997 05:00:00 GMT"); // Date dans le passé
9942     header("Content-Type: ".$file['metadata']['mimetype']);
9943     header("Accept-Ranges: bytes");
9944     header("Content-Disposition: inline; filename=\"".$file['metadata']['filename']."\";" );
9945     // Affichage du document
9946     echo $file['file_content'];
9947 softime 10808
9948 softime 10869 // Récupération de la date de premier accès et maj du suivi uniquement
9949     // si la date de 1er accès n'a pas encore été remplis
9950     $inst_notif = $this->getInstanceNotificationWithKey($cle_acces_document);
9951     if ($inst_notif->getVal('date_premier_acces') == null ||
9952     $inst_notif->getVal('date_premier_acces') == '') {
9953     $notif_val = array();
9954     foreach ($inst_notif->champs as $champ) {
9955     $notif_val[$champ] = $inst_notif->getVal($champ);
9956     }
9957     $notif_val['date_premier_acces'] = date("d/m/Y H:i:s");
9958     $notif_val['statut'] = 'vu';
9959     $notif_val['commentaire'] = 'Le document a été vu';
9960     $suivi_notif = $inst_notif->modifier($notif_val);
9961 softime 10808 }
9962    
9963     } else {
9964 softime 10869 // Page vide 404
9965     printf('Ressource inexistante');
9966     header('HTTP/1.0 404 Not Found');
9967 softime 10808 }
9968     }
9969    
9970 softime 11228 /**
9971     * Récupère le titre du document envoyé au parapheur
9972     */
9973 softime 10808 protected function getDocumentTitre($champ = null) {
9974     $title = $this->getTitle();
9975     $dossier = $this->getDossier();
9976     return $dossier.' '.$title;
9977     }
9978    
9979 softime 10869 /**
9980 softime 11228 * Compose le nom du document à transmettre au parapheur.
9981     * Le nom ets composé de cette manière :
9982     * instruction_xxx_libelle_de_la_lettre_type_associee
9983     * ou xxx correspond au numéro de l'instruction
9984     */
9985     protected function getDocumentLibelle() {
9986     // Récupère le champ instruction
9987     $instruction = $this->getVal("instruction");
9988    
9989     // Requête sql servant à récupérer le titre du document
9990     // TO_CHAR() introduit un espace avant l'affichage du nombre
9991     // comme les espaces sont remplacé par des '_' dans le retour de la fonction
9992     // il n'est pas nécessaire de mettre un '_' après le mot instruction.
9993     $sql = sprintf(
9994     'SELECT
9995     CONCAT(
9996     \'instruction\',
9997     TO_CHAR(instruction.instruction, \'000\'),
9998     \'_\',
9999     LOWER(om_lettretype.libelle)
10000     ) as nom_fichier
10001     FROM
10002     %1$sinstruction
10003     LEFT JOIN %1$som_lettretype ON om_lettretype.id = instruction.lettretype
10004     WHERE
10005     instruction = %2$s',
10006     DB_PREFIXE,
10007     $instruction
10008     );
10009 softime 12847 $documentLibelle = $this->f->db->getone($sql);
10010     $this->addToLog(__METHOD__."(): db->getone(\"".$sql."\");", VERBOSE_MODE);
10011     $this->f->isDatabaseError($documentLibelle);
10012 softime 11228
10013     // Transforamtion des ' ' en '_', des accents en lettres sans accents et des
10014     // caractères spéciaux en '_'
10015     // La méthode normalize_string est utilisé pour gérer les accents
10016     $documentLibelle = $this->f->normalize_string($documentLibelle);
10017     // TODO : comparer cette liste et celle de la méthode normalize_string
10018     // pour éviter les doublons + vérifier qu'il n'y a pas de doublons dans cette
10019     // liste
10020     $invalid = array('Œ'=>'oe', 'œ'=>'oe', 'Ÿ'=>'y', 'ü'=>'u',
10021     '¢' => '_', 'ß' => '_', '¥' => '_', '£' => '_', '™' => '_', '©' => '_',
10022     '®' => '_', 'ª' => '_', '×' => '_', '÷' => '_', '±' => '_', '²' => '_',
10023     '³' => '_', '¼' => '_', '½' => '_', '¾' => '_', 'µ' => '_', '¿' => '_',
10024     '¶' => '_', '·' => '_', '¸' => '_', 'º' => '_', '°' => '_', '¯' => '_',
10025     '§' => '_', '…' => '_', '¤' => '_', '¦' => '_', '≠' => '_', '¬' => '_',
10026     'ˆ' => '_', '¨' => '_', '‰' => '_', '¤' => '_', '€' => '_', '$' => '_',
10027     '«' => '_', '»' => '_', '‹' => '_', '›' => '_', 'ƒ' => '_', '¥' => '_',
10028     '‘‘' => '_', '‚' => '_', '!' => '_', '¡' => '_', '¢' => '_', '£' => '_',
10029     '?' => '_', '[' => '_', ']' => '_', '´' => '_', '`' => '_', '^' => '_',
10030     '~' => '_', '˜' => '_', '#' => '_', '*' => '_', '.' => '_', ':' => '_',
10031     ';' => '_', '•' => '_', '¯' => '_', '‾' => '_', '–' => '_', '–' => '_',
10032     '—' => '_', '_' => '_', '|' => '_', '¦‌' => '_', '‡' => '_', '§' => '_',
10033     '¶' => '_', '©' => '_', '®' => '_', '™' => '_', '&' => '_', '@' => '_',
10034     '/' => '_', '\\' => '_', '◊' => '_', '♠' => '_', '♣' => '_', '♥' => '_',
10035     '♦' => '_', '←' => '_', '↑' => '_', '→' => '_', '↓' => '_', '↔' => '_',
10036     '°' => '_', 'µ' => '_', '<' => '_', '>' => '_', '≤' => '_', '≥' => '_',
10037     '=' => '_', '≈' => '_', '≠' => '_', '≡' => '_', '±' => '_', '−' => '_',
10038     '+' => '_', '×' => '_', '÷' => '_', '⁄' => '_', '%' => '_', '‰' => '_',
10039     '¼' => '_', '½' => '_', '¾' => '_', '¹' => '_', '²' => '_', '³' => '_',
10040     '' => '_', 'º' => '_', 'ª' => '_', 'ƒ' => '_', '′' => '_', '″' => '_',
10041     '∂' => '_', '∏' => '_', '∑' => '_', '√' => '_', '∞' => '_', '¬' => '_',
10042     '∩' => '_', '∫' => '_', 'α' => '_', 'Α' => '_', 'β' => '_', 'Β' => '_',
10043     'γ' => '_', 'Γ' => '_', 'δ' => '_', 'Δ' => '_', 'ε' => '_', 'Ε' => '_',
10044     'ζ' => '_', 'Ζ' => '_', 'η' => '_', 'Η' => '_', 'θ' => '_', 'Θ' => '_',
10045     'ι' => '_', 'Ι' => '_', 'κ' => '_', 'Κ' => '_', 'λ' => '_', 'Λ' => '_',
10046     'μ' => '_', 'Μ' => '_', 'ν' => '_', 'Ν' => '_', 'ξ' => '_', 'Ξ' => '_',
10047     'ο' => '_', 'Ο' => '_', 'π' => '_', 'Π' => '_', 'ρ' => '_', 'Ρ' => '_',
10048     'σ' => '_', 'ς' => '_', 'Σ' => '_', 'τ' => '_', 'Τ' => '_', 'υ' => '_',
10049     'Υ' => '_', 'φ' => '_', 'Φ' => '_', 'χ' => '_', 'Χ' => '_', 'ψ' => '_',
10050     'Ψ' => '_', 'ω' => '_', 'Ω' => '_', ',' => '_', ' ' => '_'
10051     );
10052    
10053     return str_replace(array_keys($invalid), array_values($invalid), $documentLibelle);
10054     }
10055    
10056     /**
10057 softime 10869 * Surcharge permettant de ne pas afficher le fil d'Ariane dans
10058     * l'overlay de notification des demandeurs.
10059     */
10060     function getSubFormTitle($ent) {
10061 softime 11876 $actionSansPath = array('411', '420', '430');
10062     if (in_array($this->getParameter('maj'), $actionSansPath)) {
10063 softime 10869 return '';
10064     }
10065     return parent::getSubFormTitle($ent);
10066     }
10067 softime 13137
10068     /**
10069     * Traitement de la notification automatique des tiers consulté.
10070     *
10071     * Récupère la liste des adresses mails des tiers notifiables. Pour chaque adresses
10072     * récupérées ajoute une notification et une tâche de notification par mail.
10073     * La création de la tâche de notification par mail déclenchera l'envoi du mail
10074     * et la mise à jour du suivi.
10075     *
10076     * Les tiers notifiables sont ceux :
10077     * - n’ayant pas un ID PLAT’AU correspondant à l’ID PLAT’AU du service consultant
10078     * - ayant une habilitation dont le type est listé dans les paramètres de
10079     * notification de l’événement,
10080     * - intervenant sur la commune ou le département du dossier
10081     * - ayant au moins une adresse mail valide
10082     *
10083     * @param evenement instance de l'événement associée à l'instruction
10084     * @param dossier instance du dossier de l'instruction
10085     * @return boolean indique si le traitement à réussi
10086     */
10087     protected function traitement_notification_automatique_tiers_consulte($evenement, $dossier) {
10088     // Récupération de l'identifiant plat'au du service consultant
10089     $consultationEntrante = $dossier->get_inst_consultation_entrante();
10090     // Récupération de la liste des types d'habilitations autorisées pour
10091     // cette notification
10092     $typesHabilitationsNotifiable = $evenement->get_types_habilitation_notifiable();
10093     // Récupération du département et de la commune du dossier
10094     $commune = $dossier->getVal('commune');
10095     // Le département est récupéré à partir de la commune du dossier donc si la
10096     // commune n'a pas pu être récupéré on ne récupère pas non plus le département.
10097     $idDepartement = null;
10098     if (! empty($commune)) {
10099     $departement = $dossier->get_inst_departement_dossier();
10100     $idDepartement = $departement->getVal($departement->clePrimaire);
10101     }
10102     // Récupération des courriels des tiers notifiables
10103     $tiersANotifier = $this->get_courriels_tiers_notifiable(
10104     $typesHabilitationsNotifiable,
10105     $consultationEntrante->getVal('service_consultant_id'),
10106     $commune,
10107     $idDepartement
10108     );
10109     // Traitement de chacune des listes de diffusion pour extraire les
10110     // courriels, vérifier la validité des courriels et envoyer la
10111     // notification
10112     $notificationSend = false;
10113     if (empty($tiersANotifier)) {
10114     $this->addToLog(
10115     sprintf(
10116     '%s() : %s %s : ',
10117     __METHOD__,
10118     __("La récupération des tiers à échoué."),
10119     __('Paramétrage'),
10120     var_export(
10121     array(
10122     'types_habilitations_notifiable' => $typesHabilitationsNotifiable,
10123     'service_consultant' => $consultationEntrante->getVal('service_consultant_id'),
10124     'id_commune' => $commune,
10125     'id_departement' => $idDepartement
10126     ),
10127     true
10128     )
10129     ),
10130     DEBUG_MODE
10131     );
10132     return false;
10133     }
10134     foreach($tiersANotifier as $tierANotifier) {
10135     // Découpe la liste de diffusion pour stocker les adresses mails
10136     // des tiers dans un tableau
10137     $courriels =
10138     array_filter(
10139     array_map(
10140     'trim',
10141     preg_split("/\r\n|\n|\r/", $tierANotifier['liste_diffusion'])));
10142    
10143     foreach ($courriels as $courriel) {
10144     // Pour chaque adresse mail vérifie si l'adresse est valide
10145     if (! $this->f->checkValidEmailAddress($courriel)) {
10146     continue;
10147     }
10148     $destinataire = array(
10149     'destinataire' => $tierANotifier['libelle'].' : '.$courriel,
10150     'courriel' => $courriel
10151     );
10152     // Si l'adresse est valide ajoute une nouvelle notification
10153     // et une tâche d'envoi de mails
10154     $idNotif = $this->ajouter_notification(
10155     $this->getVal($this->clePrimaire),
10156     $this->f->get_connected_user_login_name(),
10157     $destinataire,
10158     $this->get_dossier_instruction_om_collectivite(),
10159     array(),
10160     true
10161     );
10162     if ($idNotif === false) {
10163     $this->addToLog(
10164     __METHOD__.
10165     __("L'ajout de la notification a échoué."),
10166     DEBUG_MODE
10167     );
10168     return false;
10169     }
10170     // Création de la tache en lui donnant l'id de la notification
10171     $notification_by_task = $this->notification_by_task(
10172     $idNotif,
10173     $dossier->getVal('dossier'),
10174     'mail',
10175     'notification_tiers_consulte'
10176     );
10177     if ($notification_by_task === false) {
10178     $this->addToLog(
10179     __METHOD__.
10180     __("L'ajout de la tâche de notification a échoué."),
10181     DEBUG_MODE
10182     );
10183     $this->addToMessage(
10184     __("Erreur lors de la génération de la notification au(x) pétitionnaire(s).")
10185     );
10186     return false;
10187     }
10188     $notificationSend = true;
10189     }
10190     }
10191     // Si aucune notification n'a été envoyé car il n'y a pas de courriels
10192     // valide, affiche un message dans les logs pour avoir un suivi.
10193     if (! $notificationSend) {
10194     $this->addToLog(
10195     sprintf(
10196     '%s %s : %s %s : %s',
10197     __METHOD__,
10198     __("Il n'y a pas de tiers notifiable pour l'instruction"),
10199     $evenement->getVal('libelle'),
10200     __("du dossier"),
10201     $this->getVal('dossier')
10202     ),
10203     DEBUG_MODE
10204     );
10205     }
10206     return true;
10207     }
10208    
10209     /**
10210     * Récupère, à l'aide d'une requête, la liste de diffusion des tiers
10211     * respectant les conditions suvantes :
10212     * - le tiers consulté dois accepté les notifications
10213     * - la liste de diffusion ne dois pas être vide
10214     * - l'uid du tiers consulté ne dois pas être celui passé en paramètre
10215     * si pas d'uid passé en paramètre alors on ne filtre pas selon l'uid
10216     * du tiers
10217     * - le type d'habilitation des tiers dois appartenir à la liste
10218     * fournie en paramètre
10219     * - le tiers dois être associé à la commune ou au département passé
10220     * en paramètre
10221     *
10222     * @param array $typesHabilitations tableau contenant la liste des types d'habilitation
10223     * pouvant être notifiée
10224     * @param integer $idPlautau uid de l'acteur plat'au du dossier qui ne dois pas être notifié
10225     * @param integer $commune identifiant de la commune du dossier
10226     * @param integer $departement identifiant du département du dossier
10227     *
10228     * @return array listes de diffusion des tiers notifiable
10229     */
10230     protected function get_courriels_tiers_notifiable(array $typesHabilitations, $idPlatau, $commune, $departement) {
10231     // Si paramètre non renseigné alors ne renvoie rien
10232     if (empty($typesHabilitations) || empty($commune) || empty($departement)) {
10233     return false;
10234     }
10235     // Si il n'y a pas d'acteur associé au dossier alors on ne filtre pas sur l'uid de l'acteur
10236     $filtreServiceConsulteDI = '';
10237     if (! empty($idPlatau)) {
10238     $filtreServiceConsulteDI = sprintf(
10239     'AND tiers_consulte.uid_platau_acteur != \'%s\'',
10240     $this->f->db->escapeSimple($idPlatau)
10241     );
10242     }
10243     $rst = $this->f->get_all_results_from_db_query(
10244     sprintf(
10245     'SELECT
10246     tiers_consulte.liste_diffusion,
10247     tiers_consulte.libelle
10248     FROM
10249     %1$shabilitation_tiers_consulte
10250     LEFT JOIN %1$stiers_consulte
10251     ON habilitation_tiers_consulte.tiers_consulte = tiers_consulte.tiers_consulte
10252     LEFT JOIN %1$slien_habilitation_tiers_consulte_commune
10253     ON habilitation_tiers_consulte.habilitation_tiers_consulte = lien_habilitation_tiers_consulte_commune.habilitation_tiers_consulte
10254     LEFT JOIN %1$slien_habilitation_tiers_consulte_departement
10255     ON habilitation_tiers_consulte.habilitation_tiers_consulte = lien_habilitation_tiers_consulte_departement.habilitation_tiers_consulte
10256     WHERE
10257     tiers_consulte.accepte_notification_email IS TRUE
10258     AND tiers_consulte.liste_diffusion IS NOT NULL
10259     %3$s
10260     AND habilitation_tiers_consulte.type_habilitation_tiers_consulte IN (%2$s)
10261     AND (
10262     lien_habilitation_tiers_consulte_commune.commune = %4$d
10263     OR lien_habilitation_tiers_consulte_departement.departement = %5$d
10264     )
10265     ORDER BY
10266     tiers_consulte.libelle
10267     ',
10268     DB_PREFIXE,
10269     implode(', ', $typesHabilitations),
10270     $filtreServiceConsulteDI,
10271     intval($commune),
10272     intval($departement)
10273     ),
10274     array(
10275     "origin" => __METHOD__
10276     )
10277     );
10278     return $rst['result'];
10279     }
10280     }

Properties

Name Value
svn:keywords "Id"

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26