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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 17542 - (hide annotations)
Thu Apr 25 13:27:12 2024 UTC (9 months ago) by softime
File size: 503364 byte(s)
chore(branch): fusion de la branche d'intégration 6.5.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 softime 17542 /**
111     * Méthode appelée par le module_manager lors de la récupération des modules de cet objet.
112     * Permet d'ajouer des modules en plus de ceux récupérer par défaut par le module_manager.
113     *
114     * @return array Liste de modules supplémentaires pour cet objet
115     */
116     public function get_modules_append() {
117     $modules = array();
118    
119     // si on est dans le cadre de l'affichage d'une nouvelle instruction
120     $action = $this->f->get_submitted_get_value('action');
121     if ($action == '0') {
122    
123     // si on est sur un dossier d'instruction
124     if ($this->f->contexte_dossier_instruction()) {
125     $idx = $this->f->get_submitted_get_value('idxformulaire');
126     if (! empty($idx)) {
127    
128     // ajoute les modules des évènements possible sur le dossier courant
129     $evenements_data = $this->get_var_sql_forminc__sql_evenement();
130     $evenements_ids = array_map(function($item) { return $item['evenement']; }, $evenements_data);
131     $this->f->log(__METHOD__, 'evenements: '.implode(',', $evenements_ids));
132     $modules = $this->f->module_manager->get_modules_for_object_name_and_ids(
133     'evenement', $evenements_ids, $this, false);
134     }
135     }
136     }
137     return $modules;
138     }
139    
140 mbroquet 3730 // {{{ Gestion de la confidentialité des données spécifiques
141    
142     /**
143     * Définition des actions disponibles sur la classe.
144     *
145     * @return void
146     */
147     function init_class_actions() {
148    
149     parent::init_class_actions();
150    
151     // ACTION - 000 - ajouter
152     // Modifie la condition d'affichage du bouton ajouter
153 softime 6565 $this->class_actions[0]["condition"] = array("is_addable", "can_user_access_dossier_contexte_ajout");
154 mbroquet 3730
155     // ACTION - 001 - modifier
156     // Modifie la condition et le libellé du bouton modifier
157 softime 6565 $this->class_actions[1]["condition"] = array(
158     "is_editable",
159     "is_finalizable_without_bypass",
160     "can_user_access_dossier_contexte_modification",
161 softime 10573 "is_evenement_modifiable",
162 softime 6565 );
163 mbroquet 3730 $this->class_actions[1]["portlet"]["libelle"] = _("Modifier");
164    
165     // ACTION - 002 - supprimer
166     // Modifie la condition et le libellé du bouton supprimer
167 softime 6565 $this->class_actions[2]["condition"] = array(
168     "is_deletable",
169     "is_finalizable_without_bypass",
170 softime 10573 "can_user_access_dossier_contexte_modification",
171     "is_evenement_supprimable",
172 softime 6565 );
173 mbroquet 3730 $this->class_actions[2]["portlet"]["libelle"] = _("Supprimer");
174    
175 softime 6565 // ACTION - 003 - consulter
176     //
177     $this->class_actions[3]["condition"] = "can_user_access_dossier_contexte_modification";
178    
179 mbroquet 3730 // ACTION - 100 - finaliser
180     // Finalise l'enregistrement
181     $this->class_actions[100] = array(
182     "identifier" => "finaliser",
183     "portlet" => array(
184     "type" => "action-direct",
185     "libelle" => _("Finaliser le document"),
186     "order" => 110,
187     "class" => "finalise",
188     ),
189     "view" => "formulaire",
190     "method" => "finalize",
191     "button" => "finaliser",
192     "permission_suffix" => "finaliser",
193 softime 6565 "condition" => array(
194     "is_finalizable",
195     "is_finalizable_without_bypass",
196     "has_an_edition",
197     "can_user_access_dossier_contexte_modification",
198     ),
199 mbroquet 3730 );
200    
201     // ACTION - 110 - definaliser
202     // Finalise l'enregistrement
203     $this->class_actions[110] = array(
204     "identifier" => "definaliser",
205     "portlet" => array(
206     "type" => "action-direct",
207     "libelle" => _("Reprendre la redaction du document"),
208     "order" => 110,
209     "class" => "definalise",
210     ),
211     "view" => "formulaire",
212     "method" => "unfinalize",
213     "button" => "definaliser",
214     "permission_suffix" => "definaliser",
215 softime 6565 "condition" => array(
216     "is_unfinalizable",
217     "is_unfinalizable_without_bypass",
218     "can_user_access_dossier_contexte_modification",
219 softime 10573 "is_not_sent_for_signature",
220 softime 15973 "is_not_signed",
221 softime 6565 ),
222 mbroquet 3730 );
223    
224 softime 13137 // ACTION - 115 - Modification d'un document généré par une instruction
225 softime 12847 // Permet à un instructeur de modifier un document généré par une instruction
226     $this->class_actions[115] = array(
227     "identifier" => "modale_selection_document_signe",
228     "portlet" => array(
229     "type" => "action-self",
230     "libelle" => _("Remplacer par le document signé"),
231     "order" => 115,
232     "class" => "selection-document-signé",
233     ),
234     "view" => "view_modale_selection_document_signe",
235     "permission_suffix" => "selection_document_signe",
236     "condition" => array(
237     "is_finalized",
238     "is_not_date_retour_signature_set",
239     ),
240     );
241    
242 mbroquet 3730 // ACTION - 120 - edition
243     // Affiche l'édition
244     $this->class_actions[120] = array(
245     "identifier" => "edition",
246     "portlet" => array(
247     "type" => "action-blank",
248     "libelle" => _("Edition"),
249     "order" => 100,
250     "class" => "pdf-16",
251     ),
252     "view" => "view_edition",
253 softime 6565 "condition" => array("has_an_edition", "can_user_access_dossier_contexte_modification"),
254 mbroquet 3730 "permission_suffix" => "om_fichier_instruction_telecharger",
255     );
256    
257     // ACTION - 125 - modifier_suivi
258     // Suivi des dates
259     $this->class_actions[125] = array(
260     "identifier" => "modifier_suivi",
261     "portlet" => array(
262     "type" => "action-self",
263     "libelle" => _("Suivi des dates"),
264     "order" => 125,
265     "class" => "suivi-dates-16",
266     ),
267     "crud" => "update",
268 softime 6565 "condition" => array("can_monitoring_dates", "can_user_access_dossier_contexte_modification"),
269 mbroquet 3730 "permission_suffix" => "modification_dates",
270     );
271    
272     // ACTION - 130 - bible
273     // Affiche la bible
274     $this->class_actions[130] = array(
275     "identifier" => "bible",
276     "view" => "view_bible",
277     "permission_suffix" => "modifier",
278     );
279    
280     // ACTION - 140 - bible_auto
281     // Active la bible automatique
282     $this->class_actions[140] = array(
283     "identifier" => "bible_auto",
284     "view" => "view_bible_auto",
285     "permission_suffix" => "modifier",
286     );
287    
288     // ACTION - 150 - suivi_bordereaux
289     // Imprimer un bordereau d'envoi
290     $this->class_actions[150] = array(
291     "identifier" => "suivi_bordereaux",
292     "view" => "view_suivi_bordereaux",
293     "permission_suffix" => "consulter",
294     );
295    
296     // ACTION - 160 - suivi_envoi_lettre_rar
297     // Imprimer un bordereau d'envoi
298     $this->class_actions[160] = array(
299     "identifier" => "suivi_envoi_lettre_rar",
300     "view" => "view_suivi_envoi_lettre_rar",
301     "permission_suffix" => "consulter",
302     );
303    
304     // ACTION - 170 - suivi_mise_a_jour_des_dates
305     // Mettre à jour les dates de l'instruction
306     $this->class_actions[170] = array(
307     "identifier" => "suivi_mise_a_jour_des_dates",
308     "view" => "view_suivi_mise_a_jour_des_dates",
309     "permission_suffix" => "consulter",
310     );
311    
312 softime 13528 // ACTION - 175 - edit_by_notification_task
313 softime 13137 // Action à utiliser lors de la mise à jour des instructions par notification
314     $this->class_actions[175] = array(
315 softime 13528 "identifier" => "edit_by_notification_task",
316 softime 13137 "view" => "formulaire",
317     "permission_suffix" => "modifier",
318     "crud" => "update",
319     );
320    
321 softime 14064 // ACTION - 176 - add_by_evenement_retour_after_notification_task
322     // Action à utiliser lors de l'ajout des instructions par événement suivant
323     // suite à une notification par tâche (donc notification dématerialisée)
324     $this->class_actions[176] = array(
325     "identifier" => "add_by_evenement_retour_after_notification_task",
326     "view" => "formulaire",
327     "permission_suffix" => "ajouter",
328     "crud" => "create",
329     );
330    
331 mbroquet 3730 // ACTION - 180 - pdf_lettre_rar
332 softime 8989 // Génère PDF sur bordereaux de lettres AR
333 mbroquet 3730 $this->class_actions[180] = array(
334     "identifier" => "pdf_lettre_rar",
335     "view" => "view_pdf_lettre_rar",
336     "permission_suffix" => "consulter",
337     );
338    
339     // ACTION - 190 - bordereau_envoi_maire
340     // Formulaire pour générer le bordereau d'envoi au maire
341     // Met à jour la date d'envoi à signature du maire
342     $this->class_actions[190] = array(
343     "identifier" => "bordereau_envoi_maire",
344     "view" => "view_bordereau_envoi_maire",
345     "permission_suffix" => "bordereau_envoi_maire",
346     );
347    
348     // ACTION - 200 - generate_bordereau_envoi_maire
349     // Génère PDF bordereau d'envoi au maire
350     $this->class_actions[200] = array(
351     "identifier" => "generate_bordereau_envoi_maire",
352     "view" => "view_generate_bordereau_envoi_maire",
353     "permission_suffix" => "bordereau_envoi_maire",
354     );
355 nmeucci 4108
356     // ACTION - 210 - notifier_commune
357     // Notifie la commune par mail d'un évément d'instruction finalisé
358     $this->class_actions[210] = array(
359     "identifier" => "notifier_commune",
360     "portlet" => array(
361     "type" => "action-direct-with-confirmation",
362     "libelle" => _("Notifier la commune par courriel"),
363     "order" => 210,
364     "class" => "notifier_commune-16",
365     ),
366     "view" => "formulaire",
367     "method" => "notifier_commune",
368     "permission_suffix" => "notifier_commune",
369 softime 6565 "condition" => array("is_notifiable", "can_user_access_dossier_contexte_modification"),
370 nmeucci 4108 );
371 nmeucci 4317
372     // ACTION - 220 - generate_suivi_bordereaux
373     // GénÚre PDF bordereaux
374     $this->class_actions[220] = array(
375     "identifier" => "generate_suivi_bordereaux",
376     "view" => "view_generate_suivi_bordereaux",
377 softime 6565 "permission_suffix" => "consulter",
378     );
379 softime 7521
380     // ACTION - 777 - pdf_temp
381     // Crée un PDF temporaire et affiche son contenu en base64
382     $this->class_actions[777] = array(
383     "identifier" => "pdf_temp",
384     "view" => "view_pdf_temp",
385     "permission_suffix" => "modifier",
386     "condition" => array("can_user_access_dossier_contexte_modification"),
387     );
388 softime 8593
389     // ACTION - 701
390     $this->class_actions[701] = array(
391     "identifier" => "enable-edition-integrale",
392     "portlet" => array(
393     "type" => "action-direct-with-confirmation",
394     "libelle" => _("Rédaction libre"),
395     "order" => 50,
396     "class" => "redac-libre-16",
397     ),
398     "view" => "formulaire",
399     "method" => "enable_edition_integrale",
400     "permission_suffix" => "modifier",
401     "condition" => array(
402     "is_editable",
403     "is_finalizable_without_bypass",
404     "can_user_access_dossier_contexte_modification",
405     "is_edition_integrale_not_enabled",
406     "is_option_redaction_libre_enabled",
407     "has_an_edition",
408     ),
409     );
410     // ACTION - 702
411     $this->class_actions[702] = array(
412     "identifier" => "disable-edition-integrale",
413     "portlet" => array(
414     "type" => "action-direct-with-confirmation",
415     "libelle" => _("Rédaction par compléments"),
416     "order" => 50,
417     "class" => "redac-complement-16",
418     ),
419     "view" => "formulaire",
420     "method" => "disable_edition_integrale",
421     "permission_suffix" => "modifier",
422     "condition" => array(
423     "is_editable",
424     "is_finalizable_without_bypass",
425     "can_user_access_dossier_contexte_modification",
426     "is_edition_integrale_enabled",
427     "is_option_redaction_libre_enabled",
428     "has_an_edition",
429     ),
430     );
431     // ACTION - 300 - evenement_has_an_edition_json
432     //
433     $this->class_actions[300] = array(
434     "identifier" => "evenement_has_an_edition_json",
435     "view" => "view_evenement_has_an_edition_json",
436     "permission_suffix" => "consulter",
437     );
438 softime 10573
439     // ACTION - 301 - evenement_has_a_commentaire
440     //
441     $this->class_actions[301] = array(
442     "identifier" => "evenement_has_a_commentaire_json",
443     "view" => "view_evenement_has_a_commentaire_json",
444     "permission_suffix" => "consulter",
445     );
446    
447     // ACTION - 400 - Envoyer en signature
448     // Cet évenement permet d'envoyer le document au parapheur pour signature
449     $this->class_actions[400] = array(
450     "identifier" => "envoyer_a_signature",
451     "portlet" => array(
452     "libelle" => _("Envoyer à signature"),
453     "type" => "action-direct-with-confirmation",
454     "class" => "envoyer_a_signature-16",
455     ),
456     "view" => "formulaire",
457 softime 10713 "method" => "envoyer_a_signature_sans_relecture",
458 softime 10573 "condition" => array(
459     "can_be_signed",
460     ),
461     "permission_suffix" => "envoyer_a_signature",
462     );
463    
464 softime 10713 // ACTION - 402 - Envoyer en signature avec relecture
465     // Cet évenement permet d'envoyer le document au parapheur pour signature
466     $this->class_actions[402] = array(
467     "identifier" => "envoyer_a_signature_relecture",
468     "portlet" => array(
469     "libelle" => __("Envoyer à signature avec relecture"),
470     "type" => "action-direct-with-confirmation",
471     "class" => "envoyer_a_signature-16",
472     ),
473     "view" => "formulaire",
474     "method" => "envoyer_a_signature_avec_relecture",
475     "condition" => array(
476     "can_be_signed",
477 softime 10808 "is_parapheur_relecture_parameter_enabled"
478 softime 10713 ),
479     "permission_suffix" => "envoyer_a_signature",
480     );
481    
482 softime 11876 // ACTION - 404 - Annuler l'envoi en signature
483     // Cet évenement permet d'annuler l'envoi en signature du document au parapheur
484     $this->class_actions[404] = array(
485     "identifier" => "annuler_envoi_signature",
486     "portlet" => array(
487     "libelle" => __("Annuler l'envoi en signature"),
488     "type" => "action-direct-with-confirmation",
489     "class" => "annuler_envoi_signature-16",
490     ),
491     "view" => "formulaire",
492     "method" => "annuler_envoi_en_signature",
493     "condition" => array(
494 softime 12124 "is_sent_for_signature",
495 softime 11876 "is_parapheur_annulation_parameter_enabled"
496     ),
497     "permission_suffix" => "envoyer_a_signature",
498     );
499    
500 softime 10573 //
501     $this->class_actions[401] = array(
502     "identifier" => "preview_edition",
503     "view" => "formulaire",
504     "permission_suffix" => "tab",
505     );
506    
507 softime 17036 //
508     $this->class_actions[405] = array(
509     "identifier" => "telecharger_editions",
510     "view" => "view_telecharger_editions",
511     "permission_suffix" => "om_fichier_instruction_telecharger",
512     );
513    
514 softime 10808 // ACTION - 410 - Notifier les pétitionnaires (mail ou autre)
515     $this->class_actions[410] = array(
516     "identifier" => "overlay_notification_manuelle",
517     "portlet" => array(
518     "libelle" => __("Notifier les pétitionnaires"),
519     "type" => "action-self",
520     "class" => "notifier_commune-16",
521     ),
522     "condition" => array(
523     "is_notifiable_by_task_manual",
524 softime 10869 "is_not_portail_notification_sans_annexe"
525 softime 10808 ),
526     "view" => "view_overlay_notification_manuelle",
527     "permission_suffix" => "modifier",
528     );
529    
530 softime 11585 // ACTION - 411 - Notifier les pétitionnaires (portail citoyen)
531 softime 10808 $this->class_actions[411] = array(
532     "identifier" => "notification_manuelle_portal",
533     "portlet" => array(
534     "libelle" => __("Notifier les pétitionnaires"),
535     "type" => "action-direct-with-confirmation",
536     "class" => "notifier_commune-16",
537     ),
538     "condition" => array(
539     "is_notifiable_by_task_manual",
540 softime 10869 "is_portail_notification_sans_annexe"
541 softime 10808 ),
542 softime 14542 "method" => "notifier_demandeur_principal_via_portal",
543 softime 10808 "permission_suffix" => "modifier",
544     );
545    
546 softime 17542 // ACTION - 412 - Vérifie le dépassement de la date limite de notification
547     $this->class_actions[412] = array(
548     "identifier" => "is_date_limite_notification_dossier_depasse",
549     "view" => "is_date_limite_notification_dossier_depasse",
550     "permission_suffix" => "modifier",
551     );
552    
553 softime 11585 // ACTION - 420 - Notifier les services consultés (mail)
554     $this->class_actions[420] = array(
555     "identifier" => "overlay_notification_service_consulte",
556     "portlet" => array(
557     "libelle" => __("Notifier les services consultés"),
558     "type" => "action-self",
559     "class" => "notifier_commune-16",
560     ),
561     "condition" => array(
562     "is_service_notifiable"
563     ),
564     "view" => "view_overlay_notification_service_consulte",
565     "permission_suffix" => "tab",
566     );
567    
568     // ACTION - 430 - Notifier les tiers consultés (mail)
569     $this->class_actions[430] = array(
570     "identifier" => "overlay_notification_tiers_consulte",
571     "portlet" => array(
572     "libelle" => __("Notifier les tiers consultés"),
573     "type" => "action-self",
574     "class" => "notifier_commune-16",
575     ),
576     "condition" => array(
577     "is_tiers_notifiable"
578     ),
579     "view" => "view_overlay_notification_tiers_consulte",
580     "permission_suffix" => "tab",
581     );
582    
583 softime 10573 //
584 softime 11418 $this->class_actions[403] = array(
585     "identifier" => "envoyer_au_controle_de_legalite",
586     "portlet" => array(
587     "libelle" => __("Envoyer au contrôle de légalité"),
588     "type" => "action-direct-with-confirmation",
589     "class" => "envoyer_au_controle_de_legalite-16",
590     ),
591     "view" => "formulaire",
592     "method" => "envoyer_au_controle_de_legalite",
593     "condition" => array(
594     "can_be_sended_to_cl"
595     ),
596     "permission_suffix" => "envoyer_au_controle_de_legalite",
597     );
598    
599     //
600 softime 10573 $this->class_actions[998] = array(
601     "identifier" => "json_data",
602     "view" => "view_json_data",
603     "permission_suffix" => "consulter",
604     );
605 mbroquet 3730 }
606    
607 softime 8593 /**
608 softime 8989 * Clause select pour la requête de sélection des données de l'enregistrement.
609     *
610     * @return array
611     */
612     function get_var_sql_forminc__champs() {
613     return array(
614     "instruction",
615     "destinataire",
616     "instruction.evenement",
617 softime 10573 "instruction.commentaire",
618 softime 8989 "date_evenement",
619     "instruction.lettretype",
620     "signataire_arrete",
621     "flag_edition_integrale",
622     "om_final_instruction_utilisateur",
623     "date_finalisation_courrier",
624     "date_envoi_signature",
625 softime 15973 "date_retour_signature",
626 softime 8989 "date_envoi_rar",
627    
628     "date_retour_rar",
629 softime 15973 "date_envoi_controle_legalite",
630 softime 8989 "date_retour_controle_legalite",
631    
632     "numero_arrete",
633    
634     "complement_om_html",
635     "'' as bible_auto",
636     "'' as bible",
637     "complement2_om_html",
638     "'' as bible2",
639     "complement3_om_html",
640     "'' as bible3",
641     "complement4_om_html",
642     "'' as bible4",
643    
644     "titre_om_htmletat",
645     "corps_om_htmletatex",
646    
647     "'' as btn_preview",
648     "'' as btn_redaction",
649    
650     "'' as btn_refresh",
651     "'' as live_preview",
652    
653     "dossier",
654     "instruction.action",
655     "instruction.delai",
656     "instruction.etat",
657     "instruction.autorite_competente",
658     "instruction.accord_tacite",
659     "instruction.delai_notification",
660     "instruction.avis_decision",
661     "archive_delai",
662     "archive_accord_tacite",
663     "archive_etat",
664     "archive_avis",
665     "archive_date_complet",
666     "archive_date_rejet",
667     "archive_date_limite",
668     "archive_date_notification_delai",
669     "archive_date_decision",
670     "archive_date_validite",
671     "archive_date_achevement",
672     "archive_date_conformite",
673     "archive_date_chantier",
674     "archive_date_dernier_depot",
675     "date_depot",
676 softime 10573 "date_depot_mairie",
677 softime 8989 "complement5_om_html",
678     "'' as bible5",
679     "complement6_om_html",
680     "'' as bible6",
681     "complement7_om_html",
682     "'' as bible7",
683     "complement8_om_html",
684     "'' as bible8",
685     "complement9_om_html",
686     "'' as bible9",
687     "complement10_om_html",
688     "'' as bible10",
689     "complement11_om_html",
690     "'' as bible11",
691     "complement12_om_html",
692     "complement13_om_html",
693     "complement14_om_html",
694     "complement15_om_html",
695     "archive_incompletude",
696     "archive_incomplet_notifie",
697     "archive_evenement_suivant_tacite",
698     "archive_evenement_suivant_tacite_incompletude",
699     "archive_etat_pendant_incompletude",
700     "archive_date_limite_incompletude",
701     "archive_delai_incompletude",
702     "archive_autorite_competente",
703     "code_barres",
704     "om_fichier_instruction",
705     "om_final_instruction",
706     "om_fichier_instruction_dossier_final",
707     "document_numerise",
708     "duree_validite_parametrage",
709     "duree_validite",
710     "created_by_commune",
711     "archive_date_cloture_instruction",
712     "archive_date_premiere_visite",
713     "archive_date_derniere_visite",
714     "archive_date_contradictoire",
715     "archive_date_retour_contradictoire",
716     "archive_date_ait",
717     "archive_date_transmission_parquet",
718     "archive_dossier_instruction_type",
719     "archive_date_affichage",
720 softime 10573 "pec_metier",
721     "archive_pec_metier",
722     "archive_a_qualifier",
723     "id_parapheur_signature",
724     "statut_signature",
725     "commentaire_signature",
726     "historique_signature",
727 softime 10808 "'' as suivi_notification",
728 softime 11585 "'' as suivi_notification_service",
729     "'' as suivi_notification_tiers",
730 softime 12654 "'' as suivi_notification_commune",
731 softime 10573
732     "'' as preview_edition",
733 softime 11418 "envoye_cl_platau",
734 softime 15037 "'' as log_instruction",
735     "parapheur_lien_page_signature"
736 softime 8989 );
737     }
738    
739     /**
740 softime 8593 * CONDITION - is_edition_integrale_enabled
741     *
742     * Vérifie que la rédaction libre est activée sur l'instruction en cours.
743     *
744     * @return boolean
745     */
746     function is_edition_integrale_enabled() {
747     if ($this->getVal("flag_edition_integrale") == 't') {
748     return true;
749     }
750     return false;
751     }
752 mbroquet 3730
753     /**
754 softime 8593 * CONDITION - is_edition_integrale_not_enabled
755     *
756     * Vérifie que la rédaction libre est désactivée sur l'instruction en cours.
757     *
758     * @return boolean
759     */
760     function is_edition_integrale_not_enabled() {
761     return !$this->is_edition_integrale_enabled();
762     }
763    
764     /**
765     * CONDITION - is_option_redaction_libre_enabled
766     *
767     * Vérifie que l'option de rédaction libre est activée.
768     *
769     * @return boolean
770     */
771     function is_option_redaction_libre_enabled() {
772     $collectivite_di = $this->get_dossier_instruction_om_collectivite();
773     return $this->f->is_option_redaction_libre_enabled($collectivite_di);
774     }
775    
776     /**
777 softime 10713 * CONDITION - is_option_parapheur_relecture_enabled
778     *
779     * Vérifie que l'option de relecture lors de l'envoi en signature est activée.
780     *
781     * @return boolean
782     */
783 softime 10808 function is_parapheur_relecture_parameter_enabled() {
784     //Instanciation de la classe electronicsignature
785     $inst_es = $this->get_electronicsignature_instance();
786     if ($inst_es === false) {
787     return false;
788     }
789    
790     if ($inst_es->get_conf('is_forced_view_files') !== 'true' && $inst_es->get_conf('is_forced_view_files') !== true) {
791     return false;
792     }
793    
794     return true;
795 softime 10713 }
796    
797 softime 11876 /**
798     * CONDITION - is_parapheur_annulation_parameter_enabled
799     *
800     * Vérifie que l'option d'annulation de l'envoi en signature est activée.
801     *
802     * @return boolean
803     */
804     function is_parapheur_annulation_parameter_enabled() {
805     //Instanciation de la classe electronicsignature
806     $inst_es = $this->get_electronicsignature_instance();
807     if ($inst_es === false) {
808     return false;
809     }
810 softime 10713
811 softime 11876 if ($inst_es->get_conf('cancel_send') !== 'true' && $inst_es->get_conf('cancel_send') !== true) {
812     return false;
813     }
814    
815     return true;
816     }
817    
818    
819 softime 10713 /**
820 softime 10573 * CONDITION - is_sent_for_signature
821     *
822     * Vérifie que l'instruction a été envoyé à signature
823     *
824     * @return boolean
825     */
826     function is_sent_for_signature() {
827     // Si un parapheur a été configuré
828     // et que le champ id_parapheur_signature n'est pas vide
829     // que le status est différent de "canceled" ou "expired"
830     // alors l'évènement a été envoyé en signature
831     if ($this->has_connector_electronicsignature() === true
832     && empty($this->getVal("id_parapheur_signature")) === false
833     && ($this->getVal("statut_signature") != "canceled"
834 softime 12124 && $this->getVal("statut_signature") != "expired"
835     && $this->getVal("statut_signature") != "finished")) {
836 softime 10573 //
837     return true;
838     }
839    
840     return false;
841     }
842    
843     /**
844     * CONDITION - is_not_sent_for_signature
845     *
846     * Vérifie que l'instruction n'a pas été envoyé à signature
847     *
848     * @return boolean
849     */
850     function is_not_sent_for_signature() {
851 softime 10968 // Contrôle si l'utilisateur possède un bypass
852     $bypass = $this->f->isAccredited($this->get_absolute_class_name()."_definaliser_bypass");
853     if ($bypass == true) {
854     return true;
855     }
856    
857 softime 10573 return !$this->is_sent_for_signature();
858     }
859    
860    
861     /**
862     * CONDITION - is_signed
863     *
864     * Vérifie que l'instruction a été signé
865     *
866     * @return boolean
867     */
868     function is_signed() {
869     // Si un parapheur a été configuré
870     // et que le champ id_parapheur_signature n'est pas vide
871     // et que le statut est égal à "finished"
872     // alors le document de l'instruciton à été signé
873     if ($this->has_connector_electronicsignature() === true
874     && empty($this->getVal("id_parapheur_signature")) === false
875     && $this->getVal("statut_signature") == "finished") {
876     //
877     return true;
878     }
879    
880     return false;
881     }
882    
883 softime 15973 /**
884     * CONDITION - is_signed
885     *
886     * Vérifie que l'instruction n'a pas été signée
887     *
888     * @return boolean
889     */
890     function is_not_signed() {
891     // Contrôle si l'utilisateur possède un bypass
892     $bypass = $this->f->isAccredited($this->get_absolute_class_name()."_definaliser_apres_signature");
893     if ($bypass == true) {
894     return true;
895     }
896 softime 11876
897 softime 15973 return !$this->is_signed();
898     }
899    
900    
901 softime 12433 /**
902     * is_sent_to_cl
903     *
904     * Vérifie que l'instruction a été envoyé au contrôle de légalité
905     *
906     * @return boolean
907     */
908 softime 11418 function is_sent_to_cl() {
909 softime 12433 // Si la case à cocher de l'instruction envoye_cl_platau est à "t"
910     if ($this->getVal('envoye_cl_platau') === 't') {
911     //
912     return true;
913 softime 11418 }
914     //
915     return false;
916     }
917    
918 softime 10808 /**
919     * CONDITION - is_portail_notification
920     *
921     * Vérifie si la notification est une notification de catégorie portail
922     *
923     * @return boolean
924     */
925 softime 10869 function is_portail_notification_sans_annexe() {
926 softime 10808 $collectiviteDi = $this->get_dossier_instruction_om_collectivite();
927 softime 10869 $ev = $this->get_inst_evenement($this->getVal('evenement'));
928 softime 14064 if ($this->f->get_param_option_notification($collectiviteDi) === PORTAL
929 softime 10869 && $ev->getVal('notification') != 'notification_manuelle_annexe'
930     && $ev->getVal('notification') != 'notification_manuelle_annexe_signature_requise'
931     ) {
932 softime 10808 return true;
933     }
934     return false;
935     }
936 softime 10573
937     /**
938 softime 10808 * CONDITION - is_not_portail_notification
939     *
940     * Vérifie si la notification n'est pas une notification de catégorie portail
941     *
942     * @return boolean
943     */
944 softime 10869 function is_not_portail_notification_sans_annexe() {
945     return (! $this->is_portail_notification_sans_annexe());
946 softime 10808 }
947    
948     /**
949 softime 10573 * CONDITION - can_be_signed
950     *
951     * Vérifie que le document de l'instruction peut être envoyé au parapheur pour signature
952     *
953     * @return boolean
954     */
955     function can_be_signed() {
956     // Instanciation de l'objet signataire_arrete
957     $inst_signataire_arrete = $this->f->get_inst__om_dbform(array(
958     "obj" => "signataire_arrete",
959     "idx" => $this->getVal("signataire_arrete"),
960     ));
961     // Si un parapheur a été configuré, que le document est finalisé, que le signataire
962     // possède une adresse email, on vérifie le champ id_parapheur_signature
963     // S'il est vide l'évènement peut être envoyé en signature
964     // S'il ne l'est pas, alors on vérifie le champ statut_signature
965     // Si la valeur de ce champ est égal à "canceled" ou "expired"
966     // alors l'évènement peut être envoyé en signature
967     if ($this->has_connector_electronicsignature() === true
968     && $this->getVal("om_final_instruction") == 't'
969     && empty($inst_signataire_arrete->getVal('email')) === false) {
970     //
971     if (empty($this->getVal("id_parapheur_signature")) === true
972     || $this->getVal("statut_signature") == "canceled"
973     || $this->getVal("statut_signature") == "expired") {
974     //
975     return true;
976     }
977     }
978    
979     $this->addToLog(__METHOD__."() has_connector_electronicsignature: ".var_export($this->has_connector_electronicsignature(), true), EXTRA_VERBOSE_MODE);
980     $this->addToLog(__METHOD__."() om_final_instruction: ".var_export($this->getVal("om_final_instruction"), true), EXTRA_VERBOSE_MODE);
981     $this->addToLog(__METHOD__."() email: ".var_export($inst_signataire_arrete->getVal('email'), true), EXTRA_VERBOSE_MODE);
982     $this->addToLog(__METHOD__."() id_parapheur_signature: ".var_export($this->getVal("id_parapheur_signature"), true), EXTRA_VERBOSE_MODE);
983     $this->addToLog(__METHOD__."() statut_signature: ".var_export($this->getVal("statut_signature"), true), EXTRA_VERBOSE_MODE);
984    
985     return false;
986     }
987    
988     /**
989     * CONDITION - has_connector_electronicsignature
990     *
991     * Vérifie qu'un parapheur est paramétré
992     *
993     * @return boolean
994     */
995     function has_connector_electronicsignature() {
996     $inst_es = $this->get_electronicsignature_instance(false);
997     if ($inst_es === false) {
998     return false;
999     }
1000     return true;
1001     }
1002    
1003     /**
1004     * CONDITION - can_display_parapheur
1005     *
1006     * Vérifie que le fieldset "Suivi Parapheur" soit affichable
1007     *
1008     * @return boolean
1009     */
1010     function can_display_parapheur() {
1011     $evenement_id = $this->getVal("evenement");
1012     $inst_evenement = $this->get_inst_evenement($evenement_id);
1013     if ($this->has_connector_electronicsignature() === true
1014     && $inst_evenement->getVal('lettretype') !== ''
1015     && $inst_evenement->getVal('lettretype') !== null
1016     && (empty($this->getVal("id_parapheur_signature")) === false
1017     || empty($this->getVal("historique_signature")) === false)) {
1018     //
1019     return true;
1020     }
1021    
1022     return false;
1023     }
1024    
1025     /**
1026 softime 10808 * CONDITION - can_display_notification
1027     *
1028 softime 11585 * Vérifie que le champs "Suivi notification" est affichable
1029 softime 10808 *
1030     * @return boolean
1031     */
1032 softime 11585 function can_display_notification_demandeur() {
1033 softime 10808 // Le suivi des notification est affiché si l'événement est notifiable
1034     // et si des notifications ont été envoyées
1035     $evenement_id = $this->getVal("evenement");
1036     $inst_evenement = $this->get_inst_evenement($evenement_id);
1037     if ($inst_evenement->getVal('notification') != null &&
1038     $inst_evenement->getVal('notification') != '') {
1039     // Des notifications ont été envoyé si il existe au moins une notification
1040     // liées à l'instruction
1041 softime 11585 $idsNotifs = $this->get_instruction_notification(
1042     $this->getVal($this->clePrimaire),
1043     array(
1044     'notification_recepisse',
1045     'notification_instruction',
1046     'notification_decision',
1047 softime 12124 ),
1048     true
1049 softime 11585 );
1050 softime 10808 if (isset($idsNotifs) && $idsNotifs !== array()) {
1051     return true;
1052     }
1053     }
1054     return false;
1055     }
1056    
1057     /**
1058 softime 11585 * CONDITION - can_display_notification
1059     *
1060     * Vérifie que le champs "suivi_notification_service" est affichable
1061     *
1062     * @return boolean
1063     */
1064     function can_display_notification_service() {
1065     // Le suivi des notification est affiché si l'événement est notifiable
1066     // et si des notifications ont été envoyées
1067     $evenement_id = $this->getVal("evenement");
1068     $inst_evenement = $this->get_inst_evenement($evenement_id);
1069     if ($this->get_boolean_from_pgsql_value($inst_evenement->getVal('notification_service')) == true) {
1070     // Des notifications ont été envoyé si il existe au moins une notification
1071     // de type notification_service_consulte liées à l'instruction
1072     $idsNotifs = $this->get_instruction_notification(
1073     $this->getVal($this->clePrimaire),
1074     'notification_service_consulte'
1075     );
1076     if (isset($idsNotifs) && $idsNotifs !== array()) {
1077     return true;
1078     }
1079     }
1080     return false;
1081     }
1082    
1083    
1084     /**
1085     * CONDITION - can_display_notification_tiers
1086     *
1087     * Vérifie que le champs "suivi_notification_tiers" est affichable
1088     *
1089     * @return boolean
1090     */
1091     function can_display_notification_tiers() {
1092     // Le suivi des notification est affiché si l'événement est notifiable
1093     // et si des notifications ont été envoyées
1094     $evenement_id = $this->getVal("evenement");
1095     $inst_evenement = $this->get_inst_evenement($evenement_id);
1096 softime 13137 if (! empty($inst_evenement->getVal('notification_tiers'))) {
1097 softime 11585 // Des notifications ont été envoyé si il existe au moins une notification
1098     // de type notification_tiers_consulte liées à l'instruction
1099     $idsNotifs = $this->get_instruction_notification(
1100     $this->getVal($this->clePrimaire),
1101     'notification_tiers_consulte'
1102     );
1103     if (isset($idsNotifs) && $idsNotifs !== array()) {
1104     return true;
1105     }
1106     }
1107     return false;
1108     }
1109    
1110     /**
1111 softime 12654 * CONDITION - can_display_notification_commune
1112     *
1113     * Vérifie que le champs "suivi_notification_commune" est affichable
1114     *
1115     * @return boolean
1116     */
1117     function can_display_notification_commune() {
1118     // Le suivi des notification si il existe au moins une notification
1119     // de type notification_depot_demat liées à l'instruction
1120     $idsNotifs = $this->get_instruction_notification(
1121     $this->getVal($this->clePrimaire),
1122     array('notification_depot_demat', 'notification_commune')
1123     );
1124     if (isset($idsNotifs) && $idsNotifs !== array()) {
1125     return true;
1126     }
1127     return false;
1128     }
1129    
1130     /**
1131 softime 8593 * TREATMENT - disable_edition_integrale.
1132     *
1133     * Cette methode permet de passer la consultation en "lu"
1134     *
1135     * @return boolean true si maj effectué false sinon
1136     */
1137     function disable_edition_integrale() {
1138     // Cette méthode permet d'exécuter une routine en début des méthodes
1139     // dites de TREATMENT.
1140     $this->begin_treatment(__METHOD__);
1141     $this->correct = true;
1142     $valF = array(
1143     "flag_edition_integrale" => false,
1144     "titre_om_htmletat" => null,
1145     "corps_om_htmletatex" => null,
1146     );
1147     $res = $this->f->db->autoExecute(
1148     DB_PREFIXE.$this->table,
1149     $valF,
1150     DB_AUTOQUERY_UPDATE,
1151     $this->clePrimaire."=".$this->getVal($this->clePrimaire)
1152     );
1153     if ($this->f->isDatabaseError($res, true)) {
1154     // Appel de la methode de recuperation des erreurs
1155     $this->erreur_db($res->getDebugInfo(), $res->getMessage(), '');
1156     $this->correct = false;
1157     // Termine le traitement
1158     return $this->end_treatment(__METHOD__, false);
1159     } else {
1160     $this->addToMessage(_("Rédaction par compléments activé."));
1161     return $this->end_treatment(__METHOD__, true);
1162     }
1163    
1164     // Termine le traitement
1165     return $this->end_treatment(__METHOD__, false);
1166     }
1167    
1168     /**
1169     * TREATMENT - enable_edition_integrale.
1170     *
1171     * Cette methode permet de passer la consultation en "lu"
1172     *
1173     * @return boolean true si maj effectué false sinon
1174     */
1175     function enable_edition_integrale() {
1176     // Cette méthode permet d'exécuter une routine en début des méthodes
1177     // dites de TREATMENT.
1178     $this->begin_treatment(__METHOD__);
1179     $this->correct = true;
1180    
1181     // Récupère la collectivite du dossier d'instruction
1182     $dossier_instruction_om_collectivite = $this->get_dossier_instruction_om_collectivite();
1183     $collectivite = $this->f->getCollectivite($dossier_instruction_om_collectivite);
1184     //
1185     $params = array(
1186     "specific" => array(
1187     "corps" => array(
1188     "mode" => "get",
1189     )
1190     ),
1191     );
1192     $result = $this->compute_pdf_output('lettretype', $this->getVal('lettretype'), $collectivite, null, $params);
1193     $corps = $result['pdf_output'];
1194     //
1195     $params = array(
1196     "specific" => array(
1197     "titre" => array(
1198     "mode" => "get",
1199     )
1200     ),
1201     );
1202     $result = $this->compute_pdf_output('lettretype', $this->getVal('lettretype'), $collectivite, null, $params);
1203     $titre = $result['pdf_output'];
1204     //
1205     $valF = array(
1206     "flag_edition_integrale" => true,
1207     "titre_om_htmletat" => $titre,
1208     "corps_om_htmletatex" => $corps,
1209     );
1210     $res = $this->f->db->autoExecute(
1211     DB_PREFIXE.$this->table,
1212     $valF,
1213     DB_AUTOQUERY_UPDATE,
1214     $this->clePrimaire."=".$this->getVal($this->clePrimaire)
1215     );
1216     if ($this->f->isDatabaseError($res, true)) {
1217     // Appel de la methode de recuperation des erreurs
1218     $this->erreur_db($res->getDebugInfo(), $res->getMessage(), '');
1219     $this->correct = false;
1220     // Termine le traitement
1221     return $this->end_treatment(__METHOD__, false);
1222     } else {
1223     $this->addToMessage(_("Rédaction libre activé."));
1224     return $this->end_treatment(__METHOD__, true);
1225     }
1226    
1227     // Termine le traitement
1228     return $this->end_treatment(__METHOD__, false);
1229     }
1230    
1231     /**
1232 softime 14064 * Cette méthode instancie le dossier à partir de l'identifiant passé
1233     * en paramètre et renvoie l'identifiant du dossier d'autorisation (DA)
1234     * associé au dossier.
1235     * Si l'identifiant du dossier n'est pas fourni alors cette méthode
1236     * renverra NULL
1237     *
1238     * @param string identifiant du dossier
1239     * @return null|string null ou identifiant du DA
1240 mbroquet 3730 */
1241     function getNumDemandeAutorFromDossier($id) {
1242     if (!isset($id)) {
1243     return NULL;
1244     }
1245 softime 14064
1246     $dossier = $this->f->get_inst__om_dbform(array(
1247     'obj' => 'dossier',
1248     'idx' => $id,
1249     ));
1250    
1251     return $dossier->getVal('dossier_autorisation');
1252 mbroquet 3730 }
1253    
1254 softime 14064
1255 mbroquet 3730 function setType(&$form, $maj) {
1256 softime 17542 $data = array('form' => &$form, 'maj' => &$maj);
1257     $this->f->module_manager->run_hooks('setType_pre', $this, $data);
1258    
1259 softime 8593 // Récupération du mode de l'action
1260     $crud = $this->get_action_crud($maj);
1261     // Récupère la collectivité du dossier d'instruction
1262     $collectivite_di = $this->get_dossier_instruction_om_collectivite();
1263 mbroquet 3730
1264 softime 8593 // Cache tous les champs
1265     foreach ($this->champs as $value) {
1266     $form->setType($value, 'hidden');
1267     }
1268 softime 6565
1269 softime 10573 // Les champs historique_signature et statut_signature ne sont pas saisissable dans tous les cas
1270 softime 11228 if ($this->can_display_parapheur() === true && $maj == 3) {
1271 softime 10573 $form->setType('statut_signature', 'selectstatic');
1272     $form->setType('historique_signature', 'jsontotab');
1273     if ($this->getVal('commentaire_signature') == null) {
1274     $form->setType('commentaire_signature', 'hidden');
1275     } else {
1276     $form->setType('commentaire_signature', 'hiddenstatic');
1277     }
1278     }
1279    
1280 softime 11585 // Le champ de suivi des notifications des demandeurs n'est pas affichable dans tous les cas
1281 softime 12654 if ($maj == 3 && $this->can_display_notification_demandeur() === true) {
1282 softime 10808 $form->setType('suivi_notification', 'jsontotab');
1283     }
1284 softime 11585 // Le champ de suivi des notifications des services n'est pas affichable dans tous les cas
1285 softime 12654 if ($maj == 3 && $this->can_display_notification_service() === true) {
1286 softime 11585 $form->setType('suivi_notification_service', 'jsontotab');
1287     }
1288     // Le champ de suivi des notifications des tiers n'est pas affichable dans tous les cas
1289 softime 12654 if ($maj == 3 && $this->can_display_notification_tiers() === true) {
1290 softime 11585 $form->setType('suivi_notification_tiers', 'jsontotab');
1291     }
1292 softime 12654 // Le champ de suivi des notifications des communes n'est pas affichable dans tous les cas
1293     if ($maj == 3 && $this->can_display_notification_commune() === true) {
1294     $form->setType('suivi_notification_commune', 'jsontotab');
1295     }
1296 softime 10808
1297 softime 8593 // MODE AJOUTER
1298     if ($this->getParameter('maj') == 0) {
1299 softime 10573 $form->setType('commentaire', 'textareahidden');
1300     // Si l'option est active passage du champ date en lecture seule
1301     if ($this->f->is_option_date_evenement_instruction_lecture_seule($collectivite_di) === true) {
1302     $form->setType("date_evenement", "hiddenstaticdate");
1303     } else {
1304     $form->setType("date_evenement", "date");
1305     }
1306 softime 8989 if ($this->is_in_context_of_foreign_key("evenement", $this->getParameter("retourformulaire"))) {
1307 softime 8593 $form->setType("evenement", "selecthiddenstatic");
1308     } else {
1309     $form->setType("evenement", "select");
1310     }
1311 softime 8989 if ($this->is_in_context_of_foreign_key("signataire_arrete", $this->getParameter("retourformulaire"))) {
1312 softime 8593 $form->setType("signataire_arrete", "selecthiddenstatic");
1313     } else {
1314     $form->setType("signataire_arrete", "select");
1315     }
1316     if ($this->is_option_redaction_libre_enabled() === true) {
1317     $form->setType("flag_edition_integrale", "select");
1318     }
1319 mbroquet 3730 }
1320    
1321 softime 8593 // MODE MODIFIER
1322     if ($this->getParameter('maj') == 1) {
1323 softime 10573 // Si l'option est active passage du champ date en lecture seule
1324     if ($this->f->is_option_date_evenement_instruction_lecture_seule($collectivite_di) === true) {
1325     $form->setType("date_evenement", "hiddenstaticdate");
1326     } else {
1327     $form->setType("date_evenement", "date");
1328     }
1329 softime 8593 $form->setType("evenement", "selecthiddenstatic");
1330     if ($this->has_an_edition() === true) {
1331     $form->setType('lettretype', 'hiddenstatic');
1332 softime 8989 if ($this->is_in_context_of_foreign_key("signataire_arrete", $this->getParameter("retourformulaire"))) {
1333 softime 8593 $form->setType("signataire_arrete", "selecthiddenstatic");
1334     } else {
1335     $form->setType("signataire_arrete", "select");
1336     }
1337     if ($this->getVal("flag_edition_integrale") == "t") {
1338     $form->setType("titre_om_htmletat", "htmlEtat");
1339     $form->setType("corps_om_htmletatex", "htmlEtatEx");
1340     } else {
1341     $form->setType("complement_om_html", "html");
1342     $form->setType("complement2_om_html", "html");
1343     $form->setType("complement3_om_html", "html");
1344     $form->setType("complement4_om_html", "html");
1345     $form->setType('bible_auto', 'httpclick');
1346     $form->setType('bible', 'httpclick');
1347     $form->setType('bible2', 'httpclick');
1348     $form->setType('bible3', 'httpclick');
1349     $form->setType('bible4', 'httpclick');
1350     }
1351     if ($this->f->is_option_preview_pdf_enabled($collectivite_di) === true) {
1352     //
1353     $form->setType('btn_refresh', 'httpclickbutton');
1354     $form->setType('btn_preview', 'httpclickbutton');
1355     $form->setType('btn_redaction', 'httpclickbutton');
1356 softime 11876 // /!\ le type du champs est utilisé dans un selecteur dans le jscript.js
1357     // pour identifiant le champ de prévisualisation et régler sa taille à
1358     // l'affichage du champ. En cas de modification, le selecteur doit également
1359     // être mis à jour
1360 softime 11418 $form->setType('live_preview', 'previsualiser_pdf');
1361 softime 7521 }
1362 softime 8593
1363 mbroquet 3730 // necessaire pour calcul de date en modification
1364     //$form->setType('delai', 'hiddenstatic');
1365     // les administrateurs technique et fonctionnel peuvent
1366     // modifier tous les champs de date
1367     // si l'instruction a déjà été finalisée au moins une fois
1368 softime 7996 if (($this->f->isAccredited(array($this->get_absolute_class_name(), $this->get_absolute_class_name()."modification_dates"), "OR")
1369 softime 6565 || $this->f->isAccredited(array('instruction', 'instruction_modification_dates'), "OR"))
1370 mbroquet 3730 && $this->getVal("date_finalisation_courrier") != '') {
1371 softime 8593 //
1372 mbroquet 3730 $form->setType('date_envoi_signature', 'date');
1373     $form->setType('date_retour_signature', 'date');
1374 softime 10573 if ($this->is_sent_for_signature() === true
1375     && $this->is_signed() === true) {
1376     //
1377     $form->setType("date_envoi_signature", "datereadonly");
1378     $form->setType("date_retour_signature", "datereadonly");
1379     }
1380 mbroquet 3730 $form->setType('date_envoi_rar', 'date');
1381     $form->setType('date_retour_rar', 'date');
1382     $form->setType('date_envoi_controle_legalite', 'date');
1383 softime 11418 if ($this->is_sent_to_cl() === true) {
1384 softime 12124 $form->setType("date_envoi_controle_legalite", "datedisabled");
1385 softime 11418 }
1386 mbroquet 3730 $form->setType('date_retour_controle_legalite', 'date');
1387     $form->setType('date_finalisation_courrier', 'date');
1388     }
1389     }
1390     }
1391    
1392 softime 10808 // MODE CONSULTER + SUPPRIMER + SUIVI DES DATES 125 + NOTIFICATION MANUELLE
1393 softime 8593 if ($this->getParameter('maj') == 3
1394     || $this->getParameter('maj') == 2
1395 softime 10808 || $this->getParameter('maj') == 125
1396     || $this->getParameter('maj') == 410) {
1397 softime 8593 //
1398     $form->setType("date_evenement", "datestatic");
1399     $form->setType("evenement", "selecthiddenstatic");
1400     if ($this->has_an_edition() === true) {
1401     $form->setType('lettretype', 'hiddenstatic');
1402     $form->setType("signataire_arrete", "selecthiddenstatic");
1403     if ($this->getVal("om_final_instruction") == 't') {
1404     $form->setType('om_final_instruction_utilisateur', 'textareastatic');
1405     } else {
1406     $form->setType('om_final_instruction_utilisateur', 'hidden');
1407     }
1408     }
1409 softime 10573 if ($this->evenement_has_a_commentaire($this->getVal('evenement')) === true ) {
1410     $form->setType('commentaire', 'textareastatic');
1411     }
1412 mbroquet 3730 }
1413    
1414 softime 10808 // MODE CONSULTER + SUPPRIMER + NOTIFICATION MANUELLE
1415     if ($this->getParameter('maj') == 3
1416     || $this->getParameter('maj') == 2
1417     || $this->getParameter('maj') == 410) {
1418 softime 10573 // Si il n'y a pas de lettre type (edition) associé à l'événement
1419     // les dates de suivi ne sont pas affichée
1420 softime 8593 if ($this->has_an_edition() === true) {
1421 softime 10573 $form->setType('date_envoi_signature', 'datestatic');
1422     $form->setType('date_retour_signature', 'datestatic');
1423     $form->setType('date_envoi_rar', 'datestatic');
1424     $form->setType('date_retour_rar', 'datestatic');
1425     $form->setType('date_envoi_controle_legalite', 'datestatic');
1426     $form->setType('date_retour_controle_legalite', 'datestatic');
1427     $form->setType('date_finalisation_courrier', 'datestatic');
1428 softime 8593 if ($this->getVal("flag_edition_integrale") == "t") {
1429     $form->setType("titre_om_htmletat", "htmlstatic");
1430     $form->setType("corps_om_htmletatex", "htmlstatic");
1431     } else {
1432     $form->setType("complement_om_html", "htmlstatic");
1433     $form->setType("complement2_om_html", "htmlstatic");
1434     $form->setType("complement3_om_html", "htmlstatic");
1435     $form->setType("complement4_om_html", "htmlstatic");
1436     }
1437 mbroquet 3730 }
1438     }
1439 softime 8593
1440     // MODE SUIVI DES DATES 125
1441     if ($this->getParameter('maj') == 125) {
1442     $form->setType("date_evenement", "hiddenstaticdate");
1443     $form->setType('om_final_instruction_utilisateur', 'hiddenstatic');
1444     $form->setType('date_envoi_signature', 'date');
1445     $form->setType('date_retour_signature', 'date');
1446 softime 10573 if ($this->is_sent_for_signature() === true
1447     || $this->is_signed() === true) {
1448     //
1449     $form->setType("date_envoi_signature", "datereadonly");
1450     $form->setType("date_retour_signature", "datereadonly");
1451     }
1452 softime 8593 $form->setType('date_envoi_rar', 'date');
1453     $form->setType('date_retour_rar', 'date');
1454     $form->setType('date_envoi_controle_legalite', 'date');
1455 softime 11418 if ($this->is_sent_to_cl() === true) {
1456 softime 12124 $form->setType("date_envoi_controle_legalite", "datedisabled");
1457 softime 11418 }
1458 softime 8593 $form->setType('date_retour_controle_legalite', 'date');
1459     $form->setType('date_finalisation_courrier', 'date');
1460     }
1461 softime 10573
1462     if ($maj == 401) {
1463     foreach ($this->champs as $champ) {
1464     $form->setType($champ, 'hidden');
1465     }
1466 softime 11418 $form->setType('preview_edition', 'previsualiser');
1467 softime 10573 }
1468 softime 12124
1469     // Si l'instruction a été envoyé au contrôle de légalité et que la
1470     // tâche envoi_cl lié n'a pas encore été traité il faut indiquer à
1471     // l'utilisateur que l'envoi au cl est en cours de traitement.
1472     if ($this->is_sent_to_cl() === true
1473     && empty($this->getVal('date_envoi_controle_legalite'))
1474     && $maj == 3) {
1475     $form->setType("date_envoi_controle_legalite", "hiddenstatic");
1476     }
1477 softime 17542 $data = array('form' => &$form, 'maj' => &$maj);
1478     $this->f->module_manager->run_hooks('setType_post', $this, $data);
1479 mbroquet 3730 }
1480    
1481 softime 8593 function setOnchange(&$form,$maj){
1482 softime 17542 $this->f->log(__METHOD__, 'BEGIN');
1483     $data = array('form' => &$form, 'maj' => &$maj);
1484     $this->f->module_manager->run_hooks('setOnchange_pre', $this, $data);
1485    
1486 softime 8593 parent::setOnchange($form,$maj);
1487    
1488     // MODE AJOUTER
1489     if ($this->getParameter('maj') == 0) {
1490 softime 10573 $form->setOnchange(
1491     "evenement",
1492     "manage_instruction_evenement_lettretype(this.value, '".addslashes($this->getParameter('idxformulaire'))."');
1493     manage_instruction_evenement_commentaire(this.value, '".addslashes($this->getParameter('idxformulaire'))."');"
1494     );
1495 softime 8593 }
1496 softime 17542
1497     $data = array('form' => &$form, 'maj' => &$maj);
1498     $this->f->module_manager->run_hooks('setOnchange_post', $this, $data);
1499     $this->f->log(__METHOD__, 'END');
1500 softime 8593 }
1501    
1502     function evenement_has_an_edition($evenement_id) {
1503     $evenement = $this->get_inst_evenement($evenement_id);
1504     $lettretype = $evenement->getVal('lettretype');
1505     if ($lettretype !== '' && $lettretype !== null) {
1506     return true;
1507     }
1508     return false;
1509     }
1510    
1511     function view_evenement_has_an_edition_json() {
1512     $json_return = array(
1513     "lettretype" => $this->evenement_has_an_edition($this->f->get_submitted_get_value('evenement_id')),
1514     "option_redaction_libre_enabled" => $this->is_option_redaction_libre_enabled(),
1515     );
1516     echo json_encode($json_return);
1517     }
1518    
1519 softime 10573 function evenement_has_a_commentaire($evenement_id) {
1520     $evenement = $this->get_inst_evenement($evenement_id);
1521     return $this->get_boolean_from_pgsql_value($evenement->getVal('commentaire'));
1522     }
1523    
1524     function view_evenement_has_a_commentaire_json() {
1525     $json_return = array(
1526     "commentaire" => $this->evenement_has_a_commentaire($this->f->get_submitted_get_value('evenement_id'))
1527     );
1528     echo json_encode($json_return);
1529     }
1530    
1531 softime 11418
1532 softime 8989 /**
1533 softime 11418 * CONDITION - can_be_sended_to_cl
1534 softime 8989 *
1535 softime 11418 * Vérifie que le contrôle de légalité est disponible
1536     *
1537     * @return boolean
1538     */
1539     function can_be_sended_to_cl() {
1540     // Si l'instruction a une édition
1541     // et que l'événement est paramétré pour envoyer le contrôle de légalité
1542     // par Plat'AU
1543     // et que la date de retour signature est renseignée
1544     // et que la date d'envoi au contrôle légalité n'est pas renseignée
1545     // et qu'il n'existe pas de task envoi_CL en cours (!= done ou canceled)
1546     if ($this->has_an_edition() === true) {
1547     $inst_di = $this->get_inst_dossier($this->getVal('dossier'));
1548     $inst_evenement = $this->get_inst_evenement($this->getVal('evenement'));
1549     if ($inst_evenement->getVal('envoi_cl_platau') === 't'
1550     && empty($this->getVal('date_retour_signature')) === false
1551     && empty($this->getVal('date_envoi_controle_legalite')) === true
1552     && $this->getVal('envoye_cl_platau') === 'f'
1553     && $this->f->is_type_dossier_platau($inst_di->getVal('dossier_autorisation')) === true
1554     && $inst_di->getVal('etat_transmission_platau') !== 'jamais_transmissible') {
1555     //
1556     return true;
1557     }
1558     }
1559     //
1560     return false;
1561     }
1562    
1563     /**
1564     *
1565 softime 8989 * @return string
1566     */
1567     function get_var_sql_forminc__sql_signataire_arrete() {
1568 softime 11585 return sprintf(
1569     "SELECT
1570     signataire_arrete.signataire_arrete,
1571     CONCAT_WS(
1572     ' - ',
1573     CONCAT_WS(' ', signataire_arrete.prenom, signataire_arrete.nom),
1574     signataire_habilitation.libelle,
1575     signataire_arrete.description
1576     )
1577     FROM
1578     %1\$ssignataire_arrete
1579     LEFT JOIN %1\$ssignataire_habilitation
1580     ON signataire_arrete.signataire_habilitation = signataire_habilitation.signataire_habilitation
1581     WHERE
1582     ((signataire_arrete.om_validite_debut IS NULL
1583     AND (signataire_arrete.om_validite_fin IS NULL
1584     OR signataire_arrete.om_validite_fin > CURRENT_DATE))
1585     OR (signataire_arrete.om_validite_debut <= CURRENT_DATE
1586     AND (signataire_arrete.om_validite_fin IS NULL
1587     OR signataire_arrete.om_validite_fin > CURRENT_DATE)))
1588     ORDER BY
1589     signataire_arrete.prenom,
1590     signataire_arrete.nom",
1591     DB_PREFIXE
1592     );
1593 softime 8989 }
1594    
1595     /**
1596     *
1597     * @return string
1598     */
1599     function get_var_sql_forminc__sql_signataire_arrete_by_id() {
1600 softime 11585 return sprintf(
1601     "SELECT
1602     signataire_arrete.signataire_arrete,
1603     CONCAT_WS(
1604     ' - ',
1605     CONCAT_WS(' ', signataire_arrete.prenom, signataire_arrete.nom),
1606     signataire_habilitation.libelle,
1607     signataire_arrete.description
1608     )
1609     FROM
1610     %1\$ssignataire_arrete
1611     LEFT JOIN %1\$ssignataire_habilitation
1612     ON signataire_arrete.signataire_habilitation = signataire_habilitation.signataire_habilitation
1613     WHERE
1614     signataire_arrete.signataire_arrete = <idx>",
1615     DB_PREFIXE
1616     );
1617 softime 8989 }
1618    
1619     /**
1620     *
1621     * @return string
1622     */
1623     function get_var_sql_forminc__sql_signataire_arrete_by_di() {
1624 softime 11585 return sprintf(
1625     "SELECT
1626     signataire_arrete.signataire_arrete,
1627     CONCAT_WS(
1628     ' - ',
1629     CONCAT_WS(' ', signataire_arrete.prenom, signataire_arrete.nom),
1630     signataire_habilitation.libelle,
1631     signataire_arrete.description
1632     )
1633     FROM
1634     %1\$ssignataire_arrete
1635     LEFT JOIN %1\$som_collectivite
1636     ON signataire_arrete.om_collectivite = om_collectivite.om_collectivite
1637     LEFT JOIN %1\$ssignataire_habilitation
1638     ON signataire_arrete.signataire_habilitation = signataire_habilitation.signataire_habilitation
1639     WHERE
1640     ((signataire_arrete.om_validite_debut IS NULL
1641     AND (signataire_arrete.om_validite_fin IS NULL
1642     OR signataire_arrete.om_validite_fin > CURRENT_DATE))
1643     OR (signataire_arrete.om_validite_debut <= CURRENT_DATE
1644     AND (signataire_arrete.om_validite_fin IS NULL
1645     OR signataire_arrete.om_validite_fin > CURRENT_DATE)))
1646     AND (om_collectivite.niveau = '2'
1647     OR signataire_arrete.om_collectivite = <collectivite_di>)
1648     ORDER BY
1649     signataire_arrete.prenom, signataire_arrete.nom",
1650     DB_PREFIXE
1651     );
1652 softime 8989 }
1653    
1654     /**
1655     *
1656     * @return string
1657     */
1658     function get_var_sql_forminc__sql_signataire_arrete_defaut() {
1659 softime 11585 return sprintf(
1660     "SELECT
1661     signataire_arrete.signataire_arrete,
1662     CONCAT_WS(
1663     ' - ',
1664     CONCAT_WS(' ', signataire_arrete.prenom, signataire_arrete.nom),
1665     signataire_habilitation.libelle,
1666     signataire_arrete.description
1667     )
1668     FROM
1669     %1\$ssignataire_arrete
1670     LEFT JOIN %1\$ssignataire_habilitation
1671     ON signataire_arrete.signataire_habilitation = signataire_habilitation.signataire_habilitation
1672     WHERE
1673     ((signataire_arrete.om_validite_debut IS NULL
1674     AND (signataire_arrete.om_validite_fin IS NULL
1675     OR signataire_arrete.om_validite_fin > CURRENT_DATE))
1676     OR (signataire_arrete.om_validite_debut <= CURRENT_DATE
1677     AND (signataire_arrete.om_validite_fin IS NULL
1678     OR signataire_arrete.om_validite_fin > CURRENT_DATE)))
1679     AND signataire_arrete.defaut IS TRUE
1680     ORDER BY
1681     signataire_arrete.prenom, signataire_arrete.nom",
1682     DB_PREFIXE
1683     );
1684 softime 8989 }
1685    
1686     /**
1687     *
1688     * @return string
1689     */
1690     function get_var_sql_forminc__sql_signataire_arrete_defaut_by_di() {
1691 softime 11585 return sprintf(
1692     "SELECT
1693     signataire_arrete.signataire_arrete,
1694     CONCAT_WS(
1695     ' - ',
1696     CONCAT_WS(' ', signataire_arrete.prenom, signataire_arrete.nom),
1697     signataire_habilitation.libelle,
1698     signataire_arrete.description
1699     )
1700     FROM
1701     %1\$ssignataire_arrete
1702     LEFT JOIN %1\$ssignataire_habilitation
1703     ON signataire_arrete.signataire_habilitation = signataire_habilitation.signataire_habilitation
1704     LEFT JOIN %1\$som_collectivite
1705     ON signataire_arrete.om_collectivite = om_collectivite.om_collectivite
1706     WHERE
1707     ((signataire_arrete.om_validite_debut IS NULL
1708     AND (signataire_arrete.om_validite_fin IS NULL
1709     OR signataire_arrete.om_validite_fin > CURRENT_DATE))
1710     OR (signataire_arrete.om_validite_debut <= CURRENT_DATE
1711     AND (signataire_arrete.om_validite_fin IS NULL
1712     OR signataire_arrete.om_validite_fin > CURRENT_DATE)))
1713     AND signataire_arrete.defaut IS TRUE
1714     AND (om_collectivite.niveau = '2'
1715     OR signataire_arrete.om_collectivite = <collectivite_di>)
1716     ORDER BY
1717     signataire_arrete.prenom,
1718     signataire_arrete.nom",
1719     DB_PREFIXE
1720     );
1721 softime 8989 }
1722    
1723     /**
1724 softime 14542 * Renvoie sous la forme d'un tableau la liste des événements pouvant être ajoutés au dossier
1725     * dont l'identifiant a été passé en paramètre dans l'url.
1726     *
1727     * @return array
1728     */
1729     function get_var_sql_forminc__sql_evenement() {
1730     // Récupération du numéro de dossier
1731 softime 17542 $dossier = $this->getParameter("idxformulaire") ?? $_GET['idxformulaire'];
1732     $this->f->log(__METHOD__, 'dossier: '.var_export($dossier, true));
1733 softime 14542 // Si changement de décision par instructeur commune
1734     $filter = '';
1735     if ($this->f->isUserInstructeur() === true
1736 softime 17542 // TODO faire autrement car ça instancier le dossier et donc charge ses modules !
1737 softime 14542 && $this->getDivisionFromDossier($dossier) != $_SESSION["division"]
1738     && $this->isInstrCanChangeDecision($dossier) === true) {
1739     $filter = "AND evenement.type IN ('arrete', 'changement_decision')";
1740     }
1741     // Récupération du libellé, de l'identifiant des évènement et d'un booléen permettant
1742     // de déterminer si il s'agit d'évènements suggérés.
1743     $qres = $this->f->get_all_results_from_db_query(
1744     sprintf(
1745     'SELECT
1746     DISTINCT(evenement.evenement),
1747     evenement.libelle,
1748     -- Si l evenement est suggérés alors il sera lié à la table des événements suggérés du dossier
1749     CASE WHEN evenement_suggere_dossier.evenement IS NULL
1750     THEN FALSE
1751     ELSE TRUE
1752     END AS is_suggested
1753     FROM
1754     -- Jointures permettant de récupérer la liste des évènements compatibles avec le dossier
1755     -- selon le type de dossier et l état du dossier.
1756     %1$sevenement
1757     JOIN %1$slien_dossier_instruction_type_evenement
1758     ON evenement.evenement = lien_dossier_instruction_type_evenement.evenement
1759     JOIN %1$stransition
1760     ON evenement.evenement = transition.evenement
1761     JOIN %1$sdossier
1762     ON lien_dossier_instruction_type_evenement.dossier_instruction_type = dossier.dossier_instruction_type
1763     AND transition.etat = dossier.etat
1764     -- Jointures avec une sous requêtes servant à récupérer la liste des évènements suggérés du dossier.
1765     LEFT JOIN (
1766     SELECT
1767     lien_sig_contrainte_evenement.evenement,
1768     dossier.dossier
1769     FROM
1770     %1$slien_sig_contrainte_evenement
1771     JOIN %1$ssig_contrainte
1772     ON lien_sig_contrainte_evenement.sig_contrainte = sig_contrainte.sig_contrainte
1773     JOIN %1$slien_sig_contrainte_dossier_instruction_type
1774     ON sig_contrainte.sig_contrainte = lien_sig_contrainte_dossier_instruction_type.sig_contrainte
1775     JOIN %1$slien_sig_contrainte_om_collectivite
1776     ON sig_contrainte.sig_contrainte = lien_sig_contrainte_om_collectivite.sig_contrainte
1777     JOIN %1$scontrainte
1778     ON sig_contrainte.libelle = contrainte.libelle
1779     JOIN %1$sdossier_contrainte
1780     ON contrainte.contrainte = dossier_contrainte.contrainte
1781     JOIN %1$sdossier
1782     ON dossier_contrainte.dossier = dossier.dossier
1783     AND lien_sig_contrainte_dossier_instruction_type.dossier_instruction_type = dossier.dossier_instruction_type
1784     JOIN %1$som_collectivite
1785     ON lien_sig_contrainte_om_collectivite.om_collectivite = om_collectivite.om_collectivite
1786     AND (dossier.om_collectivite = om_collectivite.om_collectivite
1787     OR om_collectivite.niveau = \'2\')
1788     ) AS evenement_suggere_dossier
1789     ON evenement.evenement = evenement_suggere_dossier.evenement
1790     AND dossier.dossier = evenement_suggere_dossier.dossier
1791     WHERE
1792     dossier.dossier = \'%2$s\'
1793     %3$s
1794     ORDER BY
1795     is_suggested DESC,
1796     evenement.libelle',
1797     DB_PREFIXE,
1798     $this->f->db->escapeSimple($dossier),
1799     $filter
1800     ),
1801     array(
1802     "origin" => __METHOD__
1803     )
1804     );
1805     return $qres['result'];
1806     }
1807    
1808     /**
1809     * Récupère un tableau contenant des évènements de la forme :
1810     * $events = array(
1811     * 1 => array(
1812     * 'libelle' => 'evenement_libelle',
1813     * 'evenement' => 'identifiant_evenement',
1814     * 'is_suggested' => true/false -> booleen indiquant si c'est un événement suggéré
1815     * ))
1816     * Et le transforme pour pouvoir l'utiliser pour le remplissage d'un select de formulaire.
1817     *
1818     * Le format de sorti est le suivant :
1819     * $select = array(
1820     * 0 => array( -> liste des id des événements
1821     * '0' => '',
1822     * '1' => array(
1823     * '0' => array(), -> liste des id des événements suggérés
1824     * '1' => array(), -> liste des libelles des événements suggérés
1825     * ),
1826     * ...,
1827     * n => 'id_evenement_n'
1828     * ),
1829     * 1 => array(
1830     * '0' => '__('choisir')." ".__('evenement')',
1831     * '1' => '💡 Suggestions',
1832     * ...,
1833     * 'n' => 'libelle_evenement_n',
1834     * )
1835     * )
1836     *
1837     * @param array tableau des événements
1838     * @return array
1839     */
1840     protected function convert_events_array_to_select_format($events) {
1841     // Remplissage du tableau du select en incluant le groupe des instructions suggérées.
1842     $contenu = array(
1843     0 => array("",),
1844     1 => array(__('choisir')." ".__('evenement'),)
1845     );
1846    
1847     if (! empty($events)) {
1848     // S'il y a des évènements suggérés extraction de ces événements et mise en place du groupe
1849     $suggested_event_group = array_filter($events, function($a) {
1850     return $a['is_suggested'] === 't';
1851     });
1852     if (! empty($suggested_event_group)) {
1853     // Prépare les données qui permettront d'afficher le groupe des événements
1854     // suggérés.
1855     $values = array();
1856     $labels = array();
1857     foreach ($suggested_event_group as $index => $suggested_event) {
1858     $values[] = $suggested_event['evenement'];
1859     $labels[] = $suggested_event['libelle'];
1860     // Supprime les évènements suggérés de la liste des évènements
1861     unset($events[$index]);
1862     }
1863     // Remplissage du select pour le groupe
1864     $contenu[0][] = array($values, $labels);
1865     $contenu[1][] = __('💡 Suggestions');
1866     }
1867    
1868     // Remplissage du select
1869     foreach ($events as $event) {
1870     $contenu[0][] = $event['evenement'];
1871     $contenu[1][] = $event['libelle'];
1872     }
1873     }
1874     return $contenu;
1875     }
1876    
1877     /**
1878 softime 8989 * SETTER_FORM - setSelect.
1879     *
1880     * @return void
1881     */
1882     function setSelect(&$form, $maj, &$dnu1 = null, $dnu2 = null) {
1883     //parent::setSelect($form, $maj);
1884 mbroquet 3730 /**
1885     * On ne surcharge pas la méthode parent car une requête sur la table
1886     * dossier est mauvaise pour les performances, car la requête qui
1887     * concerne evenement est plus complexe que celle générée et car les
1888     * champs action, avis_decision et etat ne sont pas utilisés comme des
1889     * select
1890     */
1891     //// action
1892 softime 8989 //$this->init_select($form, $this->f->db, $maj, null, "action",
1893 mbroquet 3730 // $sql_action, $sql_action_by_id, false);
1894    
1895     //// avis_decision
1896 softime 8989 //$this->init_select($form, $this->f->db, $maj, null, "avis_decision",
1897 mbroquet 3730 // $sql_avis_decision, $sql_avis_decision_by_id, false);
1898    
1899     //// dossier
1900 softime 8989 //$this->init_select($form, $this->f->db, $maj, null, "dossier",
1901 mbroquet 3730 // $sql_dossier, $sql_dossier_by_id, false);
1902    
1903     //// etat
1904 softime 8989 //$this->init_select($form, $this->f->db, $maj, null, "etat",
1905 mbroquet 3730 // $sql_etat, $sql_etat_by_id, false);
1906    
1907     //// evenement
1908 softime 8989 //$this->init_select($form, $this->f->db, $maj, null, "evenement",
1909 mbroquet 3730 // $sql_evenement, $sql_evenement_by_id, false);
1910    
1911     // signataire_arrete
1912     // si contexte DI
1913     if ($this->getParameter("retourformulaire") == "dossier"
1914 softime 12847 || $this->f->contexte_dossier_instruction()) {
1915 mbroquet 3730 // on recupère les signataires de la multicollectivité et de celle du DI
1916 softime 7996 $di = $this->f->get_inst__om_dbform(array(
1917     "obj" => "dossier_instruction",
1918     "idx" => $this->getParameter('idxformulaire'),
1919     ));
1920 softime 8989 $sql_signataire_arrete_by_di = str_replace(
1921     '<collectivite_di>',
1922     $di->getVal("om_collectivite"),
1923     $this->get_var_sql_forminc__sql("signataire_arrete_by_di")
1924     );
1925     $this->init_select(
1926     $form,
1927     $this->f->db,
1928     $maj,
1929     null,
1930     "signataire_arrete",
1931     $sql_signataire_arrete_by_di,
1932     $this->get_var_sql_forminc__sql("signataire_arrete_by_id"),
1933     true
1934     );
1935 mbroquet 3730 } else {
1936 softime 8989 $this->init_select(
1937     $form,
1938     $this->f->db,
1939     $maj,
1940     null,
1941     "signataire_arrete",
1942     $this->get_var_sql_forminc__sql("signataire_arrete"),
1943     $this->get_var_sql_forminc__sql("signataire_arrete_by_id"),
1944     true
1945     );
1946 mbroquet 3730 }
1947    
1948     /**
1949     * Gestion du filtre sur les événements de workflow disponibles
1950     * On récupère ici en fonction de l'état du dossier d'instruction en
1951     * cours et du type du dossier d'instruction en cours la liste
1952     * événements disponibles.
1953     */
1954     if ($maj == 0) {
1955 softime 14542 $evenements = $this->get_var_sql_forminc__sql_evenement();
1956     $form->setSelect("evenement", $this->convert_events_array_to_select_format($evenements));
1957 mbroquet 3730 } else {
1958 softime 14064 // Instanciation de l'événement pour récupérer son libellé
1959     $evenement = $this->f->get_inst__om_dbform(array(
1960     "obj" => "evenement",
1961     "idx" => $this->getVal("evenement"),
1962     ));
1963    
1964 mbroquet 3730 $contenu = array(
1965     0 => array($this->getVal("evenement"),),
1966 softime 14064 1 => array($evenement->getVal('libelle'),)
1967 mbroquet 3730 );
1968     $form->setSelect("evenement", $contenu);
1969     }
1970    
1971     /**
1972     * Gesion des liens vers la bible
1973     */
1974     // lien bible_auto
1975     $contenu = array(_("automatique"));
1976     $form->setSelect("bible_auto",$contenu);
1977     // lien bible1
1978     $contenu = array(_("bible"));
1979     $form->setSelect("bible",$contenu);
1980     // lien bible2
1981     $contenu = array(_("bible"));
1982     $form->setSelect("bible2",$contenu);
1983     // lien bible3
1984     $contenu = array(_("bible"));
1985     $form->setSelect("bible3",$contenu);
1986     // lien bible4
1987     $contenu = array(_("bible"));
1988     $form->setSelect("bible4",$contenu);
1989 softime 7521
1990     if ($maj == 1) {
1991     $base64 = $this->init_pdf_temp();
1992     $form->setSelect('live_preview', array('base64'=>$base64));
1993 softime 8593 $form->setSelect("btn_refresh", array(_('Prévisualiser')));
1994     $form->setSelect("btn_preview", array(_('Prévisualiser >>')));
1995     $form->setSelect("btn_redaction", array(_('<< Rédiger')));
1996 softime 7521 }
1997 softime 8593
1998     // Selection du type de rédaction à l'ajout
1999     $content = array(
2000     0 => array('f', 't', ),
2001     1 => array(_('Rédaction par compléments'), _('Rédaction libre'), ),
2002     );
2003     $form->setSelect('flag_edition_integrale', $content);
2004 softime 10573
2005     $contenu = array();
2006     foreach(array('waiting', 'in_progress', 'canceled', 'expired', 'finished') as $value) {
2007     $contenu[0][] = $value;
2008     $contenu[1][] = $this->get_trad_for_statut($value);
2009     }
2010     $form->setSelect('statut_signature', $contenu);
2011    
2012    
2013     if ($maj == 401) {
2014 softime 17036 $idx = $this->getParameter("idx");
2015     $dossier = $this->getParameter("idxformulaire");
2016     if ( strpos($idx, 'STORAGE_') !== FALSE) {
2017     $idx = substr($idx, 8);
2018     $model = 'storage';
2019     $champ = 'uid';
2020     $object = $this->f->get_inst__om_dbform(array(
2021     "obj" => $model,
2022     "idx" => $idx,
2023     ));
2024    
2025     $file = $this->f->storage->get($object->getVal($champ));
2026     $label = $file['metadata']['filename'];
2027     $href =sprintf(
2028     '../app/index.php?module=form&snippet=file&obj=storage&champ=uid&id=%1$s',
2029     $idx
2030     );
2031     $this->addToLog(__METHOD__."(): file['metadata']['filename'] = ".$file['metadata']['filename']." ", DEBUG_MODE);
2032     $this->val['preview_edition'] = '';
2033     }else{
2034     $label ='instruction_'.$this->getVal($this->clePrimaire);
2035     $href =sprintf(
2036     '../app/index.php?module=form&snippet=file&obj=instruction&champ=om_fichier_instruction&id=%1$s',
2037     $this->getVal($this->clePrimaire)
2038     );
2039     $file = $this->f->storage->get($this->getVal('om_fichier_instruction'));
2040     }
2041    
2042 softime 11418 $form->setSelect('preview_edition', array(
2043     'base64' => base64_encode($file['file_content']),
2044     'mimetype' => $file['metadata']['mimetype'],
2045 softime 17036 'label' => $label,
2046     'href' => $href
2047 softime 11418 ));
2048 softime 10573 }
2049 mbroquet 3730 }
2050    
2051 softime 8989 function cleSecondaire($id, &$dnu1 = null, $val = array(), $dnu2 = null) {
2052 mbroquet 3730 //
2053 softime 11228 // Vérifie uniquementla cle secondaire : demande
2054     $this->rechercheTable($this->f->db, "demande", "instruction_recepisse", $id);
2055 mbroquet 3730
2056     $id = $this->getVal($this->clePrimaire);
2057    
2058     //Requête de vérification que cet événement d'instruction n'est pas lié
2059     //à la création d'un dossier d'instruction
2060 softime 14064 $qres = $this->f->get_one_result_from_db_query(
2061     sprintf(
2062     'SELECT
2063     demande_type.dossier_instruction_type
2064     FROM
2065     %1$sdemande_type
2066     LEFT JOIN %1$sdemande
2067     ON demande.demande_type = demande_type.demande_type
2068     WHERE
2069     demande.instruction_recepisse = \'%2$d\'',
2070     DB_PREFIXE,
2071     intval($id)
2072     ),
2073     array(
2074     "origin" => __METHOD__,
2075     )
2076     );
2077 mbroquet 3730
2078     // Aucune clé secondaire n'a été trouvée ou c'est un événement sans
2079     //création de dossier d'instruction, l'événement d'instruction peut être
2080     //supprimé
2081 softime 14064 if ( $this->correct !== false || $qres['result'] == null || $qres['result'] == ""){
2082 mbroquet 3730 // Requête de vérification que cet événement d'instruction est lié
2083     // à une demande
2084 softime 14064 $qres = $this->f->get_one_result_from_db_query(
2085     sprintf(
2086     'SELECT
2087     demande
2088     FROM
2089     %1$sdemande
2090     WHERE
2091     instruction_recepisse = \'%2$d\'',
2092     DB_PREFIXE,
2093     intval($id)
2094     ),
2095     array(
2096     "origin" => __METHOD__,
2097     )
2098     );
2099 mbroquet 3730
2100     //Si c'est un événement d'instruction lié à une demande
2101 softime 14064 if ($qres['result'] != null || $qres['result'] != ""){
2102 softime 7996 $demande = $this->f->get_inst__om_dbform(array(
2103     "obj" => "demande",
2104 softime 14064 "idx" => $qres['result'],
2105 softime 7996 ));
2106 mbroquet 3730
2107 softime 14064 //On met à jour la demande en supprimant la liaison vers
2108 mbroquet 3730 //l'événement d'instruction
2109     $demande->setParameter("maj", 1);
2110     $valF = array();
2111     foreach($demande->champs as $identifiant => $champ) {
2112     $valF[$champ] = $demande->val[$identifiant];
2113     }
2114     $valF['date_demande']=$demande->dateDBToForm($valF['date_demande']);
2115     $valF['instruction_recepisse']=NULL;
2116 softime 8989 $ret = $demande->modifier($valF);
2117 mbroquet 3730 }
2118    
2119     /**
2120     * Vérification que l'élément supprimé est le dernier pour pouvoir
2121     * remodifier les données de manière itérative.
2122     */
2123 softime 14064 $qres = $this->f->get_one_result_from_db_query(
2124     sprintf(
2125     'SELECT
2126     max(instruction)
2127     FROM
2128     %1$sinstruction
2129     WHERE
2130     dossier = \'%2$s\'',
2131     DB_PREFIXE,
2132     $this->f->db->escapeSimple($this->getParameter("idxformulaire"))
2133     ),
2134     array(
2135     "origin" => __METHOD__,
2136     )
2137     );
2138    
2139 mbroquet 3730 // Si on se trouve effectivement sur le dernier evenement d'instruction
2140 softime 14064 // alors on valide la suppression sinon on l'annule
2141     $this->correct = false;
2142     $message = __("Seul le dernier evenement d'instruction peut etre supprime.");
2143     if ($qres['result'] == $id) {
2144 mbroquet 3730 // Alors on valide la suppression
2145     $this->correct = true;
2146 softime 14064 $message = __('Destruction_chronologique');
2147 mbroquet 3730 }
2148 softime 14064 $this->addToMessage($message);
2149 mbroquet 3730 }
2150     }
2151    
2152     /**
2153     * Vérification de la possibilité ou non de modifier des dates de suivi
2154     * @param string $champ champ date à vérifier
2155     */
2156     function updateDate($champ) {
2157    
2158     //Si le retourformulaire est "dossier_instruction"
2159     if ($this->getParameter("retourformulaire") == "dossier"
2160 softime 12847 || $this->f->contexte_dossier_instruction()) {
2161 mbroquet 3730
2162     // Vérification de la possibilité de modifier les dates si déjà éditées
2163     if($this->valF[$champ] != "" AND !$this->f->user_is_admin) {
2164     // si l'utilisateur n'est pas un admin
2165     if($this->getVal($champ) != "" AND $this->getVal($champ) != $this->valF[$champ]) {
2166 softime 15650
2167     // si le champ concerné est 'date_envoi_signature'
2168     // et que le statut du parapheur est 'expired'
2169     // alors on autorise le changement de la date
2170     // pour tous les autres cas, on ne peut modifier la date
2171     if ($champ !== 'date_envoi_signature' || $this->getVal('statut_signature') !== 'expired') {
2172     $this->correct = false;
2173     $this->addToMessage(_("Les dates de suivis ne peuvent etre modifiees"));
2174     }
2175 mbroquet 3730 }
2176     }
2177     }
2178    
2179     //
2180     return true;
2181     }
2182    
2183 softime 8989 /**
2184     * SETTER_FORM - setValsousformulaire (setVal).
2185     *
2186     * @return void
2187     */
2188     function setValsousformulaire(&$form, $maj, $validation, $idxformulaire, $retourformulaire, $typeformulaire, &$dnu1 = null, $dnu2 = null) {
2189 softime 17542 $data = array('form' => &$form, 'maj' => &$maj, 'validation' => &$validation, 'idxformulaire' => &$idxformulaire, 'retourformulaire' => &$retourformulaire, 'typeformulaire' => &$typeformulaire);
2190     $this->f->module_manager->run_hooks('setValsousformulaire_pre', $this, $data);
2191    
2192 softime 8989 // parent::setValsousformulaire($form, $maj, $validation, $idxformulaire, $retourformulaire, $typeformulaire);
2193 mbroquet 3730 //
2194 softime 8989 $this->retourformulaire = $retourformulaire;
2195     //
2196 mbroquet 3730 if ($maj == 0) {
2197 softime 8989 $form->setVal("destinataire", $this->getParameter("idxformulaire"));
2198     $form->setVal("dossier", $this->getParameter("idxformulaire"));
2199 mbroquet 3730 }
2200 softime 12124
2201     // Si l'instruction a été envoyé au contrôle de légalité et que la
2202     // tâche envoi_cl lié n'a pas encore été traité il faut indiquer à
2203     // l'utilisateur que l'envoi au cl est en cours de traitement.
2204     if ($this->is_sent_to_cl() === true
2205     && empty($this->getVal('date_envoi_controle_legalite'))
2206     && $maj == 3) {
2207     $form->setVal("date_envoi_controle_legalite", __("En cours de traitement."));
2208     }
2209 mbroquet 3730 //
2210     $this->set_form_default_values($form, $maj, $validation);
2211 softime 17542
2212     $data = array('form' => &$form, 'maj' => &$maj, 'validation' => &$validation, 'idxformulaire' => &$idxformulaire, 'retourformulaire' => &$retourformulaire, 'typeformulaire' => &$typeformulaire);
2213     $this->f->module_manager->run_hooks('setValsousformulaire_post', $this, $data);
2214 mbroquet 3730 }
2215    
2216     /**
2217 softime 8989 * SETTER_FORM - set_form_default_values (setVal).
2218     *
2219     * @return void
2220 mbroquet 3730 */
2221     function set_form_default_values(&$form, $maj, $validation) {
2222 softime 17542 $data = array('form' => &$form, 'maj' => &$maj, 'validation' => &$validation);
2223     $this->f->module_manager->run_hooks('set_form_default_values_pre', $this, $data);
2224    
2225 mbroquet 3730 if ($maj == 0) {
2226     // si contexte DI
2227     if ($this->getParameter("retourformulaire") == "dossier"
2228 softime 12847 || $this->f->contexte_dossier_instruction()) {
2229 mbroquet 3730 // on recupère les signataires de la multicollectivité et de celle du DI
2230 softime 7996 $di = $this->f->get_inst__om_dbform(array(
2231     "obj" => "dossier_instruction",
2232 softime 8989 "idx" => $this->getParameter("idxformulaire"),
2233 softime 7996 ));
2234 softime 8989 $sql = str_replace(
2235     "<collectivite_di>",
2236     $di->getVal("om_collectivite"),
2237     $this->get_var_sql_forminc__sql("signataire_arrete_defaut_by_di")
2238     );
2239 mbroquet 3730 } else {
2240 softime 8989 $sql = $this->get_var_sql_forminc__sql("signataire_arrete_defaut");
2241 mbroquet 3730 }
2242 softime 14542
2243     $qres = $this->f->get_all_results_from_db_query($sql, array(
2244     "origin" => __METHOD__));
2245     $row = array_shift($qres['result']);
2246 softime 8989 if (isset($row["signataire_arrete"])
2247     && is_numeric($row["signataire_arrete"])) {
2248     //
2249     $form->setVal("signataire_arrete", $row["signataire_arrete"]);
2250 mbroquet 3730 }
2251 softime 8989 // Date du jour
2252     $form->setVal("date_evenement", date("Y-m-d"));
2253 mbroquet 3730 }
2254 softime 8989 //
2255 mbroquet 3730 if ($maj == 0 || $maj == 1 || $maj == 125) {
2256 softime 8989 $form->setVal("bible_auto", "bible_auto()");
2257     $form->setVal("bible", "bible(1)");
2258     $form->setVal("bible2", "bible(2)");
2259     $form->setVal("bible3", "bible(3)");
2260     $form->setVal("bible4", "bible(4)");
2261 mbroquet 3730 }
2262 softime 17542 // TODO à faire autrement car ça génère une requête à chaque fois, plus l'instanciation du dossier d'instruction et donc de ses modules !
2263 softime 7521 $collectivite_di = $this->get_dossier_instruction_om_collectivite();
2264 softime 8989 if ($maj == 1
2265     && $this->f->is_option_preview_pdf_enabled($collectivite_di) === true
2266 softime 7521 && $this->has_an_edition() === true) {
2267 softime 8989 //
2268     $form->setVal("live_preview", $this->getVal($this->clePrimaire));
2269     $form->setVal("btn_refresh", "reload_pdf_viewer()");
2270     $form->setVal("btn_preview", "show_instr_preview()");
2271     $form->setVal("btn_redaction", "show_instr_redaction()");
2272 softime 7521 }
2273 softime 10808
2274 softime 12654 // Gestion de l'affichage des suivis de notification des demandeurs, des services, des tiers et
2275     // des communes
2276     if ($maj == 3) {
2277     if ($this->can_display_notification_demandeur()) {
2278     $typeNotification = array(
2279     'notification_recepisse',
2280     'notification_instruction',
2281     'notification_decision',
2282     );
2283     $form->setVal("suivi_notification", $this->get_json_suivi_notification($typeNotification, true));
2284     }
2285     if ($this->can_display_notification_service()) {
2286     $form->setVal("suivi_notification_service", $this->get_json_suivi_notification(array('notification_service_consulte')));
2287     }
2288     if ($this->can_display_notification_tiers()) {
2289     $form->setVal("suivi_notification_tiers", $this->get_json_suivi_notification(array('notification_tiers_consulte')));
2290     }
2291     if ($this->can_display_notification_commune()) {
2292     $form->setVal("suivi_notification_commune", $this->get_json_suivi_notification(array('notification_depot_demat', 'notification_commune')));
2293     }
2294 softime 15835 if ($this->getVal('flag_edition_integrale') == 't') {
2295     $message = __("Aucun contenu à afficher.");
2296     if (empty($this->getVal('titre_om_htmletat'))) {
2297     $form->setVal("titre_om_htmletat", $message);
2298     }
2299     if (empty($this->getVal('corps_om_htmletatex'))) {
2300     $form->setVal("corps_om_htmletatex", $message);
2301     }
2302     }
2303 softime 10808 }
2304 softime 17542 $data = array('form' => &$form, 'maj' => &$maj, 'validation' => &$validation);
2305     $this->f->module_manager->run_hooks('set_form_default_values_post', $this, $data);
2306 mbroquet 3730 }
2307    
2308     function setLayout(&$form, $maj){
2309 softime 17542 $data = array('form' => &$form, 'maj' => &$maj);
2310     $this->f->module_manager->run_hooks('setLayout_pre', $this, $data);
2311    
2312 softime 8593 $form->setBloc('evenement','D',"","sousform-instruction-action-".$maj);
2313 mbroquet 3730
2314 softime 8593 $form->setFieldset('evenement','D',_('Evenement'));
2315     $form->setFieldset('om_final_instruction_utilisateur','F','');
2316    
2317     $form->setBloc('om_final_instruction_utilisateur','F');
2318 softime 15835 // Idem que pour le layout de la synthèse des DI, on est obligé de "casser" le setBloc en utilisant que la fin
2319     // afin de bypasser le fait de ne pas avoir le form-content et le portlet dans le meme container
2320     $form->setBloc('om_final_instruction_utilisateur','F');
2321     $form->setBloc('parapheur_lien_page_signature','D');
2322 mbroquet 3730
2323 softime 8593 $form->setBloc('date_finalisation_courrier','D',"","");
2324 mbroquet 3730
2325 softime 15973 $form->setFieldset('date_finalisation_courrier','D',_('Dates'),"instruction--suivi-dates");
2326     $form->setBloc('date_finalisation_courrier','D');
2327     $form->setBloc('date_envoi_rar','F');
2328 mbroquet 3730
2329 softime 15973 $form->setBloc('date_retour_rar','D');
2330 softime 8593 $form->setBloc('date_retour_controle_legalite','F');
2331     $form->setFieldset('date_retour_controle_legalite','F','');
2332    
2333     $form->setBloc('date_retour_controle_legalite','F');
2334 mbroquet 3730
2335 softime 10573 $form->setBloc('statut_signature','D');
2336     $form->setFieldset('statut_signature','D','Suivi Parapheur');
2337     $form->setBloc('commentaire_signature','F');
2338     $form->setBloc('historique_signature','D');
2339     $form->setFieldset('historique_signature', 'DF', __("Historique"), "collapsible, startClosed");
2340     $form->setBloc('historique_signature','F');
2341     $form->setFieldset('historique_signature','F');
2342    
2343 softime 10808 $form->setFieldset('suivi_notification', 'D', __("Suivi notification"), "collapsible");
2344     $form->setFieldset('suivi_notification','F');
2345 softime 11585 $form->setFieldset('suivi_notification_service', 'D', __("Suivi notification service"), "collapsible");
2346     $form->setFieldset('suivi_notification_service','F');
2347     $form->setFieldset('suivi_notification_tiers', 'D', __("Suivi notification tiers"), "collapsible");
2348     $form->setFieldset('suivi_notification_tiers','F');
2349 softime 12654 $form->setFieldset('suivi_notification_commune', 'D', __("Suivi notification commune"), "collapsible");
2350     $form->setFieldset('suivi_notification_commune','F');
2351 softime 10808
2352 softime 8593 if ($maj == 1) {
2353     // Récupère la collectivité du dossier d'instruction
2354     $collectivite_di = $this->get_dossier_instruction_om_collectivite();
2355 mbroquet 3730
2356 softime 8593 //
2357     if ($this->f->is_option_preview_pdf_enabled($collectivite_di) === true
2358     && $this->has_an_edition() === true) {
2359 softime 7521 //
2360 softime 8593 $form->setBloc('complement_om_html','D',"","container_instr_edition");
2361     $form->setBloc('complement_om_html','D',"","hidelabel box_instr_edition redaction_instr_edition");
2362     $form->setBloc('complement_om_html','D',"","box_instr_edition_main");
2363     $form->setFieldset('complement_om_html','D',_('Complement'));
2364     $form->setFieldset('bible','F','');
2365     $form->setFieldset('complement2_om_html','D',_('Complement 2'));
2366     $form->setFieldset('bible2','F','');
2367     $form->setFieldset('complement3_om_html','D',_('Complement 3'));
2368     $form->setFieldset('bible3','F','');
2369     $form->setFieldset('complement4_om_html','D',_('Complement 4'));
2370     $form->setFieldset('bible4','F','');
2371     $form->setFieldset('titre_om_htmletat','DF',_('Titre'), 'startClosed');
2372     $form->setFieldset('corps_om_htmletatex','DF',_('Corps'));
2373     $form->setBloc('corps_om_htmletatex','F');
2374     $form->setBloc('btn_preview','DF',"","box_instr_edition_btn");
2375     $form->setBloc('btn_preview','F');
2376     $form->setBloc('btn_redaction','D', '',"hidelabel box_instr_edition preview_instr_edition");
2377     $form->setBloc('btn_redaction','DF',"","box_instr_edition_btn");
2378     $form->setFieldset('btn_refresh','D',_('Prévisualisation'), "box_instr_edition_main");
2379     $form->setFieldset('live_preview','F');
2380     $form->setBloc('live_preview','F');
2381     $form->setBloc('live_preview','F');
2382 softime 7521 } else {
2383 softime 8593 $form->setBloc('complement_om_html','D',"","hidelabel");
2384 softime 7521 $form->setFieldset('complement_om_html','D',_('Complement'));
2385     $form->setFieldset('bible','F','');
2386     $form->setFieldset('complement2_om_html','D',_('Complement 2'));
2387     $form->setFieldset('bible2','F','');
2388     $form->setFieldset('complement3_om_html','D',_('Complement 3'));
2389     $form->setFieldset('bible3','F','');
2390     $form->setFieldset('complement4_om_html','D',_('Complement 4'));
2391     $form->setFieldset('bible4','F','');
2392 softime 8593 $form->setFieldset('titre_om_htmletat','DF',_('Titre'), 'startClosed');
2393     $form->setFieldset('corps_om_htmletatex','DF',_('Corps'));
2394     $form->setBloc('corps_om_htmletatex','F');
2395 softime 7521 }
2396 softime 8593 } else {
2397     $form->setBloc('complement_om_html','D',"","hidelabel");
2398     $form->setFieldset('complement_om_html','D',_('Complement'));
2399     $form->setFieldset('bible','F','');
2400     $form->setFieldset('complement2_om_html','D',_('Complement 2'));
2401     $form->setFieldset('bible2','F','');
2402     $form->setFieldset('complement3_om_html','D',_('Complement 3'));
2403     $form->setFieldset('bible3','F','');
2404     $form->setFieldset('complement4_om_html','D',_('Complement 4'));
2405     $form->setFieldset('bible4','F','');
2406     $form->setFieldset('titre_om_htmletat','DF',_('Titre'), 'startClosed');
2407     $form->setFieldset('corps_om_htmletatex','DF',_('Corps'));
2408     $form->setBloc('corps_om_htmletatex','F');
2409 mbroquet 3730 }
2410 softime 17542 $data = array('form' => &$form, 'maj' => &$maj);
2411     $this->f->module_manager->run_hooks('setLayout_post', $this, $data);
2412 mbroquet 3730 }
2413    
2414     function setLib(&$form, $maj) {
2415 softime 17542 $data = array('form' => &$form, 'maj' => &$maj);
2416     $this->f->module_manager->run_hooks('setLib_pre', $this, $data);
2417 mbroquet 3730 //
2418     parent::setLib($form, $maj);
2419     //
2420     $form->setLib('bible_auto', "");
2421     $form->setLib('bible', "");
2422     $form->setLib('bible2', "");
2423     $form->setLib('bible3', "");
2424     $form->setLib('bible4', "");
2425 softime 7521 $form->setLib('btn_refresh', "");
2426 softime 8593 $form->setLib('btn_preview', "");
2427     $form->setLib('btn_redaction', "");
2428 softime 7521 $form->setLib('live_preview', "");
2429 mbroquet 3730 $form->setLib('om_final_instruction_utilisateur', _("finalise par"));
2430 softime 8989 $form->setLib('date_envoi_rar', __("date_envoi_ar"));
2431     $form->setLib('date_retour_rar', __("date_notification"));
2432 softime 10573 $form->setLib('statut_signature', __("statut"));
2433     $form->setLib('commentaire_signature', __("commentaire"));
2434     $form->setLib('historique_signature', '');
2435 softime 10808 $form->setLib('suivi_notification', '');
2436 softime 11585 $form->setLib('suivi_notification_service', '');
2437     $form->setLib('suivi_notification_tiers', '');
2438 softime 12654 $form->setLib('suivi_notification_commune', '');
2439 softime 10573 $form->setLib('preview_edition', "");
2440 softime 8593
2441     // Ajout d'une infobulle d'aide lorsque le formulaire est en mode
2442     // ajout et que l'option de rédaction libre est activée sur la
2443     // collectivité du dossier
2444     if ($maj === '0' && $this->is_option_redaction_libre_enabled() === true) {
2445     //
2446     $help_text_template = '%s <span class="info-16" title="%s"></span>';
2447     $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.");
2448     $form->setLib('flag_edition_integrale', sprintf($help_text_template, _("Type de rédaction"), $help_text));
2449     }
2450     else {
2451     $form->setLib('flag_edition_integrale', _("Type de rédaction"));
2452     }
2453    
2454     // Ajout d'une infobulle d'aide lorsque le formulaire est en mode
2455     // modification et que l'option de prévisualisation de l'édition est
2456     // activée sur la collectivité du dossier
2457     if ($maj === '1'
2458     && $this->f->is_option_preview_pdf_enabled($this->get_dossier_instruction_om_collectivite()) === true) {
2459     //
2460     $help_text_template = '%s <span class="info-16" title="%s"></span>';
2461     $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.");
2462     $form->setLib('date_evenement', sprintf($help_text_template, _('date_evenement'), $help_text));
2463     $form->setLib('signataire_arrete', sprintf($help_text_template, _('signataire_arrete'), $help_text));
2464     }
2465 softime 17542 $data = array('form' => &$form, 'maj' => &$maj);
2466     $this->f->module_manager->run_hooks('setLib_post', $this, $data);
2467 mbroquet 3730 }
2468    
2469 softime 8989 /**
2470 softime 15835 * Surcharge om_dbform::set_form_specificity()
2471     *
2472     * Traitements spécifiques lié à l'affichage des formulaires.
2473     * Les traitements gérés ici sont les suivants :
2474     * - Affichage d'un message d'erreur si la lettretype de l'évènement n'a pas
2475     * pu être récupérée.
2476     * - Affichage d'un message d'information à l'attention de l'utilisateur si
2477     * la notification est activée mais qu'elle n'est pas possible à cause du
2478     * paramètrage.
2479     *
2480     * @param formulaire $form Instance formulaire.
2481     * @param string $maj
2482     *
2483     * @return void
2484     */
2485     function set_form_specificity(&$form, $maj) {
2486     parent::set_form_specificity($form, $maj);
2487    
2488     // En consultation, vérifie si une lettretype est associée à l'instruction et a pu être récupérée.
2489     // Si ce n'est pas le cas affiche un message d'erreur.
2490     if ((! empty($maj) && $maj == 3)) {
2491     if (! empty($this->getVal('lettretype'))) {
2492    
2493     $om_edition = $this->f->get_inst__om_edition();
2494     $dossier_instruction_om_collectivite = $this->get_dossier_instruction_om_collectivite();
2495     $collectivite = $this->f->getCollectivite($dossier_instruction_om_collectivite);
2496     $edition = $om_edition->get_edition_from_collectivite('om_lettretype', $this->getVal("lettretype"), $collectivite['om_collectivite_idx']);
2497    
2498     if (empty($edition)) {
2499     $this->display_error_message(__("Erreur de paramétrage, le modèle de document n'a pas pu être récupéré. Contactez votre administrateur."));
2500     }
2501     }
2502     }
2503    
2504     $this->display_notification_info($maj);
2505     }
2506    
2507     /**
2508     * En consultation, pour les dossiers qui n'ont pas été transmis par le portail
2509     * citoyen, si la notification des demandeurs est activée sur l'évenement
2510     * d'instruction et que le paramétrage du demandeur principal n'est pas
2511     * correct alors un message a destination de l'instructeur est affiché.
2512     *
2513     * @param string $maj
2514     *
2515     * @return void
2516     */
2517     public function display_notification_info($maj) {
2518     if ((! empty($maj) && $maj == 3)) {
2519     // Si le dossier n'a pas été déposé sur le portail citoyen (ou si
2520     // la requête permettant de savoir le type de demande à échouée) et si
2521     // la notification se fait par mail vérifie si il y a des erreurs de
2522     // paramétrage et si c'est le cas on affiche un message d'information
2523     if ($this->dossier_depose_sur_portail() == null || ! $this->dossier_depose_sur_portail()) {
2524     $erreurParam = $this->get_info_notification_fail();
2525     // Récupération de l'évenement d'instruction
2526     $instEV = $this->get_inst_evenement();
2527     if (! empty($instEV->getVal('notification')) && $erreurParam != array()) {
2528     $class = 'text-info ui-state-highlight ui-state-info';
2529     $message = __("La notification n'est pas possible.");
2530     $this->f->display_panel_information(
2531     $class,
2532     $message,
2533     $erreurParam,
2534     __('Les données suivantes doivent être modifiées'),
2535     'erreur_param_notif'
2536     );
2537     }
2538     }
2539     }
2540     }
2541    
2542     /**
2543     * Méthode permettant d'afficher des messages d'erreur sur les formulaires.
2544     */
2545     public function display_error_message($msg) {
2546     $this->correct = false;
2547     $this->msg = $msg;
2548     }
2549    
2550     /**
2551 softime 8989 * TRIGGER - triggerajouter.
2552 softime 17036 * Réalise différents traitements avant d'ajouter l'instruction en base.
2553 softime 8989 *
2554 softime 17036 * Les traitements réalisés sont les suivant :
2555     * - TODO : documenter les traietements existant
2556     * - Intégre les bibles pré-chargé aux compléments de l'instruction.
2557     * Ce traitement n'est déclenché que si l'on est pas en rédaction libre, et que l'évènement a une lettretype.
2558     *
2559 softime 8989 * @return boolean
2560     */
2561     function triggerajouter($id, &$dnu1 = null, $val = array(), $dnu2 = null) {
2562     $this->addToLog(__METHOD__."(): start", EXTRA_VERBOSE_MODE);
2563 softime 17542 $data = array('val' => &$val, 'id' => $id);
2564     $this->f->module_manager->run_hooks('triggerajouter_pre', $this, $data);
2565 mbroquet 3730 /**
2566     * Le code suivant permet de récupérer des valeurs des tables evenement
2567     * et dossier pour les stocker dans l'instruction :
2568     * DEPUIS L'EVENEMENT
2569     * - action
2570     * - delai
2571     * - accord_tacite
2572     * - etat
2573     * - avis_decision
2574     * - delai_notification
2575     * - lettretype
2576     * - autorite_competente
2577 softime 10573 * - pec_metier
2578 softime 6565 * - complement_om_html
2579     * - complement2_om_html
2580     * - complement3_om_html
2581     * - complement4_om_html
2582     * - complement5_om_html
2583 mbroquet 3730 * DEPUIS LE DOSSIER D'INSTRUCTION
2584     * - archive_delai
2585     * - archive_accord_tacite
2586     * - archive_etat
2587     * - archive_avis
2588     * - date_complet
2589     * - date_rejet
2590     * - date_limite
2591     * - date_notification_delai
2592     * - date_decision
2593     * - date_validite
2594     * - date_achevement
2595     * - date_chantier
2596     * - date_conformite
2597     * - avis_decision
2598     */
2599     // Récupération de tous les paramètres de l'événement sélectionné
2600 softime 14542 // TODO : remplacer cette requête par l'instanciation de l'événement
2601     $qres = $this->f->get_all_results_from_db_query(
2602     sprintf(
2603     'SELECT
2604     *
2605     FROM
2606     %1$sevenement
2607     WHERE
2608     evenement = %2$d',
2609     DB_PREFIXE,
2610     intval($this->valF['evenement'])
2611     ),
2612     array(
2613     "origin" => __METHOD__,
2614     )
2615     );
2616     foreach ($qres['result'] as $row) {
2617 mbroquet 3730 // Récupération de l'identifiant de l'action
2618     // si une action est paramétrée dans l'événement
2619     $this->valF['action'] = NULL;
2620     if (isset($row['action']) and !empty($row['action'])) {
2621     $this->valF['action']=$row['action'];
2622     }
2623     // Récupération de la valeur du délai
2624     $this->valF['delai'] = $row['delai'];
2625     // Récupération de l'identifiant de l'état
2626     // si un état est paramétré dans l'événement
2627     $this->valF['etat']=NULL;
2628     if (isset($row['etat']) and !empty($row['etat'])) {
2629     $this->valF['etat']=$row['etat'];
2630     }
2631     // Récupération de la valeur d'accord tacite
2632     $this->valF['accord_tacite']=$row['accord_tacite'];
2633     // Récupération de la valeur du délai de notification
2634     $this->valF['delai_notification']=$row['delai_notification'];
2635     // Récupération de l'identifiant de l'avis
2636     // si un avis est paramétré dans l'événement
2637     $this->valF['avis_decision'] = NULL;
2638     if(isset($row['avis_decision']) and !empty($row['avis_decision'])) {
2639     $this->valF['avis_decision']=$row['avis_decision'];
2640     }
2641     // Récupération de la valeur de l'autorité compétente
2642     // si l'autorité compétente est paramétré dans l'événement
2643     $this->valF['autorite_competente'] = NULL;
2644     if(isset($row['autorite_competente']) and !empty($row['autorite_competente'])) {
2645     $this->valF['autorite_competente']=$row['autorite_competente'];
2646     }
2647     // Récupération de la valeur de la lettre type
2648     $this->valF['lettretype']=$row['lettretype'];
2649 softime 10573 // Récupération de la valeur de la prise en compte métier
2650     // si la prise en compte métier est paramétrée dans l'événement
2651     $this->valF['pec_metier'] = NULL;
2652     if(isset($row['pec_metier']) === true and empty($row['pec_metier']) === false) {
2653     $this->valF['pec_metier'] = $row['pec_metier'];
2654     }
2655 mbroquet 3730 }
2656     // Récupération de toutes les valeurs du dossier d'instruction en cours
2657 softime 14542 // TODO : remplacer cette requête par l'instanciation de l'objet
2658     $qres = $this->f->get_all_results_from_db_query(
2659     sprintf(
2660     'SELECT
2661     *
2662     FROM
2663     %1$sdossier
2664     WHERE
2665     dossier = \'%2$s\'',
2666     DB_PREFIXE,
2667     $this->f->db->escapeSimple($this->valF['dossier'])
2668     ),
2669     array(
2670     "origin" => __METHOD__,
2671     )
2672     );
2673     $row = array_shift($qres['result']);
2674 mbroquet 3730 $this->updateArchiveData($row);
2675 softime 17542
2676 mbroquet 3730 // Récupération de la duree de validite du dossier d'autorisation
2677 softime 14064 $qres = $this->f->get_one_result_from_db_query(
2678     sprintf(
2679     'SELECT
2680     duree_validite_parametrage
2681     FROM
2682     %1$sdossier_autorisation_type_detaille
2683     LEFT JOIN %1$sdossier_autorisation
2684     ON dossier_autorisation.dossier_autorisation_type_detaille = dossier_autorisation_type_detaille.dossier_autorisation_type_detaille
2685     LEFT JOIN %1$sdossier
2686     ON dossier.dossier_autorisation = dossier_autorisation.dossier_autorisation
2687     WHERE
2688     dossier.dossier = \'%2$s\'',
2689     DB_PREFIXE,
2690     $this->f->db->escapeSimple($this->valF['dossier'])
2691     ),
2692     array(
2693     "origin" => __METHOD__,
2694     )
2695     );
2696    
2697     if ($qres['result'] != '') {
2698     $this->valF['duree_validite_parametrage'] = $qres['result'];
2699 mbroquet 3730 }
2700    
2701     // Identifiant du type de courrier
2702     $idTypeCourrier = '11';
2703     $idCourrier = str_pad($this->valF["instruction"], 10, "0", STR_PAD_LEFT);
2704     // Code barres
2705     $this->valF["code_barres"] = $idTypeCourrier . $idCourrier;
2706 softime 17036
2707     // Set dans la propriété valF les valeurs des compléments pour qu'ils soient enregistrés
2708     // à l'ajout de l'instruction.
2709     // Le traitement n'est réalisé que si il y a une lettretype et qu'on est pas en rédaction libre
2710     if (! empty($this->valF['lettretype'])) {
2711     $this->set_precharge_complement($this->valF['evenement'], $this->valF['dossier']);
2712     }
2713 softime 17542
2714     $res = true;
2715     $data = array('val' => &$val, 'id' => $id, 'result' => &$res);
2716     $this->f->module_manager->run_hooks('triggerajouter_post', $this, $data);
2717     return $res;
2718 mbroquet 3730 }
2719 softime 17036
2720     /**
2721     * Récupère pour chaque champ complementX_om_html le complément correspondant
2722     * et set l'entrée correspondante de valF avec.
2723     *
2724     * Problème potentiel : Le nombre de complément se base sur le champs complement ayant
2725     * l'indice le plus grand visible dans get_var_sql_forminc__champs().
2726     * Dans cette fonction on fait donc 15 itérations. Changer le nombre de complément
2727     * aura donc un impact sur cette méthode.
2728     *
2729     * @param string dossier : identifiant du dossier de l'instruction
2730     * @param int evenement : identifiant de l'évènement d'instruction
2731     *
2732     * @return void
2733     */
2734     public function set_precharge_complement($evenement, $dossier) {
2735     // Récupération des bibles et chargement dans les compléments
2736     for ($i = 1; $i <= 15; $i++) {
2737     // Constitution de l'id du champs.
2738     // Pour l'indice 1, l'id est complement_om_html, l'indice n'est pas visible dans ce cas.
2739     $field = "complement".($i === 1 ? '' : $i)."_om_html";
2740     // Récupération des compléments correspondant en fonction de l'évènement
2741     // et du dossier puis insertion dans la champs voulu
2742     $this->valF[$field] = $this->getBible($evenement, $dossier, $i, 'precharge');
2743     }
2744     }
2745    
2746    
2747 mbroquet 3730
2748 softime 12124 /**
2749     * Test si une restriction est valide.
2750     *
2751     * @return boolean
2752     */
2753 mbroquet 3730 function restrictionIsValid($restriction){
2754     if($this->restriction_valid != null) {
2755     return $this->restriction_valid;
2756     }
2757     if(empty($restriction)) {
2758     $this->restriction_valid = true;
2759     return $this->restriction_valid;
2760     }
2761 nmeucci 3873 // Liste des opérateurs possibles sans espace
2762     $operateurs = array(">=", "<=", "+", "-", "&&", "||", "==", "!=");
2763     // Liste identique mais avec le marqueur §
2764     $mark = "§";
2765     $operateurs_marked = array();
2766     foreach ($operateurs as $operateur) {
2767     $operateurs_marked[] = $mark.$operateur.$mark;
2768     }
2769 mbroquet 3730
2770     // Supprime tous les espaces de la chaîne de caractère
2771 nmeucci 3873 $restriction = preg_replace('/\s+/', '', $restriction);
2772 mbroquet 3730
2773 nmeucci 3873 // Met un marqueur avant et après les opérateurs
2774     // puis transforme la chaine en un tableau
2775     $restriction = str_replace($operateurs, $operateurs_marked,
2776 mbroquet 3730 $restriction);
2777    
2778 nmeucci 3873 // Pour chaque opérateur logique
2779     foreach (array('&&', '||') as $operator) {
2780    
2781     // S'il est absent on ne fait aucun traitement
2782     if (strpos($restriction, $mark.$operator.$mark) === false) {
2783     continue;
2784     }
2785     // Sinon on vérifie les deux conditions avec le OU/ET logique
2786     $restrictions = explode($mark.$operator.$mark, $restriction);
2787     $restrictions[0] = explode($mark, $restrictions[0]);
2788     $restrictions[1] = explode($mark, $restrictions[1]);
2789     $res_bool = false;
2790     if ($operator == '&&') {
2791     if ($this->is_restriction_satisfied($restrictions[0], $operateurs)
2792     && $this->is_restriction_satisfied($restrictions[1], $operateurs)) {
2793     $res_bool = true;
2794     }
2795     }
2796     if ($operator == '||') {
2797     if ($this->is_restriction_satisfied($restrictions[0], $operateurs)
2798     || $this->is_restriction_satisfied($restrictions[1], $operateurs)) {
2799     $res_bool = true;
2800     }
2801     }
2802     return $res_bool;
2803     }
2804     $tabRestriction = explode($mark, $restriction);
2805     return $this->is_restriction_satisfied($tabRestriction, $operateurs);
2806    
2807     }
2808    
2809     function is_restriction_satisfied($restriction, $operateurs) {
2810 mbroquet 3730 // Tableau comprenant les résultat
2811     $res = array();
2812     // Compteur pour les résultat
2813     // commence à 1 car le 0 doit rester inchangé tout au long du traitement
2814     $j = 1;
2815     // Comparateur du calcul
2816     $comparateur = '';
2817     // Booléen retourné
2818     $res_bool = true;
2819    
2820     // S'il y a un comparateur
2821 nmeucci 3873 if (in_array(">=", $restriction)
2822     || in_array("<=", $restriction)
2823     || in_array("==", $restriction)
2824     || in_array("!=", $restriction)) {
2825 mbroquet 3730
2826     // Si le tableau n'est pas vide
2827 nmeucci 3873 if (count($restriction) > 0) {
2828 mbroquet 3730
2829     // Boucle dans le tableau pour récupérer seulement les valeurs
2830 nmeucci 3873 foreach ($restriction as $key => $value) {
2831 mbroquet 3730 //
2832     if (!in_array($value, $operateurs)) {
2833     if ($this->getRestrictionValue($value) != false) {
2834     $res[] = $this->getRestrictionValue($value);
2835     } else {
2836     // Message d'erreur
2837     $error_message = sprintf(_("Le champ %s de l'instruction %s est vide"), "<span class='bold'>".$value."</span>", "<span class='bold'>".$this->valF["instruction"]."</span>");
2838     $this->addToMessage($error_message);
2839     // Arrête le traitement
2840     return false;
2841     }
2842     }
2843     }
2844    
2845     // Boucle dans le tableau
2846     // commence à 1 car le 0 doit rester inchangé tout au long du
2847     // traitement
2848 nmeucci 3873 for ($i = 1; $i<count($restriction); $i++) {
2849 mbroquet 3730
2850     // Récupère le comparateur
2851 nmeucci 3873 if ($restriction[$i] === ">="
2852     || $restriction[$i] === "<="
2853     || $restriction[$i] === "=="
2854     || $restriction[$i] === "!=") {
2855     $comparateur = $restriction[$i];
2856 mbroquet 3730 }
2857    
2858     // Si l'opérateur qui suit est un "+"
2859 nmeucci 3873 if ($restriction[$i] === "+") {
2860 mbroquet 3730 $dateDep = $res[$j];
2861     unset($res[$j]);$j++;
2862     $duree = $res[$j];
2863     unset($res[$j]);
2864     $res[$j] = $this->f->mois_date($dateDep, $duree, "+");
2865     }
2866    
2867     // Si l'opérateur qui suit est un "-"
2868 nmeucci 3873 if ($restriction[$i] === "-") {
2869 mbroquet 3730 $dateDep = $res[$j];
2870     unset($res[$j]);$j++;
2871     $duree = $res[$j];
2872     unset($res[$j]);
2873     $res[$j] = $this->f->mois_date($dateDep, $duree, "-");
2874     }
2875     }
2876    
2877     }
2878    
2879     // Si les tableau des résultats n'est pas vide
2880     if (count($res) > 0) {
2881     //
2882     $res_bool = false;
2883     // Effectue le test
2884     if ($comparateur === ">=") {
2885     //
2886     if (strtotime($res[0]) >= strtotime($res[$j])) {
2887     $res_bool = true;
2888     }
2889     }
2890     if ($comparateur === "<=") {
2891 nmeucci 3873 //
2892 mbroquet 3730 if (strtotime($res[0]) <= strtotime($res[$j])) {
2893     $res_bool = true;
2894     }
2895     }
2896 nmeucci 3873 if ($comparateur === "==") {
2897     //
2898     if (strtotime($res[0]) == strtotime($res[$j])) {
2899     $res_bool = true;
2900     }
2901     }
2902     if ($comparateur === "!=") {
2903     //
2904     if (strtotime($res[0]) != strtotime($res[$j])) {
2905     $res_bool = true;
2906     }
2907     }
2908 mbroquet 3730 }
2909     // Sinon une erreur s'affiche
2910     } else {
2911    
2912     // Message d'erreur
2913     $error_message = _("Mauvais parametrage de la restriction.")." ".
2914     _("Contactez votre administrateur");
2915     $this->addToMessage($error_message);
2916     // Arrête le traitement
2917     return false;
2918     }
2919    
2920     return $res_bool;
2921    
2922     }
2923    
2924     /**
2925     * Permet de définir si l'événement passé en paramètre est un événement retour.
2926     * @param integer $evenement événement à tester
2927     *
2928     * @return boolean retourne true si événement retour sinon false
2929     */
2930     function is_evenement_retour($evenement) {
2931     if(empty($evenement) || !is_numeric($evenement)) {
2932     return "";
2933     }
2934 softime 14064
2935     $evenement = $this->f->get_inst__om_dbform(array(
2936     "obj" => "evenement",
2937     "idx" => $evenement,
2938     ));
2939    
2940     return $evenement->getVal('retour') == 't';
2941 mbroquet 3730 }
2942    
2943     /**
2944     * Retourne le champ restriction de l'événement passé en paramètre.
2945     *
2946     * @param integer $evenement id de l'événement sur lequel récupérer la restriction
2947     *
2948     * @return string contenu du champ restriction
2949     */
2950     function get_restriction($evenement) {
2951     if(empty($evenement) || !is_numeric($evenement)) {
2952     return "";
2953     }
2954     //Récupère la restriction
2955 softime 14064 $evenement = $this->f->get_inst__om_dbform(array(
2956     "obj" => "evenement",
2957     "idx" => $evenement,
2958     ));
2959    
2960     return $evenement->getVal('restriction');
2961 mbroquet 3730 }
2962    
2963     /**
2964     * Récupère la valeur du champ dans la restriction
2965     * @param string $restrictionValue Nom du champ
2966     * @return mixed Valeur du champ
2967     */
2968     function getRestrictionValue($restrictionValue){
2969    
2970     // Initialisation de la valeur de retour
2971     $return = false;
2972    
2973     // Récupére les valeurs du dossier
2974     $value_dossier = $this->get_dossier_actual();
2975    
2976     //
2977     if (is_numeric($restrictionValue)) {
2978     $return = $restrictionValue;
2979     }elseif (isset($value_dossier[$restrictionValue])) {
2980     $return = $value_dossier[$restrictionValue];
2981     }elseif (isset($this->valF[$restrictionValue])) {
2982     $return = $this->valF[$restrictionValue];
2983     }
2984    
2985     // Retourne la valeur du champ
2986     return $return;
2987     }
2988    
2989 softime 6565
2990 mbroquet 3730 /**
2991 softime 17542 * Calcul une regle à partir des données de l'url et affiche son
2992     * résultat au format json
2993     */
2994     public function is_date_limite_notification_dossier_depasse() {
2995     // Récupération de la date limite
2996     $dossier = $this->f->get_inst__om_dbform(array(
2997     'obj' => 'dossier',
2998     'idx' => $this->getVal('dossier')
2999     ));
3000     $date_limite = $dossier->getVal('incomplet_notifie') !== 't' ?
3001     $dossier->getVal('date_limite') :
3002     $dossier->getVal('date_limite_incompletude');
3003     // Ajout d'un jour à la date limite (reglementaire lors de la notification
3004     // par demat)
3005     $date_limite = $this->f->mois_date($date_limite, "1", "+", "jour");
3006     // Compare la date limite à j+1 et la date du jour
3007     // La date du jour est récupérée via la fonction date pour pouvoir comparer
3008     // des timestamps de début de journée
3009     echo strtotime($date_limite) < strtotime(date("Y-m-d")) ? 'True' : 'False';
3010     }
3011    
3012     /**
3013 softime 6565 * Calcul des règle d'action selon leur type.
3014     *
3015     * Types de règle :
3016     * - date
3017     * - numeric
3018     * - text
3019     * - bool
3020     * - specific
3021     * - technical_data
3022 mbroquet 3730 *
3023 softime 6565 * @param string $rule Règle d'action.
3024     * @param string $rule_name Nom de la règle.
3025     * @param string $type Type de la règle.
3026     *
3027 mbroquet 3730 * @return mixed Résultat de la règle
3028     */
3029 softime 6565 public function regle($rule, $rule_name, $type = null) {
3030 mbroquet 3730
3031     // Supprime tous les espaces de la chaîne de caractère
3032     $rule = str_replace(' ', '', $rule);
3033 softime 17542 // On force les minuscules
3034     $rule = strtolower($rule);
3035 mbroquet 3730 // Coupe la chaîne au niveau de l'opérateur
3036     $operands = explode ("+", $rule);
3037     // Nombre d'opérande
3038     $nb_operands = count($operands);
3039    
3040     // Règle à null
3041     if ($rule == "null") {
3042     return null;
3043     }
3044    
3045     // Tableau des champs de type date
3046     $rule_type_date = array(
3047     "regle_date_limite",
3048     "regle_date_notification_delai",
3049     "regle_date_complet",
3050     "regle_date_validite",
3051     "regle_date_decision",
3052     "regle_date_chantier",
3053     "regle_date_achevement",
3054     "regle_date_conformite",
3055     "regle_date_rejet",
3056     "regle_date_dernier_depot",
3057     "regle_date_limite_incompletude",
3058 softime 6565 "regle_date_cloture_instruction",
3059     "regle_date_premiere_visite",
3060     "regle_date_derniere_visite",
3061     "regle_date_contradictoire",
3062     "regle_date_retour_contradictoire",
3063     "regle_date_ait",
3064     "regle_date_transmission_parquet",
3065 softime 8989 "regle_date_affichage",
3066 softime 17542 "duree_validite",
3067     "duree_validite_parametrage",
3068 mbroquet 3730 );
3069     // Tableau des champs de type numérique
3070     $rule_type_numeric = array(
3071 softime 17542 );
3072     // Tableau des champs de type text
3073     $rule_type_time_delai = array(
3074 mbroquet 3730 "regle_delai",
3075     "regle_delai_incompletude",
3076     );
3077 softime 6565 // Tableau des champs de type text
3078     $rule_type_text = array(
3079     );
3080     // Tableau des champs de type booléen
3081     $rule_type_bool = array(
3082 softime 10573 "regle_a_qualifier",
3083     "regle_incompletude",
3084     "regle_incomplet_notifie",
3085     "regle_evenement_suivant_tacite_incompletude",
3086 softime 6565 );
3087     // Tableau des champs spécifiques
3088     $rule_type_specific = array(
3089     "regle_autorite_competente",
3090     "regle_etat",
3091     "regle_accord_tacite",
3092     "regle_avis",
3093 softime 10573 "regle_pec_metier",
3094     "regle_etat_pendant_incompletude",
3095 softime 6565 );
3096     // Tableau des champs de données techniques
3097     $rule_type_technical_data = array(
3098     'regle_donnees_techniques1',
3099     'regle_donnees_techniques2',
3100     'regle_donnees_techniques3',
3101     'regle_donnees_techniques4',
3102     'regle_donnees_techniques5',
3103     );
3104 softime 8593 // Tableau des champs simple
3105     $rule_type_simple = array(
3106     "regle_dossier_instruction_type",
3107     );
3108 mbroquet 3730
3109     // Définit le type du champ
3110     if (in_array($rule_name, $rule_type_date) == true) {
3111     $type = "date";
3112     }
3113     if (in_array($rule_name, $rule_type_numeric) == true) {
3114     $type = "numeric";
3115     }
3116 softime 6565 if (in_array($rule_name, $rule_type_text) === true) {
3117     $type = "text";
3118     }
3119     if (in_array($rule_name, $rule_type_bool) === true) {
3120     $type = "bool";
3121     }
3122     if (in_array($rule_name, $rule_type_specific) === true) {
3123     $type = "specific";
3124     }
3125     if (in_array($rule_name, $rule_type_technical_data) === true) {
3126 softime 17542 $type = 'technical_text';
3127 softime 6565 }
3128 softime 8593 if (in_array($rule_name, $rule_type_simple) === true) {
3129     $type = 'simple';
3130     }
3131 softime 17542 if (in_array($rule_name, $rule_type_time_delai) === true) {
3132     $type = "time_delai";
3133     }
3134 mbroquet 3730
3135 softime 6565 // Si c'est un type spécifique ou booléen alors il n'a qu'un opérande
3136     // Récupère directement la valeur de l'opérande
3137 softime 10573 if ($type === 'specific') {
3138 softime 6565 //
3139     return $this->get_value_for_rule($rule);
3140     }
3141    
3142 mbroquet 3730 // Initialisation des variables
3143     $total_numeric = 0;
3144 softime 6565 $res_text = '';
3145 softime 17542 $final_date = 0;
3146 mbroquet 3730
3147     // Pour chaque opérande
3148     foreach ($operands as $key => $operand) {
3149     // Si c'est une règle de type date
3150     if ($type == 'date') {
3151 softime 17542 if (is_numeric($operand) === false){
3152     $rule_value = $this->get_value_for_rule($operand);
3153     if (
3154     $rule_value !== null
3155     && (
3156     strpos($operand, 'mois') !== false
3157     || strpos($operand, 'jour') !== false
3158     )
3159     ){
3160     $rule_value = $operand;
3161     }
3162     if ($rule_value !== null){
3163     // Vérifie si l'opérande est une date
3164     if ($this->f->check_date($rule_value) == true) {
3165     // Affecte la date
3166     $final_date = $rule_value;
3167     }else{
3168     // Gère les opérandes
3169     preg_match_all('/(\d+) *([a-zA-Z]*)/', $rule_value, $matches, PREG_OFFSET_CAPTURE);
3170    
3171     // Ajoute l'opérande au total
3172     foreach ($matches[1] as $matche_key => $matche_value) {
3173     $timelength = $matches[1][$matche_key][0];
3174     $timetype = 'mois';
3175     if ( $matches[2][$matche_key][0] != ''){
3176     $timetype = $matches[2][$matche_key][0];
3177     }
3178     // Ajout au calcul de la date
3179     $final_date = $this->f->mois_date(
3180     $final_date,
3181     $timelength,
3182     "+",
3183     $timetype
3184     );
3185     }
3186     }
3187     }
3188 mbroquet 3730 }
3189     // Les autres opérandes doivent être que des numériques
3190     if (is_numeric($operand) == true) {
3191     // Ajoute l'opérande au total
3192 softime 17542 // Ajout au calcul de la date
3193     $final_date = $this->f->mois_date($final_date,
3194     $operand, "+");
3195 mbroquet 3730 }
3196     }
3197    
3198     // Si c'est une règle de type numérique
3199     if ($type == 'numeric') {
3200     // Les opérandes doivent être que des numériques
3201     if (is_numeric($operand) == true) {
3202     // Ajoute l'opérande au total
3203     $total_numeric += $operand;
3204     }
3205 softime 6565 if (is_numeric($operand) === false
3206     && $this->get_value_for_rule($operand) !== null
3207     && is_numeric($this->get_value_for_rule($operand)) == true) {
3208 mbroquet 3730 // Ajoute l'opérande au total
3209 softime 6565 $total_numeric += $this->get_value_for_rule($operand);
3210 mbroquet 3730 }
3211     }
3212 softime 6565
3213     // Si c'est une règle de type text
3214 softime 17542 if ($type === 'text' || $type === 'technical_text') {
3215 softime 6565 // Concatène toutes les chaînes de caractère
3216     $res_text .= $this->get_value_for_rule($operand);
3217     }
3218 softime 17542
3219     // Si c'est une règle de type time_delai
3220     if ($type === 'time_delai') {
3221     $rule_value = $this->get_value_for_rule($operand);
3222     if ( strlen($res_text) != 0) {
3223     $res_text .= "+";
3224     }
3225     if ($rule_value != null && $rule_value != ''){
3226     // Supprime tous les espaces de la chaîne de caractère
3227     // Concatène toutes les chaînes de caractère
3228     $res_text .= $rule_value;
3229     } else {
3230     $res_text .= $operand;
3231     }
3232     }
3233    
3234 mbroquet 3730 }
3235    
3236     // Résultat pour une règle de type date
3237     if ($type == 'date') {
3238 softime 17542 // Retourne la date
3239     return $final_date;
3240 mbroquet 3730 }
3241    
3242     // Résultat pour une règle de type numérique
3243     if ($type == 'numeric') {
3244     // Retourne le calcul
3245     return $total_numeric;
3246     }
3247 softime 6565
3248     // Résultat pour une règle de type text
3249 softime 17542 if (in_array($type, array('text', 'technical_text')) === true) {
3250 softime 6565 // Retourne la chaîne de caractère
3251     return $res_text;
3252     }
3253 softime 17542
3254     // Résultat pour une règle de type text
3255     if (in_array($type, array('time_delai')) === true) {
3256     // Traitement de la valeur à afficher
3257     $res_text = str_replace(' ', '', $res_text);
3258     $res_text = preg_replace('/(\d+)/', '$1 ', $res_text);
3259     $res_text = preg_replace('/(\+)/', ' $1 ', $res_text);
3260     $res_text = trim(preg_replace('/\s\s+/', ' ', strtolower($res_text)));
3261     return $res_text;
3262     }
3263    
3264 softime 10573 if ($type === 'simple' || $type === 'bool') {
3265 softime 8593 // Retourne la valeur du champs rule
3266     return $rule;
3267     }
3268 softime 6565 }
3269    
3270    
3271     /**
3272     * Récupère la valeur du champs dans l'instruction ou dans les données
3273     * techniques.
3274     * Spécifique au calcul des règles.
3275     *
3276     * @param string $field Champ
3277     *
3278     * @return mixed Valeur du champ
3279     */
3280     private function get_value_for_rule($field) {
3281     // Si le champ n'existe pas dans la table instruction
3282     if (array_key_exists($field, $this->valF) === false) {
3283     // Récupère l'instance de la classe donnees_techniques
3284     $inst_donnees_techniques = $this->get_inst_donnees_techniques();
3285     // Retourne la valeur de la donnée technique
3286     return $inst_donnees_techniques->getVal($field);
3287     }
3288    
3289     //
3290     return $this->valF[$field];
3291     }
3292    
3293    
3294     /**
3295     * [get_inst_donnees_techniques description]
3296     *
3297     * @param [type] $donnees_techniques [description]
3298     *
3299     * @return [type] [description]
3300     */
3301     function get_inst_donnees_techniques($donnees_techniques = null) {
3302     //
3303     if (isset($this->inst_donnees_techniques) === false or
3304     $this->inst_donnees_techniques === null) {
3305     //
3306     if (is_null($donnees_techniques)) {
3307     $donnees_techniques = $this->getDonneesTechniques();
3308     }
3309     //
3310 softime 7996 $this->inst_donnees_techniques = $this->f->get_inst__om_dbform(array(
3311     "obj" => "donnees_techniques",
3312     "idx" => $donnees_techniques,
3313     ));
3314 softime 6565 }
3315     //
3316     return $this->inst_donnees_techniques;
3317     }
3318    
3319    
3320     /**
3321     * Retourne l'identifiant des données techniques liées du dossier
3322     * @return string L'identifiant des données techniques liées du dossier
3323     */
3324     function getDonneesTechniques() {
3325 softime 14064
3326     $qres = $this->f->get_one_result_from_db_query(
3327     sprintf(
3328     'SELECT
3329     donnees_techniques
3330     FROM
3331     %1$sdonnees_techniques
3332     WHERE
3333     dossier_instruction = \'%2$s\'',
3334     DB_PREFIXE,
3335     $this->f->db->escapeSimple($this->valF["dossier"])
3336     ),
3337     array(
3338     "origin" => __METHOD__,
3339     )
3340     );
3341 mbroquet 3730
3342 softime 14064 return $qres['result'];
3343 mbroquet 3730 }
3344    
3345 fmichon 4708 /**
3346     * TRIGGER - triggerajouterapres.
3347     *
3348     * - Mise à jour des informations liées au workflow sur le dossier
3349     * - Interface avec le référentiel ERP [105][111]
3350     * - Mise à jour du DA
3351     * - Historisation de la vie du DI
3352     *
3353     * @return boolean
3354     */
3355 softime 8989 function triggerajouterapres($id, &$dnu1 = null, $val = array(), $dnu2 = null) {
3356     $this->addToLog(__METHOD__."(): start", EXTRA_VERBOSE_MODE);
3357 softime 17542 $data = array('val' => &$val, 'id' => $id);
3358     $this->f->module_manager->run_hooks('triggerajouterapres_pre', $this, $data);
3359 fmichon 4708
3360     // On a besoin de l'instance du dossier lié à l'événement d'instruction
3361     $inst_di = $this->get_inst_dossier($this->valF['dossier']);
3362     // Instance de la classe evenement
3363     $inst_evenement = $this->get_inst_evenement($this->valF['evenement']);
3364 softime 9245 // Instance de l'état courant du dossier d'instruction
3365     $inst_current_etat = $this->f->get_inst__om_dbform(array(
3366     "obj" => "etat",
3367     "idx" => $inst_di->get_id_etat(),
3368     ));
3369 fmichon 4708
3370 mbroquet 3730 /**
3371     * Mise à jour des valeurs du dossier en fonction des valeurs calculées
3372     * par l'action
3373     */
3374 fmichon 4708 // état de complétude actuel du dossier
3375     $incompletude = ($inst_di->getVal('incompletude') == 't' ? true : false);
3376 softime 10573 // L'événement suivant tacite paramétré est destiné à la gestion de l'incomplétude
3377     $ev_suiv_tacite_incompletude = false;
3378 mbroquet 3730 // Initialisation
3379 softime 9245 $valF = array();
3380     $valF_dt = array();
3381 fmichon 4708 //
3382 mbroquet 3730 // Récupération des paramètres de l'action
3383 softime 14542 // TODO : remplacer cette requête par l'instanciation de l'action
3384     $qres = $this->f->get_all_results_from_db_query(
3385     sprintf(
3386     'SELECT
3387     *
3388     FROM
3389     %1$saction
3390     WHERE
3391     action = \'%2$s\'',
3392     DB_PREFIXE,
3393     $this->f->db->escapeSimple($this->valF['action'])
3394     ),
3395     array(
3396     "origin" => __METHOD__
3397     )
3398     );
3399     foreach ($qres['result'] as $row) {
3400 mbroquet 3730
3401     // pour chacune des regles, on applique la regle
3402 softime 6565 if ($row['regle_delai'] != '') {
3403 mbroquet 3730 $valF['delai'] = $this->regle($row['regle_delai'], 'regle_delai');
3404     }
3405 softime 6565 if ($row['regle_accord_tacite'] != '') {
3406 mbroquet 3730 $valF['accord_tacite'] = $this->regle($row['regle_accord_tacite'], 'regle_accord_tacite');
3407     }
3408 softime 6565 if ($row['regle_avis'] != '') {
3409 mbroquet 3730 $valF['avis_decision'] = $this->regle($row['regle_avis'], 'regle_avis');
3410     }
3411 softime 6565 if ($row['regle_date_limite'] != '') {
3412     $valF['date_limite'] = $this->regle($row['regle_date_limite'], 'regle_date_limite');
3413 mbroquet 3730 }
3414 softime 6565 if ($row['regle_date_complet'] != '') {
3415     $valF['date_complet'] = $this->regle($row['regle_date_complet'], 'regle_date_complet');
3416 mbroquet 3730 }
3417 softime 6565 if ($row['regle_date_dernier_depot'] != '') {
3418     $valF['date_dernier_depot'] = $this->regle($row['regle_date_dernier_depot'], 'regle_date_dernier_depot');
3419 mbroquet 3730 }
3420 softime 6565 if ($row['regle_date_notification_delai'] != '') {
3421     $valF['date_notification_delai'] = $this->regle($row['regle_date_notification_delai'], 'regle_date_notification_delai');
3422 mbroquet 3730 }
3423 softime 6565 if ($row['regle_date_decision'] != '') {
3424     $valF['date_decision'] = $this->regle($row['regle_date_decision'], 'regle_date_decision');
3425 mbroquet 3730 }
3426 softime 6565 if ($row['regle_date_rejet'] != '') {
3427     $valF['date_rejet'] = $this->regle($row['regle_date_rejet'], 'regle_date_rejet');
3428 mbroquet 3730 }
3429 softime 6565 if ($row['regle_date_validite'] != '') {
3430     $valF['date_validite'] = $this->regle($row['regle_date_validite'], 'regle_date_validite');
3431 mbroquet 3730 }
3432 softime 6565 if ($row['regle_date_chantier'] != '') {
3433     $valF['date_chantier'] = $this->regle($row['regle_date_chantier'], 'regle_date_chantier');
3434 mbroquet 3730 }
3435 softime 6565 if ($row['regle_date_achevement'] != '') {
3436     $valF['date_achevement'] = $this->regle($row['regle_date_achevement'], 'regle_date_achevement');
3437 mbroquet 3730 }
3438 softime 6565 if ($row['regle_date_conformite'] != '') {
3439     $valF['date_conformite'] = $this->regle($row['regle_date_conformite'], 'regle_date_conformite');
3440 mbroquet 3730 }
3441 softime 6565 if ($row['regle_date_limite_incompletude'] != '') {
3442     $valF['date_limite_incompletude'] = $this->regle($row['regle_date_limite_incompletude'], 'regle_date_limite_incompletude');
3443 mbroquet 3730 }
3444 softime 6565 if ($row['regle_delai_incompletude'] != '') {
3445     $valF['delai_incompletude'] = $this->regle($row['regle_delai_incompletude'], 'regle_delai_incompletude');
3446 mbroquet 3730 }
3447 softime 6565 if ($row['regle_autorite_competente'] != '') {
3448     $valF['autorite_competente'] = $this->regle($row['regle_autorite_competente'], 'regle_autorite_competente');
3449 mbroquet 3730 }
3450 softime 6565 if ($row['regle_etat'] != '') {
3451 softime 10573 $valF['etat'] = $this->regle($row['regle_etat'], 'regle_etat');
3452 mbroquet 3730 }
3453 softime 6565 if ($row['regle_date_cloture_instruction'] !== '') {
3454     $valF['date_cloture_instruction'] = $this->regle($row['regle_date_cloture_instruction'], 'regle_date_cloture_instruction');
3455     }
3456     if ($row['regle_date_premiere_visite'] !== '') {
3457     $valF['date_premiere_visite'] = $this->regle($row['regle_date_premiere_visite'], 'regle_date_premiere_visite');
3458     }
3459     if ($row['regle_date_derniere_visite'] !== '') {
3460     $valF['date_derniere_visite'] = $this->regle($row['regle_date_derniere_visite'], 'regle_date_derniere_visite');
3461     }
3462     if ($row['regle_date_contradictoire'] !== '') {
3463     $valF['date_contradictoire'] = $this->regle($row['regle_date_contradictoire'], 'regle_date_contradictoire');
3464     }
3465     if ($row['regle_date_retour_contradictoire'] !== '') {
3466     $valF['date_retour_contradictoire'] = $this->regle($row['regle_date_retour_contradictoire'], 'regle_date_retour_contradictoire');
3467     }
3468     if ($row['regle_date_ait'] !== '') {
3469     $valF['date_ait'] = $this->regle($row['regle_date_ait'], 'regle_date_ait');
3470     }
3471     if ($row['regle_donnees_techniques1'] !== '') {
3472     $valF_dt[$row['cible_regle_donnees_techniques1']] = $this->regle($row['regle_donnees_techniques1'], 'regle_donnees_techniques1');
3473     }
3474     if ($row['regle_donnees_techniques2'] !== '') {
3475     $valF_dt[$row['cible_regle_donnees_techniques2']] = $this->regle($row['regle_donnees_techniques2'], 'regle_donnees_techniques2');
3476     }
3477     if ($row['regle_donnees_techniques3'] !== '') {
3478     $valF_dt[$row['cible_regle_donnees_techniques3']] = $this->regle($row['regle_donnees_techniques3'], 'regle_donnees_techniques3');
3479     }
3480     if ($row['regle_donnees_techniques4'] !== '') {
3481     $valF_dt[$row['cible_regle_donnees_techniques4']] = $this->regle($row['regle_donnees_techniques4'], 'regle_donnees_techniques4');
3482     }
3483     if ($row['regle_donnees_techniques5'] !== '') {
3484     $valF_dt[$row['cible_regle_donnees_techniques5']] = $this->regle($row['regle_donnees_techniques5'], 'regle_donnees_techniques5');
3485     }
3486     if ($row['regle_date_transmission_parquet'] !== '') {
3487     $valF['date_transmission_parquet'] = $this->regle($row['regle_date_transmission_parquet'], 'regle_date_transmission_parquet');
3488     }
3489 softime 8593 if ($row['regle_dossier_instruction_type'] !== '') {
3490     $valF['dossier_instruction_type'] = $this->regle($row['regle_dossier_instruction_type'], 'regle_dossier_instruction_type');
3491     }
3492 softime 8989 // La date d'affichage est modifiée seulement si le champ n'est pas
3493     // renseigné
3494     if ($row['regle_date_affichage'] !== ''
3495     && ($inst_di->getVal('date_affichage') === ''
3496     || $inst_di->getVal('date_affichage') === null)) {
3497     //
3498     $valF['date_affichage'] = $this->regle($row['regle_date_affichage'], 'regle_date_affichage');
3499     }
3500 softime 10573 //
3501     if ($row['regle_pec_metier'] != '') {
3502     $valF['pec_metier'] = $this->regle($row['regle_pec_metier'], 'regle_pec_metier');
3503     }
3504     if ($row['regle_a_qualifier'] != '') {
3505     $valF['a_qualifier'] = $this->regle($row['regle_a_qualifier'], 'regle_a_qualifier');
3506     }
3507     //
3508     if ($row['regle_incompletude'] != '') {
3509     $valF['incompletude'] = $this->regle($row['regle_incompletude'], 'regle_incompletude');
3510     }
3511     if ($row['regle_incomplet_notifie'] != '') {
3512     $valF['incomplet_notifie'] = $this->regle($row['regle_incomplet_notifie'], 'regle_incomplet_notifie');
3513     }
3514     if ($row['regle_etat_pendant_incompletude'] != '') {
3515     $valF['etat_pendant_incompletude'] = $this->regle($row['regle_etat_pendant_incompletude'], 'regle_etat_pendant_incompletude');
3516     }
3517     if ($row['regle_evenement_suivant_tacite_incompletude'] != '') {
3518     $resti = $this->regle($row['regle_evenement_suivant_tacite_incompletude'], 'regle_evenement_suivant_tacite_incompletude');
3519     if (strtolower($resti) === 't' || strtolower($resti) === 'true') {
3520     $ev_suiv_tacite_incompletude = true;
3521     }
3522     }
3523 mbroquet 3730 }
3524 softime 6063
3525     // Si l'événement a un événement suivant tacite
3526     if($inst_evenement->getVal('evenement_suivant_tacite') != '') {
3527 softime 10573 // En fonction de l'action de l'événement, l'événement suivant tacite ne sera
3528     // pas associé de le même façon au dossier d'instruction
3529     if ($ev_suiv_tacite_incompletude === false) {
3530 softime 6063 $valF['evenement_suivant_tacite'] = $inst_evenement->getVal('evenement_suivant_tacite');
3531 softime 10573 }
3532     if ($ev_suiv_tacite_incompletude === true) {
3533 softime 6063 $valF['evenement_suivant_tacite_incompletude'] = $inst_evenement->getVal('evenement_suivant_tacite');
3534 nhaye 5254 }
3535 mbroquet 3730 }
3536 softime 6565 // Si des valeurs de données techniques ont été calculées alors on met à jour l'enregistrement
3537 softime 9245 if (count($valF_dt) > 0) {
3538 softime 6565 $dt_id = $this->getDonneesTechniques();
3539     // On met à jour le dossier
3540     $cle = " donnees_techniques='".$dt_id."'";
3541 softime 12847 $res1 = $this->f->db->autoexecute(DB_PREFIXE.'donnees_techniques', $valF_dt, DB_AUTOQUERY_UPDATE, $cle);
3542     $this->addToLog(
3543     __METHOD__."(): db->autoexecute(\"".DB_PREFIXE."donnees_techniques\", ".print_r($valF_dt, true).", DB_AUTOQUERY_UPDATE, \"".$cle."\");",
3544     VERBOSE_MODE
3545     );
3546     $this->f->isDatabaseError($res1);
3547 softime 6565 // Affichage d'informations à l'utilisateur
3548 softime 8989 $this->addToMessage(_('enregistrement')." ".$this->valF['dossier']." "._('table')." dossier [".$this->f->db->affectedRows()." "._('enregistrement')." "._('mis_a_jour')."]");
3549 softime 6565 }
3550 mbroquet 3730 // Si des valeurs ont été calculées alors on met à jour l'enregistrement
3551 softime 9245 if (count($valF) > 0) {
3552 softime 10573 //
3553     $inst_dossier = $this->f->get_inst__om_dbform(array(
3554     "obj" => "dossier",
3555     "idx" => $this->valF['dossier'],
3556     ));
3557     $valF['instruction'] = $id;
3558 softime 10968 $valF['crud'] = 'create';
3559 softime 10573 $update_by_instruction = $inst_dossier->update_by_instruction($valF);
3560     if ($update_by_instruction === false) {
3561     $this->cleanMessage();
3562     $this->addToMessage(sprintf('%s %s', __("Une erreur s'est produite lors de la mise à jour du dossier d'instruction."), __("Veuillez contacter votre administrateur.")));
3563     return false;
3564 mbroquet 3730 }
3565     // Affichage d'informations à l'utilisateur
3566 softime 8989 $this->addToMessage(_('enregistrement')." ".$this->valF['dossier']." "._('table')." dossier [".$this->f->db->affectedRows()." "._('enregistrement')." "._('mis_a_jour')."]");
3567 mbroquet 3730 }
3568    
3569     /**
3570 fmichon 4708 * Interface avec le référentiel ERP.
3571     *
3572     * (WS->ERP)[105] Arrêté d'un dossier PC effectué -> PC qui concerne un ERP
3573     * (WS->ERP)[111] Décision de conformité effectuée -> PC qui concerne un ERP
3574     * Déclencheur :
3575     * - L'option ERP est activée
3576     * - Le dossier est marqué comme "connecté au référentiel ERP"
3577     * - Le dossier est de type PC
3578     * - Le formulaire d'ajout d'un événement d'instruction est validé
3579     * avec un événement pour lequel les services ERP doivent être
3580     * informé
3581 mbroquet 3730 */
3582 fmichon 4708 //
3583 softime 7521 if ($this->f->is_option_referentiel_erp_enabled() === true
3584 fmichon 4708 && $inst_di->is_connected_to_referentiel_erp() === true
3585     && $this->f->getDATCode($this->valF['dossier']) == $this->f->getParameter('erp__dossier__nature__pc')
3586     && in_array($inst_evenement->getVal($inst_evenement->clePrimaire), explode(";", $this->f->getParameter('erp__evenements__decision__pc')))) {
3587 mbroquet 3730 //
3588 fmichon 4708 $infos = array(
3589     "dossier_instruction" => $this->valF['dossier'],
3590     "decision" => $inst_evenement->getVal("libelle"),
3591     );
3592 mbroquet 3730 //
3593 fmichon 4708 $ret = $this->f->send_message_to_referentiel_erp(105, $infos);
3594     if ($ret !== true) {
3595     $this->cleanMessage();
3596     $this->addToMessage(_("Une erreur s'est produite lors de la notification (105) du référentiel ERP. Contactez votre administrateur."));
3597     return false;
3598 mbroquet 3730 }
3599 fmichon 4708 $this->addToMessage(_("Notification (105) du référentiel ERP OK."));
3600     }
3601 mbroquet 3730
3602 softime 8989 // Si le mode en rédaction intégrale est activé
3603     if (isset($this->valF['flag_edition_integrale']) === true
3604     && $this->valF['flag_edition_integrale'] === true) {
3605     $redactionIntegraleValF = array();
3606    
3607     // Récupère la collectivite du dossier d'instruction
3608     $dossier_instruction_om_collectivite = $this->get_dossier_instruction_om_collectivite();
3609     $collectivite = $this->f->getCollectivite($dossier_instruction_om_collectivite);
3610     // Récupère le corps de la lettre type
3611     $params = array(
3612     "specific" => array(
3613     "corps" => array(
3614     "mode" => "get",
3615     )
3616     ),
3617     );
3618     $result = $this->compute_pdf_output('lettretype', $this->valF['lettretype'], $collectivite, $id, $params);
3619     $redactionIntegraleValF['corps_om_htmletatex'] = $result['pdf_output'];
3620     // Récupère le titre de la lettre type
3621     $params = array(
3622     "specific" => array(
3623     "titre" => array(
3624     "mode" => "get",
3625     )
3626     ),
3627     );
3628     $result = $this->compute_pdf_output('lettretype', $this->valF['lettretype'], $collectivite, $id, $params);
3629     $redactionIntegraleValF['titre_om_htmletat'] = $result['pdf_output'];
3630    
3631     // mise à jour en base de données
3632     $res = $this->f->db->autoExecute(
3633     DB_PREFIXE.$this->table,
3634     $redactionIntegraleValF,
3635     DB_AUTOQUERY_UPDATE,
3636     $this->clePrimaire."=".$id
3637     );
3638     $this->addToLog(__METHOD__."(): db->autoexecute(\"".DB_PREFIXE.'.'.$this->table."\", ".print_r($redactionIntegraleValF, true).", DB_AUTOQUERY_UPDATE, \"".$this->clePrimaire."=".$id."\");", VERBOSE_MODE);
3639     if ($this->f->isDatabaseError($res, true) === true) {
3640     return false;
3641     }
3642     }
3643    
3644 fmichon 4708 /**
3645 softime 7996 * Finalisation automatique de l'instruction si le paramétrage de l'événement l'autorise
3646     */
3647     // Si la finalisation automatique de l'événement est activée
3648     // ET si l'instruction n'a pas déjà été finalisée
3649     // ET s'il existe une lettre type associée
3650     if ($inst_evenement->getVal('finaliser_automatiquement') === 't'
3651     && $inst_evenement->getVal('om_final_instruction') !== 't'
3652     && $inst_evenement->getVal('lettretype') !== ''
3653     && $inst_evenement->getVal('lettretype') !== null) {
3654    
3655     // On instancie l'instruction
3656     $inst_instruction = $this->f->get_inst__om_dbform(array(
3657     "obj" => "instruction",
3658     "idx" => $this->valF[$this->clePrimaire],
3659     ));
3660    
3661     // On finalise l'instruction dans le contexte de finalisation : action 100
3662     $inst_instruction->setParameter('maj', 100);
3663     $finalize = $inst_instruction->finalize($inst_instruction->valF);
3664    
3665     // Une erreur de finalisation renvoie 'false' : ajout dans les logs
3666     // et dans le message d'erreur
3667     if ($finalize === false) {
3668     $this->f->addToLog(__METHOD__."() : ERROR - Impossible de finaliser l'instruction.", DEBUG_MODE);
3669     $this->addToMessage(_("Erreur lors de la finalisation de l'instruction. Contactez votre administrateur."));
3670     return false;
3671     }
3672     }
3673    
3674     /**
3675 softime 7521 * Finalisation automatique des instructions tacites ou retours.
3676     */
3677 softime 7685 // Si l'option de finalisation automatique des instructions tacites ou
3678     // retours est activée et l'événement d'instruction a une lettre type
3679     // associée
3680     $collectivite_di = $this->get_dossier_instruction_om_collectivite($val['dossier']);
3681     if ($this->f->is_option_finalisation_auto_enabled($collectivite_di) === true
3682     && $inst_evenement->getVal('lettretype') !== ''
3683 softime 7521 && $inst_evenement->getVal('lettretype') !== null) {
3684    
3685     // Rècupère l'identifiant de l'événement
3686     $evenement_id = $inst_evenement->getVal($inst_evenement->clePrimaire);
3687    
3688     // Si l'événement d'instruction est identifié comme un événement
3689     // retour
3690     // OU l'événement d'instruction est l'événement suivant tacite du
3691     // dossier d'instruction (incomplétude prise en compte)
3692 softime 7996 // ET l'événement d'instruction n'a pas déjà été finalisé
3693     if (($inst_evenement->getVal("retour") === 't'
3694 softime 7521 || ($inst_di->getVal('evenement_suivant_tacite_incompletude') === $evenement_id
3695 softime 7996 || $inst_di->getVal('evenement_suivant_tacite') === $evenement_id))
3696     && ($inst_evenement->getVal('om_final_instruction') !== 't')) {
3697 softime 7521
3698     // Finalise l'instruction
3699 softime 7996 $inst_instruction = $this->f->get_inst__om_dbform(array(
3700     "obj" => "instruction",
3701     "idx" => $this->valF[$this->clePrimaire],
3702     ));
3703 softime 7521 $inst_instruction->setParameter('maj', 100);
3704     $finalize = $inst_instruction->finalize($inst_instruction->valF);
3705     if ($finalize === false) {
3706     //
3707     return false;
3708     }
3709     }
3710     }
3711    
3712     /**
3713 softime 9245 * Mise à jour de la version de clôture *version_clos* du dossier si et
3714     * seulement si l'instruction met à jour l'état du dossier.
3715     */
3716     if (isset($valF['etat']) === true
3717     && $valF['etat'] !== null
3718     && $valF['etat'] !== '') {
3719     // Instanciation de l'état appliqué sur le dossier par l'instruction
3720     $inst_etat = $this->f->get_inst__om_dbform(array(
3721     "obj" => "etat",
3722     "idx" => $valF['etat'],
3723     ));
3724     //
3725     $update_version_clos = null;
3726     // En cas d'instruction qui clôture le dossier
3727     if ($inst_etat->getVal('statut') === 'cloture') {
3728     $update_version_clos = $inst_di->update_version_clos('up');
3729     }
3730     // En cas d'instruction qui rouvre le dossier
3731     if ($inst_current_etat->getVal('statut') === 'cloture'
3732     && $inst_etat->getVal('statut') !== 'cloture') {
3733     //
3734     $update_version_clos = $inst_di->update_version_clos('down');
3735     //
3736     $params = array(
3737     'di_reopened' => true,
3738     );
3739     }
3740     //
3741     if ($update_version_clos === false) {
3742     $this->f->addToLog(sprintf(
3743     "%s() : ERREUR - %s %s",
3744     __METHOD__,
3745     sprintf(
3746     __("Impossible de mettre à jour la version de clôture du dossier d'instruction %s."),
3747     $inst_di->getVal($inst_di->clePrimaire)
3748     ),
3749     sprintf(
3750     __("L'instruction tente d'appliquer l'état %s."),
3751     $inst_etat->getVal($inst_etat->clePrimaire)
3752     )
3753     ));
3754     $this->addToMessage(sprintf(
3755     "%s %s",
3756     __("Erreur lors de la mise à jour de la version de clôture du dossier d'instruction."),
3757     __("Veuillez contacter votre administrateur.")
3758     ));
3759     return false;
3760     }
3761     }
3762    
3763     /**
3764 softime 10808 * Notification automatique
3765     */
3766     // Notification automatique à l'ajout de l'instruction si la notification
3767     // automatique est choisie et qu'il n'y a pas de lettretype associée à l'événement
3768     if ($inst_evenement->getVal('notification') === 'notification_automatique' &&
3769     ($inst_evenement->getVal('lettretype') === null ||
3770     $inst_evenement->getVal('lettretype') === '')) {
3771 softime 13137 // Message à afficher dans les logs pour indiquer quelle notification a échouée
3772 softime 13528 $msgLog = sprintf(
3773     '%s %s : %d',
3774     __('Erreur lors de la notification automatique du(des) pétitionnaire(s).'),
3775     __('Instruction notifiée'),
3776     $id
3777     );
3778 softime 13137
3779 softime 10808 // Récupération de la liste des demandeurs à notifier et de la catégorie
3780     $categorie = $this->f->get_param_option_notification($collectivite_di);
3781 softime 14064 $isPortal = $categorie === PORTAL;
3782 softime 10869 $demandeursANotifie = $this->get_demandeurs_notifiable(
3783     $this->valF['dossier'],
3784     $isPortal
3785     );
3786 softime 10808
3787     // Création d'une notification et d'une tâche pour chaque demandeur à notifier
3788 softime 12124 $demandeurPrincipalNotifie = false;
3789 softime 10808 foreach ($demandeursANotifie as $demandeur) {
3790 softime 12124 // Identifie si le demandeur principal a été notifié ou pas
3791     // et récupère ses informations
3792     if ($demandeur['petitionnaire_principal'] == 't') {
3793     $demandeurPrincipalNotifie = true;
3794     // Si le demandeur principal est notifiable mais qu'il y a des erreurs dans
3795     // son paramétrage, on effectue pas le traitement et on passe à l'itération
3796     // suivante. On le considère également comme non notifié pour gérer l'envoie
3797     // des messages d'erreurs
3798     // Si la demande a été déposée via le portail alors le paramétrage n'a pas
3799     // d'impact sur la notification
3800     $erreursParam = $this->get_info_notification_fail($val['dossier']);
3801     if (! $this->dossier_depose_sur_portail($val['dossier']) && $erreursParam != array()) {
3802     $demandeurPrincipalNotifie = false;
3803     continue;
3804     }
3805     }
3806 softime 10808 // Ajout de la notif et récupération de son id
3807     $idNotif = $this->ajouter_notification(
3808     $this->valF[$this->clePrimaire],
3809     $this->f->get_connected_user_login_name(),
3810 softime 10968 $demandeur,
3811     $collectivite_di,
3812 softime 12433 array(),
3813 softime 10968 true
3814 softime 10808 );
3815     if ($idNotif === false) {
3816 softime 13528 $this->addToLog(
3817     sprintf('%s() : %s', __METHOD__, $msgLog),
3818     DEBUG_MODE
3819     );
3820 softime 10808 return false;
3821     }
3822     // Création de la tache en lui donnant l'id de la notification
3823     $notification_by_task = $this->notification_by_task(
3824     $idNotif,
3825     $this->valF['dossier'],
3826     $categorie
3827     );
3828     if ($notification_by_task === false) {
3829 softime 13528 $this->addToLog(
3830     sprintf('%s() : %s', __METHOD__, $msgLog),
3831     DEBUG_MODE
3832     );
3833 softime 10808 $this->addToMessage(
3834     __("Erreur lors de la génération de la notification au(x) pétitionnaire(s).")
3835     );
3836     return false;
3837     }
3838     }
3839 softime 12847 // Pour la notification par mail ou la notification via portal si le dossier a
3840     // été déposés via portal, si le demandeur principal n'est pas notifiable,
3841     // on créé une nouvelle notification en erreur avec en commentaire la raison pour
3842     // laquelle le demandeur principal n'a pas pu être notifié
3843     $depotPortal = $this->dossier_depose_sur_portail();
3844     if (! $demandeurPrincipalNotifie && ($isPortal === false || $depotPortal === true)) {
3845 softime 13137 // Précision dans les logs que le pétitionnaire principal n'est pas notifiable.
3846     // ' ' permet de mettre un espace entre les 2 msg de log.
3847 softime 13528 $msgLog .= sprintf(' %s', __('Le pétitionnaire principale n\'est pas notifiable.'));
3848 softime 12124 // Analyse pour savoir pourquoi le demandeur principal n'est pas notifiable
3849     $erreursParam = $this->get_info_notification_fail($val['dossier']);
3850     $demandeurPrincipal = $this->get_info_petitionnaire_principal_dossier($val['dossier']);
3851     // Ajout de la notif et récupération de son id
3852     $idNotif = $this->ajouter_notification(
3853     $this->valF[$this->clePrimaire],
3854     $this->f->get_connected_user_login_name(),
3855     $demandeurPrincipal,
3856     $collectivite_di,
3857 softime 12433 array(),
3858 softime 12124 true,
3859     'Echec',
3860     implode(' ', $erreursParam)
3861     );
3862     if ($idNotif === false) {
3863 softime 13528 $this->addToLog(
3864     sprintf('%s() : %s', __METHOD__, $msgLog),
3865     DEBUG_MODE
3866     );
3867 softime 12124 $this->addToMessage(
3868     __('Erreur : la création de la notification a échouée.').
3869     __("Veuillez contacter votre administrateur.")
3870     );
3871     return false;
3872     }
3873     // Prépare un message d'alerte à destination de l'instructeur pour l'informer
3874     // de l'échec de la notification
3875     $dossier_message = $this->get_inst_dossier_message(0);
3876     $dossier_message_val = array(
3877     'dossier' => $val['dossier'],
3878     'type' => _('erreur expedition'),
3879     'emetteur' => $this->f->get_connected_user_login_name().' (automatique)',
3880     'login' => $_SESSION['login'],
3881     'date_emission' => date('Y-m-d H:i:s'),
3882     'contenu' => _('Échec lors de la notification de l\'instruction ').
3883     $inst_evenement->getVal('libelle').
3884     '.<br>'.
3885     implode("\n", $erreursParam).
3886     '<br>'.
3887     _('Veuillez corriger ces informations avant de renvoyer la notification.')
3888     );
3889     $add = $dossier_message->add_notification_message($dossier_message_val, true);
3890     // Si une erreur se produit pendant l'ajout
3891     if ($add !== true) {
3892     $this->addToLog(__METHOD__."(): Le message d'alerte concernant l'echec de l'envoi de la notification n'a pas pu être envoyé.", DEBUG_MODE);
3893     return false;
3894     }
3895     }
3896 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.")));
3897     }
3898    
3899 softime 12654 // Notification automatique en cas de dépôt de dossier dématérialisé
3900     // Vérifie si l'option de notification est active et si il s'agit bien d'une
3901     // instruction de récépissé
3902     if (
3903     $this->f->is_option_notification_depot_demat_enabled($collectivite_di)
3904     && $this->is_instruction_recepisse()
3905     ) {
3906 softime 13137 // Message à afficher dans les logs pour indiquer quelle notification a échouée
3907 softime 13528 $msgLog = sprintf(
3908     __('Erreur lors de la notification de dépôt du dossier dématérialisé : %s.'),
3909     $val['dossier']
3910     );
3911 softime 12654 // Récupère l'instance de la demande
3912     $demande = $inst_di->get_inst_demande();
3913 softime 13137 // Vérifie que le dossier a été déposé via platau ou portal
3914 softime 12654 if (
3915 softime 13137 ($demande->getVal('source_depot') == PLATAU ||
3916     $demande->getVal('source_depot') == PORTAL)
3917 softime 12654 ) {
3918 softime 13137 // Récupère la liste des mails fournis en paramètre. Si aucun adresse n'a été récupéré
3919     // l'envoi de la notification n'est pas effectué et un message d'erreur est affiché.
3920     $listeEmails = $this->f->get_param_courriel_de_notification_commune($collectivite_di);
3921     if (empty($listeEmails)) {
3922     $this->addToLog(
3923 softime 13528 sprintf(
3924     '%s(): %s %s',
3925     __METHOD__,
3926     $msgLog,
3927     __('Aucun courriel paramétré.')
3928     ),
3929 softime 13137 DEBUG_MODE
3930 softime 12654 );
3931 softime 13137 } else {
3932     foreach ($listeEmails as $email) {
3933     // Ajout de la notif et récupération de son id
3934     $destinataire = array(
3935     'destinataire' => $email,
3936     'courriel' => $email
3937 softime 12654 );
3938 softime 13137 $idNotif = $this->ajouter_notification(
3939     $this->valF[$this->clePrimaire],
3940     $this->f->get_connected_user_login_name(),
3941     $destinataire,
3942     $collectivite_di,
3943     array(),
3944     true
3945     );
3946     if ($idNotif === false) {
3947 softime 13528 $this->addToLog(
3948     sprintf('%s(): %s', __METHOD__, $msgLog),
3949     DEBUG_MODE
3950     );
3951 softime 13137 return false;
3952     }
3953     // Création de la tache en lui donnant l'id de la notification
3954     $notification_by_task = $this->notification_by_task(
3955     $idNotif,
3956     $this->valF['dossier'],
3957     'mail',
3958     'notification_depot_demat'
3959     );
3960     if ($notification_by_task === false) {
3961     $this->addToMessage(
3962     __("Erreur lors de la génération de la notification de dépot de dossier par voie dématérialisée.")
3963     );
3964 softime 13528 $this->addToLog(
3965     sprintf('%s(): %s', __METHOD__, $msgLog),
3966     DEBUG_MODE
3967     );
3968 softime 13137 return false;
3969     }
3970 softime 12654 }
3971     }
3972     }
3973     }
3974    
3975 softime 10808 /**
3976 softime 7996 * Mise à jour de la date de dernière modification du dossier
3977     */
3978     $inst_di->update_last_modification_date();
3979    
3980     /**
3981 softime 8640 * Mise à jour des données du DA.
3982     */
3983     $inst_da = $inst_di->get_inst_dossier_autorisation();
3984 softime 9245 $params['di_id'] = $this->valF['dossier'];
3985 softime 8640 if ($inst_da->majDossierAutorisation($params) === false) {
3986     $this->addToMessage(_("Erreur lors de la mise a jour des donnees du dossier d'autorisation. Contactez votre administrateur."));
3987     $this->correct = false;
3988     return false;
3989     }
3990    
3991     /**
3992 fmichon 4708 * Historisation de la vie du DI.
3993     */
3994 softime 17542
3995     $res = $this->add_log_to_dossier($id, array_merge($val, $this->valF));
3996    
3997     $data = array('val' => &$val, 'id' => $id, 'result' => &$res);
3998     $this->f->module_manager->run_hooks('triggerajouterapres_post', $this, $data);
3999     return $res;
4000 nmeucci 3876 }
4001 mbroquet 3730
4002 softime 12124 /**
4003     * Cette méthode vérifie si toutes les conditions de l'envoi de la notification
4004     * sont remplies.
4005     * Les conditions vérifiées sont les suivantes :
4006 softime 14064 * - L'option de notification *option_notification* doit être définie
4007 softime 12124 * - Le petitionnaire principal doit accepter les notifications
4008     * - Le pétitionnaire principal doit avoir une adresse mail renseignée
4009     * - Le pétitionnaire principal doit avoir une adresse mail correcte
4010     * Pour chaque vérification effectué un message d'erreur est ajouté si la
4011     * condition n'est pas remplie.
4012     * Renvoie le message d'erreur en sortie.
4013     *
4014     * @param string identifiant du dossier sur lequel les notifications ont échouée
4015     * @return string
4016     */
4017     protected function get_info_notification_fail($dossier = null) {
4018     // Utilise l'identifiant du dossier passé en paramètre et si aucun dossier n'a été récupéré
4019     // utilise celui associé à l'instruction
4020     if ($dossier == null) {
4021     $dossier = $this->getVal('dossier');
4022     }
4023     // Tableau contenant la liste des messages d'erreur
4024     $errorMessage = array();
4025 softime 14064 // Récupère l'option de notification
4026     $collectivite_di = $this->get_dossier_instruction_om_collectivite($dossier);
4027     $option_notification = $this->f->get_param_option_notification($collectivite_di);
4028     if ($option_notification !== PORTAL && $option_notification !== 'mail') {
4029     $errorMessage[] = __("L'option de notification option_notification doit obligatoirement être définie.");
4030     }
4031 softime 12124 // Récupère les informations du demandeurs principal
4032     $infoPetitionnaire = $this->get_info_petitionnaire_principal_dossier($dossier);
4033     // Vérifie si le pétitionnaire principal à bien la case "accepte les notification" cochée
4034     if (isset($infoPetitionnaire['notification']) && $infoPetitionnaire['notification'] != 't') {
4035     $errorMessage[] = __('Le pétitionnaire principal n\'accepte pas les notifications.');
4036     }
4037     // Vérifie si l'adresse mail du pétitionnaire principale est renseignée
4038     if (isset($infoPetitionnaire['courriel']) && ! empty($infoPetitionnaire['courriel'])) {
4039     // Vérifie si le format de l'adresse mail est pas correct et, si ce n'est pas le cas, informe l'utilisateur
4040     // qu'il doit le corriger avant de pouvoir ajouter l'nstruction
4041     if (! $this->f->checkValidEmailAddress($infoPetitionnaire['courriel'])) {
4042     $errorMessage[] = __('Le courriel du pétitionnaire principal n\'est pas correct : ').
4043     $infoPetitionnaire['courriel'].
4044     '.';
4045     }
4046     } else {
4047     // Si le courriel du pétitionnaire principal
4048     $errorMessage[] = __('Le courriel du pétitionnaire principal n\'est pas renseigné.');
4049     }
4050 softime 11585
4051 softime 12124 return $errorMessage;
4052     }
4053    
4054     /**
4055     * Méthode servant à vérifier si un dossier a été déposé sur
4056     * le portail citoyen ou pas.
4057     * La verification se fait via une requête sql dans laquelle
4058     * on va chercher un dossier ayant pour id l'identifiant de
4059     * dossier associé à l'instruction et pour lequel la demande
4060     * associée la plus ancienne est une demande de création de
4061     * dossier via portail
4062     *
4063     * @param string identifiant du dossier. Si non renseigné c'est le dossier
4064     * associé à l'instruction qui est utilisé
4065     * @return boolean|void true : dossier déposé via portail, false : dossier
4066     * non déposé via portail et null : erreur de base de données.
4067     */
4068     protected function dossier_depose_sur_portail($dossier = null) {
4069     if (empty($dossier)) {
4070     $dossier = $this->getVal('dossier');
4071     }
4072 softime 13137 $qres = $this->f->get_one_result_from_db_query(
4073     sprintf(
4074     'SELECT
4075     dossier
4076     FROM
4077     %1$sdossier
4078     -- Récuperation de la première demande associée au dossier
4079     LEFT JOIN (
4080     SELECT
4081     demande,
4082     dossier_instruction,
4083     source_depot
4084     FROM
4085     %1$sdemande
4086     WHERE
4087     dossier_instruction = \'%2$s\'
4088     ORDER BY
4089     demande ASC
4090     LIMIT 1
4091 softime 14064 ) AS demande
4092     ON dossier.dossier = demande.dossier_instruction
4093 softime 13137 WHERE
4094     dossier.dossier = \'%2$s\'
4095     AND demande.source_depot = \'portal\'',
4096     DB_PREFIXE,
4097     $this->f->db->escapeSimple($dossier)
4098     ),
4099     array(
4100     "origin" => __METHOD__,
4101     "force_return" => true,
4102     )
4103 softime 12124 );
4104 softime 13137 if ($qres["code"] !== "OK") {
4105 softime 12124 $this->addToMessage(__('Erreur : La vérification du mode de dépôt du dossier à échoué'));
4106     return;
4107     }
4108     // Si on a un résultat c'est que le dossier a été déposé via le portail
4109 softime 13137 return ! empty($qres["result"]);
4110 softime 12124 }
4111    
4112 softime 11585 public function is_service_notifiable() {
4113     $evenement = $this->get_inst_evenement($this->getVal('evenement'));
4114    
4115     // Si l'instruction a une édition non finalisé quel que soit
4116     // le type de notification, il n'est pas notifiable
4117     if ($this->has_an_edition() === true) {
4118     if ($this->is_unfinalizable_without_bypass() === false) {
4119     return false;
4120     }
4121     }
4122     // Vérifie si la notification des tiers est active pour l'évènement
4123     return $this->get_boolean_from_pgsql_value($evenement->getVal('notification_service'));
4124     }
4125    
4126     public function is_tiers_notifiable() {
4127     $evenement = $this->get_inst_evenement($this->getVal('evenement'));
4128    
4129     // Si l'instruction a une édition non finalisé quel que soit
4130     // le type de notification, il n'est pas notifiable
4131     if ($this->has_an_edition() === true) {
4132     if ($this->is_unfinalizable_without_bypass() === false) {
4133     return false;
4134     }
4135     }
4136     // Vérifie si la notification des tiers est active pour l'évènement
4137 softime 13137 return ! empty($evenement->getVal('notification_tiers'));
4138 softime 11585 }
4139    
4140 softime 12124 /**
4141     * Méthode permettant de savoir si une instruction peut
4142     * être notifiée manuellement selon les différents types
4143     * de notification.
4144     *
4145     * Si l'instruction a une édition non finalisée alors elle n'est pas
4146     * manuellement notifiable.
4147     * Si l'instruction est associé à un événement de notification pour
4148     * lequel un retour signature est recquis, elle n'est notifiable que
4149     * si la date de retour de signature est remplie.
4150     * Par défaut si le type de notification n'est pas connu alors l'instruction
4151     * n'est pas notifiable.
4152     * Pour tous les autres cas l'instruction est manuellement notifiable.
4153     *
4154     * @return boolean true : notifiable | false : non notifiable
4155     */
4156 softime 10808 public function is_notifiable_by_task_manual() {
4157     $ev = $this->get_inst_evenement($this->getVal('evenement'));
4158    
4159     // Si l'instruction a une édition non finalisé quel que soit
4160     // le type de notification, il n'est pas notifiable
4161     if ($this->has_an_edition() === true) {
4162     if ($this->is_unfinalizable_without_bypass() === false) {
4163     return false;
4164     }
4165     }
4166    
4167     // Gestion des différents cas selon la valeur du champs notification
4168 softime 12124 if ($ev->getVal('notification') == 'notification_manuelle' ||
4169     $ev->getVal('notification') == 'notification_manuelle_annexe' ||
4170     $ev->getVal('notification') == 'notification_automatique'
4171     ) {
4172     return true;
4173     } elseif (($ev->getVal('notification') == 'notification_auto_signature_requise' ||
4174     $ev->getVal('notification') == 'notification_manuelle_signature_requise' ||
4175     $ev->getVal('notification') == 'notification_manuelle_annexe_signature_requise') &&
4176     $this->getVal('date_retour_signature') != null &&
4177     $this->getVal('date_retour_signature') != ''
4178     ) {
4179     return true ;
4180 softime 10808 }
4181 softime 12124 return false;
4182 softime 10808 }
4183    
4184 softime 8989 /**
4185 softime 14542 * Crée une instance de notification et une tache notification_instruction de catégorie portal
4186     * pour le demandeur principal.
4187 softime 10808 *
4188     * @return boolean true si le traitement à réussi
4189     */
4190 softime 14542 protected function notifier_demandeur_principal_via_portal() {
4191 softime 10808 $this->begin_treatment(__METHOD__);
4192     $message = '';
4193     // Récupération des informations concernant le demandeur
4194     $dossier = $this->getVal('dossier');
4195 softime 10968 $collectivite_di = $this->get_dossier_instruction_om_collectivite($dossier);
4196 softime 10808 $demandeur = $this->get_demandeurs_notifiable(
4197     $dossier,
4198     true
4199     );
4200     if ($demandeur !== array()) {
4201 softime 10869 $destinataire = array_values($demandeur);
4202 softime 10808 // Ajout de la notif et récupération de son id
4203     $idNotification = $this->ajouter_notification(
4204     $this->getVal($this->clePrimaire),
4205     $this->f->get_connected_user_login_name(),
4206 softime 10968 $destinataire[0],
4207     $collectivite_di,
4208 softime 12433 array(),
4209 softime 10968 true
4210 softime 10808 );
4211     if ($idNotification === false) {
4212     return $this->end_treatment(__METHOD__, false);
4213     }
4214     // Création de la tâche en lui donnant l'id de la notification
4215 softime 14542 $notification_by_task = $this->notification_by_task($idNotification, $dossier, PORTAL);
4216 softime 10808 if ($notification_by_task === false) {
4217     $this->addToMessage(
4218     __("Erreur lors de la génération de la notification au(x) pétitionnaire(s).")
4219     );
4220     return $this->end_treatment(__METHOD__, false);
4221     }
4222     $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.")));
4223     return $this->end_treatment(__METHOD__, true);
4224     }
4225     $this->addToMessage( __("Le demandeur principal n'est pas notifiable."));
4226 softime 12124 return $this->end_treatment(__METHOD__, false);
4227 softime 10808 }
4228    
4229     public function notification_by_task($object_id, $dossier, $category = null, $type = null) {
4230     // Si le type n'est pas correctement spécifié, alors il est calculé
4231 softime 11585 if ($type !== 'notification_recepisse'
4232     && $type !== 'notification_instruction'
4233     && $type !== 'notification_decision'
4234     && $type !== 'notification_service_consulte'
4235 softime 12654 && $type !== 'notification_tiers_consulte'
4236     && $type !== 'notification_depot_demat'
4237 softime 15037 && $type !== 'notification_commune'
4238     && $type !== 'notification_signataire') {
4239 softime 10808 //
4240     $type = 'notification_instruction';
4241     // Vérifie si l'instruction est un récépissé
4242 softime 12654 if ($this->is_instruction_recepisse()) {
4243     $type = 'notification_recepisse';
4244    
4245 softime 10808 }
4246     // Vérifie si l'instruction est une décision
4247     if ($type !== 'notification_recepisse') {
4248     $avis_decision = $this->getVal('avis_decision') !== null ? $this->getVal('avis_decision') : $this->valF['avis_decision'];
4249     if ($avis_decision !== null && $avis_decision !== '') {
4250     $type = 'notification_decision';
4251     }
4252     }
4253     }
4254 softime 14064 // Préparation des valeurs de la tâche
4255 softime 10808 $task_val = array(
4256     'type' => $type,
4257     'object_id' => $object_id,
4258     'dossier' => $dossier,
4259     'category' => $category,
4260     );
4261 softime 14064 // Préparation de la tache de notification
4262     $inst_task = $this->f->get_inst__om_dbform(array(
4263     "obj" => "task",
4264     "idx" => 0,
4265     ));
4266 softime 10808
4267     $add_task = $inst_task->add_task(array('val' => $task_val));
4268     if ($add_task === false) {
4269 softime 13528 $this->addToLog(
4270     sprintf(
4271     '%s(): %s %s : %s',
4272     __METHOD__,
4273     __('Echec de l\'ajout de la tâche de notification.'),
4274     __('Paramétrage de la tâche'),
4275     var_export($task_val, true)
4276     ),
4277     DEBUG_MODE
4278     );
4279 softime 10808 return false;
4280     }
4281    
4282     return true;
4283     }
4284    
4285 softime 10968 /**
4286 softime 12654 * Cette méthode permet de savoir si l'instruction est une instruction
4287     * de recepisse (instruction lié à l'ajout du dossier).
4288     *
4289     * Pour cela, on récupère la liste des actions qui ont menées à la création
4290     * de l'instruction. Si une de ces actions est lié à un objet "demande" on
4291     * en deduis que c'est l'ajout d'une demande qui a déclenché la création de
4292     * l'instruction et donc qu'il s'agit d'un recepisse.
4293     *
4294     * @return boolean
4295     */
4296     protected function is_instruction_recepisse() {
4297     // Récupère la liste des actions qui ont mené à la création de
4298     // l'instruction
4299     $trace = debug_backtrace();
4300     // Parcours la liste des actions et si une de ces actions est lié
4301     // à la classe demande on cosidère que l'instruction est un recepisse
4302     foreach ($trace as $key => $value) {
4303     if (isset($trace[$key]['class']) === true
4304     && empty($trace[$key]['class']) === false) {
4305     if (strtolower($trace[$key]['class']) === 'demande') {
4306     return true;
4307     }
4308     }
4309     }
4310     return false;
4311     }
4312    
4313     /**
4314 softime 10968 * A partir des informations passée en argument ajoute un nouvel élément
4315     * dans la table instruction_notification.
4316     * Avant l'ajout vérifie en utilisant l'id de la collectivité passée en
4317     * paramètre si le paramétrage attendus est ok.
4318     * Ajoute également un nouvel élement dans instruction_notification_document
4319     * si l'instruction possède une lettretype.
4320     * Si un identifiant d'une instruction annexe est donnée ajoute un deuxième
4321     * élement dans la table instruction_notification_document qui correspondra
4322     * à l'annexe de la notification.
4323     *
4324     * @param integer identifiant de l'instruction notifiée
4325     * @param string information concernant l'emetteur
4326     * @param array tableau contenant 2 entrées
4327     * - destinatire : nom, prenom ou raison sociale, dénomination et courriel
4328     * - courriel : adresse mail de la personne à notifier
4329     * @param integer identifiant de la collectivité permettant de récupèrer les
4330     * paramètres à valider
4331     * @param boolean indique si la notification est automatique ou manuelle
4332     * @param integer identifiant d'une instruction dont l'édition sera annexé
4333     * à la notification
4334     *
4335     * @return integer|boolean identifiant de la notification créée si le traitement
4336     * a réussie, false sinon.
4337     */
4338 softime 10869 protected function ajouter_notification(
4339     $idInstruction,
4340     $emetteur,
4341     $destinataire,
4342 softime 10968 $collectiviteId,
4343 softime 12433 $annexes = array(),
4344 softime 10968 $demandeAuto = false,
4345 softime 12124 $statut = 'en cours d\'envoi',
4346 softime 12433 $commentaire = 'Notification en cours de traitement'
4347 softime 10869 ) {
4348 softime 10968 // Vérification que les paramètres nécessaires à l'envoi de la notification existe avant
4349     // de créer la notification
4350     if (! $this->is_parametrage_notification_correct($collectiviteId)) {
4351 softime 13137 $msgErreur = __("Erreur de paramétrage. L'url d'accès au(x) document(s) notifié(s) n'est pas paramétrée.");
4352     $this->addToMessage($msgErreur);
4353 softime 13528 $this->addToLog(
4354     sprintf('%s() : %s', __METHOD__, $msgErreur),
4355     DEBUG_MODE
4356     );
4357 softime 10968 return false;
4358     }
4359 softime 10808 // Préparation de la notification
4360     $inst_notif = $this->f->get_inst__om_dbform(array(
4361     "obj" => "instruction_notification",
4362     "idx" => "]",
4363     ));
4364     $notif_val = array(
4365     'instruction_notification' => null,
4366     'instruction' => $idInstruction,
4367     'automatique' => $demandeAuto,
4368     'emetteur' => $emetteur,
4369     'date_envoi' => null,
4370 softime 10869 'destinataire' => $destinataire['destinataire'],
4371     'courriel' => $destinataire['courriel'],
4372 softime 10808 'date_premier_acces' => null,
4373 softime 12124 'statut' => $statut,
4374     'commentaire' => $commentaire
4375 softime 10808 );
4376    
4377     // Création de la notification
4378     $add_notif = $inst_notif->ajouter($notif_val);
4379     if ($add_notif === false) {
4380 softime 10968 $this->addToMessage(__("Erreur lors de la génération de la notification au(x) pétitionnaire(s)."));
4381 softime 13528 $this->addToLog(
4382     sprintf(
4383     '%s() : %s %s : %s',
4384     __METHOD__,
4385     __("Echec de l'ajout de la notification en base de données."),
4386     __('Paramétrage de la notification'),
4387     var_export($notif_val, true)
4388     ),
4389     DEBUG_MODE
4390     );
4391 softime 10808 return false;
4392     }
4393    
4394 softime 10869 // Si il y a une lettretype finalisé stockage de la clé d'accès au documents
4395     if ($this->evenement_has_an_edition($this->getVal('evenement')) === true) {
4396 softime 12433 $add_notif_doc = $this->ajouter_notification_document(
4397     $inst_notif->getVal($inst_notif->clePrimaire),
4398 softime 10869 $this->getVal($this->clePrimaire),
4399 softime 12433 'instruction'
4400 softime 10808 );
4401     if ($add_notif_doc === false) {
4402 softime 10968 $this->addToMessage(__("Erreur lors de la génération de la notification du document."));
4403 softime 10808 return false;
4404     }
4405 softime 10869 }
4406     // Si une annexe a été choisie stockage de la clé d'accès à l'annexe
4407 softime 12433 if (! empty($annexes) && is_array($annexes)) {
4408     $add_notif_annexe = $this->ajouter_notification_document_multiple(
4409 softime 10869 $inst_notif->getVal($inst_notif->clePrimaire),
4410 softime 12433 $annexes
4411 softime 10869 );
4412     if ($add_notif_annexe === false) {
4413 softime 10968 $this->addToMessage(__("Erreur lors de la génération de la notification de l'annexe."));
4414 softime 10869 return false;
4415     }
4416     }
4417 softime 10808
4418     // Renvoie l'id de la nouvelle instance de instruction_notification
4419     return $inst_notif->getVal($inst_notif->clePrimaire);
4420     }
4421    
4422     /**
4423 softime 11585 * Pour chaque élément du tableau passé en paramètre ajoute une nouvelle
4424     * instance dans la table instruction_notification_document lié a la
4425     * notification dont l'id est passé en paramètre.
4426     *
4427     * @param array tableau contenant les informations nécessaires pour créer les annexes
4428     *
4429     * @return integer|boolean identifiant de la notification créée si le traitement
4430     * a réussie, false sinon.
4431     */
4432     protected function ajouter_notification_document_multiple($idNotification, $listeDocument) {
4433 softime 12433 foreach ($listeDocument as $paramDoc) {
4434     if (! $this->ajouter_notification_document($idNotification, $paramDoc['id'], $paramDoc['tableDocument'], $paramDoc['isAnnexe'])) {
4435 softime 11585 $this->addToMessage(__("Erreur lors de la génération des documents à notifier."));
4436     return false;
4437     }
4438     }
4439     return true;
4440     }
4441    
4442     /**
4443     * Ajoute un élément dans la table instruction_notification_document en utilisant
4444     * les éléments fourni en paramètre
4445     *
4446     * @param integer $idNotification : id de la notification à laquelle on associe le document
4447     * @param integer $idDocument : id de l'objet auquel est rattaché le document
4448     * @param string $tableDocument : nom de la table a laquelle est rattaché le document
4449     * @param boolean $isAnnexe : indique si le document est une annexe ou pas
4450     *
4451     * @return boolean indique si le traitement a réussi
4452     */
4453     protected function ajouter_notification_document($idNotification, $idDocument, $tableDocument, $isAnnexe = false) {
4454     $inst_notif_doc = $this->f->get_inst__om_dbform(array(
4455     "obj" => "instruction_notification_document",
4456     "idx" => "]",
4457     ));
4458     // l'attribut instruction doit obligatoirement être renseigné
4459     // pour éviter toutes confusion avec d'autres instruction l'id
4460     // 0 est donné au document n'appartenant pas aux instructions
4461     $notif_doc_val = array(
4462     'instruction_notification_document' => null,
4463     'instruction_notification' => $idNotification,
4464     'instruction' => $tableDocument == 'instruction' ? $idDocument : 0,
4465     'document_type' => $tableDocument,
4466     'document_id' => $idDocument,
4467     'cle' => $this->getCleAccesDocument(),
4468     'annexe' => $isAnnexe
4469     );
4470    
4471     $add_notif_doc = $inst_notif_doc->ajouter($notif_doc_val);
4472     if ($add_notif_doc === false) {
4473 softime 13528 $this->addToLog(
4474     sprintf(
4475     '%s() : %s %s : %s',
4476     __METHOD__,
4477     __('Echec de l\'ajout du paramétrage du document notifié en base de données.'),
4478     __('Paramétrage du document'),
4479     var_export($notif_doc_val, true)
4480     ),
4481     DEBUG_MODE
4482     );
4483 softime 11585 return false;
4484     }
4485     return true;
4486     }
4487    
4488     /**
4489 softime 10968 * Vérifie si le paramétrage de la notification des demandeurs est correct.
4490     *
4491     * @param integer identifiant de la collectivité
4492     * @return boolean
4493     */
4494     protected function is_parametrage_notification_correct($collectiviteId) {
4495     $categorie = $this->f->get_param_option_notification($collectiviteId);
4496     $urlAccesNotif = $this->f->get_parametre_notification_url_acces($collectiviteId);
4497 softime 14064 if ($categorie === 'mail' && $urlAccesNotif === null) {
4498 softime 10968 return false;
4499     }
4500     return true;
4501     }
4502    
4503     /**
4504 softime 8989 * TRIGGER - triggermodifierapres.
4505     *
4506     * @return boolean
4507     */
4508     function triggermodifierapres($id, &$dnu1 = null, $val = array(), $dnu2 = null) {
4509     $this->addToLog(__METHOD__."(): start", EXTRA_VERBOSE_MODE);
4510 softime 17542 $data = array('val' => &$val, 'id' => $id);
4511     $this->f->module_manager->run_hooks('triggermodifierapres_pre', $this, $data);
4512 softime 10808 $collectivite_di = $this->get_dossier_instruction_om_collectivite($val['dossier']);
4513     $message = '';
4514 mbroquet 3730
4515 softime 13137 // Définit si le dossier d'instruction doit être mis à jour
4516     $update_dossier = true;
4517     // Les actions de mise à jour des dates ne doivent pas appliquer
4518     // l'action de l'événement et donc ne pas mettre à jour le dossier
4519     if ($this->getParameter("maj") == 125
4520     || $this->getParameter("maj") == 170
4521     || $this->getParameter("maj") == 175) {
4522     $update_dossier = false;
4523     }
4524    
4525     // Traitement en cas de mise à jour du dossier
4526     if ($update_dossier === true) {
4527     /**
4528     * L'objectif ici est d'effectuer les recalculs de date dans le dossier
4529     * si la date de l'evenement est modifiee
4530     */
4531     // Initialisation
4532     $valF = array();
4533     $valF_dt = array();
4534     // Initialisation du type d'événement
4535     $type_evmt = "";
4536     // Récupération de l'action correspondante à l'événement
4537 softime 14064 $evenement = $this->f->get_inst__om_dbform(array(
4538     "obj" => "evenement",
4539     "idx" => $this->valF['evenement']
4540     ));
4541 softime 13137
4542     // Récupération des paramètres de l'action
4543 softime 14542 // TODO : remplacer cette requête par l'instanciation de l'action
4544     $qres = $this->f->get_all_results_from_db_query(
4545     sprintf(
4546     'SELECT
4547     *
4548     FROM
4549     %1$saction
4550     WHERE
4551     action = \'%2$s\'',
4552     DB_PREFIXE,
4553     $this->f->db->escapeSimple($evenement->getVal('action'))
4554     ),
4555     array(
4556     "origin" => __METHOD__
4557     )
4558 softime 14064 );
4559 softime 14542 foreach ($qres['result'] as $row) {
4560 softime 13137 // application des regles sur le courrier + delai
4561     if(preg_match("/date_evenement/",$row['regle_date_limite'])){
4562     $valF['date_limite']= $this->regle($row['regle_date_limite'], 'regle_date_limite');
4563     }
4564     if(preg_match("/date_evenement/",$row['regle_date_complet'])){
4565     $valF['date_complet']= $this->regle($row['regle_date_complet'], 'regle_date_complet');
4566     }
4567     if(preg_match("/date_evenement/",$row['regle_date_dernier_depot'])){
4568     $valF['date_dernier_depot']= $this->regle($row['regle_date_dernier_depot'], 'regle_date_dernier_depot');
4569     }
4570     if(preg_match("/date_evenement/",$row['regle_date_notification_delai'])){
4571     $valF['date_notification_delai']= $this->regle($row['regle_date_notification_delai'], 'regle_date_notification_delai');
4572     }
4573     if(preg_match("/date_evenement/",$row['regle_date_decision'])){
4574     $valF['date_decision']= $this->regle($row['regle_date_decision'], 'regle_date_decision');
4575     }
4576     if(preg_match("/date_evenement/",$row['regle_date_rejet'])){
4577     $valF['date_rejet']= $this->regle($row['regle_date_rejet'], 'regle_date_rejet');
4578     }
4579     if(preg_match("/date_evenement/",$row['regle_date_validite'])){
4580     $valF['date_validite']= $this->regle($row['regle_date_validite'], 'regle_date_validite');
4581     }
4582     if(preg_match("/date_evenement/",$row['regle_date_chantier'])){
4583     $valF['date_chantier']= $this->regle($row['regle_date_chantier'], 'regle_date_chantier');
4584     }
4585     if(preg_match("/date_evenement/",$row['regle_date_achevement'])){
4586     $valF['date_achevement']= $this->regle($row['regle_date_achevement'], 'regle_date_achevement');
4587     }
4588     if(preg_match("/date_evenement/",$row['regle_date_conformite'])){
4589     $valF['date_conformite']= $this->regle($row['regle_date_conformite'], 'regle_date_conformite');
4590     }
4591     if(preg_match("/date_evenement/",$row['regle_date_cloture_instruction'])){
4592     $valF['date_cloture_instruction']= $this->regle($row['regle_date_cloture_instruction'], 'regle_date_cloture_instruction');
4593     }
4594     if(preg_match("/date_evenement/",$row['regle_date_premiere_visite'])){
4595     $valF['date_premiere_visite']= $this->regle($row['regle_date_premiere_visite'], 'regle_date_premiere_visite');
4596     }
4597     if(preg_match("/date_evenement/",$row['regle_date_derniere_visite'])){
4598     $valF['date_derniere_visite']= $this->regle($row['regle_date_derniere_visite'], 'regle_date_derniere_visite');
4599     }
4600     if(preg_match("/date_evenement/",$row['regle_date_contradictoire'])){
4601     $valF['date_contradictoire']= $this->regle($row['regle_date_contradictoire'], 'regle_date_contradictoire');
4602     }
4603     if(preg_match("/date_evenement/",$row['regle_date_retour_contradictoire'])){
4604     $valF['date_retour_contradictoire']= $this->regle($row['regle_date_retour_contradictoire'], 'regle_date_retour_contradictoire');
4605     }
4606     if(preg_match("/date_evenement/",$row['regle_date_ait'])){
4607     $valF['date_ait']= $this->regle($row['regle_date_ait'], 'regle_date_ait');
4608     }
4609     if(preg_match("/date_evenement/",$row['regle_date_transmission_parquet'])){
4610     $valF['date_transmission_parquet']= $this->regle($row['regle_date_transmission_parquet'], 'regle_date_transmission_parquet');
4611     }
4612     if ($row['regle_donnees_techniques1'] !== '') {
4613     $valF_dt[$row['cible_regle_donnees_techniques1']] = $this->regle($row['regle_donnees_techniques1'], 'regle_donnees_techniques1');
4614     }
4615     if ($row['regle_donnees_techniques2'] !== '') {
4616     $valF_dt[$row['cible_regle_donnees_techniques2']] = $this->regle($row['regle_donnees_techniques2'], 'regle_donnees_techniques2');
4617     }
4618     if ($row['regle_donnees_techniques3'] !== '') {
4619     $valF_dt[$row['cible_regle_donnees_techniques3']] = $this->regle($row['regle_donnees_techniques3'], 'regle_donnees_techniques3');
4620     }
4621     if ($row['regle_donnees_techniques4'] !== '') {
4622     $valF_dt[$row['cible_regle_donnees_techniques4']] = $this->regle($row['regle_donnees_techniques4'], 'regle_donnees_techniques4');
4623     }
4624     if ($row['regle_donnees_techniques5'] !== '') {
4625     $valF_dt[$row['cible_regle_donnees_techniques5']] = $this->regle($row['regle_donnees_techniques5'], 'regle_donnees_techniques5');
4626     }
4627     if ($row['regle_dossier_instruction_type'] !== '') {
4628     $valF['dossier_instruction_type'] = $this->regle($row['regle_dossier_instruction_type'], 'regle_dossier_instruction_type');
4629     }
4630 mbroquet 3730 }
4631 softime 13137 // Si des valeurs de données techniques ont été calculées alors on met à jour l'enregistrement
4632     if (count($valF_dt) > 0) {
4633     $dt_id = $this->getDonneesTechniques();
4634     // On met à jour le dossier
4635     $cle = " donnees_techniques='".$dt_id."'";
4636     $res1 = $this->f->db->autoExecute(DB_PREFIXE.'donnees_techniques', $valF_dt, DB_AUTOQUERY_UPDATE, $cle);
4637     $this->addToLog(
4638     __METHOD__."(): db->autoexecute(\"".DB_PREFIXE."donnees_techniques\", ".print_r($valF_dt, true).", DB_AUTOQUERY_UPDATE, \"".$cle."\");",
4639     VERBOSE_MODE
4640     );
4641     $this->f->isDatabaseError($res1);
4642     // Affichage d'informations à l'utilisateur
4643     $this->addToMessage(_('enregistrement')." ".$this->valF['dossier']." "._('table')." dossier [".$this->f->db->affectedRows()." "._('enregistrement')." "._('mis_a_jour')."]");
4644 mbroquet 3730 }
4645 softime 13137 // Si des valeurs ont été calculées alors on met à jour l'enregistrement
4646     if (count($valF) > 0) {
4647     $inst_dossier = $this->f->get_inst__om_dbform(array(
4648     "obj" => "dossier",
4649     "idx" => $this->valF['dossier'],
4650     ));
4651     $valF['instruction'] = $id;
4652     $valF['crud'] = 'update';
4653     $update_by_instruction = $inst_dossier->update_by_instruction($valF);
4654     if ($update_by_instruction === false) {
4655     $this->cleanMessage();
4656     $this->addToMessage(sprintf('%s %s', __("Une erreur s'est produite lors de la mise à jour du dossier d'instruction."), __("Veuillez contacter votre administrateur.")));
4657     return false;
4658     }
4659     // Affichage d'informations à l'utilisateur
4660     $this->addToMessage(_('enregistrement')." ".$this->valF['dossier']." "._('table')." dossier [".$this->f->db->affectedRows()." "._('enregistrement')." "._('mis_a_jour')."]");
4661 mbroquet 3730 }
4662     }
4663    
4664 softime 14064 // Par défaut les instructions à ajouter suite à la saisie d'une date
4665     // de retour signature ou de notification, utilisent l'action 0
4666     // Si la création d'événement d'instruction suivant est déclenchée par
4667     // une notification suite au traitement d'une tâche (démat') alors l'ajout
4668     // de la nouvelle instruction se fait avec l'action 176
4669     // Cela permet de ne pas contrôler la restriction lors de l'ajout de la
4670     // nouvelle instruction, depuis la méthode verifier()
4671     $code_action_add = 0;
4672     if ($this->getParameter("maj") == 175) {
4673     $code_action_add = 176;
4674     }
4675 mbroquet 3730 $restriction = $this->get_restriction($val['evenement']);
4676     $this->restriction_valid = $this->restrictionIsValid($restriction);
4677    
4678     if($restriction == "" || $this->restriction_valid ){
4679     // Récupération de tous les paramètres de l'événement sélectionné
4680 softime 14542 // TODO : remplacer cette requête par l'instanciation de l'evenement
4681     $qres = $this->f->get_all_results_from_db_query(
4682     sprintf(
4683     'SELECT
4684     *
4685     FROM
4686     %1$sevenement
4687     WHERE
4688     evenement = %2$d',
4689     DB_PREFIXE,
4690     intval($this->valF['evenement'])
4691     ),
4692     array(
4693     "origin" => __METHOD__
4694     )
4695     );
4696 nmeucci 3965 $current_id = $this->getVal($this->clePrimaire);
4697 softime 14542 foreach ($qres['result'] as $row) {
4698 mbroquet 3730 // Si la date de retour signature est éditée on vérifie si il existe un événement automatique
4699     if ($this->getVal('date_retour_signature') == "" AND
4700     $this->valF['date_retour_signature'] != "" AND
4701     $row['evenement_retour_signature'] != "") {
4702 softime 7996 $new_instruction = $this->f->get_inst__om_dbform(array(
4703     "obj" => "instruction",
4704     "idx" => "]",
4705     ));
4706 mbroquet 3730 // Création d'un tableau avec la liste des champs de l'instruction
4707     foreach($new_instruction->champs as $champ) {
4708     $valNewInstr[$champ] = "";
4709     }
4710     // Définition des valeurs de la nouvelle instruction
4711     $valNewInstr["evenement"] = $row['evenement_retour_signature'];
4712     $valNewInstr["destinataire"] = $this->valF['destinataire'];
4713     $valNewInstr["dossier"] = $this->valF['dossier'];
4714     $valNewInstr["date_evenement"] = $this->f->formatDate($this->valF['date_retour_signature']);
4715     $valNewInstr["date_envoi_signature"] = $this->f->formatDate($this->valF['date_envoi_signature']);
4716     $valNewInstr["date_retour_signature"] = $this->f->formatDate($this->valF['date_retour_signature']);
4717     $valNewInstr["date_envoi_rar"] = $this->f->formatDate($this->valF['date_envoi_rar']);
4718     $valNewInstr["date_retour_rar"] = $this->f->formatDate($this->valF['date_retour_rar']);
4719     $valNewInstr["date_envoi_controle_legalite"] = $this->f->formatDate($this->valF['date_envoi_controle_legalite']);
4720     $valNewInstr["date_retour_controle_legalite"] = $this->f->formatDate($this->valF['date_retour_controle_legalite']);
4721 softime 14064 $new_instruction->setParameter("maj", $code_action_add);
4722     $new_instruction->class_actions[$code_action_add]["identifier"] =
4723 softime 13528 sprintf(
4724     __("Ajout suite au retour signature de l'instruction %s"),
4725     $current_id
4726     );
4727 softime 8989 $retour = $new_instruction->ajouter($valNewInstr);
4728 mbroquet 3730
4729     //Si une erreur s'est produite et qu'il s'agit d'un problème
4730     //de restriction
4731     if ($retour == false && !$new_instruction->restriction_valid){
4732     $error_message = $this->get_restriction_error_message($restriction);
4733     $this->f->displayMessage("error", $error_message);
4734 softime 8989 $this->addToLog(__METHOD__."(): evenement retour ".
4735 mbroquet 3730 "instruction ".$this->valF[$this->clePrimaire]." : ".
4736     $new_instruction->msg);
4737     }
4738     //Si une erreur s'est produite après le test de la restriction
4739     elseif ($retour == false && $new_instruction->restriction_valid){
4740     $this->correct = false ;
4741     $this->msg .= $new_instruction->msg;
4742     return false;
4743     }
4744     }
4745     // Si la date de retour AR est éditée on vérifie si il existe un événement automatique
4746     if ($this->getVal('date_retour_rar') == "" AND
4747     $this->valF['date_retour_rar'] != "") {
4748    
4749     if($row['evenement_retour_ar'] != "") {
4750 softime 7996 $new_instruction = $this->f->get_inst__om_dbform(array(
4751     "obj" => "instruction",
4752     "idx" => "]",
4753     ));
4754 mbroquet 3730 // Création d'un tableau avec la liste des champs de l'instruction
4755     foreach($new_instruction->champs as $champ) {
4756     $valNewInstr[$champ] = "";
4757     }
4758     // Définition des valeurs de la nouvelle instruction
4759     $valNewInstr["evenement"] = $row['evenement_retour_ar'];
4760     $valNewInstr["destinataire"] = $this->valF['destinataire'];
4761     $valNewInstr["dossier"] = $this->valF['dossier'];
4762     $valNewInstr["date_evenement"] = $this->f->formatDate($this->valF['date_retour_rar']);
4763     $valNewInstr["date_envoi_signature"] = $this->f->formatDate($this->valF['date_envoi_signature']);
4764     $valNewInstr["date_retour_signature"] = $this->f->formatDate($this->valF['date_retour_signature']);
4765     $valNewInstr["date_envoi_rar"] = $this->f->formatDate($this->valF['date_envoi_rar']);
4766     $valNewInstr["date_retour_rar"] = $this->f->formatDate($this->valF['date_retour_rar']);
4767     $valNewInstr["date_envoi_controle_legalite"] = $this->f->formatDate($this->valF['date_envoi_controle_legalite']);
4768     $valNewInstr["date_retour_controle_legalite"] = $this->f->formatDate($this->valF['date_retour_controle_legalite']);
4769 softime 14064 $new_instruction->setParameter("maj", $code_action_add);
4770     $new_instruction->class_actions[$code_action_add]["identifier"] =
4771 softime 13137 sprintf(__("Ajout suite à la notification de l'instruction %s"), $current_id);
4772 softime 8989 $retour = $new_instruction->ajouter($valNewInstr);
4773 mbroquet 3730
4774     //Si une erreur s'est produite et qu'il s'agit d'un problème
4775     //de restriction
4776     if ($retour == false && !$new_instruction->restriction_valid) {
4777     $error_message = $this->get_restriction_error_message($restriction);
4778     $this->f->displayMessage("error", $error_message);
4779     $this->addToLog(
4780 softime 8989 __METHOD__."(): evenement retour instruction ".
4781 mbroquet 3730 $this->valF[$this->clePrimaire]." : ".
4782     $new_instruction->msg
4783     );
4784     }
4785     //Si une erreur s'est produite après le test de la restriction
4786     elseif ($retour == false && $new_instruction->restriction_valid){
4787     $this->correct = false ;
4788     $this->msg .= $new_instruction->msg;
4789     return false;
4790     }
4791     }
4792     }
4793     }
4794     }
4795    
4796 softime 13137 // Traitement en cas de mise à jour du dossier
4797     if ($update_dossier === true) {
4798     /**
4799     * Mise à jour de la date de dernière modification du dossier
4800     * d'instruction
4801     */
4802     $inst_di = $this->get_inst_dossier($this->getVal('dossier'));
4803     $inst_di->update_last_modification_date();
4804 softime 8640
4805 softime 13137 // Mise à jour des données du dossier d'autorisation
4806     $da = $this->f->get_inst__om_dbform(array(
4807     "obj" => "dossier_autorisation",
4808     "idx" => $this->getNumDemandeAutorFromDossier($this->valF['dossier']),
4809     ));
4810     $params = array(
4811     'di_id' => $this->getVal('dossier'),
4812     );
4813     if($da->majDossierAutorisation($params) === false) {
4814     $this->addToMessage(_("Erreur lors de la mise a jour des donnees du dossier d'autorisation. Contactez votre administrateur."));
4815     $this->correct = false;
4816     return false;
4817     }
4818 mbroquet 3730 }
4819 softime 7996
4820 softime 10573 // mise à jour des métadonnées issues des dates de suivi
4821     $dateRetourSignatureModified = ($this->valF['date_retour_signature'] != $this->getVal('date_retour_signature'));
4822     $dateRetourRARModified = ($this->valF['date_retour_rar'] != $this->getVal('date_retour_rar'));
4823     if ($dateRetourSignatureModified || $dateRetourRARModified) {
4824    
4825     // Calculs des nouvelles métadonnées
4826     $metadata = $this->getMetadata("om_fichier_instruction");
4827    
4828     // On vérifie si l'instruction à finaliser a un événement de type arrete
4829 softime 14064 // TODO : A voir pour remplacer par une instanciation de l'événement.
4830     // Voir également si l'événement ne dois pas être instancié en début de
4831     // méthode pour pouvoir être réutilisé.
4832     $qres = $this->f->get_one_result_from_db_query(
4833     sprintf(
4834     'SELECT
4835     type
4836     FROM
4837     %1$sevenement
4838     WHERE
4839     evenement = \'%2$d\'',
4840     DB_PREFIXE,
4841     intval($this->getVal("evenement"))
4842     ),
4843     array(
4844     "origin" => __METHOD__,
4845     "force_return" => true,
4846     )
4847     );
4848    
4849     if ($qres["code"] !== "OK") {
4850 softime 10573 $this->correct = false;
4851     $this->addToMessage(__("Erreur de traitement de fichier."));
4852 softime 14064 $this->addToLog(__METHOD__."() erreur BDD: ".var_export($qres['message'], true), DEBUG_MODE);
4853 softime 10573 return false;
4854     }
4855    
4856     // Si l'événement est de type arrete, on ajoute les métadonnées spécifiques
4857 softime 14064 if ($qres['result'] == 'arrete'){
4858 softime 10573 $metadata = array_merge($metadata, $this->getMetadata("arrete"));
4859     }
4860    
4861     // Filtre pour conserver uniquement les métadonnées liées aux dates
4862     $metadataToKeep = array(
4863     "statutAutorisation",
4864     "dateEvenementDocument",
4865     'date_cloture_metier',
4866     "NotificationArrete",
4867     "dateNotificationArrete",
4868     "controleLegalite",
4869     "dateSignature",
4870     "nomSignataire",
4871     "qualiteSignataire",
4872     "dateControleLegalite",
4873     );
4874     $metadata = array_filter(
4875     $metadata,
4876     function($key) use ($metadataToKeep) { return in_array($key, $metadataToKeep); },
4877     ARRAY_FILTER_USE_KEY
4878     );
4879    
4880     // Mise à jour des métadonnées du document en GED
4881     $docUid = $this->getVal("om_fichier_instruction");
4882     $operationOrUID = $this->f->storage->update_metadata($docUid, $metadata);
4883     if ($operationOrUID == 'OP_FAILURE') {
4884     $this->correct = false;
4885     $this->addToMessage(__("Erreur de traitement de fichier."));
4886     $this->addToLog(__METHOD__."() failed to update metadata: ".var_export($operationOrUID, true), DEBUG_MODE);
4887     return false;
4888     }
4889    
4890     // mise à jour de l'UID du document en BDD
4891     else {
4892     $valF = array('om_fichier_instruction' => $operationOrUID);
4893     $res = $this->f->db->autoExecute(DB_PREFIXE.$this->table, $valF, DB_AUTOQUERY_UPDATE, $this->getCle($id));
4894     $this->addToLog(__METHOD__.'() : db->autoExecute("'.DB_PREFIXE.$this->table.'", '.print_r($valF, true).', DB_AUTOQUERY_UPDATE, "'.$this->getCle($id).'")', VERBOSE_MODE);
4895     if ($this->f->isDatabaseError($res, true) === true) {
4896     $this->correct = false;
4897     $this->addToMessage(__("Erreur de traitement de fichier."));
4898     $this->addToLog(__METHOD__."() erreur BDD: ".var_export($res->getMessage(), true), DEBUG_MODE);
4899     return false;
4900     }
4901     $this->addToMessage(__("La mise a jour du document s'est effectuee avec succes."));
4902     }
4903     }
4904    
4905 softime 13137 // Déclenchement des notifications automatique après finalisation et
4906     // retour de signature
4907 softime 10808 if ($dateRetourSignatureModified === true
4908     && $this->valF['date_retour_signature'] !== ''
4909     && $this->valF['date_retour_signature'] !== null) {
4910 softime 13137
4911     // Message à afficher dans les logs pour indiquer quelle notification a échouée
4912 softime 13528 $msgLog = sprintf(
4913     '%s %s : %d',
4914     __('Erreur lors de la notification automatique du(des) pétitionnaire(s) après retour signature.'),
4915     __('Instruction notifiée'),
4916     $id
4917     );
4918 softime 13137
4919     // Récupération de l'instance de l'événement pour accéder au paramètrage
4920     // des notifications
4921 softime 10808 $ev = $this->get_inst_evenement($this->valF['evenement']);
4922 softime 13137 // Si la notification automatique des tiers consulté est active
4923     // déclenche le traitement de notification.
4924     // Ce traitement va envoyer des courriels de notification à tous les tiers concernés
4925     $typeNotifTiers = $ev->getVal('notification_tiers');
4926     $inst_di = $this->get_inst_dossier($this->getVal('dossier'));
4927     if ($typeNotifTiers === 'notification_automatique') {
4928     if ($this->traitement_notification_automatique_tiers_consulte($ev, $inst_di) === false) {
4929     $this->addToMessage(__('Le traitement de la notification automatique de tiers à échoué.'));
4930     $this->correct = false;
4931     }
4932     }
4933    
4934 softime 10808 if ($ev->getVal('notification') === 'notification_auto_signature_requise') {
4935     // Récupération de la liste des demandeurs à notifier et de la catégorie
4936     $categorie = $this->f->get_param_option_notification($collectivite_di);
4937 softime 14064 $isPortal = $categorie === PORTAL;
4938 softime 10869 $demandeursANotifie = $this->get_demandeurs_notifiable(
4939     $this->valF['dossier'],
4940     $isPortal
4941     );
4942 softime 10808
4943     // Création d'une notification et d'une tâche pour chaque demandeur à notifier
4944 softime 12124 $demandeurPrincipalNotifie = false;
4945 softime 10808 foreach ($demandeursANotifie as $demandeur) {
4946 softime 12124 // Identifie si le demandeur principal a été notifié ou pas
4947     // et récupère ses informations
4948     if ($demandeur['petitionnaire_principal'] == 't') {
4949     $demandeurPrincipalNotifie = true;
4950     // Si le demandeur principal est notifiable mais qu'il y a des erreurs dans
4951     // son paramétrage, on effectue pas le traitement et on passe à l'itération
4952     // suivante. On le considère également comme non notifié pour gérer l'envoie
4953     // des messages d'erreurs
4954     // Si la demande a été déposée via le portail alors le paramétrage n'a pas
4955     // d'impact sur la notification
4956     $erreursParam = $this->get_info_notification_fail();
4957     if (! $this->dossier_depose_sur_portail() && $erreursParam != array()) {
4958     $demandeurPrincipalNotifie = false;
4959     continue;
4960     }
4961     }
4962 softime 10808 // Ajout de la notif et récupération de son id
4963     $idNotif = $this->ajouter_notification(
4964     $this->valF[$this->clePrimaire],
4965     $this->f->get_connected_user_login_name(),
4966 softime 10968 $demandeur,
4967     $collectivite_di,
4968 softime 12433 array(),
4969 softime 10968 true
4970 softime 10808 );
4971     if ($idNotif === false) {
4972 softime 13528 $this->addToLog(
4973     sprintf('%s() : %s',__METHOD__, $msgLog),
4974     DEBUG_MODE
4975     );
4976 softime 10808 return false;
4977     }
4978     // Création de la tache en lui donnant l'id de la notification
4979     $notification_by_task = $this->notification_by_task(
4980     $idNotif,
4981     $this->valF['dossier'],
4982     $categorie
4983     );
4984     if ($notification_by_task === false) {
4985 softime 13528 $this->addToLog(
4986     sprintf('%s() : %s',__METHOD__, $msgLog),
4987     DEBUG_MODE
4988     );
4989 softime 10808 $this->addToMessage(
4990     __("Erreur lors de la génération de la notification au(x) pétitionnaire(s).")
4991     );
4992     return false;
4993     }
4994     }
4995 softime 12847 // Pour la notification par mail ou la notification via portal si le dossier a
4996     // été déposés via portal, si le demandeur principal n'est pas notifiable,
4997     // on créé une nouvelle notification en erreur avec en commentaire la raison pour
4998     // laquelle le demandeur principal n'a pas pu être notifié
4999     $depotPortal = $this->dossier_depose_sur_portail();
5000     if (! $demandeurPrincipalNotifie && ($isPortal === false || $depotPortal === true)) {
5001 softime 13137 // Précise dans les logs que le pétitionnaire principal n'a pas été notifié
5002 softime 13528 $msgLog .= sprintf(' %s', __('Le pétitionnaire principale n\'est pas notifiable.'));
5003 softime 12124 // Analyse pour savoir pourquoi le demandeur principal n'est pas notifiable
5004     $erreursParam = $this->get_info_notification_fail();
5005     $demandeurPrincipal = $this->get_info_petitionnaire_principal_dossier($this->getVal('dossier'));
5006     // Ajout de la notif et récupération de son id
5007     $idNotif = $this->ajouter_notification(
5008     $this->valF[$this->clePrimaire],
5009     $this->f->get_connected_user_login_name(),
5010     $demandeurPrincipal,
5011     $collectivite_di,
5012 softime 12433 array(),
5013 softime 12124 true,
5014     'Echec',
5015     implode(' ', $erreursParam)
5016     );
5017     if ($idNotif === false) {
5018 softime 13528 $this->addToLog(
5019     sprintf('%s() : %s', __METHOD__, $msgLog),
5020     DEBUG_MODE
5021     );
5022 softime 12124 $this->addToMessage(
5023     __('Erreur : la création de la notification a échouée.').
5024     __("Veuillez contacter votre administrateur.")
5025     );
5026     return false;
5027     }
5028     // Prépare un message d'alerte à destination de l'instructeur pour l'informer
5029     // de l'échec de la notification
5030     $dossier_message = $this->get_inst_dossier_message(0);
5031     $dossier_message_val = array(
5032     'dossier' => $this->getVal('dossier'),
5033     'type' => _('erreur expedition'),
5034     'emetteur' => $this->f->get_connected_user_login_name(),
5035     'login' => $_SESSION['login'],
5036     'date_emission' => date('Y-m-d H:i:s'),
5037     'contenu' => _('Échec lors de la notification de l\'instruction ').
5038     $ev->getVal('libelle').
5039     '.<br>'.
5040     implode("\n", $erreursParam).
5041     '<br>'.
5042     _('Veuillez corriger ces informations avant de renvoyer la notification.')
5043     );
5044     $add = $dossier_message->add_notification_message($dossier_message_val, true);
5045     // Si une erreur se produit pendant l'ajout
5046     if ($add !== true) {
5047 softime 13528 $this->addToLog(
5048     sprintf(
5049     '%s() : %s',
5050     __METHOD__,
5051     __("Le message d'alerte concernant l'echec de l'envoi de la notification n'a pas pu être envoyé.")
5052     ),
5053     DEBUG_MODE
5054     );
5055 softime 12124 return false;
5056     }
5057     }
5058 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.")));
5059     }
5060     }
5061    
5062 softime 17542 $res = $this->add_log_to_dossier($id, $val);
5063     $data = array('val' => &$val, 'id' => $id, 'result' => &$res);
5064     $this->f->module_manager->run_hooks('triggermodifierapres_post', $this, $data);
5065     return $res;
5066 fmichon 4708 }
5067 mbroquet 3730
5068 softime 8989 /**
5069     * TRIGGER - triggersupprimer.
5070     *
5071     * @return boolean
5072     */
5073     function triggersupprimer($id, &$dnu1 = null, $val = array(), $dnu2 = null) {
5074     $this->addToLog(__METHOD__."(): start", EXTRA_VERBOSE_MODE);
5075 softime 17542 $data = array('val' => &$val, 'id' => $id);
5076     $this->f->module_manager->run_hooks('triggersupprimer_pre', $this, $data);
5077 mbroquet 3730 /**
5078     * L'objectif ici est de repositionner les valeurs récupérées en
5079     * archive dans le dossier d'instruction avant de supprimer l'événement
5080 softime 10573 * d'instruction si les valeurs du dossier sont différentes
5081 mbroquet 3730 */
5082 softime 10573 $valF = array();
5083     $inst_di = $this->get_inst_dossier($this->getVal('dossier'));
5084     foreach ($inst_di->champs as $key => $champ) {
5085     // Si le champ du DI à une archive dans l'instruction
5086     if (isset($val[sprintf('archive_%s', $champ)]) === true) {
5087     // Si la valeur entre le champ du DI et son archive dans instruction
5088     // est différente
5089     if ($inst_di->getVal($champ) !== $val[sprintf('archive_%s', $champ)]) {
5090     $val[sprintf('archive_%s', $champ)] === '' ? $valF[$champ] = null : $valF[$champ] = $val[sprintf('archive_%s', $champ)];
5091 softime 15037 // Gestion du cas particulier 'accord_tacite' pour renvoyer la valeur ' ' (3 espaces vides) au lieu de null
5092     // Car les valeurs possibles du champ accord_tacite sont : 'Oui', 'Non' ou ' '
5093     if ($champ === "accord_tacite" && $valF[$champ] === null) {
5094     $valF[$champ] = ' ';
5095     }
5096 softime 10573 }
5097     }
5098 softime 5024 }
5099 softime 10573 // Spécificité du champ avis_decision dont le champ archive est nommé
5100     // différemment
5101     if ($inst_di->getVal('avis_decision') !== $val['archive_avis']) {
5102     $val['archive_avis'] === '' ? $valF['avis_decision'] = null : $valF['avis_decision'] = $val['archive_avis'];
5103 softime 5024 }
5104 softime 10573 // Spécificité de la date d'affichage dont la valeur n'ai jamais modifiée
5105     // par l'archive
5106     unset($valF['date_affichage']);
5107 softime 6565
5108 softime 9245 /**
5109     * Mise à jour de la version de clôture *version_clos* du dossier si et
5110     * seulement si l'instruction met à jour l'état du dossier.
5111     */
5112 softime 10573 if (isset($valF['etat']) === true
5113     && $valF['etat'] !== null
5114 softime 9245 && $valF['etat'] !== '') {
5115 softime 10573 // Récupère l'état actuel du dossier d'instruction
5116     $inst_current_etat = $this->f->get_inst__om_dbform(array(
5117     "obj" => "etat",
5118     "idx" => $inst_di->get_id_etat(),
5119     ));
5120 softime 9245 // Instanciation de l'état archivé appliqué sur le dossier
5121     $inst_etat = $this->f->get_inst__om_dbform(array(
5122     "obj" => "etat",
5123     "idx" => $valF['etat'],
5124     ));
5125     //
5126     $update_version_clos = null;
5127     // En cas de clôture du dossier par l'état archivé
5128     if ($inst_etat->getVal('statut') === 'cloture') {
5129     $update_version_clos = $inst_di->update_version_clos('up');
5130     }
5131     // En cas de réouverture du dossier par l'état archivé
5132     if ($inst_current_etat->getVal('statut') === 'cloture'
5133     && $inst_etat->getVal('statut') !== 'cloture') {
5134     //
5135     $update_version_clos = $inst_di->update_version_clos('down');
5136     //
5137     $this->set_att_di_reopened(true);
5138     }
5139     //
5140     if ($update_version_clos === false) {
5141     $this->f->addToLog(sprintf(
5142     "%s() : ERREUR - %s %s",
5143     __METHOD__,
5144     sprintf(
5145     __("Impossible de mettre à jour la version de clôture du dossier d'instruction %s."),
5146     $inst_di->getVal($inst_di->clePrimaire)
5147     ),
5148     sprintf(
5149     __("L'instruction tente d'appliquer l'état %s."),
5150     $inst_etat->getVal($inst_etat->clePrimaire)
5151     )
5152     ));
5153     $this->addToMessage(sprintf(
5154     "%s %s",
5155     __("Erreur lors de la mise à jour de la version de clôture du dossier d'instruction."),
5156     __("Veuillez contacter votre administrateur.")
5157     ));
5158     return false;
5159     }
5160     }
5161 softime 10808 // On supprime toutes les notications liées à l'instruction
5162 softime 12654 $notifASupprimer = $this->get_instruction_notification(
5163     $this->getVal($this->clePrimaire),
5164     array(
5165     'notification_recepisse',
5166     'notification_instruction',
5167     'notification_decision',
5168     'notification_service_consulte',
5169     'notification_tiers_consulte',
5170 softime 13137 'notification_depot_demat',
5171 softime 15037 'notification_commune',
5172     'notification_signataire'
5173 softime 12654 ),
5174     true
5175     );
5176    
5177 softime 10808 foreach ($notifASupprimer as $idNotif) {
5178     $inst_notif = $this->f->get_inst__om_dbform(array(
5179     "obj" => "instruction_notification",
5180     "idx" => $idNotif,
5181     ));
5182     $val_notif = array();
5183     foreach ($inst_notif->champs as $champ) {
5184     $val_notif[$champ] = $inst_notif->getVal($champ);
5185     }
5186     // La suppression des notifications entrainera la suppression des tâches qui y sont
5187     // liées
5188     $supprNotif = $inst_notif->supprimer($val_notif);
5189     if ($supprNotif == false) {
5190     $this->addToMessage(sprintf(
5191     "%s %s",
5192     __("Erreur lors de la suppression des notifications de l'instruction."),
5193     __("Veuillez contacter votre administrateur.")
5194     ));
5195     return false;
5196     }
5197     }
5198 softime 9245
5199 softime 10573 // On met à jour le dossier
5200     $valF['instruction'] = $id;
5201 softime 10968 $valF['crud'] = 'delete';
5202 softime 10573 $update_by_instruction = $inst_di->update_by_instruction($valF);
5203     if ($update_by_instruction === false) {
5204     $this->cleanMessage();
5205     $this->addToMessage(sprintf('%s %s', __("Une erreur s'est produite lors de la mise à jour du dossier d'instruction."), __("Veuillez contacter votre administrateur.")));
5206     return false;
5207     }
5208    
5209 softime 5024 // Affichage d'informations à l'utilisateur
5210 softime 8989 $this->addToMessage(_("Suppression de l'instruction")." [".$this->f->db->affectedRows()." "._('enregistrement')." "._('mis_a_jour')."]");
5211 softime 5024
5212     // Mise à jour de la demande si un récépissé d'instruction correspond à l'instruction à supprimer
5213 softime 17542
5214     $res = true;
5215     $data = array('val' => &$val, 'id' => $id, 'result' => &$res);
5216     $this->f->module_manager->run_hooks('triggersupprimer_post', $this, $data);
5217     return $res;
5218 mbroquet 3730 }
5219    
5220 softime 8989 /**
5221     * TRIGGER - triggersupprimerapres.
5222     *
5223     * @return boolean
5224     */
5225     function triggersupprimerapres($id, &$dnu1 = null, $val = array(), $dnu2 = null) {
5226     $this->addToLog(__METHOD__."(): start", EXTRA_VERBOSE_MODE);
5227 softime 17542 $data = array('val' => &$val, 'id' => $id);
5228     $this->f->module_manager->run_hooks('triggersupprimerapres_pre', $this, $data);
5229 softime 8640 /**
5230     * Mise à jour de la date de dernière modification du dossier
5231     * d'instruction
5232     */
5233     $inst_di = $this->get_inst_dossier($this->getVal('dossier'));
5234     $inst_di->update_last_modification_date();
5235    
5236     /**
5237     * Mise à jour des données du dossier d'autorisation
5238     */
5239 softime 7996 $da = $this->f->get_inst__om_dbform(array(
5240     "obj" => "dossier_autorisation",
5241     "idx" => $this->getNumDemandeAutorFromDossier($val["dossier"]),
5242     ));
5243 softime 8640 $params = array(
5244     'di_id' => $this->getVal('dossier'),
5245 softime 9245 'di_reopened' => $this->get_att_di_reopened(),
5246 softime 8640 );
5247     if($da->majDossierAutorisation($params) === false) {
5248 mbroquet 3730 $this->addToMessage(_("Erreur lors de la mise a jour des donnees du dossier d'autorisation. Contactez votre administrateur."));
5249     $this->correct = false;
5250     return false;
5251     }
5252 softime 7996
5253 softime 10573 /**
5254     * Gestion des tâches pour la dématérialisation
5255     */
5256     $inst_task_empty = $this->f->get_inst__om_dbform(array(
5257     "obj" => "task",
5258     "idx" => 0,
5259     ));
5260     foreach ($inst_di->task_types as $task_type) {
5261     $task_exists = $inst_task_empty->task_exists($task_type, $id);
5262     if ($task_exists !== false) {
5263     $inst_task = $this->f->get_inst__om_dbform(array(
5264     "obj" => "task",
5265     "idx" => $task_exists,
5266     ));
5267     if ($inst_task->getVal('state') === $inst_task::STATUS_NEW || $inst_task->getVal('state') === $inst_task::STATUS_DRAFT) {
5268     $task_val = array(
5269     'state' => $inst_task::STATUS_CANCELED,
5270     );
5271     $update_task = $inst_task->update_task(array('val' => $task_val));
5272     if ($update_task === false) {
5273     $this->addToMessage(sprintf('%s %s',
5274     sprintf(__("Une erreur s'est produite lors de la modification de la tâche %."), $inst_task->getVal($inst_task->clePrimaire)),
5275     __("Veuillez contacter votre administrateur.")
5276     ));
5277     $this->correct = false;
5278     return false;
5279     }
5280     }
5281     }
5282     }
5283    
5284 softime 7996 //
5285 softime 8640 $val['evenement'] = $this->getVal('evenement');
5286 softime 17542 $res = $this->add_log_to_dossier($id, $val);
5287     $data = array('val' => &$val, 'id' => $id, 'result' => &$res);
5288     $this->f->module_manager->run_hooks('triggersupprimerapres_post', $this, $data);
5289     return $res;
5290 mbroquet 3730 }
5291    
5292     /**
5293 softime 9245 * Permet de mettre la valeur passée en paramètre dans l'attribut de classe
5294     * "di_reopened".
5295     *
5296     * @param boolean $val
5297     */
5298     function set_att_di_reopened($val) {
5299     $this->di_reopened = $val;
5300     }
5301    
5302     /**
5303     * Permet de récupérer la valeur de l'attribut de classe "di_reopened".
5304     *
5305     * @return boolean
5306     */
5307     function get_att_di_reopened() {
5308     return $this->di_reopened;
5309     }
5310    
5311     /**
5312 mbroquet 3730 * Permet de composer un message d'erreur sur restriction non valide en
5313     * fonction du contexte.
5314     *
5315     * @param string $restriction formule de la restriction
5316     *
5317     * @return string message d'erreur
5318     */
5319     function get_restriction_error_message($restriction) {
5320     // Affichage du message si la restriction s'applique
5321     // Contexte du suivi des dates (message simple)
5322     $message_restrict = _("Probleme de dates :");
5323     // Split restriction
5324     $champs_restrict = preg_split(
5325     '/(\W+)/',
5326     $restriction,
5327     null,
5328     PREG_SPLIT_NO_EMPTY|PREG_SPLIT_DELIM_CAPTURE
5329     );
5330     $formated_restrict = "";
5331     // Ajout des chaînes à traduire
5332     foreach ($champs_restrict as $value) {
5333     $formated_restrict .= _($value)." ";
5334     }
5335     $formated_restrict = substr($formated_restrict, 0, -1);
5336     // Message d'erreur dans le contexte du suivi des dates
5337     if($this->getParameter("maj") == 170) {
5338     $message_restrict .= " "._("contactez l'instructeur du dossier");
5339     $message_restrict .= "<br/>(".$formated_restrict.")";
5340     } else {
5341     // Affichage du message si la restriction s'applique
5342     // Contexte instruction
5343     $message_restrict .= "<br/>".$formated_restrict;
5344     }
5345    
5346     return $message_restrict;
5347     }
5348    
5349     /**
5350 softime 12124 * Surcharge de la méthode verifier() de la classe om_dbform pour y ajouter
5351     * les vérifications suivantes :
5352     * - Si l'instruction à un événement associé et que cet événement à des restrictions :
5353     * 1. vérifie si la restriction est valide, si ce n'est pas le cas récupère et affiche
5354     * le message d'erreur associé à la restriction
5355     * 2. vérifie si les restrictions sont respectées. Si ce n'est pas le cas bloque l'ajout
5356     * et / ou la modification et affiche un message d'erreur
5357     * -
5358     * -
5359     * -
5360     * -
5361     * -
5362     * -
5363     *
5364     * @param array val : tableau contenant les valeurs issues du formulaire.
5365     * @param - dnu1 : Paramètre déprécié et non utilisé.
5366     * @param - dnu2 : Paramètre déprécié et non utilisé.
5367     *
5368 softime 8989 * @return void
5369 mbroquet 3730 */
5370 softime 8989 function verifier($val = array(), &$dnu1 = null, $dnu2 = null) {
5371     parent::verifier($val);
5372     //
5373 mbroquet 3730 if ( isset($val['evenement']) && is_numeric($val['evenement'])){
5374     $restriction = $this->get_restriction($val['evenement']);
5375    
5376     //Test qu'une restriction est présente
5377     if ($restriction != "" ){
5378    
5379 softime 14064 // Vérifie le contexte de la modification et test si la restriction est valide.
5380     // Si l'instruction est modifiée par une tache le dossier n'est pas impacté.
5381     // Il n'est donc pas nécessaire de vérifier les restrictions.
5382 mbroquet 3730 $this->restriction_valid = $this->restrictionIsValid($restriction);
5383 softime 14064 if ($this->getParameter("maj") != 176
5384     && !$this->restriction_valid) {
5385 mbroquet 3730
5386     // Affichage du message si la restriction s'applique
5387     $this->addToMessage(
5388     $this->get_restriction_error_message($restriction)
5389     );
5390     $this->correct=false;
5391     return false;
5392     }
5393    
5394     // Liste des opérateurs possible
5395 nmeucci 3873 $operateurs = array(">=", "<=", "+", "-", "&&", "||", "==", "!=");
5396 mbroquet 3730 // Supprime tous les espaces de la chaîne de caractère
5397     $restriction = str_replace(' ', '', $restriction);
5398    
5399     // Met des espace avant et après les opérateurs puis transforme la
5400     // chaine en un tableau
5401     $tabRestriction = str_replace($operateurs, " ", $restriction);
5402     // Tableau des champ
5403     $tabRestriction = explode(" ", $tabRestriction);
5404     // Supprime les numériques du tableau
5405     foreach ($tabRestriction as $key => $value) {
5406     if (is_numeric($value)) {
5407     unset($tabRestriction[$key]);
5408     }
5409     }
5410    
5411     // Vérifie les champs utilisés pour la restriction
5412     $check_field_exist = $this->f->check_field_exist($tabRestriction, 'instruction');
5413     if ($check_field_exist !== true) {
5414    
5415     // Liste des champs en erreur
5416     $string_error_fields = implode(", ", $check_field_exist);
5417    
5418     // Message d'erreur
5419     $error_message = _("Le champ %s n'est pas utilisable pour le champ %s");
5420     if (count($check_field_exist) > 1) {
5421     $error_message = _("Les champs %s ne sont pas utilisable pour le champ %s");
5422     }
5423    
5424     // Affiche l'erreur
5425     $this->correct=false;
5426     $this->addToMessage(sprintf($error_message, $string_error_fields, _("restriction")));
5427     $this->addToMessage(_("Veuillez contacter votre administrateur."));
5428     }
5429     }
5430    
5431     }
5432     if(!$this->updateDate("date_envoi_signature")) {
5433     return false;
5434     }
5435     if(!$this->updateDate("date_retour_signature")) {
5436     return false;
5437     }
5438     if(!$this->updateDate("date_envoi_rar")) {
5439     return false;
5440     }
5441     if(!$this->updateDate("date_retour_rar")) {
5442     return false;
5443     }
5444     if(!$this->updateDate("date_envoi_controle_legalite")) {
5445     return false;
5446     }
5447     if(!$this->updateDate("date_retour_controle_legalite")) {
5448     return false;
5449     }
5450    
5451     }
5452 softime 12124
5453     /**
5454     * Récupère et stocket dans un tableau toutes les infos du pétitionnaire
5455     * principal du dossier auquel appartiens l'instruction.
5456     * Renvoie un tableau contenant les informations du pétitionnaire principal.
5457     *
5458     * Si l'identifiant de l'instruction n'a pas pu etre récupéré renvoie false
5459     * et affiche un message dans les logs.
5460     * En cas d'erreur de base de donnée renvoie false et affiche un message d'erreur.
5461     *
5462     * @param string identifiant du dossier
5463     * @return array|boolean
5464     */
5465     protected function get_info_petitionnaire_principal_dossier($dossier = null) {
5466     // Si l'identifiant de l'instruction n'a pas été fournit on récupère celui de
5467     // l'objet courant
5468     if (empty($dossier)) {
5469     $dossier = $this->getVal('dossier');
5470     // Si la récupération de l'identifiant de l'instruction a échoué la méthode renvoie
5471     // false et on affiche un message d'erreur dans les logs
5472     if (empty($dossier)) {
5473     $this->addToLog(__METHOD__.' : L\'identifiant du dossier n\'a pas pu être récupéré');
5474     return false;
5475     }
5476     }
5477    
5478     // Requête sql servant à récupérer toutes les informations relatives au demandeurs
5479     // principal
5480 softime 13137 $qres = $this->f->get_all_results_from_db_query(
5481     sprintf(
5482     'SELECT
5483     -- Récupère toutes les informations du demandeur principal
5484     demandeur.*,
5485     CASE
5486     WHEN demandeur.qualite=\'particulier\'
5487     THEN TRIM(CONCAT(demandeur.particulier_nom, \' \', demandeur.particulier_prenom, \' \', demandeur.courriel))
5488     ELSE
5489     TRIM(CONCAT(demandeur.personne_morale_raison_sociale, \' \', demandeur.personne_morale_denomination, \' \', demandeur.courriel))
5490     END AS destinataire
5491     FROM
5492     %1$sdossier
5493     LEFT JOIN %1$slien_dossier_demandeur
5494     ON lien_dossier_demandeur.dossier = dossier.dossier
5495     LEFT JOIN %1$sdemandeur
5496     ON demandeur.demandeur = lien_dossier_demandeur.demandeur
5497     WHERE
5498     dossier.dossier = \'%2$s\'
5499     AND lien_dossier_demandeur.petitionnaire_principal IS TRUE',
5500     DB_PREFIXE,
5501     $this->f->db->escapeSimple($dossier)
5502     ),
5503     array(
5504     "origin" => __METHOD__,
5505     )
5506 softime 12124 );
5507 softime 13137 if (is_array($qres["result"]) === true
5508     && array_key_exists(0, $qres["result"]) === true) {
5509     //
5510     return $qres["result"][0];
5511 softime 12124 }
5512 softime 13137 return null;
5513 softime 12124 }
5514    
5515    
5516 mbroquet 3730
5517     /**
5518     * Finalisation des documents.
5519     * @param string $champ champ du fichier à finaliser
5520     * @param booleen $status permet de définir si on finalise ou définalise
5521     * @param string $sousform permet de savoir si se trouve dans un sousformulaire (passé au javascript)
5522     */
5523     function manage_finalizing($mode = null, $val = array()) {
5524 softime 5024 //
5525     $this->begin_treatment(__METHOD__);
5526 mbroquet 3730
5527 softime 5024 //
5528     $id_inst = $this->getVal($this->clePrimaire);
5529 mbroquet 3730
5530 softime 5024 //
5531     $admin_msg_error = _("Veuillez contacter votre administrateur.");
5532     $file_msg_error = _("Erreur de traitement de fichier.")
5533     ." ".$admin_msg_error;
5534     $bdd_msg_error = _("Erreur de base de données.")
5535     ." ".$admin_msg_error;
5536 softime 5169 $log_msg_error = "Finalisation non enregistrée - id instruction = %s - uid fichier = %s";
5537 mbroquet 3730
5538     // Si on finalise le document
5539     if ($mode == "finalize"){
5540 softime 5024 //
5541     $etat = _('finalisation');
5542 mbroquet 3730
5543     // Récupère la collectivite du dossier d'instruction
5544     $dossier_instruction_om_collectivite = $this->get_dossier_instruction_om_collectivite();
5545    
5546     //
5547     $collectivite = $this->f->getCollectivite($dossier_instruction_om_collectivite);
5548 softime 8593
5549     //
5550     $params = array(
5551     "specific" => array(),
5552     );
5553     // Si la rédaction libre est activée sur l'instruction
5554     if ($this->getVal("flag_edition_integrale") == 't') {
5555     $params["specific"]["corps"] = array(
5556     "mode" => "set",
5557     "value" => $this->getVal("corps_om_htmletatex"),
5558     );
5559     $params["specific"]["titre"] = array(
5560     "mode" => "set",
5561     "value" => $this->getVal("titre_om_htmletat"),
5562     );
5563     }
5564 mbroquet 3730 // Génération du PDF
5565 softime 8593 $result = $this->compute_pdf_output('lettretype', $this->getVal('lettretype'), $collectivite, null, $params);
5566 mbroquet 3730 $pdf_output = $result['pdf_output'];
5567 softime 10573
5568 mbroquet 3730 //Métadonnées du document
5569     $metadata = array(
5570 softime 5024 'filename' => 'instruction_'.$id_inst.'.pdf',
5571 mbroquet 3730 'mimetype' => 'application/pdf',
5572     'size' => strlen($pdf_output)
5573     );
5574    
5575     // Récupération des métadonnées calculées après validation
5576     $spe_metadata = $this->getMetadata("om_fichier_instruction");
5577    
5578     //On vérifie si l'instruction à finaliser a un événement de type arrete
5579 softime 14064 // TODO : A voir pour remplacer par une instanciation de l'événement.
5580     // Voir également si l'événement ne dois pas être instancié en début de
5581     // méthode pour pouvoir être réutilisé.
5582     $qres = $this->f->get_one_result_from_db_query(
5583     sprintf(
5584     'SELECT
5585     type
5586     FROM
5587     %1$sevenement
5588     WHERE
5589     evenement = \'%2$d\'',
5590     DB_PREFIXE,
5591     intval($this->getVal("evenement"))
5592     ),
5593     array(
5594     "origin" => __METHOD__,
5595     "force_return" => true,
5596     )
5597     );
5598    
5599     if ($qres["code"] !== "OK") {
5600 softime 5024 $this->correct = false;
5601     $this->addToMessage($bdd_msg_error);
5602     return $this->end_treatment(__METHOD__, false);
5603 mbroquet 3730 }
5604    
5605     //Initialisation de la variable
5606     $arrete_metadata = array();
5607     // Si l'événement est de type arrete, on ajoute les métadonnées spécifiques
5608 softime 14064 if ($qres['result'] === 'arrete'){
5609 mbroquet 3730 $arrete_metadata = $this->getMetadata("arrete");
5610     }
5611    
5612     $metadata = array_merge($metadata, $spe_metadata, $arrete_metadata);
5613    
5614 softime 10573 /*
5615     // transforme le tableau de métadonnées en objet
5616     $mdf = new MetadataFactory();
5617     $md = $mdf->build('Instruction', $metadata);
5618     */
5619    
5620 softime 5024 // Si le document a déjà été finalisé on le met à jour
5621     // en conservant son UID
5622 mbroquet 3730 if ($this->getVal("om_fichier_instruction") != ''){
5623     $uid = $this->f->storage->update(
5624     $this->getVal("om_fichier_instruction"), $pdf_output, $metadata);
5625     }
5626 softime 5024 // Sinon on crée un nouveau document et dont on récupère l'UID
5627 mbroquet 3730 else {
5628 softime 10573 $uid = $this->f->storage->create($pdf_output, $metadata, "from_content", $this->table.".om_fichier_instruction");
5629 mbroquet 3730 }
5630     }
5631    
5632 softime 5024 // Si on définalise le document
5633 mbroquet 3730 if ($mode == "unfinalize") {
5634 softime 5024 //
5635     $etat = _('définalisation');
5636 mbroquet 3730 // Récupération de l'uid du document finalisé
5637     $uid = $this->getVal("om_fichier_instruction");
5638     }
5639 softime 5024
5640     // Si on définalise l'UID doit être défini
5641     // Si on finalise la création/modification du fichier doit avoir réussi
5642 mbroquet 3730 if ($uid == '' || $uid == 'OP_FAILURE' ) {
5643 softime 5024 $this->correct = false;
5644     $this->addToMessage($file_msg_error);
5645 softime 8989 $this->addToLog(sprintf($log_msg_error, $id_inst, $uid), DEBUG_MODE);
5646 softime 5024 return $this->end_treatment(__METHOD__, false);
5647 mbroquet 3730 }
5648    
5649     //
5650     foreach ($this->champs as $key => $champ) {
5651     //
5652     $val[$champ] = $this->val[$key];
5653     }
5654    
5655     //
5656 softime 6565 $val['date_evenement'] = $this->dateDBToForm($val['date_evenement']);
5657     $val['archive_date_complet'] = $this->dateDBToForm($val['archive_date_complet']);
5658     $val['archive_date_rejet'] = $this->dateDBToForm($val['archive_date_rejet']);
5659     $val['archive_date_limite'] = $this->dateDBToForm($val['archive_date_limite']);
5660     $val['archive_date_notification_delai'] = $this->dateDBToForm($val['archive_date_notification_delai']);
5661     $val['archive_date_decision'] = $this->dateDBToForm($val['archive_date_decision']);
5662     $val['archive_date_validite'] = $this->dateDBToForm($val['archive_date_validite']);
5663     $val['archive_date_achevement'] = $this->dateDBToForm($val['archive_date_achevement']);
5664     $val['archive_date_chantier'] = $this->dateDBToForm($val['archive_date_chantier']);
5665     $val['archive_date_conformite'] = $this->dateDBToForm($val['archive_date_conformite']);
5666     $val['archive_date_dernier_depot'] = $this->dateDBToForm($val['archive_date_dernier_depot']);
5667     $val['archive_date_limite_incompletude'] = $this->dateDBToForm($val['archive_date_limite_incompletude']);
5668     $val['date_finalisation_courrier'] = $this->dateDBToForm($val['date_finalisation_courrier']);
5669     $val['date_envoi_signature'] = $this->dateDBToForm($val['date_envoi_signature']);
5670     $val['date_retour_signature'] = $this->dateDBToForm($val['date_retour_signature']);
5671     $val['date_envoi_rar'] = $this->dateDBToForm($val['date_envoi_rar']);
5672     $val['date_retour_rar'] = $this->dateDBToForm($val['date_retour_rar']);
5673     $val['date_envoi_controle_legalite'] = $this->dateDBToForm($val['date_envoi_controle_legalite']);
5674     $val['date_retour_controle_legalite'] = $this->dateDBToForm($val['date_retour_controle_legalite']);
5675     $val['archive_date_cloture_instruction'] = $this->dateDBToForm($val['archive_date_cloture_instruction']);
5676     $val['archive_date_premiere_visite'] = $this->dateDBToForm($val['archive_date_premiere_visite']);
5677     $val['archive_date_derniere_visite'] = $this->dateDBToForm($val['archive_date_derniere_visite']);
5678     $val['archive_date_contradictoire'] = $this->dateDBToForm($val['archive_date_contradictoire']);
5679     $val['archive_date_retour_contradictoire'] = $this->dateDBToForm($val['archive_date_retour_contradictoire']);
5680     $val['archive_date_ait'] = $this->dateDBToForm($val['archive_date_ait']);
5681     $val['archive_date_transmission_parquet'] = $this->dateDBToForm($val['archive_date_transmission_parquet']);
5682 softime 8989 $val['archive_date_affichage'] = $this->dateDBToForm($val['archive_date_affichage']);
5683 mbroquet 3730 $this->setvalF($val);
5684    
5685     // Verification de la validite des donnees
5686 softime 8989 $this->verifier($this->val);
5687 mbroquet 3730 // Si les verifications precedentes sont correctes, on procede a
5688     // la modification, sinon on ne fait rien et on retourne une erreur
5689 softime 5024 if ($this->correct === true) {
5690 mbroquet 3730 //
5691     $valF = array(
5692     "om_fichier_instruction" => $uid,
5693     "date_finalisation_courrier" => date('Y-m-d')
5694     );
5695     //
5696     if($mode=="finalize") {
5697     // état finalisé vrai
5698 softime 5024 $valF["om_final_instruction"] = true;
5699 mbroquet 3730 // ajout log utilisateur
5700     $login = $_SESSION['login'];
5701     $nom = "";
5702     $this->f->getUserInfos();
5703     if (isset($this->f->om_utilisateur["nom"])
5704     && !empty($this->f->om_utilisateur["nom"])) {
5705     $nom = $this->f->om_utilisateur["nom"];
5706     }
5707     $valF["om_final_instruction_utilisateur"] = $_SESSION['login'];
5708     if ($nom != "") {
5709     $valF["om_final_instruction_utilisateur"] .= " (".$nom.")";
5710     }
5711     } else {
5712     // état finalisé faux
5713 softime 5024 $valF["om_final_instruction"] = false;
5714 mbroquet 3730 // suppression log utilisateur
5715     $valF["om_final_instruction_utilisateur"] = '';
5716     }
5717    
5718     // Execution de la requête de modification des donnees de l'attribut
5719     // valF de l'objet dans l'attribut table de l'objet
5720 softime 8989 $res = $this->f->db->autoExecute(DB_PREFIXE.$this->table, $valF,
5721 softime 5024 DB_AUTOQUERY_UPDATE, $this->getCle($id_inst));
5722     $this->addToLog(__METHOD__."() : db->autoExecute(\"".DB_PREFIXE.$this->table."\", ".print_r($valF, true).", DB_AUTOQUERY_UPDATE, \"".$this->getCle($id_inst)."\")", VERBOSE_MODE);
5723     //
5724     if ($this->f->isDatabaseError($res, true) === true) {
5725     $this->correct = false;
5726     $this->addToMessage($bdd_msg_error);
5727     return $this->end_treatment(__METHOD__, false);
5728     }
5729 mbroquet 3730
5730 softime 5024 //
5731     $this->addToMessage(sprintf(_("La %s du document s'est effectuee avec succes."), $etat));
5732     //
5733     if ($this->add_log_to_dossier($id_inst, $val) === false) {
5734     return $this->end_treatment(__METHOD__, false);
5735     }
5736     //
5737     return $this->end_treatment(__METHOD__, true);
5738 mbroquet 3730 }
5739 softime 5024 // L'appel de verifier() a déjà positionné correct à false
5740     // et défini un message d'erreur.
5741 softime 8989 $this->addToLog(sprintf($log_msg_error, $id_inst, $uid), DEBUG_MODE);
5742 softime 5024 return $this->end_treatment(__METHOD__, false);
5743 mbroquet 3730 }
5744    
5745     /**
5746     * Récupération du numéro de dossier d'instruction à ajouter aux métadonnées
5747     * @return string numéro de dossier d'instruction
5748     */
5749 softime 10573 protected function getDossier($champ = null) {
5750 mbroquet 3730 if(empty($this->specificMetadata)) {
5751     $this->getSpecificMetadata();
5752     }
5753     return $this->specificMetadata->dossier;
5754     }
5755     /**
5756     * Récupération la version du dossier d'instruction à ajouter aux métadonnées
5757     * @return int Version
5758     */
5759     protected function getDossierVersion() {
5760     if(empty($this->specificMetadata)) {
5761     $this->getSpecificMetadata();
5762     }
5763     return $this->specificMetadata->version;
5764     }
5765     /**
5766     * Récupération du numéro de dossier d'autorisation à ajouter aux métadonnées
5767     * @return string numéro de dossier d'autorisation
5768     */
5769     protected function getNumDemandeAutor() {
5770     if(empty($this->specificMetadata)) {
5771     $this->getSpecificMetadata();
5772     }
5773     return $this->specificMetadata->dossier_autorisation;
5774     }
5775     /**
5776     * Récupération de la date de demande initiale du dossier à ajouter aux métadonnées
5777     * @return date de la demande initiale
5778     */
5779     protected function getAnneemoisDemandeAutor() {
5780     if(empty($this->specificMetadata)) {
5781     $this->getSpecificMetadata();
5782     }
5783     return $this->specificMetadata->date_demande_initiale;
5784     }
5785     /**
5786     * Récupération du type de dossier d'instruction à ajouter aux métadonnées
5787     * @return string type du dossier d'instruction
5788     */
5789     protected function getTypeInstruction() {
5790     if(empty($this->specificMetadata)) {
5791     $this->getSpecificMetadata();
5792     }
5793     return $this->specificMetadata->dossier_instruction_type;
5794     }
5795     /**
5796     * Récupération du statut du dossier d'autorisation à ajouter aux métadonnées
5797     * @return string avis
5798     */
5799     protected function getStatutAutorisation() {
5800     if(empty($this->specificMetadata)) {
5801     $this->getSpecificMetadata();
5802     }
5803     return $this->specificMetadata->statut;
5804     }
5805     /**
5806     * Récupération du type de dossier d'autorisation à ajouter aux métadonnées
5807     * @return string type du dossier d'autorisation
5808     */
5809     protected function getTypeAutorisation() {
5810     if(empty($this->specificMetadata)) {
5811     $this->getSpecificMetadata();
5812     }
5813     return $this->specificMetadata->dossier_autorisation_type;
5814     }
5815     /**
5816     * Récupération de la date d'ajout de document à ajouter aux métadonnées
5817     * @return date de l'évènement
5818     */
5819     protected function getDateEvenementDocument() {
5820     return date("Y-m-d");
5821     }
5822     /**
5823     * Récupération du groupe d'instruction à ajouter aux métadonnées
5824     * @return string Groupe d'instruction
5825     */
5826     protected function getGroupeInstruction() {
5827     if(empty($this->specificMetadata)) {
5828     $this->getSpecificMetadata();
5829     }
5830     return $this->specificMetadata->groupe_instruction;
5831     }
5832     /**
5833     * Récupération du libellé du type du document à ajouter aux métadonnées
5834     * @return string Groupe d'instruction
5835     */
5836     protected function getTitle() {
5837    
5838     // Récupère le champ événement
5839     if (isset($this->valF["evenement"]) AND $this->valF["evenement"] != "") {
5840     $evenement = $this->valF["evenement"];
5841     } else {
5842     $evenement = $this->getVal("evenement");
5843     }
5844    
5845     // Requête sql
5846 softime 14064 $evenement = $this->f->get_inst__om_dbform(array(
5847     "obj" => "evenement",
5848     "idx" => $evenement
5849     ));
5850    
5851 mbroquet 3730 // Retourne le libelle de l'événement
5852 softime 14064 return $evenement->getVal('libelle');
5853 mbroquet 3730 }
5854    
5855 softime 6272
5856 mbroquet 3730 /**
5857 softime 6272 * Récupération du champ ERP du dossier d'instruction.
5858     *
5859     * @return boolean
5860     */
5861     public function get_concerne_erp() {
5862     //
5863     if(empty($this->specificMetadata)) {
5864     $this->getSpecificMetadata();
5865     }
5866     //
5867     return $this->specificMetadata->erp;
5868     }
5869    
5870    
5871     /**
5872 mbroquet 3730 * Cette méthode permet de stocker en attribut toutes les métadonnées
5873     * nécessaire à l'ajout d'un document.
5874     */
5875     public function getSpecificMetadata() {
5876     if (isset($this->valF["dossier"]) AND $this->valF["dossier"] != "") {
5877     $dossier = $this->valF["dossier"];
5878     } else {
5879     $dossier = $this->getVal("dossier");
5880     }
5881     //Requête pour récupérer les informations essentiels sur le dossier d'instruction
5882 softime 14542 $qres = $this->f->get_all_results_from_db_query(
5883     sprintf(
5884     'SELECT
5885     dossier.dossier AS dossier,
5886     dossier_autorisation.dossier_autorisation AS dossier_autorisation,
5887     to_char(dossier.date_demande, \'YYYY/MM\') AS date_demande_initiale,
5888     dossier_instruction_type.code AS dossier_instruction_type,
5889     etat_dossier_autorisation.libelle AS statut,
5890     dossier_autorisation_type.code AS dossier_autorisation_type,
5891     groupe.code AS groupe_instruction,
5892     CASE WHEN dossier.erp IS TRUE
5893     THEN \'true\'
5894     ELSE \'false\'
5895     END AS erp
5896     FROM
5897     %1$sdossier
5898     LEFT JOIN %1$sdossier_instruction_type
5899 mbroquet 3730 ON dossier.dossier_instruction_type = dossier_instruction_type.dossier_instruction_type
5900 softime 14542 LEFT JOIN %1$sdossier_autorisation
5901 mbroquet 3730 ON dossier.dossier_autorisation = dossier_autorisation.dossier_autorisation
5902 softime 14542 LEFT JOIN %1$setat_dossier_autorisation
5903 mbroquet 3730 ON dossier_autorisation.etat_dossier_autorisation = etat_dossier_autorisation.etat_dossier_autorisation
5904 softime 14542 LEFT JOIN %1$sdossier_autorisation_type_detaille
5905 mbroquet 3730 ON dossier_autorisation.dossier_autorisation_type_detaille = dossier_autorisation_type_detaille.dossier_autorisation_type_detaille
5906 softime 14542 LEFT JOIN %1$sdossier_autorisation_type
5907 mbroquet 3730 ON dossier_autorisation_type_detaille.dossier_autorisation_type = dossier_autorisation_type.dossier_autorisation_type
5908 softime 14542 LEFT JOIN %1$sgroupe
5909 mbroquet 3730 ON dossier_autorisation_type.groupe = groupe.groupe
5910 softime 14542 WHERE
5911     dossier.dossier = \'%2$s\'',
5912     DB_PREFIXE,
5913     $this->f->db->escapeSimple($dossier)
5914     ),
5915     array(
5916     "origin" => __METHOD__,
5917     )
5918     );
5919     $row = array_shift($qres['result']);
5920 mbroquet 3730
5921     //Si il y a un résultat
5922 softime 14542 if (! empty($row)) {
5923 mbroquet 3730
5924 fmichon 3892 // Instrance de la classe dossier
5925     $inst_dossier = $this->get_inst_dossier($dossier);
5926 softime 14542 // TODO : améliorer ce code
5927     //
5928     // Avant l e résultat été récupéré dans un objet à partir de la requête mais en modifiant pour
5929     // utiliser la méthode get_all_results_from_db_query() c'est maintenant un tableau
5930     // qu'on obtiens. Pour garder le même fonctionnement on transforme le tableau des
5931     // valeurs issues de la requête en objet.
5932     $metadata = (object)$row;
5933 fmichon 3892 // Insère l'attribut version à l'objet
5934 softime 14542 $metadata->version = $inst_dossier->get_di_numero_suffixe();
5935 fmichon 3892
5936 mbroquet 3730 //Alors on créé l'objet dossier_instruction
5937 softime 14542 $this->specificMetadata = $metadata;
5938 mbroquet 3730
5939     }
5940     }
5941    
5942     /**
5943     * Retourne le statut du dossier d'instruction
5944     * @param string $idx Identifiant du dossier d'instruction
5945     * @return string Le statut du dossier d'instruction
5946     */
5947     function getStatutAutorisationDossier($idx){
5948    
5949     $statut = '';
5950    
5951     //Si l'identifiant du dossier d'instruction fourni est correct
5952     if ( $idx != '' ){
5953    
5954     //On récupère le statut de l'état du dossier à partir de l'identifiant du
5955     //dossier
5956 softime 14064 $qres = $this->f->get_one_result_from_db_query(
5957     sprintf(
5958     'SELECT
5959     etat.statut
5960     FROM
5961     %1$sdossier
5962     LEFT JOIN
5963     %1$setat
5964     ON
5965     dossier.etat = etat.etat
5966     WHERE
5967     dossier = \'%2$s\'',
5968     DB_PREFIXE,
5969     $this->f->db->escapeSimple($idx)
5970     ),
5971     array(
5972     "origin" => __METHOD__,
5973     )
5974     );
5975 mbroquet 3730 }
5976 softime 14064
5977     return $qres['result'];
5978 mbroquet 3730 }
5979    
5980     /**
5981     * Récupère les données du dossier
5982     * @return array
5983     */
5984     function get_dossier_actual() {
5985    
5986     // Initialisation de la valeur de retour
5987     $return = array();
5988    
5989     // Récupération de toutes les valeurs du dossier d'instruction en cours
5990 softime 14542 // TODO : remplacer cette requête par une instanciation de l'objet
5991     $qres = $this->f->get_all_results_from_db_query(
5992     sprintf(
5993     'SELECT
5994     *
5995     FROM
5996     %1$sdossier
5997     WHERE
5998     dossier = \'%2$s\'',
5999     DB_PREFIXE,
6000     $this->f->db->escapeSimple($this->valF['dossier'])
6001     ),
6002     array(
6003     'origin' => __METHOD__
6004     )
6005     );
6006 mbroquet 3730
6007 softime 14542 foreach ($qres['result'] as $row) {
6008 mbroquet 3730
6009     // Récupération de la valeur actuelle du délai, de l'accord tacite,
6010     // de l'état et de l'avis du dossier d'instruction
6011 softime 6565 $return['archive_delai'] = $row['delai'];
6012     $return['archive_accord_tacite'] = $row['accord_tacite'];
6013     $return['archive_etat'] = $row['etat'];
6014     $return['archive_avis'] = $row['avis_decision'];
6015     // Récupération de la valeur actuelle des dates du dossier
6016 mbroquet 3730 // d'instruction
6017 softime 6565 $return['archive_date_complet'] = $row['date_complet'];
6018     $return['archive_date_dernier_depot'] = $row['date_dernier_depot'];
6019     $return['archive_date_rejet'] = $row['date_rejet'];
6020     $return['archive_date_limite'] = $row['date_limite'];
6021     $return['archive_date_notification_delai'] = $row['date_notification_delai'];
6022     $return['archive_date_decision'] = $row['date_decision'];
6023     $return['archive_date_validite'] = $row['date_validite'];
6024     $return['archive_date_achevement'] = $row['date_achevement'];
6025     $return['archive_date_chantier'] = $row['date_chantier'];
6026     $return['archive_date_conformite'] = $row['date_conformite'];
6027     $return['archive_incompletude'] = $row['incompletude'];
6028     $return['archive_incomplet_notifie'] = $row['incomplet_notifie'];
6029     $return['archive_evenement_suivant_tacite'] = $row['evenement_suivant_tacite'];
6030     $return['archive_evenement_suivant_tacite_incompletude'] = $row['evenement_suivant_tacite_incompletude'];
6031     $return['archive_etat_pendant_incompletude'] = $row['etat_pendant_incompletude'];
6032     $return['archive_date_limite_incompletude'] = $row['date_limite_incompletude'];
6033     $return['archive_delai_incompletude'] = $row['delai_incompletude'];
6034     $return['archive_autorite_competente'] = $row['autorite_competente'];
6035 softime 8593 $return['archive_dossier_instruction_type'] = $row['dossier_instruction_type'];
6036 softime 6565 $return['duree_validite'] = $row['duree_validite'];
6037     $return['date_depot'] = $row['date_depot'];
6038 softime 10573 $return['date_depot_mairie'] = $row['date_depot_mairie'];
6039 softime 6565 $return['archive_date_cloture_instruction'] = $row['date_cloture_instruction'];
6040     $return['archive_date_premiere_visite'] = $row['date_premiere_visite'];
6041     $return['archive_date_derniere_visite'] = $row['date_derniere_visite'];
6042     $return['archive_date_contradictoire'] = $row['date_contradictoire'];
6043     $return['archive_date_retour_contradictoire'] = $row['date_retour_contradictoire'];
6044     $return['archive_date_ait'] = $row['date_ait'];
6045     $return['archive_date_transmission_parquet'] = $row['date_transmission_parquet'];
6046 softime 8989 $return['archive_date_affichage'] = $row['date_affichage'];
6047 softime 10573 $return['archive_pec_metier'] = $row['pec_metier'];
6048     $return['archive_a_qualifier'] = $row['a_qualifier'];
6049 mbroquet 3730 }
6050    
6051     // Retour de la fonction
6052     return $return;
6053    
6054     }
6055    
6056     /**
6057     * Permet de vérifier qu'un événement est verrouillable
6058     * @param integer $idx Identifiant de l'instruction
6059     * @return boolean
6060     */
6061     function checkEvenementNonVerrouillable($idx) {
6062     // Si la condition n'est pas vide
6063     if ($idx != "") {
6064    
6065     // Requête SQL
6066 softime 14064 $qres = $this->f->get_one_result_from_db_query(
6067     sprintf(
6068     'SELECT
6069     evenement.non_verrouillable
6070     FROM
6071     %1$sevenement
6072     LEFT JOIN %1$sinstruction
6073     ON instruction.evenement = evenement.evenement
6074     WHERE
6075     instruction.instruction = \'%2$s\'',
6076     DB_PREFIXE,
6077     intval($idx)
6078     ),
6079     array(
6080     "origin" => __METHOD__,
6081     )
6082     );
6083 mbroquet 3730 }
6084    
6085 softime 14064 // Si on a un résultat et que ce résultat indique que l'événement n'est
6086     // pas vérrouillable renvoie true, sinon renvoie false
6087     return isset($qres) && isset($qres['result']) && $qres['result'] == 't';
6088 mbroquet 3730 }
6089    
6090     /**
6091     * Mise à jour des champs archive_*
6092     * @param mixed $row La ligne de données
6093     */
6094     public function updateArchiveData($row){
6095    
6096     // Récupération de la valeur actuelle du délai, de l'accord tacite,
6097     // de l'état et de l'avis du dossier d'instruction
6098     $this->valF['archive_delai']=$row['delai'];
6099     $this->valF['archive_accord_tacite']=$row['accord_tacite'];
6100     $this->valF['archive_etat']=$row['etat'];
6101     $this->valF['archive_avis']=$row['avis_decision'];
6102     // Récupération de la valeur actuelle des 9 dates du dossier
6103     // d'instruction
6104     if ($row['date_complet'] != '') {
6105     $this->valF['archive_date_complet']=$row['date_complet'];
6106     }
6107     if ($row['date_dernier_depot'] != '') {
6108     $this->valF['archive_date_dernier_depot']=$row['date_dernier_depot'];
6109     }
6110 softime 6565 if ($row['date_rejet'] != '') {
6111 mbroquet 3730 $this->valF['archive_date_rejet']= $row['date_rejet'];
6112     }
6113 softime 6565 if ($row['date_limite'] != '') {
6114 mbroquet 3730 $this->valF['archive_date_limite']= $row['date_limite'];
6115     }
6116 softime 6565 if ($row['date_notification_delai'] != '') {
6117 mbroquet 3730 $this->valF['archive_date_notification_delai']= $row['date_notification_delai'];
6118     }
6119 softime 6565 if ($row['date_decision'] != '') {
6120 mbroquet 3730 $this->valF['archive_date_decision']= $row['date_decision'];
6121     }
6122 softime 6565 if ($row['date_validite'] != '') {
6123 mbroquet 3730 $this->valF['archive_date_validite']= $row['date_validite'];
6124     }
6125 softime 6565 if ($row['date_achevement'] != '') {
6126 mbroquet 3730 $this->valF['archive_date_achevement']= $row['date_achevement'];
6127     }
6128 softime 6565 if ($row['date_chantier'] != '') {
6129 mbroquet 3730 $this->valF['archive_date_chantier']= $row['date_chantier'];
6130     }
6131 softime 6565 if ($row['date_conformite'] != '') {
6132 mbroquet 3730 $this->valF['archive_date_conformite']= $row['date_conformite'];
6133     }
6134 softime 6565 if ($row['incompletude'] != '') {
6135 mbroquet 3730 $this->valF['archive_incompletude']= $row['incompletude'];
6136     }
6137 softime 6565 if ($row['incomplet_notifie'] != '') {
6138 mbroquet 3730 $this->valF['archive_incomplet_notifie']= $row['incomplet_notifie'];
6139     }
6140 softime 6565 if ($row['evenement_suivant_tacite'] != '') {
6141 mbroquet 3730 $this->valF['archive_evenement_suivant_tacite']= $row['evenement_suivant_tacite'];
6142     }
6143 softime 6565 if ($row['evenement_suivant_tacite_incompletude'] != '') {
6144 mbroquet 3730 $this->valF['archive_evenement_suivant_tacite_incompletude']= $row['evenement_suivant_tacite_incompletude'];
6145     }
6146 softime 6565 if ($row['etat_pendant_incompletude'] != '') {
6147 mbroquet 3730 $this->valF['archive_etat_pendant_incompletude']= $row['etat_pendant_incompletude'];
6148     }
6149 softime 6565 if ($row['date_limite_incompletude'] != '') {
6150 mbroquet 3730 $this->valF['archive_date_limite_incompletude']= $row['date_limite_incompletude'];
6151     }
6152 softime 6565 if ($row['delai_incompletude'] != '') {
6153 mbroquet 3730 $this->valF['archive_delai_incompletude']= $row['delai_incompletude'];
6154     }
6155 softime 6565 if ($row['autorite_competente'] != '') {
6156 mbroquet 3730 $this->valF['archive_autorite_competente']= $row['autorite_competente'];
6157     }
6158 softime 6565 if ($row['duree_validite'] != '') {
6159 mbroquet 3730 $this->valF['duree_validite']= $row['duree_validite'];
6160     }
6161 softime 6565 if ($row['date_depot'] != '') {
6162 nmeucci 3873 $this->valF['date_depot']= $row['date_depot'];
6163     }
6164 softime 10573 if ($row['date_depot_mairie'] != '') {
6165     $this->valF['date_depot_mairie']= $row['date_depot_mairie'];
6166     }
6167 softime 6565 // Dates concernant les dossiers contentieux
6168     if ($row['date_cloture_instruction'] != '') {
6169     $this->valF['archive_date_cloture_instruction']= $row['date_cloture_instruction'];
6170     }
6171     if ($row['date_premiere_visite'] != '') {
6172     $this->valF['archive_date_premiere_visite']= $row['date_premiere_visite'];
6173     }
6174     if ($row['date_derniere_visite'] != '') {
6175     $this->valF['archive_date_derniere_visite']= $row['date_derniere_visite'];
6176     }
6177     if ($row['date_contradictoire'] != '') {
6178     $this->valF['archive_date_contradictoire']= $row['date_contradictoire'];
6179     }
6180     if ($row['date_retour_contradictoire'] != '') {
6181     $this->valF['archive_date_retour_contradictoire']= $row['date_retour_contradictoire'];
6182     }
6183     if ($row['date_ait'] != '') {
6184     $this->valF['archive_date_ait']= $row['date_ait'];
6185     }
6186     if ($row['date_transmission_parquet'] != '') {
6187     $this->valF['archive_date_transmission_parquet']= $row['date_transmission_parquet'];
6188     }
6189 softime 8989 //
6190 softime 8593 if ($row['dossier_instruction_type'] != '') {
6191     $this->valF['archive_dossier_instruction_type']= $row['dossier_instruction_type'];
6192     }
6193 softime 8989 if ($row['date_affichage'] != '') {
6194     $this->valF['archive_date_affichage']= $row['date_affichage'];
6195     }
6196 softime 10573 if (isset($row['pec_metier']) === true && $row['pec_metier'] != '') {
6197     $this->valF['archive_pec_metier']= $row['pec_metier'];
6198     }
6199     if (isset($row['a_qualifier']) === true && $row['a_qualifier'] != '') {
6200     $this->valF['archive_a_qualifier']= $row['a_qualifier'];
6201     }
6202 mbroquet 3730 }
6203    
6204     // {{{
6205     // Méthodes de récupération des métadonnées arrêté
6206     /**
6207     * @return string Retourne le numéro d'arrêté
6208     */
6209     function getNumArrete() {
6210     return $this->getVal("numero_arrete");
6211     }
6212     /**
6213     * @return chaîne vide
6214     */
6215     function getReglementaireArrete() {
6216     return 'true';
6217     }
6218     /**
6219     * @return boolean de notification au pétitionnaire
6220     */
6221     function getNotificationArrete() {
6222     return 'true';
6223     }
6224     /**
6225     * @return date de notification au pétitionnaire
6226     */
6227     function getDateNotificationArrete() {
6228     if (empty($this->metadonneesArrete)) {
6229     $this->getArreteMetadata();
6230     }
6231     return $this->metadonneesArrete["datenotification"];
6232     }
6233     /**
6234     * @return boolean check si le document est passé au contrôle de légalité
6235     */
6236     function getControleLegalite() {
6237     return 'true';
6238     }
6239     /**
6240     * @return date de signature de l'arrêté
6241     */
6242     function getDateSignature() {
6243     if (empty($this->metadonneesArrete)) {
6244     $this->getArreteMetadata();
6245     }
6246     return $this->metadonneesArrete["datesignaturearrete"];
6247     }
6248     /**
6249     * @return string nom du signataire
6250     */
6251     function getNomSignataire() {
6252     if (empty($this->metadonneesArrete)) {
6253     $this->getArreteMetadata();
6254     }
6255     return $this->metadonneesArrete["nomsignataire"];
6256     }
6257     /**
6258     * @return string qualité du signataire
6259     */
6260     function getQualiteSignataire() {
6261     if (empty($this->metadonneesArrete)) {
6262     $this->getArreteMetadata();
6263     }
6264     return $this->metadonneesArrete["qualitesignataire"];
6265     }
6266     /**
6267     * @return string numéro du terrain
6268     */
6269     function getAp_numRue() {
6270     if (empty($this->metadonneesArrete)) {
6271     $this->getArreteMetadata();
6272     }
6273     return $this->metadonneesArrete["ap_numrue"];
6274     }
6275     /**
6276     * @return string nom de la rue du terrain
6277     */
6278     function getAp_nomDeLaVoie() {
6279     if (empty($this->metadonneesArrete)) {
6280     $this->getArreteMetadata();
6281     }
6282     return $this->metadonneesArrete["ap_nomdelavoie"];
6283     }
6284     /**
6285     * @return string code postal du terrain
6286     */
6287     function getAp_codePostal() {
6288     if (empty($this->metadonneesArrete)) {
6289     $this->getArreteMetadata();
6290     }
6291     return $this->metadonneesArrete["ap_codepostal"];
6292     }
6293     /**
6294     * @return string ville du terrain
6295     */
6296     function getAp_ville() {
6297     if (empty($this->metadonneesArrete)) {
6298     $this->getArreteMetadata();
6299     }
6300     return $this->metadonneesArrete["ap_ville"];
6301     }
6302     /**
6303     * @return string activité
6304     */
6305     function getActivite() {
6306     return "Droit du sol";
6307     }
6308     /**
6309     * @return string date du retour de controle légalité
6310     */
6311     function getDateControleLegalite() {
6312     if (empty($this->metadonneesArrete)) {
6313     $this->getArreteMetadata();
6314     }
6315     return $this->metadonneesArrete["datecontrolelegalite"];
6316     }
6317    
6318     // Fin des méthodes de récupération des métadonnées
6319     // }}}
6320    
6321     /**
6322     * Méthode de récupération des métadonnées arrêtés dans la base de données,
6323     * les données sont stockés dans l'attribut $this->metadonneesArrete
6324     */
6325     function getArreteMetadata() {
6326    
6327 softime 14542 //Récupération de la dernière instruction dont l'événement est de type 'arrete'
6328     $this->metadonneesArrete = array("nomsignataire"=>"", "qualitesignataire"=>"",
6329     "decisionarrete"=>"", "datenotification"=>"", "datesignaturearrete"=>"",
6330     "datecontrolelegalite"=>"", "ap_numrue"=>"", "ap_nomdelavoie"=>"",
6331     "ap_codepostal"=>"", "ap_ville"=>"");
6332 mbroquet 3730
6333 softime 14542 $qres = $this->f->get_all_results_from_db_query(
6334     sprintf(
6335     'SELECT
6336     signataire_arrete.prenom || \' \' ||signataire_arrete.nom as nomsignataire,
6337     signataire_arrete.qualite as qualitesignataire,
6338     instruction.etat as decisionarrete,
6339     instruction.date_retour_rar as datenotification,
6340     instruction.date_retour_signature as datesignaturearrete,
6341     instruction.date_retour_controle_legalite as datecontrolelegalite,
6342     dossier.terrain_adresse_voie_numero as ap_numrue,
6343     dossier.terrain_adresse_voie as ap_nomdelavoie,
6344     dossier.terrain_adresse_code_postal as ap_codepostal,
6345     dossier.terrain_adresse_localite as ap_ville
6346     FROM
6347     %1$sinstruction
6348     LEFT JOIN %1$ssignataire_arrete
6349     ON instruction.signataire_arrete = signataire_arrete.signataire_arrete
6350     LEFT JOIN %1$sdossier
6351     ON instruction.dossier = dossier.dossier
6352     LEFT JOIN %1$sdonnees_techniques
6353     ON donnees_techniques.dossier_instruction = dossier.dossier
6354     WHERE
6355     instruction.instruction = %2$d',
6356     DB_PREFIXE,
6357     intval($this->getVal('instruction'))
6358     ),
6359     array(
6360     'origin' => __METHOD__
6361     )
6362     );
6363     $this->metadonneesArrete = array_shift($qres['result']);
6364 mbroquet 3730 }
6365    
6366     /**
6367     * CONDITION - has_an_edition.
6368     *
6369     * Condition pour afficher le bouton de visualisation de l'édition.
6370     *
6371     * @return boolean
6372     */
6373     function has_an_edition() {
6374     // Récupère la valeur du champ lettretype
6375     $lettretype = $this->getVal("lettretype");
6376     // Si le champ est vide
6377 softime 7521 if ($lettretype !== '' && $lettretype !== null) {
6378 mbroquet 3730 //
6379 softime 7521 return true;
6380 mbroquet 3730 }
6381    
6382     //
6383 softime 7521 return false;
6384 mbroquet 3730 }
6385    
6386     /**
6387 softime 10573 * CONDITION - is_modifiable.
6388     *
6389     * Controle si l'évenement est modifiable.
6390     *
6391     * @return boolean
6392     */
6393     function is_evenement_modifiable() {
6394     $evenement = $this->get_inst_evenement($this->getVal('evenement'));
6395     return ! $this->get_boolean_from_pgsql_value($evenement->getVal('non_modifiable'));
6396     }
6397    
6398     /**
6399 mbroquet 3730 * CONDITION - is_editable.
6400     *
6401     * Condition pour la modification.
6402     *
6403     * @return boolean
6404     */
6405     function is_editable() {
6406 softime 10573
6407     // XXX
6408     // 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é)
6409     // Si cette tâche identifiée est DONE alors la suppression/modification de cette intruction est impossible
6410    
6411 mbroquet 3730 // Contrôle si l'utilisateur possède un bypass
6412 softime 7996 $bypass = $this->f->isAccredited($this->get_absolute_class_name()."_modifier_bypass");
6413 mbroquet 3730 //
6414     if ($bypass == true) {
6415     //
6416     return true;
6417     }
6418 softime 6565
6419 mbroquet 3730 // Si l'utilisateur est un instructeur, que le dossier est cloturé et
6420     // que l'événement n'est pas identifié comme non verrouillable
6421     if ($this->f->isUserInstructeur()
6422     && $this->getStatutAutorisationDossier($this->getParameter("idxformulaire")) == "cloture"
6423     && $this->checkEvenementNonVerrouillable($this->getVal("instruction")) === false) {
6424     //
6425     return false;
6426     }
6427    
6428 softime 6565 // Si l'utilisateur est un intructeur qui correspond à la division du
6429     // dossier
6430     if ($this->is_instructeur_from_division_dossier() === true) {
6431     //
6432     return true;
6433     }
6434    
6435     // Si l'utilisateur est instructeur de la commune du dossier et que
6436     // l'instruction est créée par un instructeur de la commune
6437     if ($this->is_instructeur_from_collectivite_dossier() === true and
6438     $this->getVal('created_by_commune') === 't') {
6439     return true;
6440     }
6441    
6442 mbroquet 3730 //
6443 softime 6565 return false;
6444 mbroquet 3730 }
6445    
6446     /**
6447 softime 10573 * Vérifie si l'événement est supprimable ou pas.
6448     *
6449     * @return boolean
6450     */
6451     function is_evenement_supprimable() {
6452     // Controle si l'évenement est supprimable
6453     $evenement = $this->get_inst_evenement($this->getVal('evenement'));
6454     return ! $this->get_boolean_from_pgsql_value($evenement->getVal('non_supprimable'));
6455     }
6456    
6457     /**
6458 mbroquet 3730 * CONDITION - is_deletable.
6459     *
6460 softime 6864 * Condition pour la suppression.
6461 mbroquet 3730 *
6462     * @return boolean
6463     */
6464     function is_deletable() {
6465 softime 10573
6466     // XXX
6467     // 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é)
6468     // Si cette tâche identifiée est DONE alors la suppression/modification de cette intruction est impossible
6469    
6470 softime 6864 // Contrôle si l'utilisateur possède un bypass intégral
6471 softime 7996 $bypass = $this->f->isAccredited($this->get_absolute_class_name()."_supprimer_bypass");
6472 mbroquet 3730 //
6473     if ($bypass == true) {
6474    
6475     //
6476     return true;
6477     }
6478    
6479     // Si l'utilisateur est un intructeur qui ne correspond pas à la
6480 softime 6864 // division du dossier et si l'utilisateur n'a pas la permission bypass
6481     // de la division
6482     if ($this->is_instructeur_from_division_dossier() === false
6483 softime 7996 && $this->f->isAccredited($this->get_absolute_class_name()."_supprimer_bypass_division") === false) {
6484 mbroquet 3730
6485     //
6486     return false;
6487     }
6488 softime 5024
6489     // l'événement est-il le dernier ?
6490     $dernier_evenement = false;
6491     // instanciation dossier
6492 softime 7996 $dossier = $this->f->get_inst__om_dbform(array(
6493     "obj" => "dossier",
6494     "idx" => $this->getVal('dossier'),
6495     ));
6496 softime 5024 // récupération dernier événement
6497     $id_dernier_evenement = $dossier->get_dernier_evenement();
6498     if ($id_dernier_evenement == $this->getVal($this->clePrimaire)) {
6499     $dernier_evenement = true;
6500     }
6501 mbroquet 3730
6502 softime 5024 // Si dossier cloturé ou si pas dernier événement
6503     // ou de type retour ou si une date est renseignée
6504     // ET utilisateur non administrateur
6505     if ($this->getStatutAutorisationDossier($this->getVal('dossier')) == 'cloture'
6506     || $dernier_evenement == false
6507     || $this->is_evenement_retour($this->getVal("evenement")) == true
6508     || $this->getVal('date_envoi_signature') != ''
6509     || $this->getVal('date_retour_signature') != ''
6510     || $this->getVal('date_envoi_rar') != ''
6511     || $this->getVal('date_retour_rar') != ''
6512     || $this->getVal('date_envoi_controle_legalite') != ''
6513     || $this->getVal('date_retour_controle_legalite') != '') {
6514     // pas le droit de supprimer
6515     return false;;
6516     }
6517    
6518 mbroquet 3730 //
6519     return true;
6520     }
6521 softime 6565
6522    
6523 mbroquet 3730 /**
6524 softime 6565 * Vérifie que l'utilisateur est instructeur et qu'il est de la division du
6525     * dossier.
6526     *
6527     * @return, boolean true/false
6528     */
6529     function is_instructeur_from_collectivite_dossier() {
6530     if ($this->f->isUserInstructeur() === true and
6531     $this->f->om_utilisateur["om_collectivite"] == $this->get_dossier_instruction_om_collectivite()) {
6532     return true;
6533     }
6534     return false;
6535     }
6536    
6537     /**
6538 mbroquet 3730 * CONDITION - is_addable.
6539     *
6540     * Condition pour afficher les boutons modifier et supprimer.
6541     *
6542     * @return boolean
6543     */
6544     function is_addable() {
6545     // Contrôle si l'utilisateur possède un bypass
6546 softime 7996 $bypass = $this->f->isAccredited($this->get_absolute_class_name()."_ajouter_bypass");
6547 mbroquet 3730 //
6548     if ($bypass == true) {
6549    
6550     //
6551     return true;
6552     }
6553 softime 6565 // Si l'utilisateur est un intructeur qui correspond à la
6554     // division du dossier ou qu'il peut changer la décision
6555     if ($this->is_instructeur_from_division_dossier() === true or
6556     $this->isInstrCanChangeDecision($this->getParameter('idxformulaire')) === true) {
6557 mbroquet 3730 //
6558 softime 6565 return true;
6559 mbroquet 3730 }
6560    
6561     //
6562 softime 6565 return false;
6563 mbroquet 3730 }
6564    
6565     /**
6566     * CONDITION - is_finalizable.
6567     *
6568     * Condition pour afficher le bouton.
6569     *
6570     * @return boolean
6571     */
6572     function is_finalizable() {
6573     // Contrôle si l'utilisateur possède un bypass
6574 softime 7996 $bypass = $this->f->isAccredited($this->get_absolute_class_name()."_finaliser_bypass");
6575 mbroquet 3730 //
6576     if ($bypass == true) {
6577     //
6578     return true;
6579     }
6580 softime 6565
6581 mbroquet 3730 // Si l'utilisateur est un instructeur, que le dossier est cloturé et
6582     // que l'événement n'est pas identifié comme non verrouillable
6583     if ($this->f->isUserInstructeur()
6584     && $this->getStatutAutorisationDossier($this->getParameter("idxformulaire")) == "cloture"
6585     && $this->checkEvenementNonVerrouillable($this->getVal("instruction")) === false) {
6586     //
6587     return false;
6588     }
6589 softime 6565
6590     // Si l'utilisateur est un intructeur qui correspond à la division du
6591     // dossier
6592     if ($this->is_instructeur_from_division_dossier() === true) {
6593     //
6594     return true;
6595     }
6596 mbroquet 3730
6597 softime 6565 // Si l'utilisateur est instructeur de la commune du dossier et que
6598     // l'instruction est créée par un instructeur de la commune
6599     if ($this->is_instructeur_from_collectivite_dossier() === true and
6600     $this->getVal('created_by_commune') === 't') {
6601     return true;
6602     }
6603    
6604 mbroquet 3730 //
6605 softime 6565 return false;
6606 mbroquet 3730 }
6607    
6608     /**
6609     * CONDITION - is_finalize_without_bypass.
6610     *
6611     * Condition pour afficher le bouton sans le bypass.
6612     *
6613     * @return boolean [description]
6614     */
6615     function is_finalizable_without_bypass() {
6616     // Récupère la valeur du champ finalisé
6617     $om_final_instruction = $this->getVal('om_final_instruction');
6618    
6619     // Si le rapport n'est pas finalisé
6620     if (empty($om_final_instruction)
6621     || $om_final_instruction == 'f') {
6622     //
6623     return true;
6624     }
6625    
6626     //
6627     return false;
6628     }
6629    
6630     /**
6631     * CONDITION - is_unfinalizable.
6632     *
6633     * Condition pour afficher le bouton.
6634     *
6635     * @return boolean
6636     */
6637     function is_unfinalizable(){
6638     // Contrôle si l'utilisateur possède un bypass
6639 softime 7996 $bypass = $this->f->isAccredited($this->get_absolute_class_name()."_definaliser_bypass");
6640 mbroquet 3730 //
6641     if ($bypass == true) {
6642     //
6643     return true;
6644     }
6645 softime 6565
6646     // Si l'utilisateur est un instructeur, que le dossier est cloturé et
6647     // que l'événement n'est pas identifié comme non verrouillable
6648 mbroquet 3730 if ($this->f->isUserInstructeur()
6649 softime 6565 && $this->getStatutAutorisationDossier($this->getParameter("idxformulaire")) == "cloture"
6650     && $this->checkEvenementNonVerrouillable($this->getVal("instruction")) === false) {
6651 mbroquet 3730 //
6652     return false;
6653     }
6654    
6655 softime 6565 // Si l'utilisateur est un intructeur qui correspond à la division du
6656     // dossier
6657     if ($this->is_instructeur_from_division_dossier() === true) {
6658     //
6659     return true;
6660 mbroquet 3730 }
6661    
6662 softime 6565 // Si l'utilisateur est instructeur de la commune du dossier et que
6663     // l'instruction est créée par un instructeur de la commune
6664     if ($this->is_instructeur_from_collectivite_dossier() === true and
6665     $this->getVal('created_by_commune') === 't') {
6666     return true;
6667 mbroquet 3730 }
6668    
6669     //
6670 softime 6565 return false;
6671 mbroquet 3730 }
6672    
6673     /**
6674     * CONDITION - is_unfinalizable_without_bypass.
6675     *
6676     * Condition pour afficher le bouton sans le bypass.
6677     *
6678     * @return boolean
6679     */
6680     function is_unfinalizable_without_bypass() {
6681     // Récupère la valeur du champ finalisé
6682     $om_final_instruction = $this->getVal('om_final_instruction');
6683    
6684     // Si l'instruction est finalisée
6685     if ($om_final_instruction == 't') {
6686     //
6687     return true;
6688     }
6689    
6690     //
6691     return false;
6692     }
6693    
6694 softime 5169
6695 mbroquet 3730 /**
6696 softime 6565 * Permet de définir si un instructeur commune peut editer une instruction
6697     *
6698     * @return boolean true si il peut
6699     */
6700     function isInstrCanChangeDecision($idx) {
6701    
6702     if ($this->f->isAccredited(array("instruction", "instruction_changer_decision"), "OR") !== true or
6703     $this->f->isUserInstructeur() !== true) {
6704     return false;
6705     }
6706    
6707    
6708    
6709     // Sinon on vérifie l'éligibilité du dossier au changement de décision
6710 softime 11876 // /!\ Requête lié à celles du widget indiquant les dossiers éligible au changement
6711     // de décision :
6712     // * dossier_instruction.class.php : view_widget_dossiers_evenement_retour_finalise()
6713     // * dossier_instruction.inc.php : si le paramètre filtre_decision = true
6714     $sql = sprintf(
6715     'SELECT
6716 softime 6565 dossier.dossier
6717     FROM
6718 softime 11876 %1$sdossier
6719     JOIN %1$setat
6720     ON dossier.etat = etat.etat AND etat.statut = \'encours\'
6721     JOIN %1$slien_dossier_demandeur
6722     ON dossier.dossier = lien_dossier_demandeur.dossier AND lien_dossier_demandeur.petitionnaire_principal IS TRUE
6723     JOIN %1$sdossier_instruction_type
6724     ON dossier.dossier_instruction_type=dossier_instruction_type.dossier_instruction_type
6725     JOIN %1$sinstruction
6726     -- Recherche de la dernière instruction qui ne soit pas liée à un événement retour
6727     ON instruction.instruction = (
6728     SELECT instruction
6729     FROM %1$sinstruction
6730     JOIN %1$sevenement ON instruction.evenement=evenement.evenement
6731     AND evenement.retour IS FALSE
6732     WHERE instruction.dossier = dossier.dossier
6733     ORDER BY date_evenement DESC, instruction DESC
6734     LIMIT 1
6735     )
6736     -- On ne garde que les dossiers pour lesquels la dernière instruction est finalisée
6737     -- ou alors pour laquelle l instruction a été ajouté par la commune et est
6738     -- non signée, non notifié, etc.
6739     AND (instruction.om_final_instruction IS TRUE
6740     OR instruction.created_by_commune IS TRUE)
6741     AND instruction.date_retour_signature IS NULL
6742     AND instruction.date_envoi_rar IS NULL
6743     AND instruction.date_retour_rar IS NULL
6744     AND instruction.date_envoi_controle_legalite IS NULL
6745     AND instruction.date_retour_controle_legalite IS NULL
6746     -- On vérifie que l instruction soit un arrêté ou un changement de décision
6747     JOIN %1$sevenement
6748     ON instruction.evenement=evenement.evenement
6749     AND (evenement.type = \'arrete\'
6750     OR evenement.type = \'changement_decision\')
6751     -- Recherche les informations du pétitionnaire principal pour l affichage
6752     JOIN %1$sdemandeur
6753     ON lien_dossier_demandeur.demandeur = demandeur.demandeur
6754     -- Recherche la collectivité rattachée à l instructeur
6755     JOIN %1$sinstructeur
6756     ON dossier.instructeur=instructeur.instructeur
6757     JOIN %1$sdivision
6758     ON instructeur.division=division.division
6759     JOIN %1$sdirection
6760     ON division.direction=direction.direction
6761     JOIN %1$som_collectivite
6762     ON direction.om_collectivite=om_collectivite.om_collectivite
6763 softime 6565 WHERE
6764 softime 11876 -- Vérification que la décision a été prise par l agglo
6765     om_collectivite.niveau = \'2\'
6766     AND dossier.dossier = \'%2$s\'
6767     ',
6768     DB_PREFIXE,
6769 softime 14064 $this->f->db->escapeSimple($idx)
6770 softime 11876 );
6771 softime 6565
6772    
6773     // Si collectivité de l'utilisateur niveau mono alors filtre sur celle-ci
6774     if ($this->f->isCollectiviteMono($_SESSION['collectivite']) === true) {
6775 softime 11876 $sql .= sprintf(
6776 softime 14064 ' AND dossier.om_collectivite = %1$d',
6777     intval($_SESSION['collectivite'])
6778 softime 11876 );
6779 softime 6565 }
6780 softime 14064 $qres = $this->f->get_one_result_from_db_query(
6781     $sql,
6782     array(
6783     "origin" => __METHOD__,
6784     )
6785     );
6786    
6787     return $qres['result'] !== null;
6788 softime 6565 }
6789    
6790    
6791     /**
6792 softime 5169 * CONDITION - can_monitoring_dates.
6793     *
6794     * Condition pour afficher le bouton de suivi des dates.
6795     *
6796     * @return boolean
6797     */
6798     public function can_monitoring_dates() {
6799     // Récupère la valeur du champ finalisé
6800     $om_final_instruction = $this->getVal('om_final_instruction');
6801    
6802     // Si l'instruction n'est pas finalisée
6803     if ($om_final_instruction !== 't') {
6804     //
6805     return false;
6806     }
6807    
6808     // Contrôle si l'utilisateur possède un bypass
6809 softime 7996 $bypass = $this->f->isAccredited($this->get_absolute_class_name()."_modification_dates_bypass");
6810 softime 5169 if ($bypass === true) {
6811     return true;
6812     }
6813    
6814 softime 8989 // Permission de modifier le suivi des dates sur un dossier cloturé pour
6815     // un utilisateur lié à un instructeur
6816     $perm_moni_dates_d_closed = $this->f->isAccredited($this->get_absolute_class_name()."_modification_dates_cloture");
6817    
6818     // On vérifie en premier lieu que le DI n'est pas clôturé et que
6819     // l'utilisateur ne possède pas la permission de modifier le suivi des
6820     // dates sur un dossier clôturé
6821 softime 5169 $inst_dossier = $this->get_inst_dossier();
6822 softime 8989 if ($inst_dossier->getStatut() === 'cloture'
6823     && $perm_moni_dates_d_closed === false) {
6824 softime 5169 //
6825     return false;
6826     }
6827     // On récupère ses infos
6828     $coll_di = $inst_dossier->getVal('om_collectivite');
6829     $div_di = $this->getDivisionFromDossier();
6830     // et celles de son éventuel instructeur
6831     $instr_di = $inst_dossier->getVal('instructeur');
6832    
6833 softime 6565 // Il faut disposer d'une entrée instructeur
6834     if ($this->f->isUserInstructeur() === false) {
6835     return false;
6836     }
6837    
6838 softime 5169 // Par défaut on prétend que l'instructeur n'est pas multi
6839     $instr_di_coll_multi = false;
6840     // Si un instructeur est affecté au dossier
6841     if ($instr_di !== '' && $instr_di !== null) {
6842     // Vérifie si l'instructeur est de la collectivité de niveau 2
6843 softime 5295 $instr_di_coll = $this->get_instructeur_om_collectivite($instr_di);
6844 softime 5169 if ($this->f->isCollectiviteMono($instr_di_coll) === false) {
6845     //
6846     $instr_di_coll_multi = true;
6847     }
6848     }
6849    
6850 softime 6565 // Il faut qu'il instruise le dossier ou soit de la même division
6851     if ($this->f->om_utilisateur['instructeur'] === $instr_di
6852     || $this->f->om_utilisateur['division'] === $div_di) {
6853 softime 5169 //
6854     return true;
6855     }
6856    
6857 softime 6565 // On donne également le droit s'il est de la même collectivité que
6858     // le dossier ET si l'instruction est déléguée à la communauté
6859     if ($this->f->isCollectiviteMono($this->f->om_utilisateur['om_collectivite']) === true
6860     && $this->f->om_utilisateur['om_collectivite'] === $coll_di
6861     && $instr_di_coll_multi === true) {
6862 softime 5169 //
6863     return true;
6864     }
6865    
6866 softime 6565 // Si l'instructeur ne rentre pas dans les deux cas précédents
6867 softime 5169 return false;
6868     }
6869    
6870    
6871     /**
6872 softime 12847 * CONDITION - is_finalized.
6873     *
6874     * Condition pour vérifier si une instruction est finalisée.
6875     *
6876     * @return boolean
6877     */
6878     public function is_finalized() {
6879    
6880     return $this->getVal('om_final_instruction') === "t";
6881     }
6882    
6883     /**
6884     * CONDITION - is_not_date_retour_signature_set.
6885     *
6886     * Condition pour vérifier si une date de retour signature n'est pas définie.
6887     *
6888     * @return boolean
6889     */
6890     public function is_not_date_retour_signature_set() {
6891    
6892     return $this->getVal('date_retour_signature') == null;
6893    
6894     }
6895    
6896    
6897     /**
6898 mbroquet 3730 * TREATMENT - finalize.
6899     *
6900     * Permet de finaliser un enregistrement.
6901     *
6902     * @param array $val valeurs soumises par le formulaire
6903     *
6904     * @return boolean
6905     */
6906     function finalize($val = array()) {
6907    
6908     // Cette méthode permet d'exécuter une routine en début des méthodes
6909     // dites de TREATMENT.
6910     $this->begin_treatment(__METHOD__);
6911 softime 10808 $message = '';
6912 softime 11585 $ev = $this->get_inst_evenement($this->getVal('evenement'));
6913 mbroquet 3730
6914 softime 11585 // Controle du signataire
6915     if (! $this->controle_signataire($ev)) {
6916     $this->addToMessage(__("Le document ne peut pas être finalisé car aucun signataire n'a été sélectionné."));
6917     // Termine le traitement
6918     return $this->end_treatment(__METHOD__, false);
6919     }
6920    
6921 mbroquet 3730 // Traitement de la finalisation
6922     $ret = $this->manage_finalizing("finalize", $val);
6923    
6924     // Si le traitement retourne une erreur
6925     if ($ret !== true) {
6926    
6927     // Termine le traitement
6928 softime 5024 return $this->end_treatment(__METHOD__, false);
6929 mbroquet 3730 }
6930    
6931 softime 10808 // Envoi des notifications aux demandeurs si la notification est automatique
6932     // et que la signature n'est pas requise
6933     if ($ev->getVal('notification') === 'notification_automatique') {
6934 softime 13137 // Préparation du message de log en cas d'erreur de notification
6935 softime 13528 $msgLog = sprintf(
6936     '%s %s : %d',
6937     __('Erreur lors de la notification automatique du(des) pétitionnaire(s) suite à la finalisation de l\'instruction.'),
6938     __('Instruction notifiée'),
6939     $this->getVal($this->clePrimaire)
6940     );
6941 softime 10808 // Récupération de la catégorie et envoie des notifications au(x) demandeur(s)
6942     $collectivite_di = $this->get_dossier_instruction_om_collectivite($this->getVal('dossier'));
6943     // Récupération de la liste des demandeurs à notifier et de la catégorie
6944     $categorie = $this->f->get_param_option_notification($collectivite_di);
6945 softime 14064 $isPortal = $categorie === PORTAL;
6946 softime 10869 $demandeursANotifie = $this->get_demandeurs_notifiable(
6947     $this->getVal('dossier'),
6948     $isPortal
6949     );
6950 softime 10808
6951     // Création d'une notification et d'une tâche pour chaque demandeur à notifier
6952 softime 12124 $demandeurPrincipalNotifie = false;
6953 softime 10813 if (count($demandeursANotifie) > 0) {
6954     foreach ($demandeursANotifie as $demandeur) {
6955 softime 12124 // Identifie si le demandeur principal a été notifié ou pas
6956     // et récupère ses informations
6957     if ($demandeur['petitionnaire_principal'] == 't') {
6958     $demandeurPrincipalNotifie = true;
6959     // Si le demandeur principal est notifiable mais qu'il y a des erreurs dans
6960     // son paramétrage, on effectue pas le traitement et on passe à l'itération
6961     // suivante. On le considère également comme non notifié pour gérer l'envoie
6962     // des messages d'erreurs
6963     // Si la demande a été déposée via le portail alors le paramétrage n'a pas
6964     // d'impact sur la notification
6965     $erreursParam = $this->get_info_notification_fail();
6966     if (! $this->dossier_depose_sur_portail() && $erreursParam != array()) {
6967     $demandeurPrincipalNotifie = false;
6968     continue;
6969     }
6970     }
6971 softime 10813 // Ajout de la notif et récupération de son id
6972     $idNotif = $this->ajouter_notification(
6973     $this->getVal($this->clePrimaire),
6974     $this->f->get_connected_user_login_name(),
6975 softime 10968 $demandeur,
6976     $collectivite_di,
6977 softime 12433 array(),
6978 softime 10968 true
6979 softime 10808 );
6980 softime 10813 if ($idNotif === false) {
6981     // Termine le traitement
6982 softime 13528 $this->addToLog(
6983     sprintf('%s() : %s', __METHOD__, $msgLog),
6984     DEBUG_MODE
6985     );
6986 softime 10813 return $this->end_treatment(__METHOD__, false);
6987     }
6988     $notification_by_task = $this->notification_by_task(
6989     $idNotif,
6990     $this->getVal('dossier'),
6991     $categorie
6992 softime 10808 );
6993 softime 10813 if ($notification_by_task === false) {
6994 softime 13528 $this->addToLog(
6995     sprintf('%s() : %s', __METHOD__, $msgLog),
6996     DEBUG_MODE
6997     );
6998 softime 10813 $this->addToMessage(
6999     __("Erreur lors de la génération de la notification au(x) pétitionnaire(s).")
7000     );
7001     // Termine le traitement
7002     return $this->end_treatment(__METHOD__, false);
7003     }
7004 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.")));
7005 softime 10808 }
7006     }
7007 softime 12847 // Pour la notification par mail ou la notification via portal si le dossier a
7008     // été déposés via portal, si le demandeur principal n'est pas notifiable,
7009     // on créé une nouvelle notification en erreur avec en commentaire la raison pour
7010     // laquelle le demandeur principal n'a pas pu être notifié
7011     $depotPortal = $this->dossier_depose_sur_portail();
7012     if (! $demandeurPrincipalNotifie && ($isPortal === false || $depotPortal === true)) {
7013 softime 13137 // Préparation des logs pour indiquer que le pétitionnaire principale n'est pas notifiable
7014 softime 13528 $msgLog .= sprintf(' %s', __('Le pétitionnaire principale n\'est pas notifiable.'));
7015 softime 12124 // Analyse pour savoir pourquoi le demandeur principal n'est pas notifiable
7016     $erreursParam = $this->get_info_notification_fail();
7017     $demandeurPrincipal = $this->get_info_petitionnaire_principal_dossier($this->getVal('dossier'));
7018     // Ajout de la notif et récupération de son id
7019     $idNotif = $this->ajouter_notification(
7020     $this->valF[$this->clePrimaire],
7021     $this->f->get_connected_user_login_name(),
7022     $demandeurPrincipal,
7023     $collectivite_di,
7024 softime 12433 array(),
7025 softime 12124 true,
7026     'Echec',
7027     implode(' ', $erreursParam)
7028     );
7029     if ($idNotif === false) {
7030     $this->addToMessage(
7031     __('Erreur : la création de la notification a échouée.').
7032     __("Veuillez contacter votre administrateur.")
7033     );
7034 softime 13528 $this->addToLog(
7035     sprintf('%s() : %s', __METHOD__, $msgLog),
7036     DEBUG_MODE
7037     );
7038 softime 12124 return false;
7039     }
7040     // Prépare un message d'alerte à destination de l'instructeur pour l'informer
7041     // de l'échec de la notification
7042     $dossier_message = $this->get_inst_dossier_message(0);
7043     $dossier_message_val = array(
7044     'dossier' => $this->getVal('dossier'),
7045     'type' => _('erreur expedition'),
7046     'emetteur' => $this->f->get_connected_user_login_name(),
7047     'login' => $_SESSION['login'],
7048     'date_emission' => date('Y-m-d H:i:s'),
7049     'contenu' => _('Échec lors de la notification de l\'instruction ').
7050     $ev->getVal('libelle').
7051     '.<br>'.
7052     implode("\n", $erreursParam).
7053     '<br>'.
7054     _('Veuillez corriger ces informations avant de renvoyer la notification.')
7055     );
7056     $add = $dossier_message->add_notification_message($dossier_message_val, true);
7057     // Si une erreur se produit pendant l'ajout
7058     if ($add !== true) {
7059     $this->addToLog(__METHOD__."(): Le message d'alerte concernant l'echec de l'envoi de la notification n'a pas pu être envoyé.", DEBUG_MODE);
7060     return false;
7061     }
7062     }
7063 softime 10808 }
7064    
7065 mbroquet 3730 // Termine le traitement
7066     return $this->end_treatment(__METHOD__, true);
7067     }
7068    
7069     /**
7070 softime 12124 * Récupère l'instance de dossier message.
7071     *
7072     * @param string $dossier_message Identifiant du message.
7073     *
7074     * @return object
7075     */
7076     private function get_inst_dossier_message($dossier_message = null) {
7077     //
7078     return $this->get_inst_common("dossier_message", $dossier_message);
7079     }
7080    
7081     /**
7082 softime 11585 * Vérifie si le signataire est obligatoire pour finaliser
7083     * le document apartir du paramétrage de l'événement.
7084     * Si c'est le cas, vérifie si il y a bien un signataire
7085     * renseigné.
7086     * Si c'est le cas renvoie true, sinon renvoie false.
7087     *
7088     * @param evenement évenement de l'instruction permettant de
7089     * récupérer le paramétrage
7090     * @return boolean
7091     */
7092     protected function controle_signataire($evenement) {
7093     // Vérifie si le signataire est obligatoire et si c'est le cas
7094     // vérifie si il y a bien un signataire pour le document
7095     if ($evenement->is_signataire_obligatoire() &&
7096     ($this->getVal('signataire_arrete') === null ||
7097     $this->getVal('signataire_arrete') === '')) {
7098     return false;
7099     }
7100     return true;
7101     }
7102    
7103     /**
7104 mbroquet 3730 * TREATMENT - unfinalize.
7105     *
7106     * Permet de définaliser un enregistrement.
7107     *
7108     * @param array $val valeurs soumises par le formulaire
7109     *
7110     * @return boolean
7111     */
7112     function unfinalize($val = array()) {
7113    
7114     // Cette méthode permet d'exécuter une routine en début des méthodes
7115     // dites de TREATMENT.
7116     $this->begin_treatment(__METHOD__);
7117    
7118     // Traitement de la finalisation
7119     $ret = $this->manage_finalizing("unfinalize", $val);
7120    
7121     // Si le traitement retourne une erreur
7122     if ($ret !== true) {
7123    
7124     // Termine le traitement
7125 softime 5024 return $this->end_treatment(__METHOD__, false);
7126 mbroquet 3730 }
7127    
7128     // Termine le traitement
7129     return $this->end_treatment(__METHOD__, true);
7130     }
7131    
7132     /**
7133     * VIEW - view_edition
7134     *
7135     * Edite l'édition de l'instruction ou affiche celle contenue dans le stockage.
7136     *
7137     * @return null Si l'action est incorrecte
7138     */
7139     function view_edition() {
7140    
7141     // Si l'instruction est finalisée
7142     if($this->getVal("om_final_instruction") == 't'
7143     && $this->getVal("om_final_instruction") != null) {
7144    
7145     // Ouvre le document
7146 softime 7996 $lien = '../app/index.php?module=form&snippet=file&obj='.$this->table.'&'.
7147 mbroquet 3730 'champ=om_fichier_instruction&id='.$this->getVal($this->clePrimaire);
7148     //
7149     header("Location: ".$lien);
7150     } else {
7151    
7152     // Récupère la collectivite du dossier d'instruction
7153     $dossier_instruction_om_collectivite = $this->get_dossier_instruction_om_collectivite();
7154    
7155     //
7156     $collectivite = $this->f->getCollectivite($dossier_instruction_om_collectivite);
7157    
7158     // Paramètre du PDF
7159     $params = array(
7160     "watermark" => true,
7161     "specific" => array(
7162     "mode" => "previsualisation",
7163     ),
7164     );
7165 softime 8593 // Si la rédaction libre est activée sur l'instruction
7166     if ($this->getVal("flag_edition_integrale") == 't') {
7167     $params["specific"]["corps"] = array(
7168     "mode" => "set",
7169     "value" => $this->getVal("corps_om_htmletatex"),
7170     );
7171     $params["specific"]["titre"] = array(
7172     "mode" => "set",
7173     "value" => $this->getVal("titre_om_htmletat"),
7174     );
7175     }
7176 mbroquet 3730
7177     // Génération du PDF
7178     $result = $this->compute_pdf_output('lettretype', $this->getVal("lettretype"), $collectivite, null, $params);
7179     // Affichage du PDF
7180     $this->expose_pdf_output(
7181     $result['pdf_output'],
7182     $result['filename']
7183     );
7184     }
7185     }
7186    
7187     /**
7188     * Récupère la collectivité du dossier d'instruction.
7189     *
7190 softime 7685 * @param string $dossier_instruction_id Identifiant du DI.
7191     *
7192 mbroquet 3730 * @return integer
7193     */
7194 softime 7685 function get_dossier_instruction_om_collectivite($dossier_instruction_id = null) {
7195 mbroquet 3730
7196 softime 7685 // Si l'identifiant n'est pas renseigné
7197     if ($dossier_instruction_id === null) {
7198 softime 8593 // Récupère la valeur
7199     if ($this->getVal('dossier') !== null && $this->getVal('dossier') !== '') {
7200     $dossier_instruction_id = $this->getVal('dossier');
7201     } elseif ($this->getParameter('idxformulaire') !== null
7202     && $this->getParameter('idxformulaire') !== '') {
7203     //
7204     $dossier_instruction_id = $this->getParameter('idxformulaire');
7205     } elseif ($this->f->get_submitted_get_value('idxformulaire') !== null
7206     && $this->f->get_submitted_get_value('idxformulaire') !== '') {
7207     //
7208     $dossier_instruction_id = $this->f->get_submitted_get_value('idxformulaire');
7209     }
7210 softime 7685 }
7211    
7212 mbroquet 3730 //
7213 softime 7996 $dossier_instruction = $this->f->get_inst__om_dbform(array(
7214     "obj" => "dossier_instruction",
7215     "idx" => $dossier_instruction_id,
7216     ));
7217 mbroquet 3730
7218     //
7219     return $dossier_instruction->getVal('om_collectivite');
7220     }
7221    
7222     /**
7223     * VIEW - view_bible
7224     *
7225     * Affiche la bible manuelle.
7226     *
7227     * @return void
7228     */
7229     function view_bible() {
7230     // Vérification de l'accessibilité sur l'élément
7231     $this->checkAccessibility();
7232    
7233     /**
7234     * Affichage de la structure HTML
7235     */
7236     //
7237 softime 8989 if ($this->f->isAjaxRequest()) {
7238 mbroquet 3730 //
7239     header("Content-type: text/html; charset=".HTTPCHARSET."");
7240     } else {
7241     //
7242 softime 8989 $this->f->setFlag("htmlonly");
7243     $this->f->display();
7244 mbroquet 3730 }
7245     //
7246 softime 8989 $this->f->displayStartContent();
7247 mbroquet 3730 //
7248 softime 8989 $this->f->setTitle(_("Liste des éléments de la bible en lien avec un evenement"));
7249     $this->f->displayTitle();
7250 mbroquet 3730
7251     /**
7252     *
7253     */
7254     //
7255 softime 8989 ($this->f->get_submitted_get_value("ev") ? $evenement = $this->f->get_submitted_get_value("ev") : $evenement = "");
7256 mbroquet 3730 $evenement = intval($evenement);
7257     //
7258 softime 8989 ($this->f->get_submitted_get_value("idx") ? $idx = $this->f->get_submitted_get_value("idx") : $idx = "");
7259 softime 5169 // Récupération du code du type de DA
7260     $code_da_type = '';
7261     if (preg_match('/[A-Za-z]{2,3}/', $idx, $matches) !== false) {
7262     $code_da_type = $matches[0];
7263     }
7264 mbroquet 3730 //
7265 softime 8989 ($this->f->get_submitted_get_value("complement") ? $complement = $this->f->get_submitted_get_value("complement") : $complement = "1");
7266 mbroquet 3730
7267     // Récupération de la collectivité du dossier
7268 softime 7996 $dossier = $this->f->get_inst__om_dbform(array(
7269     "obj" => "dossier",
7270     "idx" => $idx,
7271     ));
7272 mbroquet 3730
7273 softime 14542 $qres = $this->f->get_all_results_from_db_query(
7274     sprintf(
7275     'SELECT
7276     *,
7277     bible.libelle as bible_lib
7278     FROM
7279     %1$sbible
7280     LEFT OUTER JOIN %1$sdossier_autorisation_type
7281     ON bible.dossier_autorisation_type = dossier_autorisation_type.dossier_autorisation_type
7282     LEFT JOIN %1$som_collectivite
7283     ON bible.om_collectivite = om_collectivite.om_collectivite
7284     WHERE
7285     (evenement = %2$d
7286     OR evenement IS NULL)
7287     AND (complement = %3$d
7288     OR complement IS NULL)
7289     AND (bible.dossier_autorisation_type IS NULL
7290     OR dossier_autorisation_type.code = \'%4$s\')
7291     AND (om_collectivite.niveau = \'2\'
7292     OR bible.om_collectivite = %5$d)
7293     ORDER BY
7294     bible_lib ASC',
7295     DB_PREFIXE,
7296     intval($evenement),
7297     intval($complement),
7298     $this->f->db->escapeSimple($code_da_type),
7299     intval($dossier->getVal("om_collectivite"))
7300     ),
7301     array(
7302     'origin' => __METHOD__
7303     )
7304     );
7305 mbroquet 3730 //
7306     echo "<form method=\"post\" name=\"f3\" action=\"#\">\n";
7307     //
7308 softime 15835 if ($qres['row_count'] > 0) {
7309 mbroquet 3730 //
7310     echo "\t<table id='tab-bible' width='100%'>\n";
7311     //
7312     echo "\t\t<tr class=\"ui-tabs-nav ui-accordion ui-state-default tab-title\">";
7313     echo "<th>"._("Choisir")."</th>";
7314     echo "<th>"._("Libelle")."</th>";
7315     echo "</tr>\n";
7316     //
7317     $i = 0;
7318     //
7319 softime 14542 foreach ($qres['result'] as $row) {
7320 mbroquet 3730 //
7321     echo "\t\t<tr";
7322     echo " class=\"".($i % 2 == 0 ? "odd" : "even")."\"";
7323     echo ">";
7324     //
7325     echo "<td class=\"center\"><input type=\"checkbox\" name=\"choix[]\" value=\"".$i."\" id=\"checkbox".$i."\" /></td>";
7326     // XXX utilisation de l'attribut titre pour afficher une infobulle
7327     echo "<td><span class=\"content\" title=\"".htmlentities($row['contenu'])."\" id=\"content".$i."\">".$row['bible_lib']."</span></td>";
7328     //
7329     echo "</tr>\n";
7330     //
7331     $i++;
7332     }
7333     echo "\t</table>\n";
7334     //
7335     echo "<div class=\"formControls\">\n";
7336 softime 8989 $this->f->layout->display_form_button(array(
7337 mbroquet 3730 "value" => _("Valider"),
7338     "onclick" => "bible_return('f2', 'complement".($complement == "1" ? "" : $complement)."_om_html'); return false;",
7339     ));
7340 softime 8989 $this->f->displayLinkJsCloseWindow();
7341 mbroquet 3730 echo "</div>\n";
7342    
7343     } else {
7344     //
7345     $message_class = "error";
7346     $message = _("Aucun element dans la bible pour l'evenement")." : ".$evenement;
7347 softime 8989 $this->f->displayMessage($message_class, $message);
7348 mbroquet 3730 //
7349     echo "<div class=\"formControls\">\n";
7350 softime 8989 $this->f->displayLinkJsCloseWindow();
7351 mbroquet 3730 echo "</div>\n";
7352     }
7353     //
7354     echo "</form>\n";
7355    
7356     /**
7357     * Affichage de la structure HTML
7358     */
7359     //
7360 softime 8989 $this->f->displayEndContent();
7361 mbroquet 3730 }
7362    
7363     /**
7364 softime 5169 * VIEW - view_bible_auto
7365 mbroquet 3730 *
7366 softime 5169 * Renvoie les valeurs de la bible à placer dans les compléments de l'instruction.
7367 mbroquet 3730 *
7368     * @return void
7369     */
7370     function view_bible_auto() {
7371     // Vérification de l'accessibilité sur l'élément
7372     $this->checkAccessibility();
7373     //
7374 softime 8989 $this->f->disableLog();
7375 mbroquet 3730
7376     $formatDate="AAAA-MM-JJ";
7377    
7378     // Récupération des paramètres
7379 softime 8989 $idx = $this->f->get_submitted_get_value('idx');
7380     $evenement = $this->f->get_submitted_get_value('ev');
7381 mbroquet 3730
7382     // Initialisation de la variable de retour
7383     $retour['complement_om_html'] = '';
7384     $retour['complement2_om_html'] = '';
7385     $retour['complement3_om_html'] = '';
7386     $retour['complement4_om_html'] = '';
7387 softime 14064
7388 mbroquet 3730 // Vérification d'une consultation liée à l'événement
7389 softime 14064 $instEvenement = $this->f->get_inst__om_dbform(array(
7390     "obj" => "evenement",
7391     "idx" => $evenement,
7392     ));
7393    
7394 mbroquet 3730 // Si consultation liée, récupération du retour d'avis
7395 softime 14064 if($instEvenement->getVal('consultation') == 'Oui'){
7396 softime 14542
7397     $qres = $this->f->get_all_results_from_db_query(
7398     sprintf(
7399     'SELECT
7400     date_retour,
7401     avis_consultation.libelle as avis_consultation,
7402     COALESCE(service.libelle, tiers_consulte.libelle) as service
7403     FROM
7404     %1$sconsultation
7405     LEFT JOIN %1$stiers_consulte
7406     ON consultation.tiers_consulte = tiers_consulte.tiers_consulte
7407     LEFT JOIN %1$sservice
7408     ON consultation.service = service.service
7409     LEFT JOIN %1$savis_consultation
7410     ON consultation.avis_consultation = avis_consultation.avis_consultation
7411     WHERE
7412     dossier = \'%2$s\'
7413     AND consultation.visible',
7414     DB_PREFIXE,
7415     $this->f->db->escapeSimple($idx)
7416     ),
7417     array(
7418     'origin' => __METHOD__
7419     )
7420 softime 11876 );
7421 mbroquet 3730 // Récupération des consultations
7422 softime 14542 foreach ($qres['result'] as $row) {
7423 mbroquet 3730 $correct=false;
7424     // date retour
7425     if ($row['date_retour']<>""){
7426     if ($formatDate=="AAAA-MM-JJ"){
7427     $date = explode("-", $row['date_retour']);
7428     // controle de date
7429     if (count($date) == 3 and
7430     checkdate($date[1], $date[2], $date[0])) {
7431     $date_retour_f= $date[2]."/".$date[1]."/".$date[0];
7432     $correct=true;
7433     }else{
7434     $msg= $msg."<br>La date ".$row['date_retour']." n'est pas une date.";
7435     $correct=false;
7436     }
7437     }
7438     }
7439     //
7440     $temp="Vu l'avis ".$row['avis_consultation']." du service ".$row['service'];
7441     if($correct == true){
7442     $temp=$temp." du ".$date_retour_f;
7443     }
7444     // Concaténation des retours d'avis de consultation
7445 softime 7067 $retour['complement_om_html'] .= $temp . "<br/><br/>";
7446 mbroquet 3730 } // while
7447    
7448     } // consultation
7449     // Récupération des bibles automatiques pour le champ complement_om_html
7450 softime 8989 $retour['complement_om_html'] .= $this->getBible($evenement, $idx, '1');
7451 mbroquet 3730 // Récupération des bibles automatiques pour le champ complement2_om_html
7452 softime 8989 $retour['complement2_om_html'] .= $this->getBible($evenement, $idx, '2');
7453 mbroquet 3730 // Récupération des bibles automatiques pour le champ complement3_om_html
7454 softime 8989 $retour['complement3_om_html'] .= $this->getBible($evenement, $idx, '3');
7455 mbroquet 3730 // Récupération des bibles automatiques pour le champ complement4_om_html
7456 softime 8989 $retour['complement4_om_html'] .= $this->getBible($evenement, $idx, '4');
7457 mbroquet 3730
7458    
7459    
7460     echo json_encode($retour);
7461     }
7462    
7463     /**
7464 softime 7521 * VIEW - view_pdf_temp
7465     *
7466     * @return void
7467     */
7468     function view_pdf_temp() {
7469     $this->checkAccessibility();
7470 softime 8593 // Utilisation de $_POST pour ne pas que les textes soient altérés.
7471 softime 7521 $this->f->set_submitted_value();
7472 softime 8593 $merge_fields = array();
7473     //
7474     if (array_key_exists('c1', $_POST) === true) {
7475 softime 11876 $merge_fields['[complement_instruction]'] = $_POST['c1'];
7476     $merge_fields['[complement1_instruction]'] = $_POST['c1'];
7477 softime 8593 }
7478     if (array_key_exists('c2', $_POST) === true) {
7479 softime 11876 $merge_fields['[complement2_instruction]'] = $_POST['c2'];
7480 softime 8593 }
7481     if (array_key_exists('c3', $_POST) === true) {
7482 softime 11876 $merge_fields['[complement3_instruction]'] = $_POST['c3'];
7483 softime 8593 }
7484     if (array_key_exists('c4', $_POST) === true) {
7485 softime 11876 $merge_fields['[complement4_instruction]'] = $_POST['c4'];
7486 softime 8593 }
7487 softime 7521 $params = array(
7488     "watermark" => true,
7489     "specific" => array(
7490     "merge_fields" => $merge_fields,
7491     ),
7492     );
7493 softime 8593 //
7494     if (array_key_exists('corps', $_POST) === true) {
7495     $params["specific"]["corps"] = array(
7496     "mode" => "set",
7497 softime 11876 "value" => $_POST['corps'],
7498 softime 8593 );
7499     }
7500     if (array_key_exists('titre', $_POST) === true) {
7501     $params["specific"]["titre"] = array(
7502     "mode" => "set",
7503 softime 11876 "value" => $_POST['titre'],
7504 softime 8593 );
7505     }
7506 softime 7521 $dossier_instruction_om_collectivite = $this->get_dossier_instruction_om_collectivite();
7507     $collectivite = $this->f->getCollectivite($dossier_instruction_om_collectivite);
7508     $result = $this->compute_pdf_output('lettretype', $this->getVal('lettretype'), $collectivite, null, $params);
7509     $retour = array(
7510     'base' => base64_encode($result['pdf_output']),
7511     );
7512     echo json_encode($retour);
7513     }
7514    
7515     /**
7516     * Dans le contexte de prévisualisation des éditions, génère le rendu du
7517     * PDF sans prise en compte de la valeur des compléments et le retourne en
7518     * base 64.
7519     *
7520     * @return string Rendu PDF converti en base 64.
7521     */
7522     function init_pdf_temp() {
7523     $params = array(
7524     "watermark" => true,
7525     );
7526 softime 8593 // Si la rédaction libre est activée sur l'instruction
7527     if ($this->getVal("flag_edition_integrale") == 't') {
7528     $params["specific"]["corps"] = array(
7529     "mode" => "set",
7530     "value" => $this->getVal("corps_om_htmletatex"),
7531     );
7532     $params["specific"]["titre"] = array(
7533     "mode" => "set",
7534     "value" => $this->getVal("titre_om_htmletat"),
7535     );
7536     }
7537 softime 7521 $dossier_instruction_om_collectivite = $this->get_dossier_instruction_om_collectivite();
7538     $collectivite = $this->f->getCollectivite($dossier_instruction_om_collectivite);
7539     $result = $this->compute_pdf_output('lettretype', $this->getVal('lettretype'), $collectivite, null, $params);
7540    
7541     return base64_encode($result['pdf_output']);
7542     }
7543    
7544     /**
7545 mbroquet 3730 * Récupération des éléments de bible.
7546     *
7547     * @param integer $event id de l'événement
7548     * @param string $idx id du dossier
7549     * @param integer $compnb numéro du champ complement
7550 softime 17036 * @param string $type types possibles : automatique ou precharge
7551 mbroquet 3730 *
7552     * @return string Chaîne de texte à insérer dans le champ complement
7553     */
7554 softime 17036 function getBible($event, $idx, $compnb, $type = 'automatique') {
7555 mbroquet 3730 // Récupération de la collectivité du dossier
7556 softime 7996 $dossier = $this->f->get_inst__om_dbform(array(
7557     "obj" => "dossier",
7558     "idx" => $idx,
7559     ));
7560 softime 5169 // Récupération du code du type de DA
7561     $code_da_type = '';
7562     if (preg_match('/[A-Za-z]{2,3}/', $idx, $matches) !== false) {
7563     $code_da_type = $matches[0];
7564     }
7565 mbroquet 3730
7566 softime 17036 // Prépare le filtre de la requête selon le type de remplissage voulu
7567     $sql_filter_type = '';
7568     if ($type === 'automatique') {
7569     $sql_filter_type = "AND automatique = 'Oui'";
7570     } elseif ($type === 'precharge') {
7571     $sql_filter_type = "AND precharge IS TRUE";
7572     }
7573    
7574 softime 14542 $qres = $this->f->get_all_results_from_db_query(
7575     sprintf(
7576     'SELECT
7577     *
7578     FROM
7579     %1$sbible
7580     LEFT OUTER JOIN %1$sdossier_autorisation_type
7581     ON bible.dossier_autorisation_type =
7582     dossier_autorisation_type.dossier_autorisation_type
7583     LEFT JOIN %1$som_collectivite
7584     ON bible.om_collectivite = om_collectivite.om_collectivite
7585     WHERE
7586     (evenement = %2$d
7587     OR evenement IS NULL)
7588     AND (complement = %3$d
7589     OR complement IS NULL)
7590     AND (dossier_autorisation_type.code = \'%4$s\'
7591     OR bible.dossier_autorisation_type IS NULL)
7592     AND (om_collectivite.niveau = \'2\'
7593 softime 17036 OR bible.om_collectivite = %5$d)
7594     %6$s',
7595 softime 14542 DB_PREFIXE,
7596     intval($event),
7597     intval($compnb),
7598     $this->f->db->escapeSimple($code_da_type),
7599 softime 17036 intval($dossier->getVal("om_collectivite")),
7600     $sql_filter_type
7601 softime 14542 ),
7602     array(
7603     "origin" => __METHOD__
7604     )
7605     );
7606 mbroquet 3730 $temp = "";
7607 softime 14542 foreach ($qres['result'] as $row) {
7608 mbroquet 3730 // Remplacement des retours à la ligne par des br
7609     $temp .= preg_replace(
7610     '#(\\\r|\\\r\\\n|\\\n)#', '<br/>', $row['contenu']
7611     );
7612 softime 7521 // Ajout d'un saut de ligne entre chaque bible.
7613     $temp .= '<br/>';
7614 mbroquet 3730 } // fin while
7615     return $temp;
7616     }
7617    
7618     /**
7619     * VIEW - view_suivi_bordereaux.
7620     *
7621 nmeucci 4317 * Formulaire de choix du bordereau de suivi, permettant de générer les 4 bordereaux.
7622     * Si l'utilisateur est d'une collectivité de niveau 2 il a le choix de la
7623     * collectivité des dossiers affichés.
7624 mbroquet 3730 *
7625     * @return void
7626     */
7627     function view_suivi_bordereaux() {
7628     // Vérification de l'accessibilité sur l'élément
7629     $this->checkAccessibility();
7630    
7631     /**
7632     * Validation du formulaire
7633     */
7634     // Si le formulaire a été validé
7635 softime 8989 if ($this->f->get_submitted_post_value("validation") !== null) {
7636 mbroquet 3730 // Si un bordereau à été sélectionné
7637 softime 8989 if ($this->f->get_submitted_post_value("bordereau") !== null && $this->f->get_submitted_post_value("bordereau") == "" ) {
7638 mbroquet 3730 // Si aucun bordereau n'a été sélectionné
7639     $message_class = "error";
7640     $message = _("Veuillez selectionner un bordereau.");
7641     }
7642     // Sinon si les dates ne sont pas valide
7643 softime 8989 elseif (($this->f->get_submitted_post_value("date_bordereau_debut") !== null
7644     && $this->f->get_submitted_post_value("date_bordereau_debut") == "")
7645     || ($this->f->get_submitted_post_value("date_bordereau_fin") !== null
7646     && $this->f->get_submitted_post_value("date_bordereau_fin") == "")) {
7647 mbroquet 3730 // Si aucune date n'a été saisie
7648     $message_class = "error";
7649     $message = _("Veuillez saisir une date valide.");
7650     }
7651 softime 7366 // Sinon si les dates ne sont pas valides
7652 softime 8989 elseif ($this->f->get_submitted_post_value("bordereau") === "bordereau_avis_maire_prefet"
7653     && $this->f->getParameter("id_evenement_bordereau_avis_maire_prefet") == null) {
7654 softime 7366 // Si aucune date n'a été saisie
7655     $message_class = "error";
7656     $message = _("Erreur de parametrage. Contactez votre administrateur.");
7657     }
7658 mbroquet 3730 // Affiche le message de validation
7659     else {
7660     // On récupère le libellé du bordereau pour l'afficher à l'utilisateur
7661 softime 14064 $etat = $this->f->get_inst__om_dbform(array(
7662     "obj" => "om_etat",
7663     "idx" => $this->f->get_submitted_post_value("bordereau")
7664     ));
7665     $qres = $this->f->get_one_result_from_db_query(
7666     sprintf(
7667     'SELECT
7668     om_etat.libelle
7669     FROM
7670     %som_etat
7671     WHERE
7672     om_etat.id = \'%s\'',
7673     DB_PREFIXE,
7674     $this->f->db->escapeSimple($this->f->get_submitted_post_value("bordereau"))
7675     ),
7676     array(
7677     "origin" => __METHOD__,
7678     )
7679     );
7680    
7681 mbroquet 3730 //
7682     $message_class = "valid";
7683     $message = _("Cliquez sur le lien ci-dessous pour telecharger votre bordereau");
7684     $message .= " : <br/><br/>";
7685     $message .= "<a class='om-prev-icon pdf-16'";
7686     $message .= " title=\""._("Bordereau")."\"";
7687 softime 7996 $message .= "href='".OM_ROUTE_FORM."&obj=instruction";
7688 nmeucci 4317 $message .= "&action=220";
7689     $message .= "&idx=0";
7690 softime 8989 $message .= "&type_bordereau=".$this->f->get_submitted_post_value("bordereau");
7691     $message .= "&date_bordereau_debut=".$this->f->get_submitted_post_value("date_bordereau_debut");
7692     $message .= "&date_bordereau_fin=".$this->f->get_submitted_post_value("date_bordereau_fin");
7693 mbroquet 3730 // Si l'utilisateur est MULTI alors on ajoute le paramètre collectivite
7694 softime 8989 if ($this->f->get_submitted_post_value("om_collectivite") !== null) {
7695     $message .= "&collectivite=".$this->f->get_submitted_post_value("om_collectivite");
7696 mbroquet 3730 }
7697     $message .= "'"." target='_blank'>";
7698 softime 14064 $message .= $qres['result']." "._("du")." ".$this->f->get_submitted_post_value("date_bordereau_debut")
7699 softime 8989 ." "._("au")." ".$this->f->get_submitted_post_value("date_bordereau_fin");
7700 mbroquet 3730 $message .= "</a>";
7701     }
7702     }
7703    
7704     /**
7705     * Affichage des messages et du formulaire
7706     */
7707     // Affichage du message de validation ou d'erreur
7708     if (isset($message) && isset($message_class) && $message != "") {
7709 softime 8989 $this->f->displayMessage($message_class, $message);
7710 mbroquet 3730 }
7711     // Ouverture du formulaire
7712     printf("\t<form");
7713     printf(" method=\"post\"");
7714     printf(" id=\"suivi_bordereaux_form\"");
7715     printf(" action=\"\"");
7716     printf(">\n");
7717     // Paramétrage des champs du formulaire
7718     $champs = array("date_bordereau_debut", "date_bordereau_fin", "bordereau");
7719 softime 8989 // Si l'utilisateur est d'une collectivité de niveau 2 on affiche un select
7720 mbroquet 3730 // collectivité dans le formulaire
7721 softime 8989 if ($_SESSION["niveau"] == 2) {
7722 mbroquet 3730 array_push($champs, "om_collectivite");
7723     }
7724     // Création d'un nouvel objet de type formulaire
7725 softime 7996 $form = $this->f->get_inst__om_formulaire(array(
7726     "validation" => 0,
7727     "maj" => 0,
7728     "champs" => $champs,
7729     ));
7730 mbroquet 3730 // Paramétrage du champ date_bordereau_debut
7731     $form->setLib("date_bordereau_debut", _("date_bordereau_debut"));
7732     $form->setType("date_bordereau_debut", "date");
7733     $form->setTaille("date_bordereau_debut", 12);
7734     $form->setMax("date_bordereau_debut", 12);
7735     $form->setRequired("date_bordereau_debut");
7736     $form->setOnchange("date_bordereau_debut", "fdate(this)");
7737     $form->setVal("date_bordereau_debut", date("d/m/Y"));
7738     // Paramétrage du champ date_bordereau_fin
7739     $form->setLib("date_bordereau_fin", _("date_bordereau_fin"));
7740     $form->setType("date_bordereau_fin", "date");
7741     $form->setTaille("date_bordereau_fin", 12);
7742     $form->setMax("date_bordereau_fin", 12);
7743     $form->setRequired("date_bordereau_fin");
7744     $form->setOnchange("date_bordereau_fin", "fdate(this)");
7745     $form->setVal("date_bordereau_fin", date("d/m/Y"));
7746     // Paramétrage du champ bordereau
7747     $form->setLib("bordereau", _("bordereau"));
7748     $form->setType("bordereau", "select");
7749     $form->setRequired("bordereau");
7750     // Valeurs des champs
7751 softime 8989 if ($this->f->get_submitted_post_value("validation") !== null) {
7752     $form->setVal("date_bordereau_debut", $this->f->get_submitted_post_value("date_bordereau_debut"));
7753     $form->setVal("date_bordereau_fin", $this->f->get_submitted_post_value("date_bordereau_fin"));
7754     $form->setVal("bordereau", $this->f->get_submitted_post_value("bordereau"));
7755     $form->setVal("om_collectivite", $this->f->get_submitted_post_value("om_collectivite"));
7756 mbroquet 3730 }
7757     // Données du select - On récupère ici la liste de tous les états disponibles
7758     // dans la table om_etat qui ont un id qui commence par la cahine de caractères
7759     // 'bordereau_'
7760 softime 14542 $qres = $this->f->get_all_results_from_db_query(
7761     sprintf(
7762     'SELECT
7763     om_etat.id,
7764     om_etat.libelle
7765     FROM
7766     %1$som_etat
7767     WHERE
7768     om_etat.id LIKE \'bordereau_%%\'
7769     ORDER BY
7770     om_etat.id',
7771     DB_PREFIXE
7772     ),
7773     array(
7774     "origin" => __METHOD__
7775     )
7776     );
7777 mbroquet 3730 // Données du select
7778     $contenu = array(
7779     0 => array("", ),
7780     1 => array(_("choisir bordereau")),
7781     );
7782 softime 14542 foreach ($qres['result'] as $row) {
7783 mbroquet 3730 $contenu[0][] = $row['id'];
7784     $contenu[1][] = $row['libelle'];
7785     }
7786     $form->setSelect("bordereau", $contenu);
7787 softime 8989 //
7788     if ($_SESSION["niveau"] == 2) {
7789     $form->setLib("om_collectivite", _("collectivite"));
7790     $form->setType("om_collectivite", "select");
7791 mbroquet 3730
7792 softime 8989 // Données du select - On récupère ici la liste de tous toutes les collectivités
7793     // de niveau 1
7794 softime 14542 $qres = $this->f->get_all_results_from_db_query(
7795     sprintf(
7796     'SELECT
7797     om_collectivite,
7798     libelle
7799     FROM
7800     %1$som_collectivite
7801     WHERE
7802     niveau = \'1\'
7803     ORDER BY
7804     libelle',
7805     DB_PREFIXE
7806     ),
7807     array(
7808     "origin" => __METHOD__
7809     )
7810     );
7811 softime 8989 // La valeur par défaut du select est Toutes
7812     $list_collectivites = array(
7813     0 => array("", ),
7814     1 => array(_("toutes"))
7815     );
7816 mbroquet 3730
7817 softime 8989 $id_colls = "";
7818     // On stocke dans $id_colls l'id de toutes les collectivités de niveau 1 séparées
7819     // par des virgules, pour un traitement plus facile dans la requête de sous-état
7820 softime 14542 foreach ($qres['result'] as $row) {
7821 softime 8989 if ($id_colls != "") {
7822     $id_colls .= ",";
7823     }
7824     $id_colls .= $row['om_collectivite'];
7825     $list_collectivites[0][] = $row['om_collectivite'];
7826     $list_collectivites[1][] = $row['libelle'];
7827 mbroquet 3730 }
7828 softime 8989 // On affecte la liste d'identifiants à l'option Toutes
7829     $list_collectivites[0][0] = $id_colls ;
7830     $form->setSelect("om_collectivite", $list_collectivites);
7831 mbroquet 3730 }
7832     // Affichage du formulaire
7833     $form->entete();
7834     $form->afficher($champs, 0, false, false);
7835     $form->enpied();
7836     // Affichage du bouton
7837     printf("\t<div class=\"formControls\">\n");
7838 softime 8989 $this->f->layout->display_form_button(array("value" => _("Valider"), "name" => "validation"));
7839 mbroquet 3730 printf("\t</div>\n");
7840     // Fermeture du formulaire
7841     printf("\t</form>\n");
7842     }
7843    
7844 nmeucci 4317
7845     /**
7846     * VIEW - view_generate_suivi_bordereaux.
7847     *
7848     * Génère et affiche les bordereaux de suivi.
7849     *
7850     * @return [void]
7851     */
7852     function view_generate_suivi_bordereaux() {
7853     // Vérification de l'accessibilité sur l'élément
7854     $this->checkAccessibility();
7855     // Récupération du type de bordereau
7856     $bordereau = $this->f->get_submitted_get_value('type_bordereau');
7857     // Génération du PDF
7858     $result = $this->compute_pdf_output('etat', $bordereau, null, $this->getVal($this->clePrimaire));
7859     // Affichage du PDF
7860     $this->expose_pdf_output(
7861     $result['pdf_output'],
7862     $result['filename']
7863     );
7864     }
7865    
7866    
7867 mbroquet 3730 /**
7868     * VIEW - view_suivi_envoi_lettre_rar.
7869     *
7870 softime 8989 * Vue pour imprimer les AR.
7871 mbroquet 3730 *
7872     * @return void
7873     */
7874     function view_suivi_envoi_lettre_rar() {
7875     // Vérification de l'accessibilité sur l'élément
7876     $this->checkAccessibility();
7877    
7878     //
7879 softime 8989 if ($this->f->get_submitted_post_value("date") !== null) {
7880     $date = $this->f->get_submitted_post_value("date");
7881 mbroquet 3730 } else {
7882     $date = "";
7883     }
7884     //
7885 softime 8989 if ($this->f->get_submitted_post_value("liste_code_barres_instruction") !== null) {
7886     $liste_code_barres_instruction = $this->f->get_submitted_post_value("liste_code_barres_instruction");
7887 mbroquet 3730 } else {
7888     $liste_code_barres_instruction = "";
7889     }
7890    
7891     // Compteur du nombre de page générées
7892     $nbLettres = 0;
7893     // Liste d'id des instructions
7894     $id4Gen = array();
7895     //
7896     $error = "";
7897    
7898 softime 5504 // Initialisation du tableau qui va contenir les DI pour lister les liens
7899     $dossierTab = array();
7900     // On vérifie que l'utilisateur ait les droits pour afficher des consultations
7901     $isAccredited = $this->f->isAccredited(array("dossier_instruction","dossier_instruction_consulter"), "OR");
7902     $hasHidden = true;
7903     // S'il ne peut pas les consulter il aura des dossiers caché
7904     if ($isAccredited === true) {
7905     $hasHidden = false;
7906     }
7907    
7908 mbroquet 3730 /**
7909     * Validation du formulaire
7910     */
7911     // Si le formulaire a été validé
7912 softime 8989 if ($this->f->get_submitted_post_value('validation') !== null) {
7913 mbroquet 3730 //
7914     if (empty($date) || empty($liste_code_barres_instruction)) {
7915     //
7916     $message_class = "error";
7917     $message = _("Tous les champs doivent etre remplis.");
7918     } else {
7919     // Création d'un tableau d'instruction
7920 softime 8989 $liste = explode("\r\n", $this->f->get_submitted_post_value("liste_code_barres_instruction"));
7921 mbroquet 3730 //
7922     foreach ($liste as $code_barres) {
7923     // On enlève les éventuels espaces saisis
7924     $code_barres = trim($code_barres);
7925     // Vérification de l'existence de l'instruction
7926     if ($code_barres != "") {
7927     // Si la valeur transmise est numérique
7928     if (is_numeric($code_barres)) {
7929     //
7930 softime 6565 $sql = "SELECT count(*)
7931     FROM ".DB_PREFIXE."instruction
7932     INNER JOIN ".DB_PREFIXE."dossier
7933     ON dossier.dossier=instruction.dossier
7934     INNER JOIN ".DB_PREFIXE."dossier_instruction_type
7935     ON dossier.dossier_instruction_type = dossier_instruction_type.dossier_instruction_type
7936     INNER JOIN ".DB_PREFIXE."dossier_autorisation_type_detaille
7937     ON dossier_instruction_type.dossier_autorisation_type_detaille = dossier_autorisation_type_detaille.dossier_autorisation_type_detaille
7938     INNER JOIN ".DB_PREFIXE."dossier_autorisation_type
7939     ON dossier_autorisation_type_detaille.dossier_autorisation_type = dossier_autorisation_type.dossier_autorisation_type
7940     INNER JOIN ".DB_PREFIXE."groupe
7941     ON dossier_autorisation_type.groupe = groupe.groupe
7942     WHERE code_barres='".$this->f->db->escapesimple($code_barres)."'";
7943 softime 7067
7944     // Ajout d'un filtre sur les groupes auxquels l'utilisateur a accès
7945     $group_clause = array();
7946     foreach ($_SESSION["groupe"] as $key => $value) {
7947     $group_clause[$key] = "(groupe.code = '".$key."'";
7948     if($value["confidentiel"] !== true) {
7949     $group_clause[$key] .= " AND dossier_autorisation_type.confidentiel IS NOT TRUE";
7950     }
7951     $group_clause[$key] .= ")";
7952     }
7953     $conditions = implode(" OR ", $group_clause);
7954     $sql .= " AND (" . $conditions . ")";
7955    
7956 softime 14064 $qres = $this->f->get_one_result_from_db_query(
7957     $sql,
7958     array(
7959     "origin" => __METHOD__,
7960     )
7961     );
7962    
7963     if ($qres['result'] == "1") {
7964 mbroquet 3730 // Récupération de la date d'envoi de l'instruction bippé
7965 softime 14542 $qres = $this->f->get_all_results_from_db_query(
7966     sprintf(
7967     'SELECT
7968     to_char(date_envoi_rar, \'DD/MM/YYYY\') as date_envoi_rar,
7969     instruction
7970     FROM
7971     %1$sinstruction
7972     WHERE
7973     code_barres = \'%2$s\'',
7974     DB_PREFIXE,
7975     $this->f->db->escapeSimple($code_barres)
7976     ),
7977     array(
7978     'origin' => __METHOD__
7979     )
7980     );
7981     $row = array_shift($qres['result']);
7982 mbroquet 3730 // Si pas de date ou correspond à la date du formulaire on
7983     // effectue le traitement
7984     if ($row["date_envoi_rar"] == "" || $row["date_envoi_rar"] == $date) {
7985 softime 7996 $instr = $this->f->get_inst__om_dbform(array(
7986     "obj" => "instruction",
7987     "idx" => $row['instruction'],
7988     ));
7989 mbroquet 3730 $valF = array();
7990     foreach($instr->champs as $id => $champ) {
7991     $valF[$champ] = $instr->val[$id];
7992     }
7993 softime 5504
7994     # Si on peut consulter les dossiers et que le dossier n'existe pas déjà dans la liste
7995     if ($isAccredited === true
7996     && array_key_exists($instr->getVal("dossier"), $dossierTab) === false) {
7997 softime 7996 $dossier = $this->f->get_inst__om_dbform(array(
7998     "obj" => "dossier",
7999     "idx" => $instr->getVal("dossier"),
8000     ));
8001 softime 5504 if ($dossier->is_user_from_allowed_collectivite()){
8002     $dossierTab[$instr->getVal("dossier")] = $dossier;
8003     } else {
8004     $hasHidden = true;
8005     }
8006     }
8007    
8008 mbroquet 3730 $valF['date_evenement']=
8009     $instr->dateDBToForm($valF['date_evenement']);
8010     $valF['archive_date_complet']=
8011     $instr->dateDBToForm($valF['archive_date_complet']);
8012     $valF['archive_date_rejet']=
8013     $instr->dateDBToForm($valF['archive_date_rejet']);
8014     $valF['archive_date_limite']=
8015     $instr->dateDBToForm($valF['archive_date_limite']);
8016     $valF['archive_date_notification_delai']=
8017     $instr->dateDBToForm($valF['archive_date_notification_delai']);
8018     $valF['archive_date_decision']=
8019     $instr->dateDBToForm($valF['archive_date_decision']);
8020     $valF['archive_date_validite']=
8021     $instr->dateDBToForm($valF['archive_date_validite']);
8022     $valF['archive_date_achevement']=
8023     $instr->dateDBToForm($valF['archive_date_achevement']);
8024     $valF['archive_date_chantier']=
8025     $instr->dateDBToForm($valF['archive_date_chantier']);
8026     $valF['archive_date_conformite']=
8027     $instr->dateDBToForm($valF['archive_date_conformite']);
8028     $valF['archive_date_dernier_depot']=
8029     $instr->dateDBToForm($valF['archive_date_dernier_depot']);
8030     $valF['archive_date_limite_incompletude']=
8031     $instr->dateDBToForm($valF['archive_date_limite_incompletude']);
8032     $valF['date_finalisation_courrier']=
8033     $instr->dateDBToForm($valF['date_finalisation_courrier']);
8034     $valF['date_envoi_signature']=
8035     $instr->dateDBToForm($valF['date_envoi_signature']);
8036     $valF['date_retour_signature']=
8037     $instr->dateDBToForm($valF['date_retour_signature']);
8038     $valF['date_envoi_rar']=
8039     $instr->dateDBToForm($valF['date_envoi_rar']);
8040     $valF['date_retour_rar']=
8041     $instr->dateDBToForm($valF['date_retour_rar']);
8042     $valF['date_envoi_controle_legalite']=
8043     $instr->dateDBToForm($valF['date_envoi_controle_legalite']);
8044     $valF['date_retour_controle_legalite']=
8045     $instr->dateDBToForm($valF['date_retour_controle_legalite']);
8046     $valF['date_envoi_rar'] = $date;
8047    
8048     // Vérification de la finalisation du document
8049     // correspondant au code barres
8050     if($instr->getVal("om_final_instruction") === 't') {
8051     $instr->setParameter('maj', 1);
8052 nmeucci 3971 $instr->class_actions[1]["identifier"] =
8053     "envoi lettre RAR (depuis le menu suivi des pièces)";
8054 softime 8989 if ($instr->modifier($valF) == true) {
8055 mbroquet 3730 $id4Gen[] = $code_barres;
8056     $nbLettres ++;
8057     } else {
8058     //
8059     if ($error != "") {
8060     $error .= "<br/>";
8061     }
8062     $error .= sprintf(_("Une erreur s'est produite lors de la modification de l'instruction %s."),
8063     $code_barres);
8064     $error .= " ";
8065     $error .= _("Veuillez contacter votre administrateur.");
8066     }
8067     } else {
8068     //
8069     if ($error != "") {
8070     $error .= "<br/>";
8071     }
8072     $error .= sprintf(_("Le document correspondant au
8073     code barres %s n'est pas finalise,
8074     le bordereau ne sera pas genere."),
8075     $code_barres);
8076     }
8077    
8078     } else {
8079     //
8080     if ($error != "") {
8081     $error .= "<br/>";
8082     }
8083     $error .= _("Une lettre correspondante a l'instruction ayant pour code barres")." ".$code_barres." "._("a deja ete envoyee, le bordereau ne sera pas genere.");
8084     }
8085     } else {
8086     //
8087     if ($error != "") {
8088     $error .= "<br/>";
8089     }
8090     $error .= _("Le numero")." ".$code_barres." "._("ne correspond a aucun code barres d'instruction.");
8091     }
8092     } else {
8093     //
8094     if ($error != "") {
8095     $error .= "<br/>";
8096     }
8097     $error .= _("Le code barres d'instruction")." ".$code_barres." "._("n'est pas valide.");
8098     }
8099     }
8100     }
8101     }
8102     }
8103    
8104     /**
8105     * Affichage des messages et du formulaire
8106     */
8107     // Affichage du message de validation ou d'erreur
8108     if (isset($message) && isset($message_class) && $message != "") {
8109 softime 8989 $this->f->displayMessage($message_class, $message);
8110 mbroquet 3730 }
8111     // Affichage du message d'erreur
8112     if(!empty($error)) {
8113 softime 8989 $this->f->displayMessage("error", $error);
8114 mbroquet 3730 }
8115     // Affichage du message de validation de la saisie
8116     if ($nbLettres > 0) {
8117     //
8118 softime 5504 echo "\n<div class=\"message ui-widget ui-corner-all ui-state-highlight ui-state-valid\" >";
8119     echo "\n<p>";
8120     echo "\n<span class=\"ui-icon ui-icon-info\"></span>";
8121     echo "\n<span class=\"text\">";
8122     echo _("Cliquez sur le lien ci-dessous pour telecharger votre document");
8123     echo " : \n<br/><br/>";
8124     echo "\n<a class='om-prev-icon pdf-16'";
8125 softime 8989 echo "\n title=\""._("imprimer les AR")."\"";
8126 softime 7996 echo "\n href=\"".OM_ROUTE_FORM."&obj=instruction&action=180&idx=0&liste=".implode(",",$id4Gen)."\"";
8127 softime 5504 echo "\n target='_blank'>";
8128 softime 8989 echo _("Telecharger le document pour")." ".$nbLettres." "._("AR");
8129 softime 5504 echo "\n</a>";
8130     echo "\n</span>";
8131     echo "\n</p>";
8132     echo "\n<br/>\n";
8133     if ($isAccredited === true) {
8134     echo '<fieldset id="fieldset-form-rar-lien_di" class="cadre ui-corner-all startClosed" style="background-color: inherite;">';
8135     echo "\n<legend class=\"ui-corner-all ui-widget-content ui-state-active\" style=\"background-color: transparent; color: inherit;\">\n";
8136     echo _('Dossiers concernés par ce traitement');
8137     echo "\n</legend>";
8138     echo "\n<div class=\"fieldsetContent\" style=\"display: none;background-color: inherite\">";
8139    
8140     if ($hasHidden === true) {
8141     echo "\n<br/>";
8142     echo "\n<p>";
8143     echo "\n<span class='text'>";
8144     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.");
8145     echo "</span>";
8146     echo "\n</p>";
8147     echo "\n<br/>";
8148     }
8149     foreach ($dossierTab as $dossier) {
8150 softime 7067
8151     $inst_da = $this->get_inst_common("dossier_autorisation", $dossier->getVal('dossier_autorisation'));
8152     $inst_datd = $this->get_inst_common("dossier_autorisation_type_detaille", $inst_da->getVal('dossier_autorisation_type_detaille'));
8153     $code_datd = $inst_datd->getVal('code');
8154    
8155     $obj = "dossier_instruction";
8156     if ($code_datd === 'REC' OR $code_datd === 'REG') {
8157     $obj = "dossier_contentieux_tous_recours";
8158     }
8159     if ($code_datd === 'IN') {
8160     $obj = "dossier_contentieux_toutes_infractions";
8161     }
8162    
8163 softime 5504 echo "\n<div class=\"bloc group\">";
8164     echo "\n<div class=\"field field-type-text\">";
8165    
8166     echo "\n<p>";
8167     echo "\n<span class='text'>";
8168     echo "\n<a class=\"om-icon om-icon-16 consult-16\" title=\"" . _('Consulter') . "\"";
8169 softime 7996 echo "\n href=\"".OM_ROUTE_FORM."&obj=dossier_instruction&action=3&idx=";
8170 softime 5504 echo $dossier->getVal("dossier");
8171     echo "\">";
8172     echo "\n</a>";
8173    
8174     echo "\n<a title=\""._("Consulter")."\" style=\"vertical-align:middle;\"";
8175 softime 7996 echo " href=\"".OM_ROUTE_FORM."&obj=";
8176 softime 7067 echo $obj;
8177     echo "&action=3&idx=";
8178 softime 5504 echo $dossier->getVal("dossier");
8179     echo "\">";
8180     echo $dossier->getVal("dossier_libelle");
8181     echo "\n</a>";
8182     echo "\n</span>";
8183     echo "\n</p>";
8184    
8185     echo "\n</div>";
8186     echo "\n</div>";
8187     }
8188     echo "\n</div>";
8189     echo "\n</fieldset>";
8190     }
8191     echo "\n</div>";
8192     echo "\n</div>";
8193 mbroquet 3730 }
8194     // Ouverture du formulaire
8195     echo "\t<form";
8196     echo " method=\"post\"";
8197     echo " id=\"suivi_envoi_lettre_rar_form\"";
8198     echo " action=\"\"";
8199     echo ">\n";
8200     // Paramétrage des champs du formulaire
8201     $champs = array("date", "liste_code_barres_instruction");
8202     // Création d'un nouvel objet de type formulaire
8203 softime 7996 $form = $this->f->get_inst__om_formulaire(array(
8204     "validation" => 0,
8205     "maj" => 0,
8206     "champs" => $champs,
8207     ));
8208 mbroquet 3730 // Paramétrage du champ date du formulaire
8209     $form->setLib("date", _("Date")."* :");
8210     $form->setType("date", "date");
8211     $form->setOnchange("date", "fdate(this)");
8212     $form->setVal("date", ($date == "" ? date("d/m/Y") : $date));
8213     $form->setTaille("date", 10);
8214     $form->setMax("date", 10);
8215     // Paramétrage du champ liste_code_barres_instruction du formulaire
8216     $form->setLib("liste_code_barres_instruction", _("Liste des codes barres d'instructions scannes")."* :");
8217     $form->setType("liste_code_barres_instruction", "textarea");
8218     $form->setVal("liste_code_barres_instruction", $liste_code_barres_instruction);
8219     $form->setTaille("liste_code_barres_instruction", 20);
8220     $form->setMax("liste_code_barres_instruction", 20);
8221     // Affichage du formulaire
8222     $form->entete();
8223     $form->afficher($champs, 0, false, false);
8224     $form->enpied();
8225     // Affichage du bouton
8226     echo "\t<div class=\"formControls\">\n";
8227 softime 8989 $this->f->layout->display_form_button(array("value" => _("Valider"), "name" => "validation"));
8228 mbroquet 3730 echo "\t</div>\n";
8229     // Fermeture du formulaire
8230     echo "\t</form>\n";
8231     }
8232    
8233     /**
8234     * VIEW - view_suivi_mise_a_jour_des_dates.
8235     *
8236     * Vu pour mettre à jour les dates de suivi de l'instruction.
8237     *
8238     * @return void
8239     */
8240     function view_suivi_mise_a_jour_des_dates() {
8241     // Vérification de l'accessibilité sur l'élément
8242     $this->checkAccessibility();
8243    
8244     // Récupération des valeur passées en POST ou GET
8245 softime 8989 if($this->f->get_submitted_post_value("type_mise_a_jour") !== null) {
8246     $type_mise_a_jour = $this->f->get_submitted_post_value("type_mise_a_jour");
8247     } elseif($this->f->get_submitted_get_value('type_mise_a_jour') !== null) {
8248     $type_mise_a_jour = $this->f->get_submitted_get_value('type_mise_a_jour');
8249 mbroquet 3730 } else {
8250     $type_mise_a_jour = "";
8251     }
8252 softime 8989 if($this->f->get_submitted_post_value('date') !== null) {
8253     $date = $this->f->get_submitted_post_value('date');
8254     } elseif($this->f->get_submitted_get_value('date') !== null) {
8255     $date = $this->f->get_submitted_get_value('date');
8256 mbroquet 3730 } else {
8257     $date = "";
8258     }
8259 softime 8989 if($this->f->get_submitted_post_value('code_barres') !== null) {
8260     $code_barres = $this->f->get_submitted_post_value('code_barres');
8261     } elseif($this->f->get_submitted_get_value('code_barres') !== null) {
8262     $code_barres = $this->f->get_submitted_get_value('code_barres');
8263 mbroquet 3730 } else {
8264     $code_barres = "";
8265     }
8266     // Booléen permettant de définir si un enregistrement à eu lieu
8267     $correct = false;
8268     // Booléen permettant de définir si les dates peuvent êtres enregistrées
8269     $date_error = false;
8270     // Champs date à mettre à jour
8271     $liste_champs=array();
8272    
8273     // Si le formulaire a été validé
8274 softime 8989 if ($this->f->get_submitted_post_value('validation') !== null) {
8275 mbroquet 3730 if(!empty($type_mise_a_jour) and !empty($date) and !empty($code_barres)) {
8276    
8277 softime 7067 // Ajout d'un filtre sur les groupes auxquels l'utilisateur a accès
8278     $group_clause = array();
8279     foreach ($_SESSION["groupe"] as $key => $value) {
8280     $group_clause[$key] = "(groupe.code = '".$key."'";
8281     if($value["confidentiel"] !== true) {
8282     $group_clause[$key] .= " AND dossier_autorisation_type.confidentiel IS NOT TRUE";
8283     }
8284     $group_clause[$key] .= ")";
8285     }
8286     $conditions = implode(" OR ", $group_clause);
8287 softime 14542 $groupFilter = " AND (" . $conditions . ")";
8288 softime 7067
8289 softime 14542 $qres = $this->f->get_all_results_from_db_query(
8290     sprintf(
8291     'SELECT
8292     instruction
8293     FROM
8294     %1$sinstruction
8295     INNER JOIN %1$sdossier
8296     ON dossier.dossier = instruction.dossier
8297     INNER JOIN %1$sdossier_instruction_type
8298     ON dossier.dossier_instruction_type = dossier_instruction_type.dossier_instruction_type
8299     INNER JOIN %1$sdossier_autorisation_type_detaille
8300     ON dossier_instruction_type.dossier_autorisation_type_detaille = dossier_autorisation_type_detaille.dossier_autorisation_type_detaille
8301     INNER JOIN %1$sdossier_autorisation_type
8302     ON dossier_autorisation_type_detaille.dossier_autorisation_type = dossier_autorisation_type.dossier_autorisation_type
8303     INNER JOIN %1$sgroupe
8304     ON dossier_autorisation_type.groupe = groupe.groupe
8305     WHERE
8306     code_barres = \'%2$s\'
8307     %3$s',
8308     DB_PREFIXE,
8309     $this->f->db->escapeSimple($code_barres),
8310     $groupFilter
8311     ),
8312     array(
8313     'origin' => __METHOD__
8314     )
8315     );
8316 softime 15835 if($qres['row_count'] === 1) {
8317 mbroquet 3730 $liste_champs = explode(";", $type_mise_a_jour);
8318 softime 14542 $row = array_shift($qres['result']);
8319 softime 11418 $instr = $this->f->get_inst__om_dbform(array(
8320     "obj" => "instruction",
8321     "idx" => $row['instruction'],
8322     ));
8323 mbroquet 3730 // Mise à jour des dates après l'écran de verification
8324 softime 8989 if($this->f->get_submitted_post_value('is_valid') !== null and $this->f->get_submitted_post_value('is_valid') == "true") {
8325 mbroquet 3730 $valF = array();
8326     foreach($instr->champs as $id => $champ) {
8327     $valF[$champ] = $instr->val[$id];
8328     }
8329 softime 6565 $valF['date_evenement'] = $instr->dateDBToForm($valF['date_evenement']);
8330     $valF['archive_date_complet'] = $instr->dateDBToForm($valF['archive_date_complet']);
8331     $valF['archive_date_rejet'] = $instr->dateDBToForm($valF['archive_date_rejet']);
8332     $valF['archive_date_limite'] = $instr->dateDBToForm($valF['archive_date_limite']);
8333     $valF['archive_date_notification_delai'] = $instr->dateDBToForm($valF['archive_date_notification_delai']);
8334     $valF['archive_date_decision'] = $instr->dateDBToForm($valF['archive_date_decision']);
8335     $valF['archive_date_validite'] = $instr->dateDBToForm($valF['archive_date_validite']);
8336     $valF['archive_date_achevement'] = $instr->dateDBToForm($valF['archive_date_achevement']);
8337     $valF['archive_date_chantier'] = $instr->dateDBToForm($valF['archive_date_chantier']);
8338     $valF['archive_date_conformite'] = $instr->dateDBToForm($valF['archive_date_conformite']);
8339     $valF['archive_date_dernier_depot'] = $instr->dateDBToForm($valF['archive_date_dernier_depot']);
8340     $valF['archive_date_limite_incompletude'] = $instr->dateDBToForm($valF['archive_date_limite_incompletude']);
8341     $valF['date_finalisation_courrier'] = $instr->dateDBToForm($valF['date_finalisation_courrier']);
8342     $valF['date_envoi_signature'] = $instr->dateDBToForm($valF['date_envoi_signature']);
8343     $valF['date_retour_signature'] = $instr->dateDBToForm($valF['date_retour_signature']);
8344     $valF['date_envoi_rar'] = $instr->dateDBToForm($valF['date_envoi_rar']);
8345     $valF['date_retour_rar'] = $instr->dateDBToForm($valF['date_retour_rar']);
8346     $valF['date_envoi_controle_legalite'] = $instr->dateDBToForm($valF['date_envoi_controle_legalite']);
8347     $valF['date_retour_controle_legalite'] = $instr->dateDBToForm($valF['date_retour_controle_legalite']);
8348     $valF['archive_date_cloture_instruction'] = $instr->dateDBToForm($valF['archive_date_cloture_instruction']);
8349     $valF['archive_date_premiere_visite'] = $instr->dateDBToForm($valF['archive_date_premiere_visite']);
8350     $valF['archive_date_derniere_visite'] = $instr->dateDBToForm($valF['archive_date_derniere_visite']);
8351     $valF['archive_date_contradictoire'] = $instr->dateDBToForm($valF['archive_date_contradictoire']);
8352     $valF['archive_date_retour_contradictoire'] = $instr->dateDBToForm($valF['archive_date_retour_contradictoire']);
8353     $valF['archive_date_ait'] = $instr->dateDBToForm($valF['archive_date_ait']);
8354     $valF['archive_date_transmission_parquet'] = $instr->dateDBToForm($valF['archive_date_transmission_parquet']);
8355 mbroquet 3730
8356     foreach(explode(";", $type_mise_a_jour) as $maj_date) {
8357     $valF[$maj_date]=$date;
8358     }
8359    
8360     // Vérification de la finalisation du document
8361     // correspondant au code barres
8362     if($valF["om_final_instruction"] === 't' or
8363     $valF["lettretype"] == '') {
8364     $code_barres = "";
8365    
8366     //Désactivation de l'autocommit
8367 softime 8989 $this->f->db->autoCommit(false);
8368 mbroquet 3730
8369     //On modifie les valeurs de l'instruction
8370     $instr->setParameter('maj', 170);
8371 nmeucci 3965 $instr->class_actions[170]["identifier"] =
8372 nmeucci 3972 "mise à jour des dates (depuis le menu suivi des pièces)";
8373 softime 8989 $retour = $instr->modifier($valF);
8374 mbroquet 3730
8375     //Si une erreur s'est produite, on défait les modifications
8376     //qui ont été faites
8377     if (!$retour){
8378     $instr->undoValidation();
8379     }
8380     //Sinon, on valide en base de données les modifications
8381     else {
8382 softime 8989 $this->f->db->commit();
8383 mbroquet 3730 }
8384    
8385     // Variable correct retourné depuis la classe instruction
8386     $correct = $instr->correct;
8387    
8388     // Si la modification sur l'instruction a échoué
8389     if ($correct === false) {
8390    
8391     // Message d'erreur de la classe instruction
8392     $error = $instr->msg;
8393     }
8394    
8395     } else {
8396     // Indique que le traitement est en erreur
8397     $correct = false;
8398     // Message d'erreur
8399     $error = sprintf(_("Le document n'est pas finalise."),
8400     "<span class='bold'>".$code_barres."</span>");
8401     }
8402     } else {
8403     // Récupération des infos du dossier
8404 softime 14542 $qres = $this->f->get_all_results_from_db_query(
8405     sprintf(
8406     'SELECT
8407     dossier.dossier_libelle,
8408     evenement.libelle as evenement,
8409     autorite_competente.code as autorite_competente_code,
8410     autorite_competente.libelle as autorite_competente,
8411     evenement.type as evenement_type,
8412     to_char(date_envoi_signature,\'DD/MM/YYYY\') as date_envoi_signature,
8413     to_char(date_retour_signature,\'DD/MM/YYYY\') as date_retour_signature,
8414     to_char(date_envoi_controle_legalite,\'DD/MM/YYYY\') as date_envoi_controle_legalite,
8415     to_char(date_retour_controle_legalite,\'DD/MM/YYYY\') as date_retour_controle_legalite,
8416     to_char(date_envoi_rar,\'DD/MM/YYYY\') as date_envoi_rar,
8417     to_char(date_retour_rar,\'DD/MM/YYYY\') as date_retour_rar
8418     FROM
8419     %1$sinstruction
8420     INNER JOIN %1$sdossier
8421     ON dossier.dossier=instruction.dossier
8422     LEFT JOIN %1$sautorite_competente
8423     ON dossier.autorite_competente=autorite_competente.autorite_competente
8424     INNER JOIN %1$sevenement
8425     ON instruction.evenement=evenement.evenement
8426     WHERE
8427     code_barres = \'%2$s\'',
8428     DB_PREFIXE,
8429     $this->f->db->escapeSimple($code_barres)
8430     ),
8431     array(
8432     "origin" => __METHOD__
8433     )
8434     );
8435     $infos = array_shift($qres['result']);
8436 mbroquet 3730
8437     // Vérification de la non modification des dates de suivi
8438     foreach(explode(";", $type_mise_a_jour) as $champ) {
8439 softime 11418 if ($champ === 'date_envoi_controle_legalite') {
8440     if ($instr->is_sent_to_cl() === true) {
8441     $error = __("Les dates de suivis ne peuvent etre modifiees");
8442     $date_error = true;
8443     break;
8444     }
8445     }
8446 mbroquet 3730 if($infos[$champ] != "" AND $infos[$champ] != $date) {
8447     $error = _("Les dates de suivis ne peuvent etre modifiees");
8448     $date_error = true;
8449 softime 11418 break;
8450 mbroquet 3730 }
8451     }
8452     }
8453     } else {
8454     $error = _("Le numero saisi ne correspond a aucun code barres d'instruction.");
8455     }
8456    
8457     } else {
8458     $error = _("Tous les champs doivent etre remplis.");
8459     }
8460     }
8461    
8462     /**
8463     * Affichage des messages et du formulaire
8464     */
8465     // Affichage du message de validation ou d'erreur
8466     if (isset($message) && isset($message_class) && $message != "") {
8467 softime 8989 $this->f->displayMessage($message_class, $message);
8468 mbroquet 3730 }
8469     // Affichage du message d'erreur
8470     if(!empty($error)) {
8471 softime 8989 $this->f->displayMessage("error", $error);
8472 mbroquet 3730 }
8473    
8474     // Affichage du message de validation de la saisie
8475     if($correct === true) {
8476 softime 8989 $this->f->displayMessage("ok", _("Saisie enregistree"));
8477 mbroquet 3730 }
8478     // Ouverture du formulaire
8479     echo "\t<form";
8480     echo " method=\"post\"";
8481     echo " id=\"suivi_mise_a_jour_des_dates_form\"";
8482     echo " action=\"\"";
8483     echo ">\n";
8484     // Paramétrage des champs du formulaire
8485     if(isset($infos)) {
8486     $champs = array("type_mise_a_jour", "date", "code_barres", "dossier_libelle", "evenement"
8487     , "autorite_competente", "date_envoi_signature",
8488     "date_retour_signature", "date_envoi_controle_legalite",
8489     "date_retour_controle_legalite", "date_envoi_rar",
8490     "date_retour_rar", "is_valid");
8491     } else {
8492     $champs = array("type_mise_a_jour", "date", "code_barres");
8493     }
8494     // Création d'un nouvel objet de type formulaire
8495 softime 7996 $form = $this->f->get_inst__om_formulaire(array(
8496     "validation" => 0,
8497     "maj" => 0,
8498     "champs" => $champs,
8499     ));
8500 mbroquet 3730 // Paramétrage des champs du formulaire
8501     // Parametrage du champ type_mise_a_jour
8502     $form->setLib("type_mise_a_jour", _("Date a mettre a jour")."* :");
8503     if(isset($infos)) {
8504     $form->setType("type_mise_a_jour", "selecthiddenstatic");
8505    
8506     } else {
8507     $form->setType("type_mise_a_jour", "select");
8508    
8509     }
8510     $form->setVal("type_mise_a_jour", $type_mise_a_jour);
8511     $contenu = array();
8512    
8513     $contenu[0][0] = "date_envoi_signature";
8514     $contenu[1][0] = _("date d'envoi pour signature Mairie/Prefet");
8515    
8516     $contenu[0][1] = "date_retour_signature";
8517     $contenu[1][1] = _("date de retour de signature Mairie/Prefet");
8518    
8519     $contenu[0][2] = "date_retour_signature;date_envoi_controle_legalite";
8520     $contenu[1][2] = _("date de retour de signature + Envoi controle legalite");
8521    
8522     $contenu[0][3] = "date_envoi_controle_legalite";
8523     $contenu[1][3] = _("date d'envoi au controle de legalite");
8524    
8525     $contenu[0][4] = "date_retour_controle_legalite";
8526     $contenu[1][4] = _("date de retour de controle de legalite");
8527    
8528     $contenu[0][5] = "date_retour_rar";
8529 softime 8989 $contenu[1][5] = __("date de notification du correspondant");
8530 mbroquet 3730
8531     $form->setSelect("type_mise_a_jour", $contenu);
8532    
8533     // Parametrage du champ date
8534     $form->setLib("date", _("Date")."* :");
8535     if(isset($infos)) {
8536     $form->setType("date", "hiddenstaticdate");
8537    
8538     } else {
8539     $form->setType("date", "date");
8540     }
8541     $form->setVal("date", $date);
8542     $form->setTaille("date", 10);
8543     $form->setMax("date", 10);
8544    
8545     // Parametrage du champ code_barres
8546     $form->setLib("code_barres", _("Code barres d'instruction")."* :");
8547     if(isset($infos)) {
8548     $form->setType("code_barres", "hiddenstatic");
8549     } else {
8550     $form->setType("code_barres", "text");
8551     }
8552     $form->setVal("code_barres", $code_barres);
8553     $form->setTaille("code_barres", 20);
8554     $form->setMax("code_barres", 20);
8555    
8556     // Ajout des infos du dossier correspondantes à l'instruction séléctionnée
8557     if(isset($infos)) {
8558    
8559     // Tous les champs sont défini par defaut à static
8560     foreach ($infos as $key => $value) {
8561     $form->setType($key, "static");
8562     if(in_array($key, $liste_champs)) {
8563     $form->setVal($key, $date);
8564     } else {
8565     $form->setVal($key, $value);
8566     }
8567     }
8568    
8569     // Les champs dont on viens de définir la valeur sont en gras
8570     foreach ($liste_champs as $value) {
8571     $form->setBloc($value,'DF',"",'bold');
8572     }
8573    
8574     // Parametrage du champ dossier
8575     $form->setLib("dossier_libelle", _("dossier_libelle")." :");
8576     $form->setType("dossier_libelle", "static");
8577     $form->setVal("dossier_libelle", $infos['dossier_libelle']);
8578    
8579     // Parametrage du champ evenement
8580     $form->setLib("evenement", _("evenement")." :");
8581     $form->setType("evenement", "static");
8582     $form->setVal("evenement", $infos['evenement']);
8583    
8584     // Parametrage du champ autorite_competente
8585     $form->setLib("autorite_competente", _("Autorite competente")." :");
8586     $form->setType("autorite_competente", "static");
8587     $form->setVal("autorite_competente", $infos['autorite_competente']);
8588    
8589 softime 8989 // Parametrage des libellés d'envoi avec AR
8590     $form->setLib("date_envoi_rar", __("date_envoi_ar")." :");
8591     $form->setLib("date_retour_rar", __("date_notification")." :");
8592 mbroquet 3730
8593     $form->setLib("date_envoi_signature", _("date_envoi_signature")." :");
8594     $form->setLib("date_retour_signature", _("date_retour_signature")." :");
8595     $form->setLib("date_envoi_controle_legalite", _("date_envoi_controle_legalite")." :");
8596     $form->setLib("date_retour_controle_legalite", _("date_retour_controle_legalite")." :");
8597     // Configuration des libellé en fonction de l'autorité compétente
8598     if($infos['autorite_competente_code'] == 'ETAT') {
8599     $form->setType("date_envoi_controle_legalite", "hiddendate");
8600     $form->setType("date_retour_controle_legalite", "hiddendate");
8601     }
8602    
8603     // Ajout d'un champ hidden permettant de savoir que le formulaire précédant est celui de vérification
8604     $form->setLib("is_valid", _("Valide")." :");
8605     $form->setType("is_valid", "hidden");
8606     $form->setVal("is_valid", 'true');
8607    
8608     $form->setFieldset('dossier_libelle','D',_('Synthese'));
8609     $form->setFieldset('is_valid','F');
8610    
8611     }
8612    
8613    
8614     // Création du fieldset regroupant les champs permettant la mise à jour des date
8615     $form->setFieldset('type_mise_a_jour','D',_('Mise a jour'));
8616     $form->setFieldset('code_barres','F');
8617     // Affichage du formulaire
8618     $form->entete();
8619     $form->afficher($champs, 0, false, false);
8620     $form->enpied();
8621     // Affichage du bouton
8622     echo "\t<div class=\"formControls\">\n";
8623     //
8624     if(!$date_error) {
8625 softime 8989 $this->f->layout->display_form_button(array("value" => _("Valider"), "name" => "validation"));
8626 mbroquet 3730 }
8627     // Si pas sur l'écran de validation
8628     if(isset($infos)) {
8629 softime 7996 echo "<a class=\"retour\" href=\"".OM_ROUTE_FORM."&obj=instruction_suivi_mise_a_jour_des_dates&action=170&idx=0";
8630 mbroquet 3730 echo "&amp;type_mise_a_jour=".$type_mise_a_jour."&amp;date=".$date."&amp;code_barres=".$code_barres;
8631     echo "\">Retour</a>";
8632     }
8633     echo "\t</div>\n";
8634     // Fermeture du formulaire
8635     echo "\t</form>\n";
8636     }
8637    
8638     /**
8639     * [view_pdf_lettre_rar description]
8640     *
8641     * @return [type] [description]
8642     */
8643     function view_pdf_lettre_rar() {
8644     // Vérification de l'accessibilité sur l'élément
8645     $this->checkAccessibility();
8646 softime 8989 //
8647     $this->f->disableLog();
8648 mbroquet 3730
8649 softime 8989 if($this->f->get_submitted_get_value('liste') != null) {
8650     $listeCodeBarres = explode(',',$this->f->get_submitted_get_value('liste'));
8651 mbroquet 3730
8652     // Classe permettant la mise en page de l'édition pdf
8653     require_once "../obj/pdf_lettre_rar.class.php";
8654     $pdf_lettre_rar = new pdf_lettre_rar('P', 'mm', 'A4');
8655     // Initialisation de la mise en page
8656 softime 8989 $pdf_lettre_rar->init($this->f);
8657 mbroquet 3730
8658     foreach ($listeCodeBarres as $code_barres) {
8659    
8660 softime 7067 // On récupère le dossier
8661 softime 14064 $qres = $this->f->get_one_result_from_db_query(
8662     sprintf(
8663     'SELECT
8664     dossier
8665     FROM
8666     %1$sinstruction
8667     WHERE
8668     code_barres = \'%2$s\'',
8669     DB_PREFIXE,
8670     $this->f->db->escapeSimple($code_barres)
8671     ),
8672     array(
8673     "origin" => __METHOD__,
8674     )
8675     );
8676    
8677 softime 7996 $inst_dossier = $this->f->get_inst__om_dbform(array(
8678     "obj" => "dossier",
8679 softime 14064 "idx" => $qres['result'],
8680 softime 7996 ));
8681 softime 7067
8682     // En fonction du type de dossier, on récupère un demandeur différent dans les requêtes
8683     $groupe = $inst_dossier->get_type_affichage_formulaire();
8684     switch ($groupe) {
8685     case 'CTX IN':
8686     $sql_demandeur = "(lien_dossier_demandeur.petitionnaire_principal IS TRUE AND demandeur.type_demandeur='plaignant')";
8687     break;
8688     case 'CTX RE':
8689     $sql_demandeur = "(lien_dossier_demandeur.petitionnaire_principal IS TRUE AND demandeur.type_demandeur='requerant')";
8690     break;
8691     case 'ADS':
8692     case 'DPC':
8693 softime 10573 case 'CONSULTATION ENTRANTE':
8694 softime 7067 default:
8695     $sql_demandeur = "((lien_dossier_demandeur.petitionnaire_principal IS TRUE AND demandeur.type_demandeur='petitionnaire') OR demandeur.type_demandeur='delegataire')";
8696     break;
8697     }
8698    
8699 mbroquet 3730 // Test si l'evenement est de type arrete et si un délégataire a été nommé
8700 softime 14542 $qres = $this->f->get_all_results_from_db_query(
8701     sprintf(
8702     'SELECT
8703 mbroquet 3730 dossier.dossier_libelle,
8704     evenement.type,
8705 softime 3834 count(lien_dossier_demandeur) as nbdemandeur,
8706     CASE
8707     WHEN division.libelle IS NOT NULL AND phase.code IS NOT NULL
8708 softime 14542 THEN CONCAT(phase.code, \' - \', division.libelle)
8709 softime 3834 ELSE
8710     phase.code
8711     END AS code_phase
8712 softime 14542 FROM
8713     %1$sinstruction
8714     LEFT JOIN %1$sdossier
8715     ON instruction.dossier = dossier.dossier
8716     LEFT JOIN %1$sdivision
8717     ON dossier.division = division.division
8718     INNER JOIN %1$sevenement
8719     ON instruction.evenement=evenement.evenement
8720     LEFT JOIN %1$sphase
8721     ON evenement.phase = phase.phase
8722     inner JOIN %1$slien_dossier_demandeur
8723     ON instruction.dossier=lien_dossier_demandeur.dossier
8724     inner join %1$sdemandeur
8725     ON demandeur.demandeur=lien_dossier_demandeur.demandeur
8726     WHERE
8727     code_barres = \'%2$s\'
8728     AND %3$s
8729     GROUP BY
8730     dossier.dossier_libelle,
8731     evenement.type,
8732     phase.code,
8733     division.libelle',
8734     DB_PREFIXE,
8735     $this->f->db->escapeSimple($code_barres),
8736     $sql_demandeur
8737     ),
8738     array(
8739     "origin" => __METHOD__
8740     )
8741     );
8742     $testDemandeur = array_shift($qres['result']);
8743 mbroquet 3730
8744    
8745     // Recuperation de l'adresse de destination
8746     // Envoi pour delegataire ou petitionnaire principal selon le type d'evenement
8747 softime 14542 $sqlAdresse = " AND demandeur.type_demandeur='petitionnaire' AND lien_dossier_demandeur.petitionnaire_principal IS TRUE";
8748 mbroquet 3730 if($testDemandeur['type'] != 'arrete' AND $testDemandeur['nbdemandeur'] > 1) {
8749 softime 14542 $sqlAdresse = " AND demandeur.type_demandeur='delegataire'";
8750 mbroquet 3730 }
8751    
8752 softime 14542 $qres = $this->f->get_all_results_from_db_query(
8753     sprintf(
8754     'SELECT
8755     CASE WHEN demandeur.qualite = \'particulier\'
8756     THEN TRIM(CONCAT_WS(\' \', pc.libelle, demandeur.particulier_nom, demandeur.particulier_prenom))
8757     ELSE TRIM(demandeur.personne_morale_denomination)
8758     END as ligne1,
8759     CASE WHEN demandeur.qualite = \'personne_morale\'
8760     THEN TRIM(demandeur.personne_morale_raison_sociale)
8761     ELSE \'\'
8762     END as ligne1_1,
8763     CASE WHEN demandeur.qualite = \'personne_morale\' AND (demandeur.personne_morale_nom IS NOT NULL OR demandeur.personne_morale_prenom IS NOT NULL)
8764     THEN TRIM(CONCAT_WS(\' \', \'rep. par\', demandeur.personne_morale_nom, demandeur.personne_morale_prenom))
8765     ELSE \'\'
8766     END as ligne1_2,
8767     trim(concat(demandeur.numero,\' \',demandeur.voie)) as ligne2,
8768     CASE demandeur.complement
8769     WHEN null THEN \'\'
8770     ELSE trim(demandeur.complement)
8771     END as ligne3,
8772     CASE demandeur.lieu_dit
8773     WHEN null THEN \'\'
8774     ELSE trim(demandeur.lieu_dit)
8775     END as ligne4,
8776     CONCAT_WS(\' \', demandeur.code_postal, demandeur.localite,
8777     (CASE WHEN demandeur.bp IS NOT NULL
8778     THEN CONCAT_WS(\' \', \'BP\', demandeur.bp)
8779     ELSE \'\'
8780     END),
8781     (CASE WHEN demandeur.cedex IS NOT NULL
8782     THEN CONCAT_WS(\' \', \'CEDEX\', demandeur.cedex)
8783     ELSE \'\'
8784     END))
8785     as ligne5,
8786     code_barres as code_barres
8787     FROM
8788     %1$sinstruction
8789     INNER JOIN %1$sdossier
8790     ON dossier.dossier = instruction.dossier
8791     INNER JOIN %1$slien_dossier_demandeur
8792     ON dossier.dossier = lien_dossier_demandeur.dossier
8793     INNER JOIN %1$sdemandeur
8794     ON lien_dossier_demandeur.demandeur = demandeur.demandeur
8795     LEFT OUTER JOIN %1$scivilite AS pc
8796     ON demandeur.particulier_civilite = pc.civilite
8797     OR demandeur.personne_morale_civilite = pc.civilite
8798     WHERE
8799     instruction.code_barres = \'%2$s\'
8800     %3$s',
8801     DB_PREFIXE,
8802     $this->f->db->escapeSimple($code_barres),
8803     $sqlAdresse
8804     ),
8805     array(
8806     "origin" => __METHOD__
8807     )
8808     );
8809     $adresse_dest = array_shift($qres['result']);
8810 mbroquet 3730
8811     // Création adresse destinataire sans ligne vide
8812     $adresse_destinataire = array();
8813     if (!empty($adresse_dest['ligne1'])) {
8814     $adresse_destinataire[] = $adresse_dest['ligne1'];
8815     }
8816     if (!empty($adresse_dest['ligne1_1'])) {
8817     $adresse_destinataire[] = $adresse_dest['ligne1_1'];
8818     }
8819     if (!empty($adresse_dest['ligne1_2'])) {
8820     $adresse_destinataire[] = $adresse_dest['ligne1_2'];
8821     }
8822     $adresse_destinataire[] = $adresse_dest['ligne2'];
8823     if (!empty($adresse_dest['ligne3'])) {
8824     $adresse_destinataire[] = $adresse_dest['ligne3'];
8825     }
8826     if (!empty($adresse_dest['ligne4'])) {
8827     $adresse_destinataire[] = $adresse_dest['ligne4'];
8828     }
8829     $adresse_destinataire[] = $adresse_dest['ligne5'];
8830    
8831     // Création du champ specifique
8832     $specifique_content = array();
8833     $specifique_content[] = $adresse_dest['ligne1'];
8834     $specifique_content[] = $adresse_dest['ligne1_1'];
8835     $specifique_content[] = $adresse_dest['ligne1_2'];
8836     $specifique_content[] = $testDemandeur['dossier_libelle'];
8837     $specifique_content[] = "|||||".$adresse_dest['code_barres']."|||||";
8838     unset($adresse_dest['code_barres']);
8839     // Ajout d'une page aux pdf
8840 softime 3834 $pdf_lettre_rar->addLetter($adresse_destinataire, $specifique_content, $testDemandeur['code_phase']);
8841 mbroquet 3730
8842     }
8843     $pdf_output = $pdf_lettre_rar->output("lettre_rar".date("dmYHis").".pdf","S");
8844 softime 7685 $om_edition = $this->f->get_inst__om_edition();
8845 softime 17542 $om_edition->set_object_linked($this);
8846 mbroquet 3730 $om_edition->expose_pdf_output($pdf_output, "lettre_rar".date("dmYHis").".pdf");
8847     }
8848     }
8849    
8850     /**
8851     * VIEW - view_bordereau_envoi_maire.
8852     *
8853     * Formulaire demandant :
8854     * - le code-barres de l'événement d'instruction
8855     * - la date d'envoi du courrier pour signature par le maire
8856     *
8857     * Lors de la validation :
8858     * => met à jour cette date dans l'événement d'instruction
8859     * => crée un lien permettant de générer en PDF le bordereau
8860     *
8861     * @return void
8862     */
8863     function view_bordereau_envoi_maire() {
8864     // Vérification de l'accessibilité sur l'élément
8865     $this->checkAccessibility();
8866    
8867     // Récupération des valeur passées en POST ou GET
8868     $code_barres = "";
8869     if($this->f->get_submitted_post_value('code_barres') !== null) {
8870     $code_barres = $this->f->get_submitted_post_value('code_barres');
8871     } elseif($this->f->get_submitted_get_value('code_barres')!==null) {
8872     $code_barres = $this->f->get_submitted_get_value('code_barres');
8873     }
8874     $date = "";
8875     if($this->f->get_submitted_post_value('date') !== null) {
8876     $date = $this->f->get_submitted_post_value('date');
8877     } elseif($this->f->get_submitted_get_value('date') !== null) {
8878     $date = $this->f->get_submitted_get_value('date');
8879     }
8880     $validation = 0;
8881     if($this->f->get_submitted_post_value('validation') !== null) {
8882     $validation = $this->f->get_submitted_post_value('validation');
8883     } elseif($this->f->get_submitted_get_value('validation') !== null) {
8884     $validation = $this->f->get_submitted_get_value('validation');
8885     }
8886    
8887     // Si le formulaire a été validé
8888     if ($this->f->get_submitted_post_value('validation') !== null) {
8889     // Tous les champs doivent obligatoirement être remplis
8890     if (!empty($date) && !empty($code_barres)) {
8891     $date_en = $this->dateDB($date);
8892     // Si date valide
8893     if ($date_en != "") {
8894     $id_instruction = $this->get_instruction_by_barcode($code_barres);
8895     // Si un événement d'instruction a été trouvé pour ce code-barres
8896     if ($id_instruction !== null) {
8897     $ret = $this->update_date_envoi_signature($id_instruction, $date_en);
8898     // Si mise à jour réussie de la date d'envoi du courrier
8899     // pour signature par l'autorité compétente
8900     if($ret === true) {
8901     // Message de validation avec lien PDF
8902     $message_class = "valid";
8903     $message = '&bullet; '._("Veuillez cliquer sur le lien ci-dessous pour telecharger votre bordereau");
8904     $message .= " : <br/><br/>";
8905     $message .= "<a class='om-prev-icon pdf-16'";
8906     $message .= " id=\"generer_bordereau_envoi_maire\"";
8907     $message .= " title=\""._("Bordereau")."\"";
8908 softime 7996 $message .= " href='".OM_ROUTE_FORM."&obj=instruction";
8909 mbroquet 3730 $message .= "&action=200";
8910     $message .= "&idx=".$id_instruction."'";
8911     $message .= " target='_blank'>";
8912     $message .= _("Bordereau d'envoi au maire");
8913     $message .= "</a><br/><br/>";
8914     $message .= '&bullet; '._("Rappel des informations saisies")." :<br/><br/>";
8915     $message .= _("Code du courrier")." : ".$code_barres."<br/>";
8916     $message .= _("Date d'envoi du courrier pour signature par le maire")." : ".$date;
8917    
8918     } else {
8919     // Message d'erreur
8920     $message_class = "error";
8921     $message = sprintf(_("Erreur lors de la mise a jour de l'evenement d'instruction correspondant au code barres %s."),
8922     $code_barres);
8923     }
8924     }
8925     else {
8926     $message_class = "error";
8927     $message = _("Le numero saisi ne correspond a aucun code-barres d'evenement d'instruction.");
8928     }
8929     }
8930     else {
8931     $message_class = "error";
8932     $message = _("La date est invalide.");
8933     }
8934     } else {
8935     $message_class = "error";
8936     $message = _("Tous les champs doivent etre remplis.");
8937     }
8938     }
8939    
8940     /**
8941     * Affichage des messages et du formulaire
8942     */
8943    
8944     // Affichage du message de validation ou d'erreur
8945     if (isset($message) && isset($message_class) && $message != "") {
8946     $this->f->displayMessage($message_class, $message);
8947     }
8948    
8949     // Ouverture du formulaire
8950     $datasubmit = $this->getDataSubmit();
8951     echo "\n<!-- ########## START DBFORM ########## -->\n";
8952     echo "<form";
8953     echo " id=\"bordereau_envoi_maire\"";
8954     echo " method=\"post\"";
8955     echo " name=\"f1\"";
8956     echo " action=\"";
8957     echo $datasubmit;
8958     echo "\"";
8959     echo ">\n";
8960    
8961     // Paramétrage des champs du formulaire
8962     $champs = array("code_barres","date");
8963    
8964     // Création d'un nouvel objet de type formulaire
8965 softime 7996 $form = $this->f->get_inst__om_formulaire(array(
8966     "validation" => 0,
8967     "maj" => 0,
8968     "champs" => $champs,
8969     ));
8970 mbroquet 3730
8971     $template_required_label = '%s *';
8972     // Parametrage du champ code_barres
8973     $form->setLib("code_barres", sprintf($template_required_label,_("Code du courrier")));
8974     $form->setType("code_barres", "text");
8975     $form->setVal("code_barres", $code_barres);
8976     $form->setTaille("code_barres", 20);
8977     $form->setMax("code_barres", 20);
8978     // Parametrage du champ date
8979     $form->setLib("date", sprintf($template_required_label,_("Date d'envoi du courrier pour signature par le maire")));
8980     $form->setType("date", "date") ;
8981     if (empty($date)) {
8982     $date = date('d/m/Y');
8983     }
8984     $form->setVal("date", $date);
8985     $form->setTaille("date", 10);
8986     $form->setMax("date", 10);
8987    
8988     // Création du bloc regroupant les champs
8989     $form->setBloc('code_barres','D');
8990     $form->setBloc('date','F');
8991     // Affichage du formulaire
8992     $form->entete();
8993     $form->afficher($champs, 0, false, false);
8994     $form->enpied();
8995     // Affichage du bouton
8996     printf("\t<div class=\"formControls\">\n");
8997     //
8998     $this->f->layout->display_form_button(array("value" => _("Valider"), "name" => "validation"));
8999     printf("\t</div>\n");
9000     // Fermeture du formulaire
9001     printf("\t</form>\n");
9002     }
9003    
9004     /**
9005     * VIEW - view_bordereau_envoi_maire.
9006     *
9007     * PDF de bordereau d'envoi au maire pour l'événement d'instruction instancié
9008     *
9009     * @return [void]
9010     */
9011     function view_generate_bordereau_envoi_maire() {
9012     // Vérification de l'accessibilité sur l'élément
9013     $this->checkAccessibility();
9014     // Récupération de la collectivité du dossier d'instruction
9015     $collectivite_di = $this->get_dossier_instruction_om_collectivite();
9016     // Récupération de ses paramètres
9017     $collectivite = $this->f->getCollectivite($collectivite_di);
9018     // Génération du PDF
9019     $result = $this->compute_pdf_output('etat', 'communaute_bordereau_envoi_maire', $collectivite, $this->getVal(($this->clePrimaire)));
9020     // Affichage du PDF
9021     $this->expose_pdf_output(
9022     $result['pdf_output'],
9023     $result['filename']
9024     );
9025     }
9026    
9027     /**
9028 softime 10808 * VIEW - view_rapport_instruction.
9029     *
9030     * Ouvre le sous-formulaire en ajaxIt dans un overlay.
9031     * Cette action est bindée pour utiliser la fonction popUpIt.
9032     *
9033     * @return void
9034     */
9035     function view_overlay_notification_manuelle() {
9036    
9037     // Vérification de l'accessibilité sur l'élément
9038     $this->checkAccessibility();
9039    
9040     printf(
9041     '<script type="text/javascript" >
9042     overlayIt(\'%1$s\',\'%2$s&objsf=%1$s&idxformulaire=%4$s&retourformulaire=dossier_instruction&obj=%1$s&action=411&idx=%3$s\', 1);
9043     </script>',
9044     'instruction_notification_manuelle',
9045     OM_ROUTE_SOUSFORM,
9046     $this->getVal($this->clePrimaire),
9047     $this->getVal('dossier')
9048     );
9049     }
9050    
9051     /**
9052 softime 11585 * VIEW - view_overlay_notification_service_consulte.
9053     *
9054     * Ouvre le sous-formulaire de notification des services consulte
9055     * en ajaxIt dans un overlay.
9056     * Cette action est bindée pour utiliser la fonction popUpIt.
9057     *
9058     * @return void
9059     */
9060     function view_overlay_notification_service_consulte() {
9061    
9062     // Vérification de l'accessibilité sur l'élément
9063     $this->checkAccessibility();
9064    
9065     printf(
9066     '<script type="text/javascript" >
9067     overlayIt(\'%1$s\',\'%2$s&objsf=%1$s&idxformulaire=%4$s&retourformulaire=dossier_instruction&obj=%1$s&action=420&idx=%3$s\', 1);
9068     </script>',
9069     'instruction_notification_manuelle',
9070     OM_ROUTE_SOUSFORM,
9071     $this->getVal($this->clePrimaire),
9072     $this->getVal('dossier')
9073     );
9074     }
9075    
9076     /**
9077     * VIEW - overlay_notification_tiers_consulte.
9078     *
9079     * Ouvre le sous-formulaire de notification des tiers consulte
9080     * en ajaxIt dans un overlay.
9081     * Cette action est bindée pour utiliser la fonction popUpIt.
9082     *
9083     * @return void
9084     */
9085     function view_overlay_notification_tiers_consulte() {
9086    
9087     // Vérification de l'accessibilité sur l'élément
9088     $this->checkAccessibility();
9089    
9090     printf(
9091     '<script type="text/javascript" >
9092     overlayIt(\'%1$s\',\'%2$s&objsf=%1$s&idxformulaire=%4$s&retourformulaire=dossier_instruction&obj=%1$s&action=430&idx=%3$s\', 1);
9093     </script>',
9094     'instruction_notification_manuelle',
9095     OM_ROUTE_SOUSFORM,
9096     $this->getVal($this->clePrimaire),
9097     $this->getVal('dossier')
9098     );
9099     }
9100 softime 12847
9101 softime 11585 /**
9102 softime 12847 * VIEW - view_modale_selection_document_signe
9103     *
9104     * Ouvre le sous-formulaire de notification des services consulte
9105     * en ajaxIt dans un overlay.
9106     * Cette action est bindée pour utiliser la fonction popUpIt.
9107     *
9108     * @return void
9109     */
9110     function view_modale_selection_document_signe() {
9111    
9112     // Vérification de l'accessibilité sur l'élément
9113     $this->checkAccessibility();
9114    
9115     printf(
9116     '<script type="text/javascript" >
9117     overlayIt(\'%1$s\',\'%2$s&objsf=%1$s&idxformulaire=%4$s&retourformulaire=dossier_instruction&obj=%1$s&action=115&idx=%3$s\', 1);
9118     </script>',
9119     'instruction_modale',
9120     OM_ROUTE_SOUSFORM,
9121     $this->getVal($this->clePrimaire),
9122     $this->getVal('dossier')
9123     );
9124     }
9125    
9126     /**
9127 softime 6565 * Retourne l'événement d'instruction dont on donne le code-barres, avec un filtre
9128     * pour exclure les dossiers du groupe contentieux.
9129 mbroquet 3730 *
9130     * @param [string] $barcode numéro du code-barres
9131     * @return [mixed] ID de son instruction ou null si aucun code
9132     */
9133     function get_instruction_by_barcode($barcode) {
9134     // Begin
9135     $this->begin_treatment(__METHOD__);
9136 softime 14064
9137 mbroquet 3730 // Vérification de l'existence de l'événement d'instruction
9138 softime 6565 // pour le code-barres donné, en excluant les dossiers liés au groupe CTX
9139 softime 14064 $qres = $this->f->get_one_result_from_db_query(
9140     sprintf(
9141     'SELECT
9142     instruction
9143     FROM
9144     %1$sinstruction
9145     INNER JOIN %1$sdossier
9146 softime 6565 ON dossier.dossier=instruction.dossier
9147 softime 14064 INNER JOIN %1$sdossier_instruction_type
9148 softime 6565 ON dossier.dossier_instruction_type = dossier_instruction_type.dossier_instruction_type
9149 softime 14064 INNER JOIN %1$sdossier_autorisation_type_detaille
9150 softime 6565 ON dossier_instruction_type.dossier_autorisation_type_detaille = dossier_autorisation_type_detaille.dossier_autorisation_type_detaille
9151 softime 14064 INNER JOIN %1$sdossier_autorisation_type
9152 softime 6565 ON dossier_autorisation_type_detaille.dossier_autorisation_type = dossier_autorisation_type.dossier_autorisation_type
9153 softime 14064 INNER JOIN %1$sgroupe
9154 softime 6565 ON dossier_autorisation_type.groupe = groupe.groupe
9155 softime 14064 AND groupe.code != \'CTX\'
9156     WHERE
9157     code_barres = \'%2$s\'',
9158     DB_PREFIXE,
9159     $this->f->db->escapeSimple($barcode)
9160     ),
9161     array(
9162     "origin" => __METHOD__,
9163     )
9164     );
9165    
9166 mbroquet 3730 // Retourne résultat
9167 softime 14064 return $this->end_treatment(__METHOD__, $qres['result']);
9168 mbroquet 3730 }
9169    
9170     /**
9171     * Met à jour le champ date d'envoi signature
9172     * avec la date fournie et pour l'instruction donnée
9173     *
9174     * @param [string] $id ID de l'événement d'instruction
9175     * @param [string] $date date au format EN
9176     * @return [boolean] true si mise à jour avec succès
9177     */
9178     function update_date_envoi_signature($id, $date) {
9179     // Préparation du tableau
9180     $valF = array();
9181     $valF['date_envoi_signature'] = $date;
9182     // Begin
9183     $this->begin_treatment(__METHOD__);
9184     // Requête
9185 softime 12847 $res = $this->f->db->autoexecute(
9186 mbroquet 3730 DB_PREFIXE.$this->table,
9187     $valF,
9188     DB_AUTOQUERY_UPDATE,
9189     $this->getCle($id)
9190     );
9191 softime 12847 $this->addToLog(
9192     __METHOD__."(): db->autoexecute(\"".DB_PREFIXE.'.'.$this->table."\", ".print_r($valF, true).", DB_AUTOQUERY_UPDATE, \"".$this->getCle($id)."\");",
9193     VERBOSE_MODE
9194     );
9195     if ($this->f->isDatabaseError($res, true) !== false) {
9196 mbroquet 3730 $this->end_treatment(__METHOD__, false);
9197     }
9198     //
9199     return $this->end_treatment(__METHOD__, true);
9200     }
9201    
9202     /**
9203     * Méthode permettant de définir des valeurs à envoyer en base après
9204     * validation du formulaire d'ajout.
9205     * @param array $val tableau des valeurs retournées par le formulaire
9206     */
9207 softime 6929 function setValFAjout($val = array()) {
9208 mbroquet 3730 // Mise à jour du flag created_by_commune lors d'un changement de décision
9209     // par un utilisateur de commune sur un dossier instruit par la comcom
9210 softime 6565 if ($this->isInstrCanChangeDecision($this->valF["dossier"])) {
9211 mbroquet 3730 $this->valF['created_by_commune'] = true;
9212     }
9213 softime 8593
9214     //
9215     if ($this->evenement_has_an_edition($this->valF['evenement']) === false) {
9216     if (isset($this->valF['flag_edition_integrale']) === true) {
9217     unset($this->valF['flag_edition_integrale']);
9218     }
9219     if (isset($this->valF['signataire_arrete']) === true) {
9220     unset($this->valF['signataire_arrete']);
9221     }
9222     }
9223 mbroquet 3730 }
9224 nmeucci 3876
9225 fmichon 3892
9226 fmichon 4708 /**
9227     * Récupère l'instance d'un événement de workflow.
9228     *
9229     * @param mixed $evenement Identifiant de l'événement.
9230     *
9231     * @return object
9232     */
9233     function get_inst_evenement($evenement = null) {
9234     //
9235     return $this->get_inst_common("evenement", $evenement);
9236     }
9237 softime 3976
9238 fmichon 3892 /**
9239 softime 3976 * Logue l'action de l'instruction dans son DI.
9240 nmeucci 3933 *
9241 softime 3976 * @param string $id Clé primaire de l'instruction.
9242     * @param array $val Valeurs de l'instruction.
9243     *
9244     * @return bool Vrai si traitement effectué avec succès
9245 nmeucci 3876 */
9246 softime 3976 private function add_log_to_dossier($id, array $val) {
9247 nmeucci 3933 $maj = $this->getParameter("maj");
9248 nmeucci 3943 // Action = Trace par défaut
9249     $action = $this->get_backtrace();
9250     // Action = Identifant de l'action si contexte connu
9251     if (empty($maj) === false
9252     || (empty($maj) === true && $maj === 0)) {
9253     $action = $this->get_action_param($maj, 'identifier');
9254 nmeucci 3965 if ($action === 'modifier_suivi') {
9255     $action = "modifier (via l'action suivi des dates)";
9256     }
9257 nmeucci 4108 if ($action === 'notifier_commune'
9258     && isset($val['mails_destinataires']) === true) {
9259     $action = "notification de la commune (courriels : ";
9260     $action .= $val['mails_destinataires'].")";
9261     }
9262 nmeucci 3943 }
9263 nmeucci 3876 // Création du log
9264     $log = array(
9265     'date' => date('Y-m-d H:i:s'),
9266     'user' => $_SESSION['login'],
9267     'action' => $action,
9268     'values' => array(
9269     'date_evenement' => $this->dateDB($val['date_evenement']),
9270     'date_retour_rar' => $this->dateDB($val['date_retour_rar']),
9271     'date_retour_signature' => $this->dateDB($val['date_retour_signature']),
9272     'evenement' => $val['evenement'],
9273     'action' => $val['action'],
9274 nmeucci 3963 'instruction' => $id,
9275 nmeucci 3876 'etat' => $val['etat'],
9276     ),
9277     );
9278     // Ajout du log
9279 softime 3976 $di = $this->get_inst_dossier($val['dossier']);
9280 nmeucci 3876 $ret = $di->add_log_instructions($log);
9281     if ($ret === false) {
9282     $this->correct = false;
9283     $this->msg = '';
9284     $this->addToMessage($di->msg);
9285     }
9286     return $ret;
9287     }
9288 nmeucci 3943
9289 softime 3976
9290 nmeucci 3943 /**
9291 softime 3976 * Retourne le contexte de déboguage formaté en HTML.
9292 nmeucci 3943 *
9293 softime 3976 * @return string Une ligne par trace
9294 nmeucci 3943 */
9295     private function get_backtrace() {
9296     $trace = debug_backtrace();
9297 nmeucci 3957 $backtrace = '';
9298     $i = 1;
9299 nmeucci 3943 foreach ($trace as $key => $value) {
9300 nmeucci 3957 $func = $trace[$key]['function'];
9301     // On ne s'autolog pas
9302     if ($func === 'get_backtrace'
9303     || $func === 'add_log_to_dossier') {
9304     continue;
9305     }
9306     $backtrace .= $i.') ';
9307     // Si dans une classe
9308     if (isset($trace[$key]['class']) === true
9309     && empty($trace[$key]['class']) === false) {
9310 nmeucci 3963 $backtrace .= $trace[$key]['class'].'->'.$func;
9311 nmeucci 3957 }
9312     // Si procédural
9313     else {
9314     $file = $trace[$key]['file'];
9315 nmeucci 3963 $line = $trace[$key]['line'];
9316 softime 3976 $truncated_file = $this->f->get_relative_path($file);
9317 nmeucci 3963 if ($truncated_file !== false) {
9318     $file = $truncated_file;
9319     }
9320     $backtrace .= $func.' IN<br/>&nbsp;&nbsp;&nbsp;&nbsp; '.$file.':'.$line;
9321 nmeucci 3957 }
9322     $backtrace .= '<br/>';
9323     $i++;
9324 nmeucci 3943 }
9325 nmeucci 3957 return $backtrace;
9326 nmeucci 3943 }
9327 nmeucci 3963
9328 nmeucci 4108 /**
9329     * CONDITION - is_notifiable.
9330     *
9331     * Condition pour afficher l'action notifier_commune.
9332     *
9333     * @return boolean
9334     */
9335     public function is_notifiable() {
9336     // L'instruction doit être finalisée, ce qui revient à dire
9337     // définalisable sans bypass
9338     if ($this->is_unfinalizable_without_bypass() === false) {
9339     return false;
9340     }
9341     // La collectivité de l'utilisateur doit être de niveau multi
9342     if ($this->f->has_collectivite_multi() === false) {
9343     return false;
9344     }
9345     // Le paramètre multi de l'objet du courriel doit exister
9346     if ($this->f->getParameter('param_courriel_de_notification_commune_objet_depuis_instruction') === NULL) {
9347     return false;
9348     }
9349     // Le paramètre multi du modèle du courriel doit exister
9350     if ($this->f->getParameter('param_courriel_de_notification_commune_modele_depuis_instruction') === NULL) {
9351     return false;
9352     }
9353     // A ce stade toutes les conditions sont satisfaites
9354     return true;
9355     }
9356 nmeucci 3963
9357 nmeucci 4108 /**
9358     * TREATMENT - notifier_commune.
9359     *
9360     * Notifie aux communes et par courriel la finalisation d'une instruction.
9361     *
9362     * @return boolean
9363     */
9364     public function notifier_commune() {
9365     // Cette méthode permet d'exécuter une routine en début des méthodes
9366     // dites de TREATMENT.
9367     $this->begin_treatment(__METHOD__);
9368 softime 14542 $message = __('Erreur de paramétrage :');
9369 softime 12654 $erreurParametrage = false;
9370     // Récupération du paramétrage de la collectivité du dossier
9371 nmeucci 4108 $id_di = $this->getVal('dossier');
9372     $di = $this->get_inst_dossier($id_di);
9373     $collectivite_di = $di->getVal('om_collectivite');
9374 softime 12654 // Récupération de l'url permettant d'accèder à l'instruction et au dossier
9375     $urlAcces = $this->f->get_parametre_notification_url_acces($collectivite_di);
9376     if (empty($urlAcces) && empty(PATH_BASE_URL)) {
9377     $erreurParametrage = true;
9378     $message .= '<br>'.__("* l'url de notification n'est pas correctement paramétré");
9379 nmeucci 4108 }
9380 softime 12654
9381     // Récupération de la liste des mails
9382     $adresses = $this->f->get_param_courriel_de_notification_commune($collectivite_di);
9383     if (empty($adresses)) {
9384     $erreurParametrage = true;
9385     $message .= '<br>'.__("* aucun courriel valide de destinataire de la commune");
9386 nmeucci 4108 }
9387 softime 12654
9388     // Vérification du paramétrage des mails
9389     $paramMail = $this->f->get_notification_commune_parametre_courriel_type($collectivite_di);
9390     if (empty($paramMail) || empty($paramMail['parametre_courriel_type_message'])) {
9391     $erreurParametrage = true;
9392     $message .= '<br>'.__("* le modèle du courriel envoyé aux communes est vide");
9393 nmeucci 4108 }
9394 softime 12654 if (empty($paramMail) || empty($paramMail['parametre_courriel_type_titre'])) {
9395     $erreurParametrage = true;
9396     $message .= '<br>'.__("* l'objet du courriel envoyé aux communes est vide");
9397 nmeucci 4108 }
9398 softime 12654
9399     // Si il y a des erreurs de paramétrage on ne déclenche pas la notification et
9400     // un message a destination de l'utilisateur est affiché
9401     if ($erreurParametrage) {
9402     $message .= '<br>'.__("Veuillez contacter votre administrateur.");
9403     $this->addToMessage($message);
9404 nmeucci 4108 return $this->end_treatment(__METHOD__, false);
9405     }
9406 softime 12654
9407     // Création d'un notification et de sa tâche associé pour chaque mail
9408     foreach ($adresses as $adresse) {
9409     // Ajout de la notif et récupération de son id
9410     $destinataire = array(
9411     'destinataire' => $adresse,
9412     'courriel' => $adresse
9413     );
9414     $idNotif = $this->ajouter_notification(
9415     $this->getVal($this->clePrimaire),
9416     $this->f->get_connected_user_login_name(),
9417     $destinataire,
9418     $collectivite_di
9419     );
9420     if ($idNotif === false) {
9421     $this->addToMessage(__("Veuillez contacter votre administrateur."));
9422     return $this->end_treatment(__METHOD__, false);
9423 nmeucci 4108 }
9424 softime 12654 // Création de la tache en lui donnant l'id de la notification
9425     $notification_by_task = $this->notification_by_task(
9426     $idNotif,
9427     $this->getVal('dossier'),
9428     'mail',
9429     'notification_commune'
9430     );
9431     if ($notification_by_task === false) {
9432     $this->addToMessage(__("Erreur lors de la préparation de la notification des communes."));
9433     $this->addToMessage(__("Veuillez contacter votre administrateur."));
9434     return $this->end_treatment(__METHOD__, false);
9435     }
9436 nmeucci 4108 }
9437 softime 12654 $this->addToMessage(__('La commune a été notifiée.'));
9438 nmeucci 4108 return $this->end_treatment(__METHOD__, true);
9439     }
9440    
9441     /**
9442 softime 5169 * Récupère l'instance de l'instructeur
9443     *
9444     * @param integer $instructeur Identifiant de l'instructeur.
9445     *
9446     * @return object
9447     */
9448     protected function get_inst_instructeur($instructeur) {
9449     //
9450     return $this->get_inst_common("instructeur", $instructeur);
9451     }
9452    
9453    
9454     /**
9455     * Récupère l'instance de l'utilisateur
9456     *
9457     * @param integer $om_utilisateur Identifiant de l'utilisateur.
9458     *
9459     * @return object
9460     */
9461     protected function get_inst_om_utilisateur($om_utilisateur) {
9462     //
9463     return $this->get_inst_common("om_utilisateur", $om_utilisateur);
9464     }
9465    
9466    
9467 softime 6565 /**
9468 softime 5295 * Récupère l'instance de la division.
9469     *
9470     * @param integer $division Identifiant de la division.
9471     *
9472     * @return object
9473     */
9474     protected function get_inst_division($division) {
9475     //
9476     return $this->get_inst_common("division", $division);
9477     }
9478    
9479    
9480     /**
9481     * Récupère l'instance de la direction.
9482     *
9483     * @param integer $direction Identifiant de la direction.
9484     *
9485     * @return object
9486     */
9487     protected function get_inst_direction($direction) {
9488     //
9489     return $this->get_inst_common("direction", $direction);
9490     }
9491    
9492    
9493     /**
9494     * Récupère la collectivité d'un instructeur en passant par sa division puis
9495     * par sa direction.
9496     *
9497     * @param integer $instructeur Identifiant de l'instructeur.
9498     *
9499     * @return integer
9500     */
9501     protected function get_instructeur_om_collectivite($instructeur) {
9502     // Chemin vers la collectivité d'un instructeur
9503     $inst_instr = $this->get_inst_instructeur($instructeur);
9504     $inst_division = $this->get_inst_division($inst_instr->getVal('division'));
9505     $inst_direction = $this->get_inst_direction($inst_division->getVal('direction'));
9506    
9507     // Collectivité
9508     $om_collectivite = $inst_direction->getVal('om_collectivite');
9509    
9510     //
9511     return $om_collectivite;
9512     }
9513    
9514 softime 6565 /*
9515     * CONDITION - can_user_access_dossier_contexte_ajout
9516     *
9517     * Vérifie que l'utilisateur a bien accès au dossier d'instruction passé dans le
9518     * formulaire d'ajout.
9519     * Cette méthode vérifie que l'utilisateur est lié au groupe du dossier, et si le
9520     * dossier est confidentiel qu'il a accès aux confidentiels de ce groupe.
9521     *
9522     */
9523     function can_user_access_dossier_contexte_ajout() {
9524 softime 5295
9525 softime 6565 ($this->f->get_submitted_get_value('idxformulaire') !== null ? $id_dossier =
9526     $this->f->get_submitted_get_value('idxformulaire') : $id_dossier = "");
9527     //
9528     if ($id_dossier !== "") {
9529 softime 7996 $dossier = $this->f->get_inst__om_dbform(array(
9530     "obj" => "dossier_instruction",
9531     "idx" => $id_dossier,
9532     ));
9533 softime 6565 //
9534     return $dossier->can_user_access_dossier();
9535     }
9536     return false;
9537     }
9538    
9539     /*
9540     * CONDITION - can_user_access_dossier
9541     *
9542     * Vérifie que l'utilisateur a bien accès au dossier lié à l'instruction instanciée.
9543     * Cette méthode vérifie que l'utilisateur est lié au groupe du dossier, et si le
9544     * dossier est confidentiel qu'il a accès aux confidentiels de ce groupe.
9545     *
9546     */
9547     function can_user_access_dossier_contexte_modification() {
9548    
9549     $id_dossier = $this->getVal('dossier');
9550     //
9551     if ($id_dossier !== "" && $id_dossier !== null) {
9552 softime 7996 $dossier = $this->f->get_inst__om_dbform(array(
9553     "obj" => "dossier_instruction",
9554     "idx" => $id_dossier,
9555     ));
9556 softime 6565 //
9557     return $dossier->can_user_access_dossier();
9558     }
9559     return false;
9560     }
9561    
9562 softime 8593 /**
9563 softime 10713 * TREATMENT - envoyer_a_signature_sans_relecture
9564     *
9565     * Permet d'envoyer le document de l'instruction au parapheur pour signature sans relecture
9566     *
9567     * @return boolean true si l'envoi a été effectué avec succès false sinon
9568     */
9569     function envoyer_a_signature_sans_relecture() {
9570     return $this->envoyer_a_signature();
9571     }
9572    
9573     /**
9574     * TREATMENT - envoyer_a_signature_avec_relecture
9575     *
9576     * Permet d'envoyer le document de l'instruction au parapheur pour signature avec relecture
9577     *
9578     * @return boolean true si l'envoi a été effectué avec succès false sinon
9579     */
9580     function envoyer_a_signature_avec_relecture() {
9581 softime 10808 $is_forced_view_files = true;
9582     return $this->envoyer_a_signature($is_forced_view_files);
9583 softime 10713 }
9584    
9585     /**
9586 softime 10573 * TREATMENT - envoyer_a_signature
9587     *
9588     * Permet d'envoyer le document de l'instruction au parapheur pour signature
9589 softime 10713 *
9590     * @param boolean $is_forced_view_files Indique si il y a une relecture (true) ou non (false)
9591 softime 10573 *
9592     * @return boolean true si l'envoi a été effectué avec succès false sinon
9593     */
9594 softime 10713 function envoyer_a_signature($is_forced_view_files = false) {
9595 softime 10573 $this->begin_treatment(__METHOD__);
9596     $this->correct = true;
9597    
9598     // Instanciation de l'objet signataire_arrete
9599     $inst_signataire_arrete = $this->f->get_inst__om_dbform(array(
9600     'obj' => 'signataire_arrete',
9601     'idx' => $this->getVal('signataire_arrete'),
9602     ));
9603    
9604     // Instanciation de l'objet dossier
9605     $inst_dossier = $this->f->get_inst__om_dbform(array(
9606     'obj' => 'dossier',
9607     'idx' => $this->getVal('dossier'),
9608     ));
9609    
9610 softime 15037 //Instanciation de la classe electronicsignature
9611     $inst_es = $this->get_electronicsignature_instance();
9612     if ($inst_es === false) {
9613     $this->correct = false;
9614     return $this->end_treatment(__METHOD__, false);
9615     }
9616    
9617     // Vérifie si la notification se fait via l'application ou via le parapheur
9618     try {
9619     $notification_required = $inst_es->signer_notification_is_delegated();
9620     } catch(electronicsignature_connector_method_not_implemented_exception $_) {
9621     // Si la méthode n'existe pas, on considère que la notification est faite par le parapheur
9622     $notification_required = false;
9623     }
9624    
9625     // Si la notification est faite par l'application vérifie que l'adresse mail du
9626     // signataire est correcte. Si ce n'est pas le cas le document n'est pas envoyé
9627     // au parapheur car il ne sera pas accessible sans le lien transmis dans la
9628     // notification
9629     if ($notification_required === true) {
9630     $signer_mail = $inst_signataire_arrete->getVal('email');
9631     $signer_name = trim($inst_signataire_arrete->getVal('prenom').' '.$inst_signataire_arrete->getVal('nom'));
9632    
9633     $err_msg = __('Le document n\'a pas pu être envoyé en signature car ');
9634    
9635     if (empty($signer_mail)) {
9636     $this->correct = false;
9637     $err_detail = sprintf(__("l'email du signataire '%s' est vide."), $signer_name);
9638     $this->addToMessage($err_msg.$err_detail);
9639     $this->addToLog(__METHOD__.$err_msg.$err_detail.' Instruction : '.$this->getVal($this->clePrimaire), DEBUG_MODE);
9640     return $this->end_treatment(__METHOD__, false);
9641     }
9642     if (! $this->f->checkValidEmailAddress($signer_mail)) {
9643     $this->correct = false;
9644     $err_detail = sprintf(__("l'email du signataire '%s' est invalide (%s)."), $signer_name, $signer_mail);
9645     $this->addToMessage($err_msg.$err_detail);
9646     $this->addToLog(__METHOD__.$err_msg.$err_detail.' Instruction : '.$this->getVal($this->clePrimaire), DEBUG_MODE);
9647     return $this->end_treatment(__METHOD__, false);
9648     }
9649     }
9650    
9651 softime 10573 // Récupération du document à signer
9652     $file = $this->f->storage->get($this->getVal('om_fichier_instruction'));
9653     if ($file === OP_FAILURE) {
9654     $this->correct = false;
9655     $this->addToMessage(__("Une erreur est survenue lors de la récupération du contenu du document de l'instruction."));
9656     // Termine le traitement
9657     return $this->end_treatment(__METHOD__, false);
9658     }
9659    
9660     // Initialisation des paramètre à passer pour l'envoi en signature
9661 softime 10808 $data = array(
9662 softime 10573 "om_utilisateur_email" => $this->f->om_utilisateur['email'],
9663     "om_utilisateur_nom" => $this->f->om_utilisateur['nom'],
9664     "signataire_arrete_email" => $inst_signataire_arrete->getVal('email'),
9665     "signataire_arrete_nom" => $inst_signataire_arrete->getVal('nom'),
9666     "signataire_arrete_prenom" => $inst_signataire_arrete->getVal('prenom'),
9667 softime 11876 // Permet d'envoyer en signature l'instruction le jour de la date limite
9668 softime 14064 "date_limite_instruction" => $this->compute_date_limite(1) != null ? $this->compute_date_limite(1) : null,
9669 softime 10573 "dossier" => $this->getVal('dossier'),
9670 softime 10713 "is_forced_view_files" => $is_forced_view_files,
9671     'commentaire_signature' => $is_forced_view_files === true ? __('relecture demandee.') : null
9672 softime 10573 );
9673    
9674 softime 10808 // Initialisation des métadonnées
9675     $metadonnee_dossier = $file['metadata'];
9676 softime 11228 // récupération de l'extension du fichier
9677     $extension = substr($metadonnee_dossier['filename'], strrpos($metadonnee_dossier['filename'], '.'));
9678     // Modification du libellé du document transmis au parapheur
9679     // pour le mettre sous la forme : instruction_xxx_libelle_lettretype.extension
9680     $metadonnee_dossier['filename'] = $this->getDocumentLibelle().$extension;
9681     $metadonnee_dossier['titre_document'] = $this->getDocumentTitre();
9682 softime 10808
9683     $metadonnee_dossier['url_di'] = sprintf(
9684 softime 15037 '%1$sapp/index.php?module=form&direct_link=true&obj=dossier_instruction&action=3&idx=%2$s&direct_field=dossier&direct_form=document_numerise&direct_action=4&direct_idx=%2$s',
9685 softime 11418 $this->f->get_param_base_path_metadata_url_di() !== null ? $this->f->get_param_base_path_metadata_url_di() : PATH_BASE_URL,
9686 softime 15037 $this->getVal('dossier')
9687 softime 10808 );
9688    
9689     $optional_data = null;
9690     // Si il y a des paramètres supplémentaire spécifié dans le signataire alors on les récupère
9691     if ($inst_signataire_arrete->getVal('parametre_parapheur') !== null && $inst_signataire_arrete->getVal('parametre_parapheur') !== '') {
9692     $optional_data = json_decode($inst_signataire_arrete->getVal('parametre_parapheur'), true);
9693     if (json_last_error() !== JSON_ERROR_NONE) {
9694     $this->correct = false;
9695     $this->addToMessage(__("Les paramètres supplémentaires envoyés au parapheur ne sont pas au bon format."));
9696     $this->addToLog(__METHOD__."(): ".
9697     __("Erreur lors du décodage du format json des paramètres supplémentaires envoyé au parapheur.
9698     Tableau : ").var_export($inst_signataire_arrete->getVal('parametre_parapheur'), true)
9699     );
9700     // Termine le traitement
9701     return $this->end_treatment(__METHOD__, false);
9702     }
9703     }
9704    
9705 softime 10573 // Appel de la méthode de l'abstracteur send_for_signature()
9706     // Cette méthode doit retourner un tableau de valeur
9707     try {
9708 softime 10808 $result = $inst_es->send_for_signature($data, $file['file_content'], $metadonnee_dossier, $optional_data);
9709 softime 10573 } catch (electronicsignature_exception $e) {
9710     $this->handle_electronicsignature_exception($e);
9711     return $this->end_treatment(__METHOD__, false);
9712     }
9713    
9714     // Après avoir reçu le résultat du parapheur, il faut mettre à jour les champs
9715     $valF = array();
9716    
9717     // Pour appeler la fonction modifier il faut traiter tous les champs de l'objet
9718     foreach($this->champs as $identifiant => $champ) {
9719     $valF[$champ] = $this->val[$identifiant];
9720     }
9721     // On fait ensuite nos modifications spécifiques
9722     $valF['id_parapheur_signature'] = $result['id_parapheur_signature'];
9723     $valF['statut_signature'] = $result['statut'];
9724     $valF['commentaire_signature'] = isset($result['commentaire_signature']) == true ? $result['commentaire_signature'] : null;
9725     $valF['date_envoi_signature'] = date("Y-m-d", strtotime($result['date_envoi_signature']));
9726     $valF['historique_signature'] = $this->get_updated_historique_signature($result);
9727 softime 15037 $valF['parapheur_lien_page_signature'] = isset($result['signature_page_url']) ? $result['signature_page_url'] : null;
9728 softime 10573 $ret = $this->modifier($valF);
9729    
9730     if ($ret === false) {
9731     $this->correct = false;
9732     $this->addToMessage(__("Une erreur est survenue lors de la mise à jour des champs."));
9733     // Termine le traitement
9734     return $this->end_treatment(__METHOD__, false);
9735     }
9736    
9737 softime 15037 // Notification du signataire
9738     if ($notification_required === true) {
9739     if ($this->notify_signer($signer_name, $signer_mail, $data['om_utilisateur_nom']) === false) {
9740     $msg = __("Une erreur s'est produite lors de la notification du signataire \"%s (%s)\". Annulation de l'envoi pour signature du document%s.");
9741     $this->addToMessage(sprintf($msg, $signer_name, $signer_mail, ''));
9742     $this->addToLog(sprintf($msg, $signer_name, $signer_mail, ' : '.$this->getVal($this->clePrimaire)), DEBUG_MODE);
9743     // Met à jour les valeurs de l'objet courant pour prendre en compte les modifications faites
9744     // precedemment
9745     $this->init_record_data($this->getVal($this->clePrimaire));
9746     $this->annuler_envoi_en_signature();
9747     $this->correct = false;
9748     return $this->end_treatment(__METHOD__, true);
9749     }
9750     }
9751    
9752 softime 10573 // Message
9753     $this->addToMessage(__("Le document a été envoyé pour signature dans le parapheur."));
9754 softime 15037 if ($this->f->is_option_enabled('option_afficher_lien_parapheur') === true
9755     && array_key_exists('signature_page_url', $result) === true) {
9756 softime 10573 $this->addToMessage(sprintf(
9757 softime 11228 '<br> > <a href="%1$s" title="%2$s" target="_blank">%2$s</a>',
9758     $result['signature_page_url'],
9759     __("Signez directement le document")
9760 softime 10573 ));
9761     }
9762 softime 15037 if ($notification_required !== true) {
9763     $this->addToMessage(__("L'envoi de la notification au signataire est effectué par la plateforme."));
9764     }
9765 softime 10573
9766     // Tout s'est bien passé, on termine le traitement
9767     return $this->end_treatment(__METHOD__, true);
9768     }
9769    
9770     /**
9771 softime 15037 * Notifie le signataire d'un document à signer.
9772     * Gère l'affichage des messages à destination de l'utilisateur selon l'état du traitement.
9773     * En cas d'erreur ajoute une ligne dans les logs de l'application.
9774     *
9775     * @param string $signer_name Nom du signataire
9776     * @param string $signer_mail Mail du signataire
9777     * @param string $user_name Nom de l'utilisateur openADS courant
9778     *
9779     * @return boolean true si succés, false si erreur
9780     */
9781     protected function notify_signer($signer_name, $signer_mail, $user_name) {
9782     // message d'erreur
9783     $err_msg_log = sprintf(
9784     __("Échec de la notification du signataire \"%s (%s)\" lors de l'envoi au parapaheur du document de l'instruction : %s"),
9785     $signer_name,
9786     $signer_mail,
9787     $this->getVal($this->clePrimaire)
9788     );
9789     $err_msg = sprintf(
9790     '%s %s (%s)"',
9791     __("Échec de la notification du signataire"),
9792     $signer_name,
9793     $signer_mail
9794     );
9795    
9796     // vérification des informations requises
9797     if (empty($signer_name)) {
9798     $err_detail = __("le nom du signataire est vide");
9799     $this->addToLog(__METHOD__.', '.$err_msg_log.', '.$err_detail, DEBUG_MODE);
9800     $this->addToMessage($err_msg.', '.$err_detail);
9801     return false;
9802     }
9803     if (empty($signer_mail)) {
9804     $err_detail = __("le courriel du signataire est vide");
9805     $this->addToLog(__METHOD__.', '.$err_msg_log.', '.$err_detail, DEBUG_MODE);
9806     $this->addToMessage($err_msg.', '.$err_detail);
9807     return false;
9808     }
9809     if (empty($this->getVal('dossier'))) {
9810     $err_detail = __("l'identifiant du dossier est vide");
9811     $this->addToLog(__METHOD__.', '.$err_msg_log.', '.$err_detail, DEBUG_MODE);
9812     $this->addToMessage($err_msg.', '.$err_detail);
9813     return false;
9814     }
9815    
9816     // ajout de la notification à la liste des notifications de l'instruction
9817     $instruction_id = $this->getVal($this->clePrimaire);
9818     $inst_notif = $this->f->get_inst__om_dbform(array(
9819     "obj" => "instruction_notification",
9820     "idx" => "]",
9821     ));
9822     $notif_val = array(
9823     'instruction_notification' => null,
9824     'instruction' => $instruction_id,
9825     'automatique' => true,
9826     'emetteur' => $user_name,
9827     'date_envoi' => null,
9828     'destinataire' => "$signer_name <$signer_mail>",
9829     'courriel' => $signer_mail,
9830     'date_premier_acces' => null,
9831     'statut' => '',
9832     'commentaire' => ''
9833     );
9834     $add_notif = $inst_notif->ajouter($notif_val);
9835     if ($add_notif === false) {
9836     $err_detail = __("Échec de l'ajout de la notification.");
9837     $this->addToLog(__METHOD__.' '.$err_msg_log.'. '.$err_detail.' Notification : '.var_export($notif_val, true), DEBUG_MODE);
9838     $this->addToMessage($err_msg);
9839     return false;
9840     }
9841     $notification_id = $inst_notif->getVal($inst_notif->clePrimaire);
9842    
9843     // ajout d'une tâche de notification (envoi du mail)
9844     $notification_task = $this->notification_by_task(
9845     $notification_id,
9846     $this->getVal('dossier'),
9847     'mail',
9848     'notification_signataire'
9849     );
9850     if ($notification_task === false) {
9851     $err_detail = sprintf(
9852     __("Échec de l'ajout de la tâche de notification (notification %s)."),
9853     $notification_id);
9854     $this->addToLog(__METHOD__.' '.$err_msg_log.'. '.$err_detail, DEBUG_MODE);
9855     $this->addToMessage($err_msg);
9856     return false;
9857     }
9858    
9859     // Vérification de la réussite de l'envoi du mail
9860     // Fais une requête pour récupérer la liste des notifications de signataire faites par mail
9861     // et associées à l'instruction en cours. Récupère uniquement la dernière qui doit être celle
9862     // qui viens d'être créée.
9863     // Si la tâche d'envoi du mail est en erreur alors on considère que l'envoi du mail a échoué.
9864     $qres = $this->f->get_one_result_from_db_query(
9865     sprintf(
9866     'SELECT
9867     state
9868     FROM
9869     %1$stask
9870     WHERE
9871     type = \'notification_signataire\'
9872     AND category = \'mail\'
9873     AND dossier = \'%2$s\'
9874     ORDER BY
9875     task DESC
9876     LIMIT 1',
9877     DB_PREFIXE,
9878     $this->f->db->escapeSimple($this->getVal('dossier'))
9879     ),
9880     array(
9881     'origin' => __METHOD__
9882     )
9883     );
9884     if ($qres['result'] === 'error') {
9885     $err_detail = sprintf(
9886     __("Échec de l'envoi du mail de notification (notification %s)."),
9887     $notification_id);
9888     $this->addToLog(__METHOD__.' '.$err_msg_log.'. '.$err_detail, DEBUG_MODE);
9889     $this->addToMessage($err_msg);
9890     return false;
9891     }
9892    
9893     // succès de la planification de la notification
9894     $this->addToMessage(sprintf(
9895     __('Le signataire "%s (%s)" sera notifié prochainement'),
9896     $signer_name,
9897     $signer_mail));
9898     return true;
9899     }
9900    
9901     /**
9902 softime 11876 * Permet de récupérer la bonne date limite en fonction de si l'instruction
9903     * est en incomplet notifié ou non.
9904     * On peut ajouter des jours à cette date grâce au paramètre "delay".
9905     * Cette fonction est utilisée dans un cas spécifique où on veut envoyer
9906     * l'instruction en signature le jour de la date limite.
9907     *
9908     * @param int $delay Le nombre de jour à ajouter à la date limite.
9909     *
9910     * @return string $date_limite la date limite calculé ou false
9911     */
9912     private function compute_date_limite($delay) {
9913     // Instanciation de l'objet dossier
9914     $inst_dossier = $this->f->get_inst__om_dbform(array(
9915     'obj' => 'dossier',
9916     'idx' => $this->getVal('dossier'),
9917     ));
9918    
9919     $date_to_compute = null;
9920     if ($inst_dossier->getVal('incomplet_notifie') === 't') {
9921     $date_to_compute = $inst_dossier->getVal('date_limite_incompletude');
9922     } else {
9923     $date_to_compute = $inst_dossier->getVal('date_limite');
9924     }
9925 softime 14064 if ($date_to_compute != null) {
9926     return date("Y-m-d", strtotime($date_to_compute."+ $delay days"));
9927     }
9928 softime 11876
9929 softime 14064 return null;
9930 softime 11876 }
9931    
9932     /**
9933 softime 10573 * Permet de récupérer la traduction de la valeur de statut_signature
9934     *
9935     * @return string la valeur de statut_signature traduite | false
9936     */
9937     function get_trad_for_statut($value_to_trad){
9938     $statut_signature_tab = array(
9939     'waiting' => __('en préparation'),
9940     'in_progress' => __('en cours de signature'),
9941     'canceled' => __('signature annulée'),
9942 softime 10808 'expired' => __('délai de signature expiré'),
9943 softime 10573 'finished' => __('signé')
9944     );
9945     if (array_key_exists($value_to_trad, $statut_signature_tab) === true) {
9946     return $statut_signature_tab[$value_to_trad];
9947     }
9948    
9949     return false;
9950     }
9951    
9952     /**
9953     * Permet de mettre à jour le tableau json sotcké dans le champ historique_signature
9954     *
9955     * @return string (json) la valeur de historique_signature mis à jour | false
9956     */
9957     function get_updated_historique_signature($historique_signature_values) {
9958    
9959     $historique_signature_value_tab = $this->get_historique_signature_decoded();
9960    
9961     if ($historique_signature_value_tab === false) {
9962     $this->addToLog(__METHOD__."(): erreur historique signature", DEBUG_MODE);
9963     return false;
9964     }
9965    
9966     $last_val_historique_signature = array();
9967    
9968     // Si la tableau récupéré n'est pas vide alors
9969     // on récupère la dernière ligne du tableau
9970     if (empty($historique_signature_value_tab) === false) {
9971     $last_val_historique_signature = end($historique_signature_value_tab);
9972     }
9973    
9974     $format_date = '';
9975     $format_date_hour = '';
9976     $date_converted=array();
9977    
9978     $date_to_convert = array(
9979     'date_envoi_signature' => $historique_signature_values['date_envoi_signature'],
9980 softime 11876 'date_limite_instruction' => $this->compute_date_limite(0),
9981 softime 10573 'date_retour_signature' => $historique_signature_values['date_retour_signature']
9982     );
9983    
9984     // Conversion des dates en fonction de leur format
9985     foreach ($date_to_convert as $key => $value) {
9986     $date_converted[$key] = null;
9987     if ($value != null) {
9988     $format_date = 'd/m/Y';
9989     $format_date_hour = 'd/m/Y H:i:s';
9990     $date_converted[$key] = empty(date_parse($value)['hour']) === false ? date($format_date_hour, strtotime($value)) : date($format_date, strtotime($value));
9991     }
9992     }
9993    
9994     // Ce tableau permet de lister les colonnes de historique_signature et de les rendre traduisibles.
9995     // Il faut en effet mettre les gettext avec l'intitulé explicite au moins
9996     // une fois afin qu'il puisse être reconnu par le logiciel de traduction.
9997     $tab_for_columns_trad = array(
9998     __('entry_date'),
9999     __('id_parapheur_signature'),
10000     __('emetteur'),
10001     __('signataire'),
10002     __('date_envoi'),
10003     __('date_limite'),
10004     __('date_retour'),
10005     __('statut_signature'),
10006     __('commentaire_signature')
10007     );
10008    
10009     array_push($historique_signature_value_tab, array(
10010     'entry_date' => date('d/m/Y H:i:s'),
10011     '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'],
10012     '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'],
10013     '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'],
10014     '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'],
10015     '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'],
10016     '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'],
10017     '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']),
10018     'commentaire_signature' => isset($historique_signature_values['commentaire_signature']) === false || $historique_signature_values['commentaire_signature'] == null ? null : $historique_signature_values['commentaire_signature'],
10019     ));
10020    
10021     return json_encode($historique_signature_value_tab, JSON_HEX_APOS);
10022     }
10023 softime 11876
10024     /**
10025     * TREATMENT - annuler_envoi_en_signature
10026     *
10027     * Permet d'annuler l'envoi du document de l'instruction au parapheur pour signature
10028     *
10029     * @return boolean true si l'annulation a été effectué avec succès false sinon
10030     */
10031     function annuler_envoi_en_signature() {
10032     $this->begin_treatment(__METHOD__);
10033     $this->correct = true;
10034 softime 10573
10035 softime 11876 //Instanciation de la classe electronicsignature
10036     $inst_es = $this->get_electronicsignature_instance();
10037     if ($inst_es === false) {
10038     $this->correct = false;
10039     return $this->end_treatment(__METHOD__, false);
10040     }
10041 softime 10573
10042 softime 11876 $data = array();
10043     if (! empty($this->getVal('id_parapheur_signature'))) {
10044     $data['id_parapheur_signature'] = $this->getVal('id_parapheur_signature');
10045     } else {
10046     $this->correct = false;
10047     $this->addToMessage(__("Il n'y a pas d'identifiant de parapheur."));
10048     return $this->end_treatment(__METHOD__, false);
10049     }
10050    
10051     // Appel de la méthode de l'abstracteur cancel_send_for_signature()
10052     // Cette méthode doit retourner un tableau de valeur
10053     try {
10054     $result = $inst_es->cancel_send_for_signature($data);
10055     } catch (electronicsignature_exception $e) {
10056     $this->handle_electronicsignature_exception($e);
10057     return $this->end_treatment(__METHOD__, false);
10058     }
10059    
10060     // Après avoir reçu le résultat du parapheur, il faut mettre à jour les champs
10061     $valF = array();
10062    
10063     // Pour appeler la fonction modifier il faut traiter tous les champs de l'objet
10064     foreach($this->champs as $identifiant => $champ) {
10065     $valF[$champ] = $this->val[$identifiant];
10066     }
10067     // On fait ensuite nos modifications spécifiques
10068     $valF['id_parapheur_signature'] = null;
10069     $valF['statut_signature'] = $result['statut'];
10070     $valF['commentaire_signature'] = isset($result['commentaire_signature']) == true ? $result['commentaire_signature'] : null;
10071     $valF['date_envoi_signature'] = null;
10072     $valF['historique_signature'] = $this->get_updated_historique_signature($result);
10073    
10074     $ret = $this->modifier($valF);
10075    
10076     if ($ret === false) {
10077     $this->correct = false;
10078     $this->addToMessage(__("Une erreur est survenue lors de la mise à jour des champs."));
10079     // Termine le traitement
10080     return $this->end_treatment(__METHOD__, false);
10081     }
10082    
10083     // Message
10084     $this->addToMessage(__("L'annulation a été effectuée avec succès."));
10085    
10086     // Tout s'est bien passé, on termine le traitement
10087     return $this->end_treatment(__METHOD__, true);
10088     }
10089    
10090    
10091 softime 10573 /**
10092     * Récupère le contenu du champ historique_signature et le converti en tableau
10093     *
10094     * @return array sinon false en cas d'erreur
10095     */
10096     protected function get_historique_signature_decoded() {
10097 softime 11876 $val = str_replace("'", '"', $this->getVal('historique_signature'));
10098     if ($val === '' || $val == 'false') {
10099 softime 10573 $val = json_encode(array());
10100     }
10101     if($this->isJson($val) === false) {
10102     return false;
10103     }
10104     return json_decode($val, true);
10105     }
10106    
10107 softime 10808 /**
10108     * Récupère les informations à afficher dans le tableau de suivi à l'aide
10109     * d'une requête sql. Stocke ces informations dans un tableau.
10110 softime 12433 * Converti le tableau au format json et renvoi le json obtenu.
10111 softime 10808 *
10112 softime 12433 * Pour identifier quel suivi est affiché (notification des demandeurs, des services ou
10113     * de tiers) ce sont les tâches liées aux notifications qui sont utilisés.
10114     * La clause where de la requête est construite à partir du tableau contenant les types
10115     * de tâches fourni en paramètre.
10116     * Il est également possible d'afficher les notifications n'étant pas lié à des tâches.
10117     *
10118     * Si le suivi concerne la notification des demandeurs via le portail citoyen,
10119     * la date de premier accès ne sera pas affichée.
10120     *
10121     * @param array liste des tâches permettant d'identifier quelles notification afficher
10122     * @param boolean permet d'afficher les notifications non liées à des tâches
10123 softime 10808 * @return json
10124     */
10125 softime 15037 public function get_json_suivi_notification($typeTache, $nonLieTache = false) {
10126 softime 11585 $whereTypeTache = '';
10127 softime 15037 $sqlTaskNull = 'INNER';
10128 softime 12654
10129     // Liste des champs à afficher. Permet également la traduction des noms de colonnes.
10130     $listeChampsTrad = array(
10131     __('emetteur'),
10132     __('date_envoi'),
10133     __('destinataire'),
10134     __('date_premier_acces'),
10135     __('instruction'),
10136     __('annexes'),
10137     __('statut'),
10138     __('commentaire')
10139     );
10140     $listeChamps = array(
10141     'emetteur',
10142     'date_envoi',
10143     'destinataire',
10144     'date_premier_acces',
10145     'instruction',
10146     'annexes',
10147     'statut',
10148     'commentaire'
10149     );
10150    
10151 softime 12124 // Défini si on veux que la requête récupère également les notifications qui n'ont pas
10152     // de tâches associées. C'est le cas pour les notifications de demandeurs lorsque la
10153     // notification du demandeur principal n'a pas pu être envoyée à cause d'un mauvais
10154     // paramétrage
10155     if(is_bool($nonLieTache) && $nonLieTache === true) {
10156 softime 15037 $sqlTaskNull = 'LEFT';
10157 softime 12124 }
10158     // Prépare la clause where pour ne récupérer que les notifications liées à certain type de tâches
10159     // Permet de différencier les notifications des demandeurs de celle des services et de celles des
10160     // tiers consulté
10161 softime 12433 if (is_array($typeTache) && $typeTache != array()) {
10162 softime 11585 if (is_array($typeTache)) {
10163     $whereTypeTache = sprintf(
10164 softime 15835 'AND (task.task IS NULL OR (task.task IS NOT NULL AND task.type IN (%1$s)))',
10165 softime 15037 "'".implode("', '", $typeTache)."'"
10166 softime 11585 );
10167     }
10168 softime 12433 // La date de premier accès n'a pas besoin d'être renseigné pour
10169     // les notifications des demandeurs via le portail citoyen.
10170     // Les notifications des demandeurs sont liés à 3 types de tâches
10171     // notification_recepisse, notification_instruction, notification_decision
10172     // Si le suivi de la notification concerne un de ces types de tâches on
10173     // considère que c'est une notification de demandeurs.
10174     // Dans ce cas on vérifie si cette notification est paramétrée pour passer
10175     // via le portail. Par défaut si rien n'est paramétré on considère que la
10176     // notification est faite via le portail
10177     if ((in_array('notification_recepisse', $typeTache) ||
10178     in_array('notification_instruction', $typeTache) ||
10179     in_array('notification_decision', $typeTache))) {
10180     $dossier = $this->getVal('dossier');
10181     $collectivite_di = $this->get_dossier_instruction_om_collectivite($dossier);
10182     $modeNotification = $this->f->get_param_option_notification($collectivite_di);
10183 softime 14064 if ($modeNotification === PORTAL) {
10184 softime 12654 $listeChamps = array(
10185     'emetteur',
10186     'date_envoi',
10187     'destinataire',
10188     'instruction',
10189     'annexes',
10190     'statut',
10191     'commentaire'
10192     );
10193 softime 12433 }
10194     }
10195 softime 12654 // Il n'y a pas d'annexe pour la notification des communes donc pas besoin
10196     // de les afficher dans le suivi
10197     if (in_array('notification_depot_demat', $typeTache)) {
10198     $listeChamps = array(
10199     'emetteur',
10200     'date_envoi',
10201     'destinataire',
10202     'instruction',
10203     'statut',
10204     'commentaire'
10205     );
10206     }
10207 softime 11585 }
10208 softime 12433
10209 softime 10808 $valSuivi = array();
10210     // Récupération des infos nécessaires à l'affichage du tableau
10211     $sql = sprintf(
10212 softime 11585 'SELECT DISTINCT
10213 softime 10869 instruction_notification.instruction_notification,
10214 softime 12124 -- Affiche la mention automatique avec le nom de l emetteur si la notification a été envoyé automatiquement
10215 softime 10869 CASE WHEN instruction_notification.automatique = TRUE
10216     THEN TRIM(CONCAT(instruction_notification.emetteur, \' \', \'(automatique)\'))
10217     ELSE instruction_notification.emetteur
10218     END as emetteur,
10219 softime 10808 date_envoi,
10220     instruction_notification.destinataire,
10221 softime 10869 instruction_notification.date_premier_acces,
10222 softime 10808 evenement.libelle as instruction,
10223 softime 10869 instruction_notification.statut,
10224     instruction_notification.commentaire,
10225 softime 12433 annexes.instruction_annexe as annexes
10226 softime 10808 FROM
10227     %1$sinstruction_notification
10228     LEFT JOIN %1$sinstruction
10229     ON instruction.instruction = instruction_notification.instruction
10230     LEFT JOIN %1$sevenement
10231     ON instruction.evenement = evenement.evenement
10232 softime 10869 LEFT JOIN %1$sinstruction_notification_document
10233     ON instruction_notification.instruction_notification = instruction_notification_document.instruction_notification
10234     AND instruction_notification_document.annexe = true
10235 softime 12124 -- Récupère les tâches liées au notification pour pouvoir par la suite identifier le type de notification
10236 softime 15037 %4$s JOIN %1$stask
10237 softime 11585 ON instruction_notification.instruction_notification::CHARACTER VARYING = task.object_id
10238 softime 15835 AND task.type LIKE \'notification%%\'
10239 softime 12124 -- Récupération de la liste des annexes sous la forme d une liste
10240 softime 11585 LEFT JOIN (
10241     SELECT
10242     instruction_notification,
10243 softime 12124 -- Récupère la liste des annexes de la notification
10244 softime 12433 -- sous la forme d un json pour récupérer toutes les informatiosn nécessaire
10245     -- à l affichage du lien vers les annexes
10246     CONCAT(
10247     \'[\',
10248     STRING_AGG(
10249     -- Affiche le nom du fichier selon le type de document/pièce
10250     CASE
10251     WHEN instruction_notification_document.document_type = \'instruction\'
10252     THEN CONCAT(
10253     \'{
10254     "obj" : "instruction",
10255     "champs" : "om_fichier_instruction",
10256     "label" : "\', evenement.libelle, \'",
10257     "id" : "\', instruction.instruction,\'"
10258     }\'
10259     )
10260     WHEN instruction_notification_document.document_type = \'consultation\'
10261     THEN CONCAT(
10262 softime 15218 \'{
10263     "obj" : "consultation",
10264     "champs" : "fichier",
10265     "label" : "\', CONCAT_WS( \' - \', \'Avis\', service.libelle, to_char(consultation.date_retour,\'DD/MM/YYYY\')), \'",
10266     "id" : "\', consultation.consultation, \'"
10267     }\'
10268 softime 12433 )
10269     ELSE
10270     CONCAT(
10271     \'{
10272     "obj" : "document_numerise",
10273     "champs" : "uid",
10274     "label" : "\', document_numerise.nom_fichier, \' - \', document_numerise_type.libelle, \'",
10275     "id" : "\', document_numerise.document_numerise,\'"
10276     }\'
10277     )
10278     END,
10279     \', \'),
10280     \']\'
10281 softime 11585 ) AS instruction_annexe
10282     FROM
10283     %1$sinstruction_notification_document
10284     LEFT JOIN %1$sinstruction
10285     ON instruction_notification_document.instruction = instruction.instruction
10286     LEFT JOIN %1$sevenement
10287     ON instruction.evenement = evenement.evenement
10288     LEFT JOIN %1$sconsultation
10289     ON instruction_notification_document.document_id = consultation.consultation
10290     LEFT JOIN %1$sservice
10291     ON consultation.service = service.service
10292 softime 12433 LEFT JOIN %1$sdocument_numerise
10293     ON instruction_notification_document.document_id = document_numerise.document_numerise
10294     LEFT JOIN %1$sdocument_numerise_type
10295     ON document_numerise.document_numerise_type = document_numerise_type.document_numerise_type
10296 softime 11585 WHERE
10297     instruction_notification_document.annexe = \'t\'
10298     GROUP BY
10299     instruction_notification
10300     ) AS annexes
10301     ON
10302     annexes.instruction_notification = instruction_notification.instruction_notification
10303 softime 10808 WHERE
10304 softime 10869 instruction.instruction = %2$s
10305 softime 15835 %3$s
10306 softime 10869 ORDER BY
10307     date_envoi ASC, instruction_notification.destinataire ASC',
10308 softime 10808 DB_PREFIXE,
10309 softime 14542 intval($this->getVal('instruction')),
10310 softime 15037 $whereTypeTache,
10311     $sqlTaskNull
10312 softime 10808 );
10313 softime 14542 $qres = $this->f->get_all_results_from_db_query($sql, array(
10314     "origin" => __METHOD__
10315     )
10316     );
10317 softime 12433 // Préparation du lien de téléchargement des annexes
10318     $htmlList =
10319     '<style>
10320     #content .gridjs-td a.lien_annexe {
10321     text-decoration : underline dotted 1px;
10322     }
10323     #content a.lien_annexe:hover {
10324     text-decoration : underline solid 1px;
10325     color : #46aede;
10326     }
10327     ol {padding-left : 10px;}
10328     </style>
10329     <ol>%1$s</ol>';
10330     $lienTelechargement =
10331     '<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">
10332     Annexe
10333     </a>';
10334 softime 10808 // Stockage des infos de chaque notification dans un tableau
10335 softime 14542 foreach ($qres['result'] as $row) {
10336 softime 10808 $valNotif = array();
10337     foreach($listeChamps as $champ) {
10338     $valNotif[$champ] = $row[$champ];
10339 softime 10815 if (($champ === 'date_envoi'
10340     || $champ === 'date_premier_acces')
10341     && $row[$champ] !== null
10342     && $row[$champ] !== '') {
10343 softime 10814 //
10344     $valNotif[$champ] = date('d/m/Y H:i:s', strtotime($row[$champ]));
10345 softime 12433 } else if ($champ === 'annexes') {
10346     $listeAnnexe = '';
10347     $infoAnnexes = json_decode($row[$champ], true);
10348     if (! empty($infoAnnexes) && json_last_error() === JSON_ERROR_NONE) {
10349     // A partir des infos récupérées prépare le code html du lien vers chacune
10350     // des annexes et ajoute un élément de liste par annexe
10351     foreach($infoAnnexes as $annexe) {
10352     $listeAnnexe .= sprintf(
10353     '<li>%s</li>',
10354     sprintf($lienTelechargement,
10355     $annexe['obj'],
10356     $annexe['champs'],
10357     $annexe['id'],
10358     $annexe['label']
10359     )
10360     );
10361     }
10362     // Construction de la liste des annexes
10363     $valNotif[$champ] = sprintf(
10364     $htmlList,
10365     $listeAnnexe
10366     );
10367     }
10368 softime 10814 }
10369 softime 10808 }
10370     array_push($valSuivi, $valNotif);
10371     }
10372    
10373     // Passage du tableau au format json
10374     return json_encode($valSuivi, JSON_HEX_APOS);
10375     }
10376    
10377 softime 10573 /**
10378     * Traitement des erreurs retournées par l'abstracteur electronicsignature.
10379     *
10380     * @param electronicsignature_exception $exception Exception retournée par l'abstracteur.
10381     *
10382     * @return void
10383     */
10384     public function handle_electronicsignature_exception(electronicsignature_exception $exception) {
10385     $this->f->displayMessage('error', $exception->getMessage());
10386     }
10387    
10388    
10389     /**
10390     * Retourne une instance du connecteur electronicsignature, et la créer si elle n'existe pas.
10391     *
10392     * @param boolean $with_handle_error Flag pour afficher ou non le message d'erreur à l'utilisateur.
10393     * @return electronicsignature Instance de l'abstracteur.
10394     */
10395     public function get_electronicsignature_instance($with_handle_error = true) {
10396     if(isset($this->electronicsignature_instance)) {
10397     return $this->electronicsignature_instance;
10398     }
10399     // Instanciation du connecteur electronicsignature
10400     try {
10401     require_once "electronicsignature.class.php";
10402     $collectivites = array("collectivite_idx" => $this->get_dossier_instruction_om_collectivite(), "collectivite_multi_idx" => $this->f->get_idx_collectivite_multi());
10403     $this->electronicsignature_instance = new electronicsignature($collectivites);
10404     } catch (electronicsignature_exception $e) {
10405     if ($with_handle_error === true) {
10406     $this->handle_electronicsignature_exception($e);
10407     }
10408     return false;
10409     }
10410     return $this->electronicsignature_instance;
10411     }
10412    
10413     /**
10414 softime 11418 * TREATMENT - envoyer_au_controle_de_legalite
10415     *
10416     * Ajoute la tâche envoi_CL.
10417     * C'est le traitement de la tâche qui mettra à jour la date d'envoi au contrôle de légalité.
10418     *
10419     * @return [type] [description]
10420     */
10421     function envoyer_au_controle_de_legalite() {
10422     $this->begin_treatment(__METHOD__);
10423     $this->correct = true;
10424    
10425     //
10426     if ($this->can_be_sended_to_cl() === true) {
10427     // Création de la task 'envoi_CL'
10428     $inst_task = $this->f->get_inst__om_dbform(array(
10429     "obj" => "task",
10430     "idx" => 0,
10431     ));
10432     $task_val = array(
10433     'type' => 'envoi_CL',
10434     'object_id' => $this->getVal('instruction'),
10435     'dossier' => $this->getVal('dossier'),
10436     );
10437     // Change l'état de la tâche de notification en fonction de l'état de
10438     // transmission du dossier d'instruction
10439     $inst_di = $this->get_inst_dossier($this->getVal('dossier'));
10440     if ($this->f->is_option_mode_service_consulte_enabled() === false
10441     && ($inst_di->getVal('etat_transmission_platau') == 'non_transmissible'
10442     || $inst_di->getVal('etat_transmission_platau') == 'transmis_mais_non_transmissible')) {
10443     //
10444     $task_val['state'] = $inst_task::STATUS_DRAFT;
10445     }
10446     $add_task = $inst_task->add_task(array('val' => $task_val));
10447     if ($add_task === false) {
10448     $this->addToMessage(sprintf('%s %s',
10449     __("Une erreur s'est produite lors de la création tâche."),
10450     __("Veuillez contacter votre administrateur.")
10451     ));
10452     $this->correct = false;
10453     return $this->end_treatment(__METHOD__, false);
10454     }
10455     // Mise à jour du champs 'envoye_cl_platau'
10456     $instr_val = array(
10457     'envoye_cl_platau' => 't',
10458     );
10459     $res = $this->f->db->autoExecute(
10460     DB_PREFIXE.$this->table,
10461     $instr_val,
10462     DB_AUTOQUERY_UPDATE,
10463     $this->getCle($this->getVal($this->clePrimaire))
10464     );
10465 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);
10466 softime 11418 if ($this->f->isDatabaseError($res, true) === true) {
10467     $this->addToMessage(sprintf('%s %s',
10468     __("Une erreur s'est produite lors de la mise à jour de l'instruction."),
10469     __("Veuillez contacter votre administrateur.")
10470     ));
10471     $this->correct = false;
10472     return $this->end_treatment(__METHOD__, false);
10473     }
10474     // Message de validation à l'utilisateur
10475     $this->addToMessage(__('Votre demande de transfert au contrôle de légalité à bien été prise en compte.'));
10476     $this->addToMessage(__("La date d'envoi au contrôle de légalité sera mise à jour ultérieurement."));
10477     }
10478     //
10479     return $this->end_treatment(__METHOD__, true);
10480     }
10481    
10482    
10483     /**
10484 softime 8593 * Retourne le lien de retour (VIEW formulaire et VIEW sousformulaire).
10485     *
10486     * @param string $view Appel dans le contexte de la vue 'formulaire' ou de
10487     * la vue 'sousformulaire'.
10488     *
10489     * @return string
10490     */
10491     function get_back_link($view = "formulaire") {
10492     //
10493     $href = parent::get_back_link($view);
10494     //
10495     $crud = $this->get_action_crud();
10496 mbroquet 3730
10497 softime 8593 // Redirection vers le formulaire de modification à la validation du
10498     // formulaire d'ajout si l'événement associé possède une lettre type
10499     if (($crud === 'create'
10500     || ($crud === null
10501     && $this->getParameter('maj') == 0))
10502     && $this->correct == true
10503     && $this->evenement_has_an_edition($this->valF['evenement']) === true) {
10504 softime 7996
10505 softime 8593 // On instancie l'instruction
10506     $inst_instruction = $this->f->get_inst__om_dbform(array(
10507     "obj" => "instruction",
10508     "idx" => $this->valF[$this->clePrimaire],
10509     ));
10510    
10511     // Si l'instruction n'est pas finalisée automatiquement
10512     if ($inst_instruction->getVal('om_final_instruction') !== 't') {
10513     $href = str_replace("&action=3", "&action=1", $href);
10514     //
10515     if (strpos($href, "&retour=tab") !== false) {
10516     $href = str_replace("&retour=tab", "&retour= form", $href);
10517     } else {
10518     $href .= "&retour=form";
10519     }
10520     }
10521     }
10522    
10523     //
10524     return $href;
10525     }
10526    
10527 softime 10573 public function view_json_data() {
10528     $this->checkAccessibility();
10529     $this->f->disableLog();
10530     $view = $this->get_json_data();
10531     printf(json_encode($view));
10532     }
10533    
10534     public function get_json_data() {
10535     $val = array_combine($this->champs, $this->val);
10536     foreach ($val as $key => $value) {
10537     $val[$key] = strip_tags($value);
10538     }
10539     $val['tacite'] = 'f';
10540     $inst_ad = $this->f->get_inst__om_dbform(array(
10541     "obj" => "avis_decision",
10542     "idx" => $val['avis_decision'],
10543     ));
10544     if (preg_match('/[tT]acite/', $inst_ad->getVal('libelle')) === 1) {
10545     $val['tacite'] = 't';
10546     }
10547     return $val;
10548     }
10549    
10550 softime 13528 /**
10551     * Permet de récupérer l'identifiant de l'instruction sur le dossier, ayant
10552     * comme événement lié le suivant définit dans l'événement de l'instruction
10553     * instanciée.
10554     *
10555     * @param string $next_type Correspond aux trois déclenchement automatique
10556     * de création d'instruction paramétré sur un événement.
10557     * @param integer $instruction Identifiant de l'instruction à instancier.
10558     * @return mixed Identifiant de l'instruction recherchée ou false.
10559     */
10560 softime 11418 public function get_related_instructions_next($next_type = 'retour_signature', $instruction = null) {
10561     if (in_array($next_type, array('retour_signature', 'retour_ar', 'suivant_tacite', )) === false) {
10562     return false;
10563     }
10564     $result = array();
10565     $evenements = array();
10566     if ($instruction === null) {
10567     $instruction = $this->getVal($this->clePrimaire);
10568     $evenement = $this->getVal('evenement');
10569     $dossier = $this->getVal('dossier');
10570     } else {
10571     $inst = $this->f->get_inst__om_dbform(array(
10572     "obj" => "instruction",
10573     "idx" => $instruction,
10574     ));
10575     $evenement = $inst->getVal('evenement');
10576     $dossier = $inst->getVal('dossier');
10577     }
10578 softime 13528 // Récupération de l'identifiant de l'événement paramétré comme suivant
10579     // sur l'instruction instanciée
10580 softime 13137 $qres = $this->f->get_one_result_from_db_query(
10581     sprintf(
10582     'SELECT
10583     evenement_%3$s
10584     FROM
10585     %1$sevenement
10586     WHERE
10587     evenement = %2$s',
10588     DB_PREFIXE,
10589     intval($evenement),
10590     $next_type
10591     ),
10592     array(
10593     "origin" => __METHOD__,
10594     "force_return" => true,
10595     )
10596 softime 11418 );
10597 softime 13137 if ($qres["code"] !== "OK") {
10598 softime 11418 return false;
10599     }
10600 softime 13137 $ev_next = $qres["result"];
10601 softime 13528 // Récupération de l'instruction dans le dossier utilisant l'événement
10602     // suivant identifié dans la requête précédente
10603     $qres = $this->f->get_one_result_from_db_query(
10604 softime 13137 sprintf(
10605     'SELECT
10606     MAX(instruction.instruction) as instruction
10607     FROM
10608     %1$sinstruction
10609     WHERE
10610     dossier = \'%3$s\'
10611     AND evenement = %2$s',
10612     DB_PREFIXE,
10613     intval($ev_next),
10614 softime 14064 $this->f->db->escapeSimple($dossier)
10615 softime 13137 ),
10616     array(
10617     "origin" => __METHOD__,
10618     "force_return" => true,
10619     )
10620 softime 11418 );
10621 softime 13137 if ($qres["code"] !== "OK") {
10622 softime 11418 return false;
10623     }
10624 softime 13137 return $qres["result"];
10625 softime 11418 }
10626    
10627 softime 10573 public function get_related_instructions($instruction = null) {
10628     $result = array();
10629     $evenements = array();
10630     if ($instruction === null) {
10631     $instruction = $this->getVal($this->clePrimaire);
10632     $evenement = $this->getVal('evenement');
10633     $dossier = $this->getVal('dossier');
10634     } else {
10635     $inst = $this->f->get_inst__om_dbform(array(
10636     "obj" => "instruction",
10637     "idx" => $instruction,
10638     ));
10639     $evenement = $inst->getVal('evenement');
10640     $dossier = $inst->getVal('dossier');
10641     }
10642     //
10643 softime 13137 $qres = $this->f->get_one_result_from_db_query(
10644     sprintf(
10645     'SELECT
10646     evenement
10647     FROM
10648     %1$sevenement
10649     WHERE
10650     evenement_retour_ar = %2$s
10651     OR evenement_retour_signature = %2$s',
10652     DB_PREFIXE,
10653     intval($evenement)
10654     ),
10655     array(
10656     "origin" => __METHOD__,
10657     "force_return" => true,
10658     )
10659 softime 10573 );
10660 softime 13137 if ($qres["code"] !== "OK") {
10661 softime 10573 return false;
10662     }
10663 softime 13137 $ev_parent = $qres["result"];
10664 softime 10573 //
10665 softime 13137 $qres = $this->f->get_one_result_from_db_query(
10666     sprintf(
10667     'SELECT
10668     MAX(instruction.instruction) as instruction
10669     FROM
10670     %1$sinstruction
10671     WHERE
10672     dossier = \'%3$s\'
10673     AND evenement = %2$s',
10674     DB_PREFIXE,
10675     intval($ev_parent),
10676     $this->f->db->escapeSimple($dossier)
10677     ),
10678     array(
10679     "origin" => __METHOD__,
10680     "force_return" => true,
10681     )
10682 softime 10573 );
10683 softime 13137 if ($qres["code"] !== "OK") {
10684 softime 10573 return false;
10685     }
10686 softime 13137 $result[] = $qres["result"];
10687 softime 10573 //
10688 softime 13137 $qres = $this->f->get_one_result_from_db_query(
10689     sprintf(
10690     'SELECT
10691     evenement_retour_ar
10692     FROM
10693     %1$sevenement
10694     WHERE
10695 softime 14542 evenement = %2$d
10696     AND evenement_retour_ar != %3$d',
10697 softime 13137 DB_PREFIXE,
10698     intval($ev_parent),
10699     intval($evenement)
10700     ),
10701     array(
10702     "origin" => __METHOD__,
10703     "force_return" => true,
10704     )
10705 softime 10573 );
10706 softime 13137 if ($qres["code"] !== "OK") {
10707 softime 10573 return false;
10708     }
10709 softime 13137 $evenements[] = $qres["result"];
10710 softime 10573 //
10711 softime 13137 $qres = $this->f->get_one_result_from_db_query(
10712     sprintf(
10713     'SELECT
10714     evenement_retour_signature
10715     FROM
10716     %1$sevenement
10717     WHERE
10718     evenement = %2$s
10719     AND evenement_retour_signature != %3$s
10720     ',
10721     DB_PREFIXE,
10722     intval($ev_parent),
10723     intval($evenement)
10724     ),
10725     array(
10726     "origin" => __METHOD__,
10727     "force_return" => true,
10728     )
10729 softime 10573 );
10730 softime 13137 if ($qres["code"] !== "OK") {
10731 softime 10573 return false;
10732     }
10733 softime 13137 $evenements[] = $qres["result"];
10734 softime 10573 foreach ($evenements as $value) {
10735     if ($value !== null) {
10736 softime 13137 $qres = $this->f->get_one_result_from_db_query(
10737     sprintf(
10738     'SELECT
10739     MAX(instruction.instruction) as instruction
10740     FROM
10741     %1$sinstruction
10742     WHERE
10743     dossier = \'%3$s\'
10744     AND evenement = %2$s',
10745     DB_PREFIXE,
10746     intval($value),
10747     $this->f->db->escapeSimple($dossier)
10748     ),
10749     array(
10750     "origin" => __METHOD__,
10751     "force_return" => true,
10752     )
10753 softime 10573 );
10754 softime 13137 if ($qres["code"] !== "OK") {
10755 softime 10573 return false;
10756     }
10757 softime 13137 $result[] = $qres["result"];
10758 softime 10573 }
10759     }
10760     return $result;
10761     }
10762    
10763     protected function getDocumentType($champ = null) {
10764     $evenementId = $this->getVal('evenement');
10765     if (! empty($evenementId)) {
10766     $evenement = $this->f->findObjectById('evenement', $evenementId);
10767     if (! empty($evenement)) {
10768     return __("Instruction").':'.$evenement->getVal('libelle');
10769     }
10770     }
10771     return parent::getDocumentType();
10772     }
10773    
10774 softime 10808 /**
10775     * Récupère à l'aide d'une requête sql la liste des demandeurs
10776     * pouvant être notifié. C'est à dire les demandeurs acceptant
10777     * les notifications et pour lesquels une adresse mail existe.
10778     *
10779     * Dans le cas, d'une notification pour le portail citoyen, seul
10780     * le pétitionnaire principal doit être notifier et uniquement si
10781     * il a une adress mail et qu'il accepte les notifications.
10782     *
10783     * @param string identifiant du dossier
10784     * @param boolean true si il faut récupérer la liste des demandeurs notifiable
10785     * pour une notification de categorie portail
10786     * @return array liste des demandeurs pouvant être notifié
10787     */
10788     protected function get_demandeurs_notifiable($idDossier = null, $portail = false) {
10789     if ($idDossier === null) {
10790     $idDossier = $this->getVal('dossier');
10791     }
10792     // Ajoute une condition sur le where pour ne récupérer que le pétitionnaire principal
10793     // pour une notification depuis le portail citoyen
10794     $sqlPetitionnairePrincipal = '';
10795 softime 12124 // Gestion des champs nécessaires pour la notification d'un demandeur
10796     $condition_demandeur = "AND demandeur.notification = 't'
10797     AND demandeur.courriel IS NOT NULL";
10798 softime 10808 if ($portail === true) {
10799     $sqlPetitionnairePrincipal = 'AND lien_dossier_demandeur.petitionnaire_principal = true';
10800 softime 12124 $condition_demandeur = "AND (
10801     (notification = 't' AND courriel IS NOT NULL)
10802     OR demande.source_depot = 'portal'
10803     )";
10804 softime 10808 }
10805    
10806     $listeDemandeursNotifiable = array();
10807    
10808     // Requête de récupération des demandeurs
10809 softime 14542 $qres = $this->f->get_all_results_from_db_query(
10810     sprintf(
10811     'SELECT
10812     demandeur.demandeur,
10813     CASE
10814     WHEN demandeur.qualite=\'particulier\'
10815     THEN TRIM(CONCAT(demandeur.particulier_nom, \' \', demandeur.particulier_prenom, \' \', demandeur.courriel))
10816     ELSE
10817     TRIM(CONCAT(demandeur.personne_morale_raison_sociale, \' \', demandeur.personne_morale_denomination, \' \', demandeur.courriel))
10818     END AS destinataire,
10819     demandeur.courriel,
10820     petitionnaire_principal
10821     FROM
10822     %1$sdossier
10823     INNER JOIN %1$slien_dossier_demandeur
10824     ON dossier.dossier = lien_dossier_demandeur.dossier
10825     INNER JOIN %1$sdemandeur
10826     ON lien_dossier_demandeur.demandeur = demandeur.demandeur
10827     -- Récupération de la plus ancienne demande associée au dossier (la demande
10828     -- de création du dossier)
10829     INNER JOIN (
10830     SELECT
10831     demande,
10832     dossier_instruction,
10833     source_depot
10834     FROM
10835     %1$sdemande
10836     WHERE
10837     dossier_instruction = \'%2$s\'
10838     ORDER BY
10839     demande ASC
10840     LIMIT 1
10841     ) as demande
10842     ON dossier.dossier = demande.dossier_instruction
10843     WHERE
10844     dossier.dossier = \'%2$s\'
10845     %3$s
10846     %4$s',
10847     DB_PREFIXE,
10848     $this->f->db->escapeSimple($idDossier),
10849     $condition_demandeur,
10850     $sqlPetitionnairePrincipal
10851     ),
10852     array(
10853     "origin" => __METHOD__
10854     )
10855 softime 10808 );
10856     // Récupération des infos des demandeurs et stockage dans un tableau
10857     // ayant pour clé les id des demandeurs
10858 softime 14542 foreach ($qres['result'] as $row) {
10859 softime 10869 $listeDemandeursNotifiable[$row['demandeur']] = $row;
10860 softime 10808 }
10861    
10862     return $listeDemandeursNotifiable;
10863     }
10864    
10865     /**
10866     * Renvoie la liste des notifications liées à l'instruction
10867     *
10868     * @param integer id de l'instruction dont on cherche les notifications
10869     * @return array liste des instruction_notification liés à l'instruction
10870     */
10871 softime 12124 public function get_instruction_notification($id_instruction, $typeNotification = null, $nonLieTache = false) {
10872 softime 11585 $whereTypeTache = '';
10873 softime 15037 $sqlTaskNull = 'INNER';
10874 softime 12124 // Défini si on veux que la requête récupère également les notifications qui n'ont pas
10875     // de tâches associées. C'est le cas pour les notifications de demandeurs lorsque la
10876     // notification du demandeur principal n'a pas pu être envoyée à cause d'un mauvais
10877     // paramétrage
10878     if(is_bool($nonLieTache) && $nonLieTache === true) {
10879 softime 15037 $sqlTaskNull = 'LEFT';
10880 softime 12124 }
10881 softime 11585 if ($typeNotification != null) {
10882     if (is_array($typeNotification)) {
10883     $whereTypeTache = sprintf(
10884 softime 15037 'AND (task.type IN (%1$s))',
10885     "'".implode("', '", $typeNotification)."'"
10886 softime 11585 );
10887     } else {
10888     $whereTypeTache = sprintf(
10889 softime 15037 'AND (task.type = \'%1$s\')',
10890     $typeNotification
10891 softime 11585 );
10892     }
10893     }
10894 softime 10808 $listeInstrNotif = array();
10895 softime 14542 $qres = $this->f->get_all_results_from_db_query(
10896     sprintf('
10897     SELECT
10898     instruction_notification.instruction_notification
10899     FROM
10900     %1$sinstruction_notification
10901 softime 15037 %4$s JOIN %1$stask
10902 softime 14542 ON instruction_notification.instruction_notification::CHARACTER VARYING = task.object_id
10903 softime 15037 %3$s
10904 softime 14542 WHERE
10905 softime 15037 instruction = %2$s',
10906 softime 14542 DB_PREFIXE,
10907     intval($id_instruction),
10908 softime 15037 $whereTypeTache,
10909     $sqlTaskNull
10910 softime 14542 ),
10911     array(
10912     "origin" => __METHOD__
10913     )
10914 softime 10808 );
10915 softime 14542 foreach ($qres['result'] as $row) {
10916 softime 10808 $listeInstrNotif[] = $row['instruction_notification'];
10917     }
10918     return $listeInstrNotif;
10919     }
10920    
10921     /**
10922     * Crée une clé d'accès unique permettant à un utilisateur
10923     * anonyme de récupérer le document.
10924     *
10925     * @return string clé d'accès du document
10926     */
10927     protected function getCleAccesDocument() {
10928 softime 10869 // Initialisation d'un tableau
10929     $number_list = array();
10930    
10931     // Génération aléatoire d'un nombre sur 4 caractères, 4 fois
10932     for ($i = 0; $i < 4; $i++) {
10933     $number_list[] = str_pad(mt_rand(0, 9999), 4, 0, STR_PAD_LEFT);
10934     }
10935    
10936     // Transformation en chaîne tout en séparant les nombres par un "-"
10937     $result = implode('-', $number_list);
10938    
10939     // Vérifie si la clé existe déjà et si c'est le cas génére une nouvelle clé
10940     if ($this->getUidDocumentInstructionWithKey($result) != null) {
10941     return $this->getCleAccesDocument();
10942     }
10943    
10944     //
10945     return $result;
10946 softime 10808 }
10947    
10948     /**
10949 softime 10869 * Récupère une clé et renvoie l'uid du document liée à cette
10950     * clé. Si la clé n'existe pas renvoie null.
10951     *
10952     * @param string $cleGen clé dont on cherche l'instruction
10953     * @return integer|null
10954     */
10955     protected function getUidDocumentInstructionWithKey($cleGen) {
10956 softime 14064 $qres = $this->f->get_one_result_from_db_query(
10957     sprintf(
10958     'SELECT
10959     instruction.om_fichier_instruction
10960     FROM
10961     %1$sinstruction_notification_document
10962     LEFT JOIN %1$sinstruction
10963     ON instruction_notification_document.instruction = instruction.instruction
10964     WHERE
10965     instruction_notification_document.cle = \'%2$s\'',
10966     DB_PREFIXE,
10967     $this->f->db->escapeSimple($cleGen)
10968     ),
10969     array(
10970     "origin" => __METHOD__,
10971     )
10972 softime 10869 );
10973 softime 14064
10974     return $qres['result'];
10975 softime 10869 }
10976    
10977     /**
10978     * Récupère une clé, fait une requête pour récupérer l'id de la notification liée a cette clé.
10979     * Récupère l'instance de instruction_notification dont l'id a été récupéré et la renvoie.
10980     *
10981     * @param string $cleGen
10982     * @return instruction_notification
10983     */
10984     protected function getInstanceNotificationWithKey($key) {
10985 softime 14064 $qres = $this->f->get_one_result_from_db_query(
10986     sprintf(
10987     'SELECT
10988     instruction_notification
10989     FROM
10990     %1$sinstruction_notification_document
10991     WHERE
10992     cle = \'%2$s\'',
10993     DB_PREFIXE,
10994     $this->f->db->escapeSimple($key)
10995     ),
10996     array(
10997     "origin" => __METHOD__,
10998     )
10999 softime 10869 );
11000    
11001     // Récupération de l'instance de notification
11002     $instNotif = $this->f->get_inst__om_dbform(array(
11003     "obj" => "instruction_notification",
11004 softime 14064 "idx" => $qres['result'],
11005 softime 10869 ));
11006     return $instNotif;
11007     }
11008    
11009    
11010     /**
11011 softime 10808 * Affiche la page de téléchargement du document de la notification.
11012     *
11013     * @param boolean $content_only Affiche le contenu seulement.
11014     *
11015     * @return void
11016     */
11017 softime 10869 public function view_telecharger_document_anonym() {
11018 softime 10808 // Par défaut on considère qu'on va afficher le formulaire
11019     $idx = 0;
11020     // Flag d'erreur
11021     $error = false;
11022     // Message d'erreur
11023     $message = '';
11024    
11025 softime 10869 // Paramètres GET : récupération de la clé d'accès
11026     $cle_acces_document = $this->f->get_submitted_get_value('key');
11027 softime 10808 $cle_acces_document = $this->f->db->escapeSimple($cle_acces_document);
11028 softime 10869 // Vérification de l'existence de la clé et récupération de l'uid du fichier
11029     $uidFichier = $this->getUidDocumentInstructionWithKey($cle_acces_document);
11030     if ($uidFichier != null) {
11031     // Récupération du document
11032     $file = $this->f->storage->get($uidFichier);
11033 softime 10808
11034 softime 10869 // Headers
11035     header("Cache-Control: no-cache, must-revalidate"); // HTTP/1.1
11036     header("Expires: Sat, 26 Jul 1997 05:00:00 GMT"); // Date dans le passé
11037     header("Content-Type: ".$file['metadata']['mimetype']);
11038     header("Accept-Ranges: bytes");
11039     header("Content-Disposition: inline; filename=\"".$file['metadata']['filename']."\";" );
11040     // Affichage du document
11041     echo $file['file_content'];
11042 softime 10808
11043 softime 10869 // Récupération de la date de premier accès et maj du suivi uniquement
11044     // si la date de 1er accès n'a pas encore été remplis
11045     $inst_notif = $this->getInstanceNotificationWithKey($cle_acces_document);
11046     if ($inst_notif->getVal('date_premier_acces') == null ||
11047     $inst_notif->getVal('date_premier_acces') == '') {
11048     $notif_val = array();
11049     foreach ($inst_notif->champs as $champ) {
11050     $notif_val[$champ] = $inst_notif->getVal($champ);
11051     }
11052     $notif_val['date_premier_acces'] = date("d/m/Y H:i:s");
11053     $notif_val['statut'] = 'vu';
11054     $notif_val['commentaire'] = 'Le document a été vu';
11055     $suivi_notif = $inst_notif->modifier($notif_val);
11056 softime 10808 }
11057    
11058     } else {
11059 softime 10869 // Page vide 404
11060     printf('Ressource inexistante');
11061     header('HTTP/1.0 404 Not Found');
11062 softime 10808 }
11063     }
11064    
11065 softime 11228 /**
11066     * Récupère le titre du document envoyé au parapheur
11067     */
11068 softime 10808 protected function getDocumentTitre($champ = null) {
11069     $title = $this->getTitle();
11070     $dossier = $this->getDossier();
11071     return $dossier.' '.$title;
11072     }
11073    
11074 softime 10869 /**
11075 softime 11228 * Compose le nom du document à transmettre au parapheur.
11076     * Le nom ets composé de cette manière :
11077     * instruction_xxx_libelle_de_la_lettre_type_associee
11078     * ou xxx correspond au numéro de l'instruction
11079     */
11080     protected function getDocumentLibelle() {
11081     // Récupère le champ instruction
11082     $instruction = $this->getVal("instruction");
11083    
11084     // Requête sql servant à récupérer le titre du document
11085     // TO_CHAR() introduit un espace avant l'affichage du nombre
11086     // comme les espaces sont remplacé par des '_' dans le retour de la fonction
11087     // il n'est pas nécessaire de mettre un '_' après le mot instruction.
11088 softime 14064 $documentLibelle = $this->f->get_one_result_from_db_query(
11089     sprintf(
11090     'SELECT
11091     CONCAT(
11092     \'instruction\',
11093     TO_CHAR(instruction.instruction, \'000\'),
11094     \'_\',
11095     LOWER(om_lettretype.libelle)
11096     ) AS nom_fichier
11097     FROM
11098     %1$sinstruction
11099     LEFT JOIN %1$som_lettretype
11100     ON om_lettretype.id = instruction.lettretype
11101     WHERE
11102     instruction = %2$d',
11103     DB_PREFIXE,
11104     intval($instruction)
11105     ),
11106     array(
11107     "origin" => __METHOD__,
11108     )
11109 softime 11228 );
11110    
11111 softime 14064 $documentLibelle = $documentLibelle['result'];
11112    
11113 softime 11228 // Transforamtion des ' ' en '_', des accents en lettres sans accents et des
11114     // caractères spéciaux en '_'
11115     // La méthode normalize_string est utilisé pour gérer les accents
11116     $documentLibelle = $this->f->normalize_string($documentLibelle);
11117     // TODO : comparer cette liste et celle de la méthode normalize_string
11118     // pour éviter les doublons + vérifier qu'il n'y a pas de doublons dans cette
11119     // liste
11120     $invalid = array('Œ'=>'oe', 'œ'=>'oe', 'Ÿ'=>'y', 'ü'=>'u',
11121     '¢' => '_', 'ß' => '_', '¥' => '_', '£' => '_', '™' => '_', '©' => '_',
11122     '®' => '_', 'ª' => '_', '×' => '_', '÷' => '_', '±' => '_', '²' => '_',
11123     '³' => '_', '¼' => '_', '½' => '_', '¾' => '_', 'µ' => '_', '¿' => '_',
11124     '¶' => '_', '·' => '_', '¸' => '_', 'º' => '_', '°' => '_', '¯' => '_',
11125     '§' => '_', '…' => '_', '¤' => '_', '¦' => '_', '≠' => '_', '¬' => '_',
11126     'ˆ' => '_', '¨' => '_', '‰' => '_', '¤' => '_', '€' => '_', '$' => '_',
11127     '«' => '_', '»' => '_', '‹' => '_', '›' => '_', 'ƒ' => '_', '¥' => '_',
11128     '‘‘' => '_', '‚' => '_', '!' => '_', '¡' => '_', '¢' => '_', '£' => '_',
11129     '?' => '_', '[' => '_', ']' => '_', '´' => '_', '`' => '_', '^' => '_',
11130     '~' => '_', '˜' => '_', '#' => '_', '*' => '_', '.' => '_', ':' => '_',
11131     ';' => '_', '•' => '_', '¯' => '_', '‾' => '_', '–' => '_', '–' => '_',
11132     '—' => '_', '_' => '_', '|' => '_', '¦‌' => '_', '‡' => '_', '§' => '_',
11133     '¶' => '_', '©' => '_', '®' => '_', '™' => '_', '&' => '_', '@' => '_',
11134     '/' => '_', '\\' => '_', '◊' => '_', '♠' => '_', '♣' => '_', '♥' => '_',
11135     '♦' => '_', '←' => '_', '↑' => '_', '→' => '_', '↓' => '_', '↔' => '_',
11136     '°' => '_', 'µ' => '_', '<' => '_', '>' => '_', '≤' => '_', '≥' => '_',
11137     '=' => '_', '≈' => '_', '≠' => '_', '≡' => '_', '±' => '_', '−' => '_',
11138     '+' => '_', '×' => '_', '÷' => '_', '⁄' => '_', '%' => '_', '‰' => '_',
11139     '¼' => '_', '½' => '_', '¾' => '_', '¹' => '_', '²' => '_', '³' => '_',
11140     '' => '_', 'º' => '_', 'ª' => '_', 'ƒ' => '_', '′' => '_', '″' => '_',
11141     '∂' => '_', '∏' => '_', '∑' => '_', '√' => '_', '∞' => '_', '¬' => '_',
11142     '∩' => '_', '∫' => '_', 'α' => '_', 'Α' => '_', 'β' => '_', 'Β' => '_',
11143     'γ' => '_', 'Γ' => '_', 'δ' => '_', 'Δ' => '_', 'ε' => '_', 'Ε' => '_',
11144     'ζ' => '_', 'Ζ' => '_', 'η' => '_', 'Η' => '_', 'θ' => '_', 'Θ' => '_',
11145     'ι' => '_', 'Ι' => '_', 'κ' => '_', 'Κ' => '_', 'λ' => '_', 'Λ' => '_',
11146     'μ' => '_', 'Μ' => '_', 'ν' => '_', 'Ν' => '_', 'ξ' => '_', 'Ξ' => '_',
11147     'ο' => '_', 'Ο' => '_', 'π' => '_', 'Π' => '_', 'ρ' => '_', 'Ρ' => '_',
11148     'σ' => '_', 'ς' => '_', 'Σ' => '_', 'τ' => '_', 'Τ' => '_', 'υ' => '_',
11149     'Υ' => '_', 'φ' => '_', 'Φ' => '_', 'χ' => '_', 'Χ' => '_', 'ψ' => '_',
11150     'Ψ' => '_', 'ω' => '_', 'Ω' => '_', ',' => '_', ' ' => '_'
11151     );
11152    
11153     return str_replace(array_keys($invalid), array_values($invalid), $documentLibelle);
11154     }
11155    
11156     /**
11157 softime 10869 * Surcharge permettant de ne pas afficher le fil d'Ariane dans
11158     * l'overlay de notification des demandeurs.
11159     */
11160     function getSubFormTitle($ent) {
11161 softime 11876 $actionSansPath = array('411', '420', '430');
11162     if (in_array($this->getParameter('maj'), $actionSansPath)) {
11163 softime 10869 return '';
11164     }
11165     return parent::getSubFormTitle($ent);
11166     }
11167 softime 13137
11168     /**
11169     * Traitement de la notification automatique des tiers consulté.
11170     *
11171     * Récupère la liste des adresses mails des tiers notifiables. Pour chaque adresses
11172     * récupérées ajoute une notification et une tâche de notification par mail.
11173     * La création de la tâche de notification par mail déclenchera l'envoi du mail
11174     * et la mise à jour du suivi.
11175     *
11176     * Les tiers notifiables sont ceux :
11177     * - n’ayant pas un ID PLAT’AU correspondant à l’ID PLAT’AU du service consultant
11178     * - ayant une habilitation dont le type est listé dans les paramètres de
11179     * notification de l’événement,
11180     * - intervenant sur la commune ou le département du dossier
11181     * - ayant au moins une adresse mail valide
11182     *
11183     * @param evenement instance de l'événement associée à l'instruction
11184     * @param dossier instance du dossier de l'instruction
11185     * @return boolean indique si le traitement à réussi
11186     */
11187     protected function traitement_notification_automatique_tiers_consulte($evenement, $dossier) {
11188     // Récupération de l'identifiant plat'au du service consultant
11189     $consultationEntrante = $dossier->get_inst_consultation_entrante();
11190     // Récupération de la liste des types d'habilitations autorisées pour
11191     // cette notification
11192     $typesHabilitationsNotifiable = $evenement->get_types_habilitation_notifiable();
11193     // Récupération du département et de la commune du dossier
11194     $commune = $dossier->getVal('commune');
11195     // Le département est récupéré à partir de la commune du dossier donc si la
11196     // commune n'a pas pu être récupéré on ne récupère pas non plus le département.
11197     $idDepartement = null;
11198     if (! empty($commune)) {
11199     $departement = $dossier->get_inst_departement_dossier();
11200     $idDepartement = $departement->getVal($departement->clePrimaire);
11201     }
11202     // Récupération des courriels des tiers notifiables
11203     $tiersANotifier = $this->get_courriels_tiers_notifiable(
11204     $typesHabilitationsNotifiable,
11205     $consultationEntrante->getVal('service_consultant_id'),
11206     $commune,
11207     $idDepartement
11208     );
11209     // Traitement de chacune des listes de diffusion pour extraire les
11210     // courriels, vérifier la validité des courriels et envoyer la
11211     // notification
11212     $notificationSend = false;
11213     if (empty($tiersANotifier)) {
11214     $this->addToLog(
11215     sprintf(
11216 softime 14542 '%s() : %s %s : %s',
11217 softime 13137 __METHOD__,
11218     __("La récupération des tiers à échoué."),
11219     __('Paramétrage'),
11220     var_export(
11221     array(
11222     'types_habilitations_notifiable' => $typesHabilitationsNotifiable,
11223     'service_consultant' => $consultationEntrante->getVal('service_consultant_id'),
11224     'id_commune' => $commune,
11225     'id_departement' => $idDepartement
11226     ),
11227     true
11228     )
11229     ),
11230     DEBUG_MODE
11231     );
11232     return false;
11233     }
11234     foreach($tiersANotifier as $tierANotifier) {
11235     // Découpe la liste de diffusion pour stocker les adresses mails
11236     // des tiers dans un tableau
11237     $courriels =
11238     array_filter(
11239     array_map(
11240     'trim',
11241     preg_split("/\r\n|\n|\r/", $tierANotifier['liste_diffusion'])));
11242    
11243     foreach ($courriels as $courriel) {
11244     // Pour chaque adresse mail vérifie si l'adresse est valide
11245     if (! $this->f->checkValidEmailAddress($courriel)) {
11246     continue;
11247     }
11248     $destinataire = array(
11249     'destinataire' => $tierANotifier['libelle'].' : '.$courriel,
11250     'courriel' => $courriel
11251     );
11252     // Si l'adresse est valide ajoute une nouvelle notification
11253     // et une tâche d'envoi de mails
11254     $idNotif = $this->ajouter_notification(
11255     $this->getVal($this->clePrimaire),
11256     $this->f->get_connected_user_login_name(),
11257     $destinataire,
11258     $this->get_dossier_instruction_om_collectivite(),
11259     array(),
11260     true
11261     );
11262     if ($idNotif === false) {
11263     $this->addToLog(
11264     __METHOD__.
11265     __("L'ajout de la notification a échoué."),
11266     DEBUG_MODE
11267     );
11268     return false;
11269     }
11270     // Création de la tache en lui donnant l'id de la notification
11271     $notification_by_task = $this->notification_by_task(
11272     $idNotif,
11273     $dossier->getVal('dossier'),
11274     'mail',
11275     'notification_tiers_consulte'
11276     );
11277     if ($notification_by_task === false) {
11278     $this->addToLog(
11279     __METHOD__.
11280     __("L'ajout de la tâche de notification a échoué."),
11281     DEBUG_MODE
11282     );
11283     $this->addToMessage(
11284     __("Erreur lors de la génération de la notification au(x) pétitionnaire(s).")
11285     );
11286     return false;
11287     }
11288     $notificationSend = true;
11289     }
11290     }
11291     // Si aucune notification n'a été envoyé car il n'y a pas de courriels
11292     // valide, affiche un message dans les logs pour avoir un suivi.
11293     if (! $notificationSend) {
11294     $this->addToLog(
11295     sprintf(
11296     '%s %s : %s %s : %s',
11297     __METHOD__,
11298     __("Il n'y a pas de tiers notifiable pour l'instruction"),
11299     $evenement->getVal('libelle'),
11300     __("du dossier"),
11301     $this->getVal('dossier')
11302     ),
11303     DEBUG_MODE
11304     );
11305     }
11306     return true;
11307     }
11308    
11309     /**
11310     * Récupère, à l'aide d'une requête, la liste de diffusion des tiers
11311     * respectant les conditions suvantes :
11312     * - le tiers consulté dois accepté les notifications
11313     * - la liste de diffusion ne dois pas être vide
11314     * - l'uid du tiers consulté ne dois pas être celui passé en paramètre
11315     * si pas d'uid passé en paramètre alors on ne filtre pas selon l'uid
11316     * du tiers
11317     * - le type d'habilitation des tiers dois appartenir à la liste
11318     * fournie en paramètre
11319     * - le tiers dois être associé à la commune ou au département passé
11320     * en paramètre
11321     *
11322     * @param array $typesHabilitations tableau contenant la liste des types d'habilitation
11323     * pouvant être notifiée
11324     * @param integer $idPlautau uid de l'acteur plat'au du dossier qui ne dois pas être notifié
11325     * @param integer $commune identifiant de la commune du dossier
11326     * @param integer $departement identifiant du département du dossier
11327     *
11328     * @return array listes de diffusion des tiers notifiable
11329     */
11330     protected function get_courriels_tiers_notifiable(array $typesHabilitations, $idPlatau, $commune, $departement) {
11331     // Si paramètre non renseigné alors ne renvoie rien
11332     if (empty($typesHabilitations) || empty($commune) || empty($departement)) {
11333     return false;
11334     }
11335     // Si il n'y a pas d'acteur associé au dossier alors on ne filtre pas sur l'uid de l'acteur
11336     $filtreServiceConsulteDI = '';
11337     if (! empty($idPlatau)) {
11338     $filtreServiceConsulteDI = sprintf(
11339 softime 14064 "-- Filtre les tiers ayant une ligne correspondante a l uid platau du service
11340     -- en charge du dossier
11341     AND (tiers_consulte.uid_platau_acteur !~ ('\y' || '%s' || '\y')
11342     OR tiers_consulte.uid_platau_acteur IS NULL)",
11343 softime 13137 $this->f->db->escapeSimple($idPlatau)
11344     );
11345     }
11346     $rst = $this->f->get_all_results_from_db_query(
11347     sprintf(
11348     'SELECT
11349 softime 14064 -- Tiers notifiables lié à la commune du dossier
11350 softime 13137 tiers_consulte.liste_diffusion,
11351     tiers_consulte.libelle
11352     FROM
11353     %1$shabilitation_tiers_consulte
11354     LEFT JOIN %1$stiers_consulte
11355     ON habilitation_tiers_consulte.tiers_consulte = tiers_consulte.tiers_consulte
11356     LEFT JOIN %1$slien_habilitation_tiers_consulte_commune
11357     ON habilitation_tiers_consulte.habilitation_tiers_consulte = lien_habilitation_tiers_consulte_commune.habilitation_tiers_consulte
11358 softime 14064 -- Conservation uniquement des tiers acteur de dossiers
11359     JOIN %1$slien_dossier_tiers
11360     ON tiers_consulte.tiers_consulte = lien_dossier_tiers.tiers
11361     WHERE
11362     tiers_consulte.accepte_notification_email IS TRUE
11363     AND tiers_consulte.liste_diffusion IS NOT NULL
11364     %3$s
11365     AND habilitation_tiers_consulte.type_habilitation_tiers_consulte IN (%2$s)
11366     AND lien_habilitation_tiers_consulte_commune.commune = %4$d
11367     -- Filtre sur les tiers acteur du dossier
11368     AND lien_dossier_tiers.dossier = \'%6$s\'
11369     UNION
11370     SELECT
11371     -- Tiers notifiables lié au département du dossier
11372     tiers_consulte.liste_diffusion,
11373     tiers_consulte.libelle
11374     FROM
11375     %1$shabilitation_tiers_consulte
11376     LEFT JOIN %1$stiers_consulte
11377     ON habilitation_tiers_consulte.tiers_consulte = tiers_consulte.tiers_consulte
11378 softime 13137 LEFT JOIN %1$slien_habilitation_tiers_consulte_departement
11379     ON habilitation_tiers_consulte.habilitation_tiers_consulte = lien_habilitation_tiers_consulte_departement.habilitation_tiers_consulte
11380 softime 14064 -- Conservation uniquement des tiers acteur de dossiers
11381     JOIN %1$slien_dossier_tiers
11382     ON tiers_consulte.tiers_consulte = lien_dossier_tiers.tiers
11383 softime 13137 WHERE
11384     tiers_consulte.accepte_notification_email IS TRUE
11385     AND tiers_consulte.liste_diffusion IS NOT NULL
11386     %3$s
11387     AND habilitation_tiers_consulte.type_habilitation_tiers_consulte IN (%2$s)
11388 softime 14064 AND lien_habilitation_tiers_consulte_departement.departement = %5$d
11389     -- Filtre sur les tiers acteur du dossier
11390     AND lien_dossier_tiers.dossier = \'%6$s\'',
11391 softime 13137 DB_PREFIXE,
11392     implode(', ', $typesHabilitations),
11393     $filtreServiceConsulteDI,
11394     intval($commune),
11395 softime 14064 intval($departement),
11396     $this->f->db->escapeSimple($this->getVal('dossier'))
11397 softime 13137 ),
11398     array(
11399     "origin" => __METHOD__
11400     )
11401     );
11402 softime 14064 // Faire un order by sur un union ne fonctionne pas. A la place
11403     // c'est le tableau des résultats qui est ordonné.
11404     usort($rst['result'], function($a, $b) {
11405     return strcmp($a['libelle'], $b['libelle']);
11406     });
11407 softime 13137 return $rst['result'];
11408     }
11409 softime 17036
11410     /**
11411 softime 17542 * Gestion spécifique de l'affichage des documents dans le tableau des
11412     * documents d'instruction.
11413     * Prend en compte qu'une instruction peut également avoir un document lié
11414     * dans la table storage.
11415     *
11416     * @return void
11417 softime 17036 */
11418 softime 17542 public function view_telecharger_editions() {
11419     // Récupère l'identifiant du document dans l'URL appelant l'action
11420     $idx = $this->f->get_submitted_get_value('idx');
11421     $obj = $this->table;
11422     $champ = 'om_fichier_instruction';
11423     // Cas d'un document historisé (dans la table storage)
11424     if (strpos($idx, 'STORAGE_') !== false) {
11425     $idx = substr($idx, 8);
11426     $obj = 'storage';
11427     $champ = 'uid';
11428 softime 17036 }
11429 softime 17542 // Ouvre le document
11430     $lien = '../app/index.php?module=form&snippet=file&obj='.$obj.'&champ='.$champ.'&id='.$idx;
11431     header("Location: ".$lien);
11432     }
11433 softime 13137 }

Properties

Name Value
svn:keywords "Id"

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26