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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 19307 - (hide annotations)
Wed Nov 6 10:57:56 2024 UTC (2 months, 3 weeks ago) by softime
File size: 519684 byte(s)
merge: fusion de la branche d'intégration 6.9.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 softime 18436 require_once "../obj/task.class.php";
25 softime 19307 require_once "../obj/action.class.php";
26 mbroquet 3730
27     //
28     class instruction extends instruction_gen {
29 softime 19307
30 mbroquet 3730 // Champs contenant les UID des fichiers
31     var $abstract_type = array(
32     "om_fichier_instruction" => "file",
33     );
34 softime 8989
35 mbroquet 3730 var $valEvenement;
36     var $restriction_valid = null;
37     // Tableau contenant une partie des métadonnées arrêtés
38     var $metadonneesArrete;
39    
40 fmichon 3892 /**
41     * Instance de la classe dossier
42     *
43     * @var mixed
44     */
45     var $inst_dossier = null;
46    
47 softime 5169 /**
48     * Instance de la classe instructeur
49     *
50     * @var mixed
51     */
52     var $inst_instructeur = null;
53    
54     /**
55     * Instance de la classe om_utilisateur
56     *
57     * @var mixed
58     */
59     var $inst_om_utilisateur = null;
60    
61 mbroquet 3730 var $metadata = array(
62     "om_fichier_instruction" => array(
63     "dossier" => "getDossier",
64     "dossier_version" => "getDossierVersion",
65     "numDemandeAutor" => "getNumDemandeAutor",
66     "anneemoisDemandeAutor" => "getAnneemoisDemandeAutor",
67     "typeInstruction" => "getTypeInstruction",
68     "statutAutorisation" => "getStatutAutorisation",
69     "typeAutorisation" => "getTypeAutorisation",
70     "dateEvenementDocument" => "getDateEvenementDocument",
71     "groupeInstruction" => 'getGroupeInstruction',
72     "title" => 'getTitle',
73 softime 6272 'concerneERP' => 'get_concerne_erp',
74 softime 10573
75     'date_cloture_metier' => 'getDossierDateDecision',
76     'type' => 'getDocumentType',
77     'dossier_autorisation_type_detaille' => 'getDossierAutorisationTypeDetaille',
78     'dossier_instruction_type' => 'getDossierInstructionTypeLibelle',
79     'region' => 'getDossierRegion',
80     'departement' => 'getDossierDepartement',
81     'commune' => 'getDossierCommune',
82     'annee' => 'getDossierAnnee',
83     'division' => 'getDossierDivision',
84 softime 10808 'collectivite' => 'getDossierServiceOrCollectivite',
85 mbroquet 3730 ),
86     "arrete" => array(
87     "numArrete" => "getNumArrete",
88     "ReglementaireArrete" => "getReglementaireArrete",
89     "NotificationArrete" => "getNotificationArrete",
90     "dateNotificationArrete" => "getDateNotificationArrete",
91     "controleLegalite" => "getControleLegalite",
92     "dateSignature" => "getDateSignature",
93     "nomSignataire" => "getNomSignataire",
94     "qualiteSignataire" => "getQualiteSignataire",
95     "ap_numRue" => "getAp_numRue",
96     "ap_nomDeLaVoie" => "getAp_nomDeLaVoie",
97     "ap_codePostal" => "getAp_codePostal",
98     "ap_ville" => "getAp_ville",
99     "activite" => "getActivite",
100     "dateControleLegalite" => "getDateControleLegalite",
101 softime 10573 )
102 mbroquet 3730 );
103    
104 softime 9245 /**
105     * Flag pour identifier la reprise de l'instruction d'un dossier.
106     * Le statut de l'état passe de "cloture" à "encours".
107     *
108     * @var boolean
109     */
110     var $di_reopened = null;
111    
112 softime 17542 /**
113     * Méthode appelée par le module_manager lors de la récupération des modules de cet objet.
114     * Permet d'ajouer des modules en plus de ceux récupérer par défaut par le module_manager.
115     *
116 softime 18436 * @param bool $only_for_class Ne renvoie que les modules pour la classe de l'objet
117     *
118 softime 17542 * @return array Liste de modules supplémentaires pour cet objet
119     */
120 softime 18436 public function get_modules_append(bool $only_for_class = false) {
121 softime 17542 $modules = array();
122    
123 softime 18436 // 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 softime 17542
127 softime 18436 $object_id = $this->getVal($this->clePrimaire);
128 softime 17542
129 softime 18436 $evenements_ids = array();
130    
131     // Dans le cas ou on a un identifiant de dossier et que
132     // l'objet courant n'a pas de cle primaire définie
133     // ou qu'on est dans le contexte d'une classe d'objet
134     if (! empty($idx) && (empty($object_id) || $only_for_class === true)) {
135    
136     // Utilise la valeur evenement si elle est déterminé,
137     $evenement = $this->f->get_submitted_post_value('evenement');
138     if (! empty($evenement)) $evenements_ids = array($evenement);
139 softime 19307 // On déclenche soit lors du premier affichage d'un instruction,
140     // soit dans le cas retour en refus de la validation du formulaire.
141     $action = $this->f->get_submitted_get_value('action');
142    
143     if (empty($evenements_ids) || ($this->correct !== true && $action == '0')){
144 softime 18436 // si on est dans le cadre de l'affichage d'une nouvelle instruction
145     if ($action == '0') {
146    
147     // ajoute les modules des évènements possible sur le dossier courant
148     $evenements_data = $this->get_var_sql_forminc__sql_evenement();
149     $evenements_ids = array_column($evenements_data, 'evenement');
150     }
151    
152     // si on est dans le cadre d'un listing
153     else if (is_null($action) || $action === '') {
154    
155     // récupère la liste des évènements d'instructions du dossier d'instruction
156     $sql = sprintf("
157     SELECT
158     evenement
159     FROM
160     ".DB_PREFIXE."instruction
161     WHERE
162     dossier = '%s'
163     ", $this->f->db->escapeSimple($idx));
164     $qres = $this->f->get_all_results_from_db_query(
165     $sql, array('origin' => __METHOD__));
166     if ($qres['code'] !== 'OK') {
167     $err_msg = "Failed to execute SQL: $sql. Detail: ".($qres['message'] ?? '');
168     $this->f->log(__METHOD__, $err_msg, 'ERROR');
169     throw new RuntimeException($err_msg);
170     }
171    
172     // ajoute les modules des évènements des instructions du dossier courant
173     $evenements_ids = array_column($qres['result'], 'evenement');
174     }
175 softime 17542 }
176     }
177 softime 18436 if (!empty($evenements_ids)){
178     $this->f->log(__METHOD__, 'evenements: '.implode(',', $evenements_ids));
179     $modules = $this->f->module_manager->get_modules_for_object_name_and_ids(
180     'evenement', $evenements_ids, $this, false);
181     }
182 softime 17542 }
183     return $modules;
184     }
185    
186 mbroquet 3730 // {{{ Gestion de la confidentialité des données spécifiques
187 softime 19307
188 mbroquet 3730 /**
189     * Définition des actions disponibles sur la classe.
190     *
191     * @return void
192     */
193     function init_class_actions() {
194    
195     parent::init_class_actions();
196    
197     // ACTION - 000 - ajouter
198     // Modifie la condition d'affichage du bouton ajouter
199 softime 6565 $this->class_actions[0]["condition"] = array("is_addable", "can_user_access_dossier_contexte_ajout");
200 mbroquet 3730
201     // ACTION - 001 - modifier
202     // Modifie la condition et le libellé du bouton modifier
203 softime 6565 $this->class_actions[1]["condition"] = array(
204     "is_editable",
205     "is_finalizable_without_bypass",
206     "can_user_access_dossier_contexte_modification",
207 softime 10573 "is_evenement_modifiable",
208 softime 6565 );
209 softime 18876 $this->class_actions[1]["portlet"]["libelle"] = __("Modifier");
210 softime 19307
211 mbroquet 3730 // ACTION - 002 - supprimer
212     // Modifie la condition et le libellé du bouton supprimer
213 softime 6565 $this->class_actions[2]["condition"] = array(
214     "is_deletable",
215     "is_finalizable_without_bypass",
216 softime 10573 "can_user_access_dossier_contexte_modification",
217     "is_evenement_supprimable",
218 softime 6565 );
219 softime 18876 $this->class_actions[2]["portlet"]["libelle"] = __("Supprimer");
220 mbroquet 3730
221 softime 6565 // ACTION - 003 - consulter
222 softime 19307 //
223 softime 6565 $this->class_actions[3]["condition"] = "can_user_access_dossier_contexte_modification";
224    
225 mbroquet 3730 // ACTION - 100 - finaliser
226     // Finalise l'enregistrement
227     $this->class_actions[100] = array(
228     "identifier" => "finaliser",
229     "portlet" => array(
230     "type" => "action-direct",
231 softime 18876 "libelle" => __("Finaliser le document"),
232 mbroquet 3730 "order" => 110,
233     "class" => "finalise",
234     ),
235     "view" => "formulaire",
236     "method" => "finalize",
237     "button" => "finaliser",
238     "permission_suffix" => "finaliser",
239 softime 6565 "condition" => array(
240     "is_finalizable",
241     "is_finalizable_without_bypass",
242     "has_an_edition",
243     "can_user_access_dossier_contexte_modification",
244     ),
245 mbroquet 3730 );
246    
247     // ACTION - 110 - definaliser
248     // Finalise l'enregistrement
249     $this->class_actions[110] = array(
250     "identifier" => "definaliser",
251     "portlet" => array(
252     "type" => "action-direct",
253 softime 18876 "libelle" => __("Reprendre la redaction du document"),
254 mbroquet 3730 "order" => 110,
255     "class" => "definalise",
256     ),
257     "view" => "formulaire",
258     "method" => "unfinalize",
259     "button" => "definaliser",
260     "permission_suffix" => "definaliser",
261 softime 6565 "condition" => array(
262     "is_unfinalizable",
263     "is_unfinalizable_without_bypass",
264     "can_user_access_dossier_contexte_modification",
265 softime 10573 "is_not_sent_for_signature",
266 softime 15973 "is_not_signed",
267 softime 6565 ),
268 mbroquet 3730 );
269    
270 softime 13137 // ACTION - 115 - Modification d'un document généré par une instruction
271 softime 12847 // Permet à un instructeur de modifier un document généré par une instruction
272     $this->class_actions[115] = array(
273     "identifier" => "modale_selection_document_signe",
274     "portlet" => array(
275     "type" => "action-self",
276 softime 18876 "libelle" => __("Remplacer par le document signé"),
277 softime 12847 "order" => 115,
278     "class" => "selection-document-signé",
279     ),
280     "view" => "view_modale_selection_document_signe",
281     "permission_suffix" => "selection_document_signe",
282     "condition" => array(
283     "is_finalized",
284     "is_not_date_retour_signature_set",
285     ),
286     );
287    
288 mbroquet 3730 // ACTION - 120 - edition
289     // Affiche l'édition
290     $this->class_actions[120] = array(
291     "identifier" => "edition",
292     "portlet" => array(
293     "type" => "action-blank",
294 softime 18876 "libelle" => __("Edition"),
295 mbroquet 3730 "order" => 100,
296     "class" => "pdf-16",
297     ),
298     "view" => "view_edition",
299 softime 6565 "condition" => array("has_an_edition", "can_user_access_dossier_contexte_modification"),
300 mbroquet 3730 "permission_suffix" => "om_fichier_instruction_telecharger",
301     );
302    
303     // ACTION - 125 - modifier_suivi
304     // Suivi des dates
305     $this->class_actions[125] = array(
306     "identifier" => "modifier_suivi",
307     "portlet" => array(
308     "type" => "action-self",
309 softime 18876 "libelle" => __("Suivi des dates"),
310 mbroquet 3730 "order" => 125,
311     "class" => "suivi-dates-16",
312     ),
313     "crud" => "update",
314 softime 6565 "condition" => array("can_monitoring_dates", "can_user_access_dossier_contexte_modification"),
315 mbroquet 3730 "permission_suffix" => "modification_dates",
316     );
317    
318     // ACTION - 130 - bible
319     // Affiche la bible
320     $this->class_actions[130] = array(
321     "identifier" => "bible",
322     "view" => "view_bible",
323     "permission_suffix" => "modifier",
324     );
325    
326     // ACTION - 140 - bible_auto
327     // Active la bible automatique
328     $this->class_actions[140] = array(
329     "identifier" => "bible_auto",
330     "view" => "view_bible_auto",
331     "permission_suffix" => "modifier",
332     );
333    
334     // ACTION - 150 - suivi_bordereaux
335     // Imprimer un bordereau d'envoi
336     $this->class_actions[150] = array(
337     "identifier" => "suivi_bordereaux",
338     "view" => "view_suivi_bordereaux",
339     "permission_suffix" => "consulter",
340     );
341    
342     // ACTION - 160 - suivi_envoi_lettre_rar
343     // Imprimer un bordereau d'envoi
344     $this->class_actions[160] = array(
345     "identifier" => "suivi_envoi_lettre_rar",
346     "view" => "view_suivi_envoi_lettre_rar",
347     "permission_suffix" => "consulter",
348     );
349    
350     // ACTION - 170 - suivi_mise_a_jour_des_dates
351     // Mettre à jour les dates de l'instruction
352     $this->class_actions[170] = array(
353     "identifier" => "suivi_mise_a_jour_des_dates",
354     "view" => "view_suivi_mise_a_jour_des_dates",
355     "permission_suffix" => "consulter",
356     );
357    
358 softime 13528 // ACTION - 175 - edit_by_notification_task
359 softime 13137 // Action à utiliser lors de la mise à jour des instructions par notification
360     $this->class_actions[175] = array(
361 softime 13528 "identifier" => "edit_by_notification_task",
362 softime 13137 "view" => "formulaire",
363     "permission_suffix" => "modifier",
364     "crud" => "update",
365     );
366    
367 softime 14064 // ACTION - 176 - add_by_evenement_retour_after_notification_task
368     // Action à utiliser lors de l'ajout des instructions par événement suivant
369     // suite à une notification par tâche (donc notification dématerialisée)
370     $this->class_actions[176] = array(
371     "identifier" => "add_by_evenement_retour_after_notification_task",
372     "view" => "formulaire",
373     "permission_suffix" => "ajouter",
374     "crud" => "create",
375     );
376    
377 mbroquet 3730 // ACTION - 180 - pdf_lettre_rar
378 softime 8989 // Génère PDF sur bordereaux de lettres AR
379 mbroquet 3730 $this->class_actions[180] = array(
380     "identifier" => "pdf_lettre_rar",
381     "view" => "view_pdf_lettre_rar",
382     "permission_suffix" => "consulter",
383     );
384    
385     // ACTION - 190 - bordereau_envoi_maire
386     // Formulaire pour générer le bordereau d'envoi au maire
387     // Met à jour la date d'envoi à signature du maire
388     $this->class_actions[190] = array(
389     "identifier" => "bordereau_envoi_maire",
390     "view" => "view_bordereau_envoi_maire",
391     "permission_suffix" => "bordereau_envoi_maire",
392     );
393    
394     // ACTION - 200 - generate_bordereau_envoi_maire
395     // Génère PDF bordereau d'envoi au maire
396     $this->class_actions[200] = array(
397     "identifier" => "generate_bordereau_envoi_maire",
398     "view" => "view_generate_bordereau_envoi_maire",
399     "permission_suffix" => "bordereau_envoi_maire",
400     );
401 nmeucci 4108
402     // ACTION - 210 - notifier_commune
403     // Notifie la commune par mail d'un évément d'instruction finalisé
404     $this->class_actions[210] = array(
405     "identifier" => "notifier_commune",
406     "portlet" => array(
407     "type" => "action-direct-with-confirmation",
408 softime 18876 "libelle" => __("Notifier la commune par courriel"),
409 nmeucci 4108 "order" => 210,
410     "class" => "notifier_commune-16",
411     ),
412     "view" => "formulaire",
413     "method" => "notifier_commune",
414     "permission_suffix" => "notifier_commune",
415 softime 6565 "condition" => array("is_notifiable", "can_user_access_dossier_contexte_modification"),
416 nmeucci 4108 );
417 nmeucci 4317
418 softime 19307 // ACTION - 220 - generate_suivi_bordereaux
419     // GénÚre PDF bordereaux
420     $this->class_actions[220] = array(
421     "identifier" => "generate_suivi_bordereaux",
422     "view" => "view_generate_suivi_bordereaux",
423 softime 6565 "permission_suffix" => "consulter",
424     );
425 softime 7521
426     // ACTION - 777 - pdf_temp
427     // Crée un PDF temporaire et affiche son contenu en base64
428     $this->class_actions[777] = array(
429     "identifier" => "pdf_temp",
430     "view" => "view_pdf_temp",
431     "permission_suffix" => "modifier",
432     "condition" => array("can_user_access_dossier_contexte_modification"),
433     );
434 softime 8593
435     // ACTION - 701
436     $this->class_actions[701] = array(
437     "identifier" => "enable-edition-integrale",
438     "portlet" => array(
439     "type" => "action-direct-with-confirmation",
440 softime 18876 "libelle" => __("Rédaction libre"),
441 softime 8593 "order" => 50,
442     "class" => "redac-libre-16",
443     ),
444     "view" => "formulaire",
445     "method" => "enable_edition_integrale",
446     "permission_suffix" => "modifier",
447     "condition" => array(
448     "is_editable",
449     "is_finalizable_without_bypass",
450     "can_user_access_dossier_contexte_modification",
451     "is_edition_integrale_not_enabled",
452     "is_option_redaction_libre_enabled",
453     "has_an_edition",
454     ),
455     );
456     // ACTION - 702
457     $this->class_actions[702] = array(
458     "identifier" => "disable-edition-integrale",
459     "portlet" => array(
460     "type" => "action-direct-with-confirmation",
461 softime 18876 "libelle" => __("Rédaction par compléments"),
462 softime 8593 "order" => 50,
463     "class" => "redac-complement-16",
464     ),
465     "view" => "formulaire",
466     "method" => "disable_edition_integrale",
467     "permission_suffix" => "modifier",
468     "condition" => array(
469     "is_editable",
470     "is_finalizable_without_bypass",
471     "can_user_access_dossier_contexte_modification",
472     "is_edition_integrale_enabled",
473     "is_option_redaction_libre_enabled",
474     "has_an_edition",
475     ),
476     );
477     // ACTION - 300 - evenement_has_an_edition_json
478     //
479     $this->class_actions[300] = array(
480     "identifier" => "evenement_has_an_edition_json",
481     "view" => "view_evenement_has_an_edition_json",
482     "permission_suffix" => "consulter",
483     );
484 softime 10573
485     // ACTION - 301 - evenement_has_a_commentaire
486     //
487     $this->class_actions[301] = array(
488     "identifier" => "evenement_has_a_commentaire_json",
489     "view" => "view_evenement_has_a_commentaire_json",
490     "permission_suffix" => "consulter",
491     );
492    
493     // ACTION - 400 - Envoyer en signature
494 softime 19307 // Cet évenement permet d'envoyer le document au parapheur pour signature
495 softime 10573 $this->class_actions[400] = array(
496     "identifier" => "envoyer_a_signature",
497     "portlet" => array(
498 softime 18876 "libelle" => __("Envoyer à signature"),
499 softime 10573 "type" => "action-direct-with-confirmation",
500     "class" => "envoyer_a_signature-16",
501     ),
502     "view" => "formulaire",
503 softime 10713 "method" => "envoyer_a_signature_sans_relecture",
504 softime 10573 "condition" => array(
505     "can_be_signed",
506     ),
507     "permission_suffix" => "envoyer_a_signature",
508     );
509    
510 softime 10713 // ACTION - 402 - Envoyer en signature avec relecture
511     // Cet évenement permet d'envoyer le document au parapheur pour signature
512     $this->class_actions[402] = array(
513     "identifier" => "envoyer_a_signature_relecture",
514     "portlet" => array(
515     "libelle" => __("Envoyer à signature avec relecture"),
516     "type" => "action-direct-with-confirmation",
517     "class" => "envoyer_a_signature-16",
518     ),
519     "view" => "formulaire",
520     "method" => "envoyer_a_signature_avec_relecture",
521     "condition" => array(
522     "can_be_signed",
523 softime 10808 "is_parapheur_relecture_parameter_enabled"
524 softime 10713 ),
525     "permission_suffix" => "envoyer_a_signature",
526     );
527    
528 softime 11876 // ACTION - 404 - Annuler l'envoi en signature
529     // Cet évenement permet d'annuler l'envoi en signature du document au parapheur
530     $this->class_actions[404] = array(
531     "identifier" => "annuler_envoi_signature",
532     "portlet" => array(
533     "libelle" => __("Annuler l'envoi en signature"),
534     "type" => "action-direct-with-confirmation",
535     "class" => "annuler_envoi_signature-16",
536     ),
537     "view" => "formulaire",
538     "method" => "annuler_envoi_en_signature",
539     "condition" => array(
540 softime 12124 "is_sent_for_signature",
541 softime 11876 "is_parapheur_annulation_parameter_enabled"
542     ),
543     "permission_suffix" => "envoyer_a_signature",
544     );
545    
546 softime 10573 //
547     $this->class_actions[401] = array(
548     "identifier" => "preview_edition",
549     "view" => "formulaire",
550     "permission_suffix" => "tab",
551     );
552    
553 softime 17036 //
554     $this->class_actions[405] = array(
555     "identifier" => "telecharger_editions",
556     "view" => "view_telecharger_editions",
557     "permission_suffix" => "om_fichier_instruction_telecharger",
558     );
559    
560 softime 10808 // ACTION - 410 - Notifier les pétitionnaires (mail ou autre)
561     $this->class_actions[410] = array(
562     "identifier" => "overlay_notification_manuelle",
563     "portlet" => array(
564     "libelle" => __("Notifier les pétitionnaires"),
565     "type" => "action-self",
566     "class" => "notifier_commune-16",
567     ),
568     "condition" => array(
569     "is_notifiable_by_task_manual",
570 softime 10869 "is_not_portail_notification_sans_annexe"
571 softime 10808 ),
572     "view" => "view_overlay_notification_manuelle",
573     "permission_suffix" => "modifier",
574     );
575    
576 softime 11585 // ACTION - 411 - Notifier les pétitionnaires (portail citoyen)
577 softime 10808 $this->class_actions[411] = array(
578     "identifier" => "notification_manuelle_portal",
579     "portlet" => array(
580     "libelle" => __("Notifier les pétitionnaires"),
581     "type" => "action-direct-with-confirmation",
582     "class" => "notifier_commune-16",
583     ),
584     "condition" => array(
585     "is_notifiable_by_task_manual",
586 softime 10869 "is_portail_notification_sans_annexe"
587 softime 10808 ),
588 softime 14542 "method" => "notifier_demandeur_principal_via_portal",
589 softime 10808 "permission_suffix" => "modifier",
590     );
591    
592 softime 17542 // ACTION - 412 - Vérifie le dépassement de la date limite de notification
593     $this->class_actions[412] = array(
594     "identifier" => "is_date_limite_notification_dossier_depasse",
595     "view" => "is_date_limite_notification_dossier_depasse",
596     "permission_suffix" => "modifier",
597     );
598    
599 softime 11585 // ACTION - 420 - Notifier les services consultés (mail)
600     $this->class_actions[420] = array(
601     "identifier" => "overlay_notification_service_consulte",
602     "portlet" => array(
603     "libelle" => __("Notifier les services consultés"),
604     "type" => "action-self",
605     "class" => "notifier_commune-16",
606     ),
607     "condition" => array(
608     "is_service_notifiable"
609     ),
610     "view" => "view_overlay_notification_service_consulte",
611     "permission_suffix" => "tab",
612     );
613    
614     // ACTION - 430 - Notifier les tiers consultés (mail)
615     $this->class_actions[430] = array(
616     "identifier" => "overlay_notification_tiers_consulte",
617     "portlet" => array(
618     "libelle" => __("Notifier les tiers consultés"),
619     "type" => "action-self",
620     "class" => "notifier_commune-16",
621     ),
622     "condition" => array(
623     "is_tiers_notifiable"
624     ),
625     "view" => "view_overlay_notification_tiers_consulte",
626     "permission_suffix" => "tab",
627     );
628    
629 softime 10573 //
630 softime 11418 $this->class_actions[403] = array(
631     "identifier" => "envoyer_au_controle_de_legalite",
632     "portlet" => array(
633     "libelle" => __("Envoyer au contrôle de légalité"),
634     "type" => "action-direct-with-confirmation",
635     "class" => "envoyer_au_controle_de_legalite-16",
636     ),
637     "view" => "formulaire",
638     "method" => "envoyer_au_controle_de_legalite",
639     "condition" => array(
640 softime 18876 "can_be_sent_to_cl"
641 softime 11418 ),
642     "permission_suffix" => "envoyer_au_controle_de_legalite",
643     );
644    
645     //
646 softime 10573 $this->class_actions[998] = array(
647     "identifier" => "json_data",
648     "view" => "view_json_data",
649     "permission_suffix" => "consulter",
650     );
651 mbroquet 3730 }
652    
653 softime 8593 /**
654 softime 8989 * Clause select pour la requête de sélection des données de l'enregistrement.
655     *
656     * @return array
657     */
658     function get_var_sql_forminc__champs() {
659     return array(
660     "instruction",
661     "destinataire",
662     "instruction.evenement",
663 softime 10573 "instruction.commentaire",
664 softime 8989 "date_evenement",
665 softime 18436 "document_type_instruction",
666     "fichier_instruction_name",
667 softime 8989 "instruction.lettretype",
668     "signataire_arrete",
669     "flag_edition_integrale",
670     "om_final_instruction_utilisateur",
671     "date_finalisation_courrier",
672     "date_envoi_signature",
673 softime 15973 "date_retour_signature",
674 softime 8989 "date_envoi_rar",
675    
676     "date_retour_rar",
677 softime 15973 "date_envoi_controle_legalite",
678 softime 8989 "date_retour_controle_legalite",
679    
680     "numero_arrete",
681    
682     "complement_om_html",
683     "'' as bible_auto",
684     "'' as bible",
685     "complement2_om_html",
686     "'' as bible2",
687     "complement3_om_html",
688     "'' as bible3",
689     "complement4_om_html",
690     "'' as bible4",
691    
692     "titre_om_htmletat",
693     "corps_om_htmletatex",
694    
695     "'' as btn_preview",
696     "'' as btn_redaction",
697    
698     "'' as btn_refresh",
699     "'' as live_preview",
700    
701     "dossier",
702     "instruction.action",
703     "instruction.delai",
704     "instruction.etat",
705     "instruction.autorite_competente",
706     "instruction.accord_tacite",
707     "instruction.delai_notification",
708     "instruction.avis_decision",
709     "archive_delai",
710     "archive_accord_tacite",
711     "archive_etat",
712     "archive_avis",
713     "archive_date_complet",
714     "archive_date_rejet",
715     "archive_date_limite",
716     "archive_date_notification_delai",
717     "archive_date_decision",
718     "archive_date_validite",
719     "archive_date_achevement",
720     "archive_date_conformite",
721     "archive_date_chantier",
722     "archive_date_dernier_depot",
723     "date_depot",
724 softime 10573 "date_depot_mairie",
725 softime 8989 "complement5_om_html",
726     "'' as bible5",
727     "complement6_om_html",
728     "'' as bible6",
729     "complement7_om_html",
730     "'' as bible7",
731     "complement8_om_html",
732     "'' as bible8",
733     "complement9_om_html",
734     "'' as bible9",
735     "complement10_om_html",
736     "'' as bible10",
737     "complement11_om_html",
738     "'' as bible11",
739     "complement12_om_html",
740     "complement13_om_html",
741     "complement14_om_html",
742     "complement15_om_html",
743     "archive_incompletude",
744     "archive_incomplet_notifie",
745     "archive_evenement_suivant_tacite",
746     "archive_evenement_suivant_tacite_incompletude",
747     "archive_etat_pendant_incompletude",
748     "archive_date_limite_incompletude",
749     "archive_delai_incompletude",
750     "archive_autorite_competente",
751     "code_barres",
752     "om_fichier_instruction",
753     "om_final_instruction",
754     "om_fichier_instruction_dossier_final",
755     "document_numerise",
756     "duree_validite_parametrage",
757     "duree_validite",
758     "created_by_commune",
759     "archive_date_cloture_instruction",
760     "archive_date_premiere_visite",
761     "archive_date_derniere_visite",
762     "archive_date_contradictoire",
763     "archive_date_retour_contradictoire",
764     "archive_date_ait",
765     "archive_date_transmission_parquet",
766     "archive_dossier_instruction_type",
767     "archive_date_affichage",
768 softime 10573 "pec_metier",
769     "archive_pec_metier",
770     "archive_a_qualifier",
771     "id_parapheur_signature",
772     "statut_signature",
773     "commentaire_signature",
774     "historique_signature",
775 softime 10808 "'' as suivi_notification",
776 softime 11585 "'' as suivi_notification_service",
777     "'' as suivi_notification_tiers",
778 softime 12654 "'' as suivi_notification_commune",
779 softime 10573
780     "'' as preview_edition",
781 softime 11418 "envoye_cl_platau",
782 softime 15037 "'' as log_instruction",
783     "parapheur_lien_page_signature"
784 softime 8989 );
785     }
786    
787     /**
788 softime 8593 * CONDITION - is_edition_integrale_enabled
789     *
790     * Vérifie que la rédaction libre est activée sur l'instruction en cours.
791     *
792     * @return boolean
793     */
794     function is_edition_integrale_enabled() {
795     if ($this->getVal("flag_edition_integrale") == 't') {
796     return true;
797     }
798     return false;
799     }
800 mbroquet 3730
801     /**
802 softime 8593 * CONDITION - is_edition_integrale_not_enabled
803     *
804     * Vérifie que la rédaction libre est désactivée sur l'instruction en cours.
805     *
806     * @return boolean
807     */
808     function is_edition_integrale_not_enabled() {
809     return !$this->is_edition_integrale_enabled();
810     }
811    
812     /**
813     * CONDITION - is_option_redaction_libre_enabled
814     *
815     * Vérifie que l'option de rédaction libre est activée.
816     *
817     * @return boolean
818     */
819     function is_option_redaction_libre_enabled() {
820     $collectivite_di = $this->get_dossier_instruction_om_collectivite();
821     return $this->f->is_option_redaction_libre_enabled($collectivite_di);
822     }
823    
824     /**
825 softime 10713 * CONDITION - is_option_parapheur_relecture_enabled
826     *
827     * Vérifie que l'option de relecture lors de l'envoi en signature est activée.
828     *
829     * @return boolean
830     */
831 softime 10808 function is_parapheur_relecture_parameter_enabled() {
832     //Instanciation de la classe electronicsignature
833     $inst_es = $this->get_electronicsignature_instance();
834     if ($inst_es === false) {
835     return false;
836     }
837    
838     if ($inst_es->get_conf('is_forced_view_files') !== 'true' && $inst_es->get_conf('is_forced_view_files') !== true) {
839     return false;
840     }
841    
842     return true;
843 softime 10713 }
844    
845 softime 11876 /**
846     * CONDITION - is_parapheur_annulation_parameter_enabled
847     *
848     * Vérifie que l'option d'annulation de l'envoi en signature est activée.
849     *
850     * @return boolean
851     */
852     function is_parapheur_annulation_parameter_enabled() {
853     //Instanciation de la classe electronicsignature
854     $inst_es = $this->get_electronicsignature_instance();
855     if ($inst_es === false) {
856     return false;
857     }
858 softime 10713
859 softime 11876 if ($inst_es->get_conf('cancel_send') !== 'true' && $inst_es->get_conf('cancel_send') !== true) {
860     return false;
861     }
862    
863     return true;
864     }
865    
866    
867 softime 10713 /**
868 softime 10573 * CONDITION - is_sent_for_signature
869     *
870     * Vérifie que l'instruction a été envoyé à signature
871     *
872     * @return boolean
873     */
874     function is_sent_for_signature() {
875     // Si un parapheur a été configuré
876     // et que le champ id_parapheur_signature n'est pas vide
877     // que le status est différent de "canceled" ou "expired"
878     // alors l'évènement a été envoyé en signature
879 softime 19307 if ($this->has_connector_electronicsignature() === true
880 softime 10573 && empty($this->getVal("id_parapheur_signature")) === false
881 softime 19307 && ($this->getVal("statut_signature") != "canceled"
882 softime 12124 && $this->getVal("statut_signature") != "expired"
883     && $this->getVal("statut_signature") != "finished")) {
884 softime 10573 //
885     return true;
886     }
887    
888     return false;
889     }
890    
891     /**
892     * CONDITION - is_not_sent_for_signature
893     *
894     * Vérifie que l'instruction n'a pas été envoyé à signature
895     *
896     * @return boolean
897     */
898     function is_not_sent_for_signature() {
899 softime 10968 // Contrôle si l'utilisateur possède un bypass
900     $bypass = $this->f->isAccredited($this->get_absolute_class_name()."_definaliser_bypass");
901     if ($bypass == true) {
902     return true;
903     }
904    
905 softime 10573 return !$this->is_sent_for_signature();
906     }
907    
908    
909     /**
910     * CONDITION - is_signed
911     *
912     * Vérifie que l'instruction a été signé
913     *
914     * @return boolean
915     */
916     function is_signed() {
917     // Si un parapheur a été configuré
918     // et que le champ id_parapheur_signature n'est pas vide
919     // et que le statut est égal à "finished"
920     // alors le document de l'instruciton à été signé
921 softime 19307 if ($this->has_connector_electronicsignature() === true
922 softime 10573 && empty($this->getVal("id_parapheur_signature")) === false
923     && $this->getVal("statut_signature") == "finished") {
924     //
925     return true;
926     }
927    
928     return false;
929     }
930    
931 softime 15973 /**
932     * CONDITION - is_signed
933     *
934     * Vérifie que l'instruction n'a pas été signée
935     *
936     * @return boolean
937     */
938     function is_not_signed() {
939     // Contrôle si l'utilisateur possède un bypass
940     $bypass = $this->f->isAccredited($this->get_absolute_class_name()."_definaliser_apres_signature");
941     if ($bypass == true) {
942     return true;
943     }
944 softime 11876
945 softime 15973 return !$this->is_signed();
946     }
947    
948    
949 softime 12433 /**
950     * is_sent_to_cl
951     *
952     * Vérifie que l'instruction a été envoyé au contrôle de légalité
953     *
954     * @return boolean
955     */
956 softime 11418 function is_sent_to_cl() {
957 softime 12433 // Si la case à cocher de l'instruction envoye_cl_platau est à "t"
958     if ($this->getVal('envoye_cl_platau') === 't') {
959     //
960     return true;
961 softime 11418 }
962     //
963     return false;
964     }
965    
966 softime 10808 /**
967     * CONDITION - is_portail_notification
968     *
969     * Vérifie si la notification est une notification de catégorie portail
970     *
971     * @return boolean
972     */
973 softime 10869 function is_portail_notification_sans_annexe() {
974 softime 10808 $collectiviteDi = $this->get_dossier_instruction_om_collectivite();
975 softime 10869 $ev = $this->get_inst_evenement($this->getVal('evenement'));
976 softime 14064 if ($this->f->get_param_option_notification($collectiviteDi) === PORTAL
977 softime 10869 && $ev->getVal('notification') != 'notification_manuelle_annexe'
978     && $ev->getVal('notification') != 'notification_manuelle_annexe_signature_requise'
979     ) {
980 softime 10808 return true;
981     }
982     return false;
983     }
984 softime 10573
985     /**
986 softime 10808 * CONDITION - is_not_portail_notification
987     *
988     * Vérifie si la notification n'est pas une notification de catégorie portail
989     *
990     * @return boolean
991     */
992 softime 10869 function is_not_portail_notification_sans_annexe() {
993     return (! $this->is_portail_notification_sans_annexe());
994 softime 10808 }
995    
996     /**
997 softime 10573 * CONDITION - can_be_signed
998     *
999     * Vérifie que le document de l'instruction peut être envoyé au parapheur pour signature
1000     *
1001     * @return boolean
1002     */
1003     function can_be_signed() {
1004     // Instanciation de l'objet signataire_arrete
1005     $inst_signataire_arrete = $this->f->get_inst__om_dbform(array(
1006     "obj" => "signataire_arrete",
1007     "idx" => $this->getVal("signataire_arrete"),
1008     ));
1009 softime 19307 // Si un parapheur a été configuré, que le document est finalisé, que le signataire
1010 softime 10573 // possède une adresse email, on vérifie le champ id_parapheur_signature
1011     // S'il est vide l'évènement peut être envoyé en signature
1012 softime 19307 // S'il ne l'est pas, alors on vérifie le champ statut_signature
1013 softime 10573 // Si la valeur de ce champ est égal à "canceled" ou "expired"
1014     // alors l'évènement peut être envoyé en signature
1015     if ($this->has_connector_electronicsignature() === true
1016     && $this->getVal("om_final_instruction") == 't'
1017     && empty($inst_signataire_arrete->getVal('email')) === false) {
1018     //
1019     if (empty($this->getVal("id_parapheur_signature")) === true
1020 softime 19307 || $this->getVal("statut_signature") == "canceled"
1021 softime 10573 || $this->getVal("statut_signature") == "expired") {
1022     //
1023     return true;
1024     }
1025     }
1026    
1027     $this->addToLog(__METHOD__."() has_connector_electronicsignature: ".var_export($this->has_connector_electronicsignature(), true), EXTRA_VERBOSE_MODE);
1028     $this->addToLog(__METHOD__."() om_final_instruction: ".var_export($this->getVal("om_final_instruction"), true), EXTRA_VERBOSE_MODE);
1029     $this->addToLog(__METHOD__."() email: ".var_export($inst_signataire_arrete->getVal('email'), true), EXTRA_VERBOSE_MODE);
1030     $this->addToLog(__METHOD__."() id_parapheur_signature: ".var_export($this->getVal("id_parapheur_signature"), true), EXTRA_VERBOSE_MODE);
1031     $this->addToLog(__METHOD__."() statut_signature: ".var_export($this->getVal("statut_signature"), true), EXTRA_VERBOSE_MODE);
1032    
1033     return false;
1034     }
1035    
1036     /**
1037     * CONDITION - has_connector_electronicsignature
1038     *
1039     * Vérifie qu'un parapheur est paramétré
1040     *
1041     * @return boolean
1042     */
1043     function has_connector_electronicsignature() {
1044     $inst_es = $this->get_electronicsignature_instance(false);
1045     if ($inst_es === false) {
1046     return false;
1047     }
1048     return true;
1049     }
1050    
1051     /**
1052     * CONDITION - can_display_parapheur
1053     *
1054 softime 19307 * Vérifie que le fieldset "Suivi Parapheur" soit affichable
1055 softime 10573 *
1056     * @return boolean
1057     */
1058     function can_display_parapheur() {
1059     $evenement_id = $this->getVal("evenement");
1060     $inst_evenement = $this->get_inst_evenement($evenement_id);
1061     if ($this->has_connector_electronicsignature() === true
1062     && $inst_evenement->getVal('lettretype') !== ''
1063     && $inst_evenement->getVal('lettretype') !== null
1064     && (empty($this->getVal("id_parapheur_signature")) === false
1065     || empty($this->getVal("historique_signature")) === false)) {
1066     //
1067     return true;
1068     }
1069    
1070     return false;
1071     }
1072    
1073     /**
1074 softime 10808 * CONDITION - can_display_notification
1075     *
1076 softime 11585 * Vérifie que le champs "Suivi notification" est affichable
1077 softime 10808 *
1078     * @return boolean
1079     */
1080 softime 11585 function can_display_notification_demandeur() {
1081 softime 18436 // Le suivi des notification est affiché si l'instruction a
1082     // des notifications de demandeurs associées
1083     $idsNotifs = $this->get_instruction_notification(
1084     $this->getVal($this->clePrimaire),
1085     array(
1086     'notification_recepisse',
1087     'notification_instruction',
1088     'notification_decision',
1089     ),
1090     true
1091     );
1092     return isset($idsNotifs) && $idsNotifs !== array();
1093 softime 10808 }
1094    
1095     /**
1096 softime 11585 * CONDITION - can_display_notification
1097     *
1098     * Vérifie que le champs "suivi_notification_service" est affichable
1099     *
1100     * @return boolean
1101     */
1102     function can_display_notification_service() {
1103     // Le suivi des notification est affiché si l'événement est notifiable
1104     // et si des notifications ont été envoyées
1105     $evenement_id = $this->getVal("evenement");
1106     $inst_evenement = $this->get_inst_evenement($evenement_id);
1107     if ($this->get_boolean_from_pgsql_value($inst_evenement->getVal('notification_service')) == true) {
1108     // Des notifications ont été envoyé si il existe au moins une notification
1109     // de type notification_service_consulte liées à l'instruction
1110     $idsNotifs = $this->get_instruction_notification(
1111     $this->getVal($this->clePrimaire),
1112     'notification_service_consulte'
1113     );
1114     if (isset($idsNotifs) && $idsNotifs !== array()) {
1115     return true;
1116     }
1117     }
1118     return false;
1119     }
1120    
1121    
1122     /**
1123     * CONDITION - can_display_notification_tiers
1124     *
1125     * Vérifie que le champs "suivi_notification_tiers" est affichable
1126     *
1127     * @return boolean
1128     */
1129     function can_display_notification_tiers() {
1130 softime 18436 // Le suivi des notification est affiché si l'instruction a
1131     // des notifications de tiers associées
1132     $idsNotifs = $this->get_instruction_notification(
1133     $this->getVal($this->clePrimaire),
1134     'notification_tiers_consulte'
1135     );
1136     return isset($idsNotifs) && $idsNotifs !== array();
1137 softime 11585 }
1138    
1139     /**
1140 softime 12654 * CONDITION - can_display_notification_commune
1141     *
1142     * Vérifie que le champs "suivi_notification_commune" est affichable
1143     *
1144     * @return boolean
1145     */
1146     function can_display_notification_commune() {
1147     // Le suivi des notification si il existe au moins une notification
1148     // de type notification_depot_demat liées à l'instruction
1149     $idsNotifs = $this->get_instruction_notification(
1150     $this->getVal($this->clePrimaire),
1151     array('notification_depot_demat', 'notification_commune')
1152     );
1153     if (isset($idsNotifs) && $idsNotifs !== array()) {
1154     return true;
1155     }
1156     return false;
1157     }
1158    
1159     /**
1160 softime 8593 * TREATMENT - disable_edition_integrale.
1161 softime 19307 *
1162 softime 8593 * Cette methode permet de passer la consultation en "lu"
1163     *
1164     * @return boolean true si maj effectué false sinon
1165     */
1166     function disable_edition_integrale() {
1167     // Cette méthode permet d'exécuter une routine en début des méthodes
1168     // dites de TREATMENT.
1169     $this->begin_treatment(__METHOD__);
1170     $this->correct = true;
1171     $valF = array(
1172     "flag_edition_integrale" => false,
1173     "titre_om_htmletat" => null,
1174     "corps_om_htmletatex" => null,
1175     );
1176     $res = $this->f->db->autoExecute(
1177 softime 19307 DB_PREFIXE.$this->table,
1178 softime 8593 $valF,
1179     DB_AUTOQUERY_UPDATE,
1180     $this->clePrimaire."=".$this->getVal($this->clePrimaire)
1181     );
1182     if ($this->f->isDatabaseError($res, true)) {
1183     // Appel de la methode de recuperation des erreurs
1184     $this->erreur_db($res->getDebugInfo(), $res->getMessage(), '');
1185     $this->correct = false;
1186     // Termine le traitement
1187     return $this->end_treatment(__METHOD__, false);
1188     } else {
1189 softime 18876 $this->addToMessage(__("Rédaction par compléments activé."));
1190 softime 8593 return $this->end_treatment(__METHOD__, true);
1191     }
1192    
1193     // Termine le traitement
1194     return $this->end_treatment(__METHOD__, false);
1195     }
1196    
1197     /**
1198     * TREATMENT - enable_edition_integrale.
1199 softime 19307 *
1200 softime 8593 * Cette methode permet de passer la consultation en "lu"
1201     *
1202     * @return boolean true si maj effectué false sinon
1203     */
1204     function enable_edition_integrale() {
1205     // Cette méthode permet d'exécuter une routine en début des méthodes
1206     // dites de TREATMENT.
1207     $this->begin_treatment(__METHOD__);
1208     $this->correct = true;
1209    
1210     // Récupère la collectivite du dossier d'instruction
1211     $dossier_instruction_om_collectivite = $this->get_dossier_instruction_om_collectivite();
1212     $collectivite = $this->f->getCollectivite($dossier_instruction_om_collectivite);
1213     //
1214     $params = array(
1215     "specific" => array(
1216     "corps" => array(
1217     "mode" => "get",
1218     )
1219     ),
1220     );
1221     $result = $this->compute_pdf_output('lettretype', $this->getVal('lettretype'), $collectivite, null, $params);
1222     $corps = $result['pdf_output'];
1223     //
1224     $params = array(
1225     "specific" => array(
1226     "titre" => array(
1227     "mode" => "get",
1228     )
1229     ),
1230     );
1231     $result = $this->compute_pdf_output('lettretype', $this->getVal('lettretype'), $collectivite, null, $params);
1232     $titre = $result['pdf_output'];
1233     //
1234     $valF = array(
1235     "flag_edition_integrale" => true,
1236     "titre_om_htmletat" => $titre,
1237     "corps_om_htmletatex" => $corps,
1238     );
1239     $res = $this->f->db->autoExecute(
1240     DB_PREFIXE.$this->table,
1241     $valF,
1242     DB_AUTOQUERY_UPDATE,
1243     $this->clePrimaire."=".$this->getVal($this->clePrimaire)
1244     );
1245     if ($this->f->isDatabaseError($res, true)) {
1246     // Appel de la methode de recuperation des erreurs
1247     $this->erreur_db($res->getDebugInfo(), $res->getMessage(), '');
1248     $this->correct = false;
1249     // Termine le traitement
1250     return $this->end_treatment(__METHOD__, false);
1251     } else {
1252 softime 18876 $this->addToMessage(__("Rédaction libre activé."));
1253 softime 8593 return $this->end_treatment(__METHOD__, true);
1254     }
1255    
1256     // Termine le traitement
1257     return $this->end_treatment(__METHOD__, false);
1258     }
1259    
1260     /**
1261 softime 14064 * Cette méthode instancie le dossier à partir de l'identifiant passé
1262     * en paramètre et renvoie l'identifiant du dossier d'autorisation (DA)
1263     * associé au dossier.
1264     * Si l'identifiant du dossier n'est pas fourni alors cette méthode
1265     * renverra NULL
1266     *
1267     * @param string identifiant du dossier
1268     * @return null|string null ou identifiant du DA
1269 mbroquet 3730 */
1270     function getNumDemandeAutorFromDossier($id) {
1271     if (!isset($id)) {
1272     return NULL;
1273     }
1274 softime 14064
1275     $dossier = $this->f->get_inst__om_dbform(array(
1276     'obj' => 'dossier',
1277     'idx' => $id,
1278     ));
1279    
1280     return $dossier->getVal('dossier_autorisation');
1281 mbroquet 3730 }
1282    
1283 softime 18436
1284     /**
1285     * Cette méthode permet de récupérer le libelle du type de document
1286     * en instanciant l'objet document_type.
1287 softime 19307 *
1288 softime 18436 * Un évènement peux avoir ou non un type de document, et si c'est le cas,
1289     * on le récupère pour l'afficher.
1290 softime 19307 *
1291 softime 18436 * @return string|NULL Retourne le libelle du type de document ou vide
1292     */
1293     function get_type_document_linked_with_instruction(){
1294     //
1295     $document_type = $this->f->get_inst__om_dbform(array(
1296     'obj' => 'document_type',
1297     'idx' => $this->getVal("document_type_instruction"),
1298     ));
1299     if ($document_type->exists() === true) {
1300 softime 19307 return $document_type->getVal("libelle");
1301 softime 18436 }
1302     return NULL;
1303     }
1304    
1305 softime 19307
1306 mbroquet 3730 function setType(&$form, $maj) {
1307 softime 17542 $data = array('form' => &$form, 'maj' => &$maj);
1308     $this->f->module_manager->run_hooks('setType_pre', $this, $data);
1309    
1310 softime 8593 // Récupération du mode de l'action
1311     $crud = $this->get_action_crud($maj);
1312     // Récupère la collectivité du dossier d'instruction
1313     $collectivite_di = $this->get_dossier_instruction_om_collectivite();
1314 mbroquet 3730
1315 softime 8593 // Cache tous les champs
1316     foreach ($this->champs as $value) {
1317     $form->setType($value, 'hidden');
1318     }
1319 softime 6565
1320 softime 10573 // Les champs historique_signature et statut_signature ne sont pas saisissable dans tous les cas
1321 softime 11228 if ($this->can_display_parapheur() === true && $maj == 3) {
1322 softime 10573 $form->setType('statut_signature', 'selectstatic');
1323     $form->setType('historique_signature', 'jsontotab');
1324     if ($this->getVal('commentaire_signature') == null) {
1325     $form->setType('commentaire_signature', 'hidden');
1326     } else {
1327     $form->setType('commentaire_signature', 'hiddenstatic');
1328     }
1329     }
1330    
1331 softime 11585 // Le champ de suivi des notifications des demandeurs n'est pas affichable dans tous les cas
1332 softime 12654 if ($maj == 3 && $this->can_display_notification_demandeur() === true) {
1333 softime 10808 $form->setType('suivi_notification', 'jsontotab');
1334     }
1335 softime 11585 // Le champ de suivi des notifications des services n'est pas affichable dans tous les cas
1336 softime 12654 if ($maj == 3 && $this->can_display_notification_service() === true) {
1337 softime 11585 $form->setType('suivi_notification_service', 'jsontotab');
1338     }
1339     // Le champ de suivi des notifications des tiers n'est pas affichable dans tous les cas
1340 softime 12654 if ($maj == 3 && $this->can_display_notification_tiers() === true) {
1341 softime 11585 $form->setType('suivi_notification_tiers', 'jsontotab');
1342     }
1343 softime 12654 // Le champ de suivi des notifications des communes n'est pas affichable dans tous les cas
1344     if ($maj == 3 && $this->can_display_notification_commune() === true) {
1345     $form->setType('suivi_notification_commune', 'jsontotab');
1346     }
1347 softime 10808
1348 softime 8593 // MODE AJOUTER
1349     if ($this->getParameter('maj') == 0) {
1350 softime 10573 $form->setType('commentaire', 'textareahidden');
1351     // Si l'option est active passage du champ date en lecture seule
1352     if ($this->f->is_option_date_evenement_instruction_lecture_seule($collectivite_di) === true) {
1353     $form->setType("date_evenement", "hiddenstaticdate");
1354     } else {
1355     $form->setType("date_evenement", "date");
1356     }
1357 softime 8989 if ($this->is_in_context_of_foreign_key("evenement", $this->getParameter("retourformulaire"))) {
1358 softime 8593 $form->setType("evenement", "selecthiddenstatic");
1359     } else {
1360     $form->setType("evenement", "select");
1361     }
1362 softime 8989 if ($this->is_in_context_of_foreign_key("signataire_arrete", $this->getParameter("retourformulaire"))) {
1363 softime 8593 $form->setType("signataire_arrete", "selecthiddenstatic");
1364     } else {
1365     $form->setType("signataire_arrete", "select");
1366     }
1367     if ($this->is_option_redaction_libre_enabled() === true) {
1368     $form->setType("flag_edition_integrale", "select");
1369     }
1370 mbroquet 3730 }
1371    
1372 softime 8593 // MODE MODIFIER
1373     if ($this->getParameter('maj') == 1) {
1374 softime 10573 // Si l'option est active passage du champ date en lecture seule
1375     if ($this->f->is_option_date_evenement_instruction_lecture_seule($collectivite_di) === true) {
1376     $form->setType("date_evenement", "hiddenstaticdate");
1377     } else {
1378     $form->setType("date_evenement", "date");
1379     }
1380 softime 8593 $form->setType("evenement", "selecthiddenstatic");
1381     if ($this->has_an_edition() === true) {
1382 softime 18436 $form->setType('document_type_instruction', 'selecthiddenstatic');
1383 softime 8593 $form->setType('lettretype', 'hiddenstatic');
1384 softime 8989 if ($this->is_in_context_of_foreign_key("signataire_arrete", $this->getParameter("retourformulaire"))) {
1385 softime 8593 $form->setType("signataire_arrete", "selecthiddenstatic");
1386     } else {
1387     $form->setType("signataire_arrete", "select");
1388     }
1389     if ($this->getVal("flag_edition_integrale") == "t") {
1390     $form->setType("titre_om_htmletat", "htmlEtat");
1391     $form->setType("corps_om_htmletatex", "htmlEtatEx");
1392     } else {
1393     $form->setType("complement_om_html", "html");
1394     $form->setType("complement2_om_html", "html");
1395     $form->setType("complement3_om_html", "html");
1396     $form->setType("complement4_om_html", "html");
1397     $form->setType('bible_auto', 'httpclick');
1398     $form->setType('bible', 'httpclick');
1399     $form->setType('bible2', 'httpclick');
1400     $form->setType('bible3', 'httpclick');
1401     $form->setType('bible4', 'httpclick');
1402     }
1403     if ($this->f->is_option_preview_pdf_enabled($collectivite_di) === true) {
1404     //
1405     $form->setType('btn_refresh', 'httpclickbutton');
1406     $form->setType('btn_preview', 'httpclickbutton');
1407     $form->setType('btn_redaction', 'httpclickbutton');
1408 softime 11876 // /!\ le type du champs est utilisé dans un selecteur dans le jscript.js
1409     // pour identifiant le champ de prévisualisation et régler sa taille à
1410     // l'affichage du champ. En cas de modification, le selecteur doit également
1411     // être mis à jour
1412 softime 11418 $form->setType('live_preview', 'previsualiser_pdf');
1413 softime 7521 }
1414 softime 8593
1415 mbroquet 3730 // necessaire pour calcul de date en modification
1416     //$form->setType('delai', 'hiddenstatic');
1417     // les administrateurs technique et fonctionnel peuvent
1418     // modifier tous les champs de date
1419     // si l'instruction a déjà été finalisée au moins une fois
1420 softime 7996 if (($this->f->isAccredited(array($this->get_absolute_class_name(), $this->get_absolute_class_name()."modification_dates"), "OR")
1421 softime 6565 || $this->f->isAccredited(array('instruction', 'instruction_modification_dates'), "OR"))
1422 mbroquet 3730 && $this->getVal("date_finalisation_courrier") != '') {
1423 softime 8593 //
1424 mbroquet 3730 $form->setType('date_envoi_signature', 'date');
1425     $form->setType('date_retour_signature', 'date');
1426 softime 10573 if ($this->is_sent_for_signature() === true
1427     && $this->is_signed() === true) {
1428     //
1429     $form->setType("date_envoi_signature", "datereadonly");
1430     $form->setType("date_retour_signature", "datereadonly");
1431     }
1432 mbroquet 3730 $form->setType('date_envoi_rar', 'date');
1433     $form->setType('date_retour_rar', 'date');
1434     $form->setType('date_envoi_controle_legalite', 'date');
1435 softime 11418 if ($this->is_sent_to_cl() === true) {
1436 softime 12124 $form->setType("date_envoi_controle_legalite", "datedisabled");
1437 softime 11418 }
1438 mbroquet 3730 $form->setType('date_retour_controle_legalite', 'date');
1439     $form->setType('date_finalisation_courrier', 'date');
1440     }
1441     }
1442     }
1443    
1444 softime 10808 // MODE CONSULTER + SUPPRIMER + SUIVI DES DATES 125 + NOTIFICATION MANUELLE
1445 softime 8593 if ($this->getParameter('maj') == 3
1446     || $this->getParameter('maj') == 2
1447 softime 10808 || $this->getParameter('maj') == 125
1448     || $this->getParameter('maj') == 410) {
1449 softime 8593 //
1450     $form->setType("date_evenement", "datestatic");
1451     $form->setType("evenement", "selecthiddenstatic");
1452     if ($this->has_an_edition() === true) {
1453 softime 18436 $form->setType("document_type_instruction", "selecthiddenstatic");
1454 softime 8593 $form->setType('lettretype', 'hiddenstatic');
1455     $form->setType("signataire_arrete", "selecthiddenstatic");
1456     if ($this->getVal("om_final_instruction") == 't') {
1457     $form->setType('om_final_instruction_utilisateur', 'textareastatic');
1458     } else {
1459     $form->setType('om_final_instruction_utilisateur', 'hidden');
1460     }
1461     }
1462 softime 10573 if ($this->evenement_has_a_commentaire($this->getVal('evenement')) === true ) {
1463     $form->setType('commentaire', 'textareastatic');
1464     }
1465 mbroquet 3730 }
1466    
1467 softime 10808 // MODE CONSULTER + SUPPRIMER + NOTIFICATION MANUELLE
1468     if ($this->getParameter('maj') == 3
1469     || $this->getParameter('maj') == 2
1470     || $this->getParameter('maj') == 410) {
1471 softime 10573 // Si il n'y a pas de lettre type (edition) associé à l'événement
1472     // les dates de suivi ne sont pas affichée
1473 softime 8593 if ($this->has_an_edition() === true) {
1474 softime 10573 $form->setType('date_envoi_signature', 'datestatic');
1475     $form->setType('date_retour_signature', 'datestatic');
1476     $form->setType('date_envoi_rar', 'datestatic');
1477     $form->setType('date_retour_rar', 'datestatic');
1478     $form->setType('date_envoi_controle_legalite', 'datestatic');
1479     $form->setType('date_retour_controle_legalite', 'datestatic');
1480     $form->setType('date_finalisation_courrier', 'datestatic');
1481 softime 8593 if ($this->getVal("flag_edition_integrale") == "t") {
1482     $form->setType("titre_om_htmletat", "htmlstatic");
1483     $form->setType("corps_om_htmletatex", "htmlstatic");
1484     } else {
1485     $form->setType("complement_om_html", "htmlstatic");
1486     $form->setType("complement2_om_html", "htmlstatic");
1487     $form->setType("complement3_om_html", "htmlstatic");
1488     $form->setType("complement4_om_html", "htmlstatic");
1489     }
1490 mbroquet 3730 }
1491     }
1492 softime 8593
1493     // MODE SUIVI DES DATES 125
1494     if ($this->getParameter('maj') == 125) {
1495     $form->setType("date_evenement", "hiddenstaticdate");
1496     $form->setType('om_final_instruction_utilisateur', 'hiddenstatic');
1497     $form->setType('date_envoi_signature', 'date');
1498     $form->setType('date_retour_signature', 'date');
1499 softime 10573 if ($this->is_sent_for_signature() === true
1500     || $this->is_signed() === true) {
1501     //
1502     $form->setType("date_envoi_signature", "datereadonly");
1503     $form->setType("date_retour_signature", "datereadonly");
1504     }
1505 softime 8593 $form->setType('date_envoi_rar', 'date');
1506     $form->setType('date_retour_rar', 'date');
1507     $form->setType('date_envoi_controle_legalite', 'date');
1508 softime 11418 if ($this->is_sent_to_cl() === true) {
1509 softime 12124 $form->setType("date_envoi_controle_legalite", "datedisabled");
1510 softime 11418 }
1511 softime 8593 $form->setType('date_retour_controle_legalite', 'date');
1512     $form->setType('date_finalisation_courrier', 'date');
1513     }
1514 softime 10573
1515     if ($maj == 401) {
1516     foreach ($this->champs as $champ) {
1517     $form->setType($champ, 'hidden');
1518     }
1519 softime 11418 $form->setType('preview_edition', 'previsualiser');
1520 softime 10573 }
1521 softime 12124
1522 softime 19307 // Si l'instruction a été envoyé au contrôle de légalité et que la
1523     // tâche envoi_cl lié n'a pas encore été traité il faut indiquer à
1524 softime 12124 // l'utilisateur que l'envoi au cl est en cours de traitement.
1525 softime 18436 if ($this->is_sent_to_cl() === true
1526 softime 12124 && $maj == 3) {
1527 softime 18436 $form->setType("date_envoi_controle_legalite", "datestatic");
1528     if (empty($this->getVal('date_envoi_controle_legalite'))) {
1529     $form->setType("date_envoi_controle_legalite", "hiddenstatic");
1530     }
1531 softime 12124 }
1532 softime 18436 $data = array('form' => &$form, 'maj' => &$maj, 'collectivite_di' => $collectivite_di);
1533 softime 17542 $this->f->module_manager->run_hooks('setType_post', $this, $data);
1534 mbroquet 3730 }
1535    
1536 softime 8593 function setOnchange(&$form,$maj){
1537 softime 17542 $this->f->log(__METHOD__, 'BEGIN');
1538     $data = array('form' => &$form, 'maj' => &$maj);
1539     $this->f->module_manager->run_hooks('setOnchange_pre', $this, $data);
1540    
1541 softime 8593 parent::setOnchange($form,$maj);
1542    
1543     // MODE AJOUTER
1544     if ($this->getParameter('maj') == 0) {
1545 softime 10573 $form->setOnchange(
1546     "evenement",
1547     "manage_instruction_evenement_lettretype(this.value, '".addslashes($this->getParameter('idxformulaire'))."');
1548     manage_instruction_evenement_commentaire(this.value, '".addslashes($this->getParameter('idxformulaire'))."');"
1549     );
1550 softime 8593 }
1551 softime 17542
1552     $data = array('form' => &$form, 'maj' => &$maj);
1553     $this->f->module_manager->run_hooks('setOnchange_post', $this, $data);
1554     $this->f->log(__METHOD__, 'END');
1555 softime 8593 }
1556    
1557     function evenement_has_an_edition($evenement_id) {
1558     $evenement = $this->get_inst_evenement($evenement_id);
1559     $lettretype = $evenement->getVal('lettretype');
1560     if ($lettretype !== '' && $lettretype !== null) {
1561     return true;
1562     }
1563     return false;
1564     }
1565    
1566     function view_evenement_has_an_edition_json() {
1567     $json_return = array(
1568     "lettretype" => $this->evenement_has_an_edition($this->f->get_submitted_get_value('evenement_id')),
1569     "option_redaction_libre_enabled" => $this->is_option_redaction_libre_enabled(),
1570     );
1571     echo json_encode($json_return);
1572     }
1573    
1574 softime 10573 function evenement_has_a_commentaire($evenement_id) {
1575     $evenement = $this->get_inst_evenement($evenement_id);
1576     return $this->get_boolean_from_pgsql_value($evenement->getVal('commentaire'));
1577     }
1578    
1579     function view_evenement_has_a_commentaire_json() {
1580     $json_return = array(
1581     "commentaire" => $this->evenement_has_a_commentaire($this->f->get_submitted_get_value('evenement_id'))
1582     );
1583     echo json_encode($json_return);
1584     }
1585    
1586 softime 11418
1587 softime 8989 /**
1588 softime 18876 * CONDITION - can_be_sent_to_cl
1589 softime 8989 *
1590 softime 11418 * Vérifie que le contrôle de légalité est disponible
1591     *
1592     * @return boolean
1593     */
1594 softime 18876 function can_be_sent_to_cl() {
1595 softime 18436 $inst_evenement = $this->get_inst_evenement($this->getVal('evenement'));
1596    
1597     // Si événement est paramétré pour envoyer le contrôle de légalité
1598 softime 11418 // par Plat'AU
1599 softime 18436 if ($inst_evenement->getVal('envoi_cl_platau') === 't') {
1600 softime 11418 $inst_di = $this->get_inst_dossier($this->getVal('dossier'));
1601 softime 19307
1602 softime 18436 // S'il n'y a pas déjà eu un envoi au CL (flag envoye_cl_platau)
1603     // Que le type de dossier d'autorisation est transmissible à Plat'AU
1604     // Que l'état de transmission du dossier n'est pas en 'jamais_transmissible'
1605     if ($this->getVal('envoye_cl_platau') === 'f'
1606 softime 19307 && $this->f->is_type_dossier_platau($this->getVal('dossier')) === true
1607 softime 11418 && $inst_di->getVal('etat_transmission_platau') !== 'jamais_transmissible') {
1608 softime 19307
1609     // Si l'instruction n'a pas d'édition liée alors elle peut être envoyé au CL
1610 softime 18436 if ($this->has_an_edition() === false) {
1611     return true;
1612     }
1613    
1614     // Si l'instruction a une édition et que la date de retour signature est renseignée
1615 softime 19307 // et que la date d'envoi au contrôle légalité n'est pas renseignée alors on peut
1616 softime 18436 // envoyer l'instruction au CL
1617     if ($this->has_an_edition() === true
1618     && empty($this->getVal('date_retour_signature')) === false
1619     && empty($this->getVal('date_envoi_controle_legalite')) === true) {
1620    
1621     return true;
1622     }
1623 softime 11418 }
1624     }
1625     //
1626     return false;
1627     }
1628    
1629     /**
1630     *
1631 softime 8989 * @return string
1632     */
1633     function get_var_sql_forminc__sql_signataire_arrete() {
1634 softime 11585 return sprintf(
1635     "SELECT
1636     signataire_arrete.signataire_arrete,
1637     CONCAT_WS(
1638     ' - ',
1639     CONCAT_WS(' ', signataire_arrete.prenom, signataire_arrete.nom),
1640     signataire_habilitation.libelle,
1641     signataire_arrete.description
1642     )
1643     FROM
1644     %1\$ssignataire_arrete
1645     LEFT JOIN %1\$ssignataire_habilitation
1646     ON signataire_arrete.signataire_habilitation = signataire_habilitation.signataire_habilitation
1647     WHERE
1648     ((signataire_arrete.om_validite_debut IS NULL
1649     AND (signataire_arrete.om_validite_fin IS NULL
1650     OR signataire_arrete.om_validite_fin > CURRENT_DATE))
1651     OR (signataire_arrete.om_validite_debut <= CURRENT_DATE
1652     AND (signataire_arrete.om_validite_fin IS NULL
1653     OR signataire_arrete.om_validite_fin > CURRENT_DATE)))
1654     ORDER BY
1655     signataire_arrete.prenom,
1656     signataire_arrete.nom",
1657     DB_PREFIXE
1658     );
1659 softime 8989 }
1660    
1661     /**
1662     *
1663     * @return string
1664     */
1665     function get_var_sql_forminc__sql_signataire_arrete_by_id() {
1666 softime 11585 return sprintf(
1667     "SELECT
1668     signataire_arrete.signataire_arrete,
1669     CONCAT_WS(
1670     ' - ',
1671     CONCAT_WS(' ', signataire_arrete.prenom, signataire_arrete.nom),
1672     signataire_habilitation.libelle,
1673     signataire_arrete.description
1674     )
1675     FROM
1676     %1\$ssignataire_arrete
1677     LEFT JOIN %1\$ssignataire_habilitation
1678     ON signataire_arrete.signataire_habilitation = signataire_habilitation.signataire_habilitation
1679     WHERE
1680     signataire_arrete.signataire_arrete = <idx>",
1681     DB_PREFIXE
1682     );
1683 softime 8989 }
1684    
1685     /**
1686     *
1687     * @return string
1688     */
1689     function get_var_sql_forminc__sql_signataire_arrete_by_di() {
1690 softime 11585 return sprintf(
1691     "SELECT
1692     signataire_arrete.signataire_arrete,
1693     CONCAT_WS(
1694     ' - ',
1695     CONCAT_WS(' ', signataire_arrete.prenom, signataire_arrete.nom),
1696     signataire_habilitation.libelle,
1697     signataire_arrete.description
1698     )
1699     FROM
1700     %1\$ssignataire_arrete
1701     LEFT JOIN %1\$som_collectivite
1702     ON signataire_arrete.om_collectivite = om_collectivite.om_collectivite
1703     LEFT JOIN %1\$ssignataire_habilitation
1704     ON signataire_arrete.signataire_habilitation = signataire_habilitation.signataire_habilitation
1705     WHERE
1706     ((signataire_arrete.om_validite_debut IS NULL
1707     AND (signataire_arrete.om_validite_fin IS NULL
1708     OR signataire_arrete.om_validite_fin > CURRENT_DATE))
1709     OR (signataire_arrete.om_validite_debut <= CURRENT_DATE
1710     AND (signataire_arrete.om_validite_fin IS NULL
1711     OR signataire_arrete.om_validite_fin > CURRENT_DATE)))
1712     AND (om_collectivite.niveau = '2'
1713     OR signataire_arrete.om_collectivite = <collectivite_di>)
1714     ORDER BY
1715     signataire_arrete.prenom, signataire_arrete.nom",
1716     DB_PREFIXE
1717     );
1718 softime 8989 }
1719    
1720     /**
1721     *
1722     * @return string
1723     */
1724     function get_var_sql_forminc__sql_signataire_arrete_defaut() {
1725 softime 11585 return sprintf(
1726     "SELECT
1727     signataire_arrete.signataire_arrete,
1728     CONCAT_WS(
1729     ' - ',
1730     CONCAT_WS(' ', signataire_arrete.prenom, signataire_arrete.nom),
1731     signataire_habilitation.libelle,
1732     signataire_arrete.description
1733     )
1734     FROM
1735     %1\$ssignataire_arrete
1736     LEFT JOIN %1\$ssignataire_habilitation
1737     ON signataire_arrete.signataire_habilitation = signataire_habilitation.signataire_habilitation
1738     WHERE
1739     ((signataire_arrete.om_validite_debut IS NULL
1740     AND (signataire_arrete.om_validite_fin IS NULL
1741     OR signataire_arrete.om_validite_fin > CURRENT_DATE))
1742     OR (signataire_arrete.om_validite_debut <= CURRENT_DATE
1743     AND (signataire_arrete.om_validite_fin IS NULL
1744     OR signataire_arrete.om_validite_fin > CURRENT_DATE)))
1745     AND signataire_arrete.defaut IS TRUE
1746     ORDER BY
1747     signataire_arrete.prenom, signataire_arrete.nom",
1748     DB_PREFIXE
1749     );
1750 softime 8989 }
1751    
1752     /**
1753     *
1754     * @return string
1755     */
1756     function get_var_sql_forminc__sql_signataire_arrete_defaut_by_di() {
1757 softime 11585 return sprintf(
1758     "SELECT
1759     signataire_arrete.signataire_arrete,
1760     CONCAT_WS(
1761     ' - ',
1762     CONCAT_WS(' ', signataire_arrete.prenom, signataire_arrete.nom),
1763     signataire_habilitation.libelle,
1764     signataire_arrete.description
1765     )
1766     FROM
1767     %1\$ssignataire_arrete
1768     LEFT JOIN %1\$ssignataire_habilitation
1769     ON signataire_arrete.signataire_habilitation = signataire_habilitation.signataire_habilitation
1770     LEFT JOIN %1\$som_collectivite
1771     ON signataire_arrete.om_collectivite = om_collectivite.om_collectivite
1772     WHERE
1773     ((signataire_arrete.om_validite_debut IS NULL
1774     AND (signataire_arrete.om_validite_fin IS NULL
1775     OR signataire_arrete.om_validite_fin > CURRENT_DATE))
1776     OR (signataire_arrete.om_validite_debut <= CURRENT_DATE
1777     AND (signataire_arrete.om_validite_fin IS NULL
1778     OR signataire_arrete.om_validite_fin > CURRENT_DATE)))
1779     AND signataire_arrete.defaut IS TRUE
1780     AND (om_collectivite.niveau = '2'
1781     OR signataire_arrete.om_collectivite = <collectivite_di>)
1782     ORDER BY
1783     signataire_arrete.prenom,
1784     signataire_arrete.nom",
1785     DB_PREFIXE
1786     );
1787 softime 8989 }
1788    
1789     /**
1790 softime 14542 * Renvoie sous la forme d'un tableau la liste des événements pouvant être ajoutés au dossier
1791     * dont l'identifiant a été passé en paramètre dans l'url.
1792     *
1793     * @return array
1794     */
1795     function get_var_sql_forminc__sql_evenement() {
1796     // Récupération du numéro de dossier
1797 softime 17542 $dossier = $this->getParameter("idxformulaire") ?? $_GET['idxformulaire'];
1798     $this->f->log(__METHOD__, 'dossier: '.var_export($dossier, true));
1799 softime 14542 // Si changement de décision par instructeur commune
1800     $filter = '';
1801     if ($this->f->isUserInstructeur() === true
1802 softime 17542 // TODO faire autrement car ça instancier le dossier et donc charge ses modules !
1803 softime 14542 && $this->getDivisionFromDossier($dossier) != $_SESSION["division"]
1804     && $this->isInstrCanChangeDecision($dossier) === true) {
1805     $filter = "AND evenement.type IN ('arrete', 'changement_decision')";
1806     }
1807     // Récupération du libellé, de l'identifiant des évènement et d'un booléen permettant
1808     // de déterminer si il s'agit d'évènements suggérés.
1809     $qres = $this->f->get_all_results_from_db_query(
1810     sprintf(
1811     'SELECT
1812     DISTINCT(evenement.evenement),
1813     evenement.libelle,
1814     -- Si l evenement est suggérés alors il sera lié à la table des événements suggérés du dossier
1815     CASE WHEN evenement_suggere_dossier.evenement IS NULL
1816     THEN FALSE
1817     ELSE TRUE
1818     END AS is_suggested
1819     FROM
1820     -- Jointures permettant de récupérer la liste des évènements compatibles avec le dossier
1821     -- selon le type de dossier et l état du dossier.
1822     %1$sevenement
1823     JOIN %1$slien_dossier_instruction_type_evenement
1824     ON evenement.evenement = lien_dossier_instruction_type_evenement.evenement
1825     JOIN %1$stransition
1826     ON evenement.evenement = transition.evenement
1827     JOIN %1$sdossier
1828     ON lien_dossier_instruction_type_evenement.dossier_instruction_type = dossier.dossier_instruction_type
1829     AND transition.etat = dossier.etat
1830     -- Jointures avec une sous requêtes servant à récupérer la liste des évènements suggérés du dossier.
1831     LEFT JOIN (
1832     SELECT
1833     lien_sig_contrainte_evenement.evenement,
1834     dossier.dossier
1835     FROM
1836     %1$slien_sig_contrainte_evenement
1837     JOIN %1$ssig_contrainte
1838     ON lien_sig_contrainte_evenement.sig_contrainte = sig_contrainte.sig_contrainte
1839     JOIN %1$slien_sig_contrainte_dossier_instruction_type
1840     ON sig_contrainte.sig_contrainte = lien_sig_contrainte_dossier_instruction_type.sig_contrainte
1841     JOIN %1$slien_sig_contrainte_om_collectivite
1842     ON sig_contrainte.sig_contrainte = lien_sig_contrainte_om_collectivite.sig_contrainte
1843     JOIN %1$scontrainte
1844     ON sig_contrainte.libelle = contrainte.libelle
1845     JOIN %1$sdossier_contrainte
1846     ON contrainte.contrainte = dossier_contrainte.contrainte
1847     JOIN %1$sdossier
1848     ON dossier_contrainte.dossier = dossier.dossier
1849     AND lien_sig_contrainte_dossier_instruction_type.dossier_instruction_type = dossier.dossier_instruction_type
1850     JOIN %1$som_collectivite
1851     ON lien_sig_contrainte_om_collectivite.om_collectivite = om_collectivite.om_collectivite
1852     AND (dossier.om_collectivite = om_collectivite.om_collectivite
1853     OR om_collectivite.niveau = \'2\')
1854     ) AS evenement_suggere_dossier
1855     ON evenement.evenement = evenement_suggere_dossier.evenement
1856     AND dossier.dossier = evenement_suggere_dossier.dossier
1857     WHERE
1858     dossier.dossier = \'%2$s\'
1859     %3$s
1860     ORDER BY
1861     is_suggested DESC,
1862     evenement.libelle',
1863     DB_PREFIXE,
1864     $this->f->db->escapeSimple($dossier),
1865     $filter
1866     ),
1867     array(
1868     "origin" => __METHOD__
1869     )
1870     );
1871     return $qres['result'];
1872     }
1873    
1874     /**
1875     * Récupère un tableau contenant des évènements de la forme :
1876     * $events = array(
1877     * 1 => array(
1878     * 'libelle' => 'evenement_libelle',
1879     * 'evenement' => 'identifiant_evenement',
1880     * 'is_suggested' => true/false -> booleen indiquant si c'est un événement suggéré
1881     * ))
1882     * Et le transforme pour pouvoir l'utiliser pour le remplissage d'un select de formulaire.
1883     *
1884     * Le format de sorti est le suivant :
1885     * $select = array(
1886     * 0 => array( -> liste des id des événements
1887     * '0' => '',
1888     * '1' => array(
1889     * '0' => array(), -> liste des id des événements suggérés
1890     * '1' => array(), -> liste des libelles des événements suggérés
1891     * ),
1892     * ...,
1893     * n => 'id_evenement_n'
1894     * ),
1895     * 1 => array(
1896     * '0' => '__('choisir')." ".__('evenement')',
1897     * '1' => '💡 Suggestions',
1898     * ...,
1899     * 'n' => 'libelle_evenement_n',
1900     * )
1901     * )
1902     *
1903     * @param array tableau des événements
1904     * @return array
1905     */
1906     protected function convert_events_array_to_select_format($events) {
1907     // Remplissage du tableau du select en incluant le groupe des instructions suggérées.
1908     $contenu = array(
1909     0 => array("",),
1910     1 => array(__('choisir')." ".__('evenement'),)
1911     );
1912    
1913     if (! empty($events)) {
1914     // S'il y a des évènements suggérés extraction de ces événements et mise en place du groupe
1915     $suggested_event_group = array_filter($events, function($a) {
1916     return $a['is_suggested'] === 't';
1917     });
1918     if (! empty($suggested_event_group)) {
1919     // Prépare les données qui permettront d'afficher le groupe des événements
1920     // suggérés.
1921     $values = array();
1922     $labels = array();
1923     foreach ($suggested_event_group as $index => $suggested_event) {
1924     $values[] = $suggested_event['evenement'];
1925     $labels[] = $suggested_event['libelle'];
1926     // Supprime les évènements suggérés de la liste des évènements
1927     unset($events[$index]);
1928     }
1929     // Remplissage du select pour le groupe
1930     $contenu[0][] = array($values, $labels);
1931     $contenu[1][] = __('💡 Suggestions');
1932     }
1933 softime 19307
1934 softime 14542 // Remplissage du select
1935     foreach ($events as $event) {
1936     $contenu[0][] = $event['evenement'];
1937     $contenu[1][] = $event['libelle'];
1938     }
1939     }
1940     return $contenu;
1941     }
1942    
1943     /**
1944 softime 8989 * SETTER_FORM - setSelect.
1945     *
1946     * @return void
1947     */
1948     function setSelect(&$form, $maj, &$dnu1 = null, $dnu2 = null) {
1949     //parent::setSelect($form, $maj);
1950 mbroquet 3730 /**
1951     * On ne surcharge pas la méthode parent car une requête sur la table
1952     * dossier est mauvaise pour les performances, car la requête qui
1953     * concerne evenement est plus complexe que celle générée et car les
1954     * champs action, avis_decision et etat ne sont pas utilisés comme des
1955     * select
1956     */
1957     //// action
1958 softime 8989 //$this->init_select($form, $this->f->db, $maj, null, "action",
1959 mbroquet 3730 // $sql_action, $sql_action_by_id, false);
1960    
1961     //// avis_decision
1962 softime 8989 //$this->init_select($form, $this->f->db, $maj, null, "avis_decision",
1963 mbroquet 3730 // $sql_avis_decision, $sql_avis_decision_by_id, false);
1964    
1965     //// dossier
1966 softime 8989 //$this->init_select($form, $this->f->db, $maj, null, "dossier",
1967 mbroquet 3730 // $sql_dossier, $sql_dossier_by_id, false);
1968    
1969     //// etat
1970 softime 8989 //$this->init_select($form, $this->f->db, $maj, null, "etat",
1971 mbroquet 3730 // $sql_etat, $sql_etat_by_id, false);
1972    
1973     //// evenement
1974 softime 8989 //$this->init_select($form, $this->f->db, $maj, null, "evenement",
1975 mbroquet 3730 // $sql_evenement, $sql_evenement_by_id, false);
1976    
1977     // signataire_arrete
1978     // si contexte DI
1979     if ($this->getParameter("retourformulaire") == "dossier"
1980 softime 12847 || $this->f->contexte_dossier_instruction()) {
1981 mbroquet 3730 // on recupère les signataires de la multicollectivité et de celle du DI
1982 softime 7996 $di = $this->f->get_inst__om_dbform(array(
1983     "obj" => "dossier_instruction",
1984     "idx" => $this->getParameter('idxformulaire'),
1985     ));
1986 softime 8989 $sql_signataire_arrete_by_di = str_replace(
1987     '<collectivite_di>',
1988     $di->getVal("om_collectivite"),
1989     $this->get_var_sql_forminc__sql("signataire_arrete_by_di")
1990     );
1991     $this->init_select(
1992     $form,
1993     $this->f->db,
1994     $maj,
1995     null,
1996     "signataire_arrete",
1997     $sql_signataire_arrete_by_di,
1998     $this->get_var_sql_forminc__sql("signataire_arrete_by_id"),
1999     true
2000     );
2001 mbroquet 3730 } else {
2002 softime 8989 $this->init_select(
2003     $form,
2004     $this->f->db,
2005     $maj,
2006     null,
2007     "signataire_arrete",
2008     $this->get_var_sql_forminc__sql("signataire_arrete"),
2009     $this->get_var_sql_forminc__sql("signataire_arrete_by_id"),
2010     true
2011     );
2012 mbroquet 3730 }
2013    
2014     /**
2015     * Gestion du filtre sur les événements de workflow disponibles
2016     * On récupère ici en fonction de l'état du dossier d'instruction en
2017     * cours et du type du dossier d'instruction en cours la liste
2018     * événements disponibles.
2019     */
2020     if ($maj == 0) {
2021 softime 14542 $evenements = $this->get_var_sql_forminc__sql_evenement();
2022     $form->setSelect("evenement", $this->convert_events_array_to_select_format($evenements));
2023 mbroquet 3730 } else {
2024 softime 14064 // Instanciation de l'événement pour récupérer son libellé
2025     $evenement = $this->f->get_inst__om_dbform(array(
2026     "obj" => "evenement",
2027     "idx" => $this->getVal("evenement"),
2028     ));
2029    
2030 mbroquet 3730 $contenu = array(
2031     0 => array($this->getVal("evenement"),),
2032 softime 14064 1 => array($evenement->getVal('libelle'),)
2033 mbroquet 3730 );
2034     $form->setSelect("evenement", $contenu);
2035     }
2036    
2037     /**
2038     * Gesion des liens vers la bible
2039     */
2040     // lien bible_auto
2041 softime 18876 $contenu = array(__("automatique"));
2042 mbroquet 3730 $form->setSelect("bible_auto",$contenu);
2043     // lien bible1
2044 softime 18876 $contenu = array(__("bible"));
2045 mbroquet 3730 $form->setSelect("bible",$contenu);
2046     // lien bible2
2047 softime 18876 $contenu = array(__("bible"));
2048 mbroquet 3730 $form->setSelect("bible2",$contenu);
2049     // lien bible3
2050 softime 18876 $contenu = array(__("bible"));
2051 mbroquet 3730 $form->setSelect("bible3",$contenu);
2052     // lien bible4
2053 softime 18876 $contenu = array(__("bible"));
2054 mbroquet 3730 $form->setSelect("bible4",$contenu);
2055 softime 7521
2056     if ($maj == 1) {
2057     $base64 = $this->init_pdf_temp();
2058     $form->setSelect('live_preview', array('base64'=>$base64));
2059 softime 18876 $form->setSelect("btn_refresh", array(__('Prévisualiser')));
2060     $form->setSelect("btn_preview", array(__('Prévisualiser >>')));
2061     $form->setSelect("btn_redaction", array(__('<< Rédiger')));
2062 softime 7521 }
2063 softime 8593
2064     // Selection du type de rédaction à l'ajout
2065     $content = array(
2066     0 => array('f', 't', ),
2067 softime 18876 1 => array(__('Rédaction par compléments'), __('Rédaction libre'), ),
2068 softime 8593 );
2069     $form->setSelect('flag_edition_integrale', $content);
2070 softime 10573
2071     $contenu = array();
2072     foreach(array('waiting', 'in_progress', 'canceled', 'expired', 'finished') as $value) {
2073     $contenu[0][] = $value;
2074     $contenu[1][] = $this->get_trad_for_statut($value);
2075     }
2076     $form->setSelect('statut_signature', $contenu);
2077    
2078    
2079     if ($maj == 401) {
2080 softime 17036 $idx = $this->getParameter("idx");
2081     $dossier = $this->getParameter("idxformulaire");
2082     if ( strpos($idx, 'STORAGE_') !== FALSE) {
2083     $idx = substr($idx, 8);
2084     $model = 'storage';
2085     $champ = 'uid';
2086     $object = $this->f->get_inst__om_dbform(array(
2087     "obj" => $model,
2088     "idx" => $idx,
2089     ));
2090 softime 19307
2091 softime 17036 $file = $this->f->storage->get($object->getVal($champ));
2092     $label = $file['metadata']['filename'];
2093     $href =sprintf(
2094     '../app/index.php?module=form&snippet=file&obj=storage&champ=uid&id=%1$s',
2095     $idx
2096     );
2097     $this->addToLog(__METHOD__."(): file['metadata']['filename'] = ".$file['metadata']['filename']." ", DEBUG_MODE);
2098     $this->val['preview_edition'] = '';
2099     }else{
2100 softime 18436 $label = $this->getVal("fichier_instruction_name");
2101 softime 17036 $href =sprintf(
2102     '../app/index.php?module=form&snippet=file&obj=instruction&champ=om_fichier_instruction&id=%1$s',
2103     $this->getVal($this->clePrimaire)
2104     );
2105     $file = $this->f->storage->get($this->getVal('om_fichier_instruction'));
2106     }
2107    
2108 softime 11418 $form->setSelect('preview_edition', array(
2109     'base64' => base64_encode($file['file_content']),
2110     'mimetype' => $file['metadata']['mimetype'],
2111 softime 17036 'label' => $label,
2112     'href' => $href
2113 softime 11418 ));
2114 softime 10573 }
2115 softime 19307
2116 softime 18436 // document_type_instruction
2117     $this->init_select(
2118 softime 19307 $form,
2119 softime 18436 $this->f->db,
2120     $maj,
2121     null,
2122     "document_type_instruction",
2123     $this->get_var_sql_forminc__sql("document_type_instruction"),
2124     $this->get_var_sql_forminc__sql("document_type_instruction_by_id"),
2125 softime 19307 true,
2126     false,
2127     '',
2128     $maj == 999 ? true : false
2129 softime 18436 );
2130 mbroquet 3730 }
2131    
2132 softime 8989 function cleSecondaire($id, &$dnu1 = null, $val = array(), $dnu2 = null) {
2133 mbroquet 3730 //
2134 softime 11228 // Vérifie uniquementla cle secondaire : demande
2135     $this->rechercheTable($this->f->db, "demande", "instruction_recepisse", $id);
2136 softime 19307
2137 mbroquet 3730 $id = $this->getVal($this->clePrimaire);
2138    
2139 softime 19307 //Requête de vérification que cet événement d'instruction n'est pas lié
2140 mbroquet 3730 //à la création d'un dossier d'instruction
2141 softime 14064 $qres = $this->f->get_one_result_from_db_query(
2142     sprintf(
2143     'SELECT
2144     demande_type.dossier_instruction_type
2145     FROM
2146     %1$sdemande_type
2147     LEFT JOIN %1$sdemande
2148     ON demande.demande_type = demande_type.demande_type
2149     WHERE
2150     demande.instruction_recepisse = \'%2$d\'',
2151     DB_PREFIXE,
2152     intval($id)
2153 softime 19307 ),
2154 softime 14064 array(
2155     "origin" => __METHOD__,
2156     )
2157     );
2158 mbroquet 3730
2159 softime 19307 // Aucune clé secondaire n'a été trouvée ou c'est un événement sans
2160     //création de dossier d'instruction, l'événement d'instruction peut être
2161 mbroquet 3730 //supprimé
2162 softime 14064 if ( $this->correct !== false || $qres['result'] == null || $qres['result'] == ""){
2163 mbroquet 3730 // Requête de vérification que cet événement d'instruction est lié
2164     // à une demande
2165 softime 14064 $qres = $this->f->get_one_result_from_db_query(
2166     sprintf(
2167     'SELECT
2168     demande
2169     FROM
2170     %1$sdemande
2171     WHERE
2172     instruction_recepisse = \'%2$d\'',
2173     DB_PREFIXE,
2174     intval($id)
2175 softime 19307 ),
2176 softime 14064 array(
2177     "origin" => __METHOD__,
2178     )
2179     );
2180 mbroquet 3730
2181     //Si c'est un événement d'instruction lié à une demande
2182 softime 14064 if ($qres['result'] != null || $qres['result'] != ""){
2183 softime 7996 $demande = $this->f->get_inst__om_dbform(array(
2184     "obj" => "demande",
2185 softime 14064 "idx" => $qres['result'],
2186 softime 7996 ));
2187 mbroquet 3730
2188 softime 14064 //On met à jour la demande en supprimant la liaison vers
2189 mbroquet 3730 //l'événement d'instruction
2190     $demande->setParameter("maj", 1);
2191     $valF = array();
2192     foreach($demande->champs as $identifiant => $champ) {
2193     $valF[$champ] = $demande->val[$identifiant];
2194     }
2195     $valF['date_demande']=$demande->dateDBToForm($valF['date_demande']);
2196     $valF['instruction_recepisse']=NULL;
2197 softime 8989 $ret = $demande->modifier($valF);
2198 mbroquet 3730 }
2199 softime 19307
2200 mbroquet 3730 /**
2201     * Vérification que l'élément supprimé est le dernier pour pouvoir
2202     * remodifier les données de manière itérative.
2203     */
2204 softime 14064 $qres = $this->f->get_one_result_from_db_query(
2205     sprintf(
2206     'SELECT
2207     max(instruction)
2208     FROM
2209     %1$sinstruction
2210     WHERE
2211     dossier = \'%2$s\'',
2212     DB_PREFIXE,
2213     $this->f->db->escapeSimple($this->getParameter("idxformulaire"))
2214     ),
2215     array(
2216     "origin" => __METHOD__,
2217     )
2218     );
2219    
2220 mbroquet 3730 // Si on se trouve effectivement sur le dernier evenement d'instruction
2221 softime 14064 // alors on valide la suppression sinon on l'annule
2222     $this->correct = false;
2223     $message = __("Seul le dernier evenement d'instruction peut etre supprime.");
2224     if ($qres['result'] == $id) {
2225 mbroquet 3730 // Alors on valide la suppression
2226     $this->correct = true;
2227 softime 14064 $message = __('Destruction_chronologique');
2228 mbroquet 3730 }
2229 softime 14064 $this->addToMessage($message);
2230 mbroquet 3730 }
2231     }
2232    
2233     /**
2234     * Vérification de la possibilité ou non de modifier des dates de suivi
2235     * @param string $champ champ date à vérifier
2236     */
2237     function updateDate($champ) {
2238 softime 19307
2239 mbroquet 3730 //Si le retourformulaire est "dossier_instruction"
2240     if ($this->getParameter("retourformulaire") == "dossier"
2241 softime 12847 || $this->f->contexte_dossier_instruction()) {
2242 mbroquet 3730
2243     // Vérification de la possibilité de modifier les dates si déjà éditées
2244 softime 18876 if($this->valF[$champ] != "" && !$this->f->user_is_admin) {
2245 mbroquet 3730 // si l'utilisateur n'est pas un admin
2246 softime 18876 if($this->getVal($champ) != "" && $this->getVal($champ) != $this->valF[$champ]) {
2247 softime 15650
2248     // si le champ concerné est 'date_envoi_signature'
2249     // et que le statut du parapheur est 'expired'
2250     // alors on autorise le changement de la date
2251     // pour tous les autres cas, on ne peut modifier la date
2252     if ($champ !== 'date_envoi_signature' || $this->getVal('statut_signature') !== 'expired') {
2253     $this->correct = false;
2254 softime 18876 $this->addToMessage(__("Les dates de suivis ne peuvent etre modifiees"));
2255 softime 15650 }
2256 mbroquet 3730 }
2257     }
2258     }
2259 softime 19307
2260 mbroquet 3730 //
2261     return true;
2262     }
2263    
2264 softime 8989 /**
2265     * SETTER_FORM - setValsousformulaire (setVal).
2266     *
2267     * @return void
2268     */
2269     function setValsousformulaire(&$form, $maj, $validation, $idxformulaire, $retourformulaire, $typeformulaire, &$dnu1 = null, $dnu2 = null) {
2270 softime 17542 $data = array('form' => &$form, 'maj' => &$maj, 'validation' => &$validation, 'idxformulaire' => &$idxformulaire, 'retourformulaire' => &$retourformulaire, 'typeformulaire' => &$typeformulaire);
2271     $this->f->module_manager->run_hooks('setValsousformulaire_pre', $this, $data);
2272    
2273 softime 8989 // parent::setValsousformulaire($form, $maj, $validation, $idxformulaire, $retourformulaire, $typeformulaire);
2274 mbroquet 3730 //
2275 softime 8989 $this->retourformulaire = $retourformulaire;
2276     //
2277 mbroquet 3730 if ($maj == 0) {
2278 softime 8989 $form->setVal("destinataire", $this->getParameter("idxformulaire"));
2279     $form->setVal("dossier", $this->getParameter("idxformulaire"));
2280 mbroquet 3730 }
2281 softime 12124
2282 softime 19307 // Si l'instruction a été envoyé au contrôle de légalité et que la
2283     // tâche envoi_cl lié n'a pas encore été traité il faut indiquer à
2284 softime 12124 // l'utilisateur que l'envoi au cl est en cours de traitement.
2285 softime 18436 if ($this->is_sent_to_cl() === true
2286 softime 12124 && empty($this->getVal('date_envoi_controle_legalite'))
2287     && $maj == 3) {
2288     $form->setVal("date_envoi_controle_legalite", __("En cours de traitement."));
2289     }
2290 mbroquet 3730 //
2291     $this->set_form_default_values($form, $maj, $validation);
2292 softime 17542
2293     $data = array('form' => &$form, 'maj' => &$maj, 'validation' => &$validation, 'idxformulaire' => &$idxformulaire, 'retourformulaire' => &$retourformulaire, 'typeformulaire' => &$typeformulaire);
2294     $this->f->module_manager->run_hooks('setValsousformulaire_post', $this, $data);
2295 mbroquet 3730 }
2296    
2297     /**
2298 softime 8989 * SETTER_FORM - set_form_default_values (setVal).
2299     *
2300     * @return void
2301 mbroquet 3730 */
2302     function set_form_default_values(&$form, $maj, $validation) {
2303 softime 17542 $data = array('form' => &$form, 'maj' => &$maj, 'validation' => &$validation);
2304     $this->f->module_manager->run_hooks('set_form_default_values_pre', $this, $data);
2305    
2306 mbroquet 3730 if ($maj == 0) {
2307     // si contexte DI
2308     if ($this->getParameter("retourformulaire") == "dossier"
2309 softime 12847 || $this->f->contexte_dossier_instruction()) {
2310 mbroquet 3730 // on recupère les signataires de la multicollectivité et de celle du DI
2311 softime 7996 $di = $this->f->get_inst__om_dbform(array(
2312     "obj" => "dossier_instruction",
2313 softime 8989 "idx" => $this->getParameter("idxformulaire"),
2314 softime 7996 ));
2315 softime 8989 $sql = str_replace(
2316     "<collectivite_di>",
2317     $di->getVal("om_collectivite"),
2318     $this->get_var_sql_forminc__sql("signataire_arrete_defaut_by_di")
2319     );
2320 mbroquet 3730 } else {
2321 softime 8989 $sql = $this->get_var_sql_forminc__sql("signataire_arrete_defaut");
2322 mbroquet 3730 }
2323 softime 19307
2324 softime 14542 $qres = $this->f->get_all_results_from_db_query($sql, array(
2325     "origin" => __METHOD__));
2326     $row = array_shift($qres['result']);
2327 softime 8989 if (isset($row["signataire_arrete"])
2328     && is_numeric($row["signataire_arrete"])) {
2329     //
2330     $form->setVal("signataire_arrete", $row["signataire_arrete"]);
2331 mbroquet 3730 }
2332 softime 8989 // Date du jour
2333     $form->setVal("date_evenement", date("Y-m-d"));
2334 mbroquet 3730 }
2335 softime 8989 //
2336 mbroquet 3730 if ($maj == 0 || $maj == 1 || $maj == 125) {
2337 softime 8989 $form->setVal("bible_auto", "bible_auto()");
2338     $form->setVal("bible", "bible(1)");
2339     $form->setVal("bible2", "bible(2)");
2340     $form->setVal("bible3", "bible(3)");
2341     $form->setVal("bible4", "bible(4)");
2342 mbroquet 3730 }
2343 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 !
2344 softime 7521 $collectivite_di = $this->get_dossier_instruction_om_collectivite();
2345 softime 8989 if ($maj == 1
2346     && $this->f->is_option_preview_pdf_enabled($collectivite_di) === true
2347 softime 7521 && $this->has_an_edition() === true) {
2348 softime 8989 //
2349     $form->setVal("live_preview", $this->getVal($this->clePrimaire));
2350     $form->setVal("btn_refresh", "reload_pdf_viewer()");
2351     $form->setVal("btn_preview", "show_instr_preview()");
2352     $form->setVal("btn_redaction", "show_instr_redaction()");
2353 softime 7521 }
2354 softime 10808
2355 softime 12654 // Gestion de l'affichage des suivis de notification des demandeurs, des services, des tiers et
2356     // des communes
2357     if ($maj == 3) {
2358     if ($this->can_display_notification_demandeur()) {
2359     $typeNotification = array(
2360     'notification_recepisse',
2361     'notification_instruction',
2362     'notification_decision',
2363     );
2364     $form->setVal("suivi_notification", $this->get_json_suivi_notification($typeNotification, true));
2365     }
2366     if ($this->can_display_notification_service()) {
2367     $form->setVal("suivi_notification_service", $this->get_json_suivi_notification(array('notification_service_consulte')));
2368     }
2369     if ($this->can_display_notification_tiers()) {
2370     $form->setVal("suivi_notification_tiers", $this->get_json_suivi_notification(array('notification_tiers_consulte')));
2371     }
2372     if ($this->can_display_notification_commune()) {
2373     $form->setVal("suivi_notification_commune", $this->get_json_suivi_notification(array('notification_depot_demat', 'notification_commune')));
2374     }
2375 softime 15835 if ($this->getVal('flag_edition_integrale') == 't') {
2376     $message = __("Aucun contenu à afficher.");
2377     if (empty($this->getVal('titre_om_htmletat'))) {
2378     $form->setVal("titre_om_htmletat", $message);
2379     }
2380     if (empty($this->getVal('corps_om_htmletatex'))) {
2381     $form->setVal("corps_om_htmletatex", $message);
2382     }
2383     }
2384 softime 10808 }
2385 softime 17542 $data = array('form' => &$form, 'maj' => &$maj, 'validation' => &$validation);
2386     $this->f->module_manager->run_hooks('set_form_default_values_post', $this, $data);
2387 mbroquet 3730 }
2388    
2389     function setLayout(&$form, $maj){
2390 softime 17542 $data = array('form' => &$form, 'maj' => &$maj);
2391     $this->f->module_manager->run_hooks('setLayout_pre', $this, $data);
2392    
2393 softime 8593 $form->setBloc('evenement','D',"","sousform-instruction-action-".$maj);
2394 mbroquet 3730
2395 softime 8593 $form->setFieldset('evenement','D',_('Evenement'));
2396     $form->setFieldset('om_final_instruction_utilisateur','F','');
2397 softime 19307
2398 softime 8593 $form->setBloc('om_final_instruction_utilisateur','F');
2399 softime 19307 // Idem que pour le layout de la synthèse des DI, on est obligé de "casser" le setBloc en utilisant que la fin
2400 softime 15835 // afin de bypasser le fait de ne pas avoir le form-content et le portlet dans le meme container
2401     $form->setBloc('om_final_instruction_utilisateur','F');
2402     $form->setBloc('parapheur_lien_page_signature','D');
2403 mbroquet 3730
2404 softime 8593 $form->setBloc('date_finalisation_courrier','D',"","");
2405 mbroquet 3730
2406 softime 15973 $form->setFieldset('date_finalisation_courrier','D',_('Dates'),"instruction--suivi-dates");
2407     $form->setBloc('date_finalisation_courrier','D');
2408     $form->setBloc('date_envoi_rar','F');
2409 mbroquet 3730
2410 softime 15973 $form->setBloc('date_retour_rar','D');
2411 softime 8593 $form->setBloc('date_retour_controle_legalite','F');
2412     $form->setFieldset('date_retour_controle_legalite','F','');
2413 softime 19307
2414 softime 8593 $form->setBloc('date_retour_controle_legalite','F');
2415 mbroquet 3730
2416 softime 10573 $form->setBloc('statut_signature','D');
2417     $form->setFieldset('statut_signature','D','Suivi Parapheur');
2418     $form->setBloc('commentaire_signature','F');
2419     $form->setBloc('historique_signature','D');
2420     $form->setFieldset('historique_signature', 'DF', __("Historique"), "collapsible, startClosed");
2421     $form->setBloc('historique_signature','F');
2422     $form->setFieldset('historique_signature','F');
2423    
2424 softime 10808 $form->setFieldset('suivi_notification', 'D', __("Suivi notification"), "collapsible");
2425     $form->setFieldset('suivi_notification','F');
2426 softime 11585 $form->setFieldset('suivi_notification_service', 'D', __("Suivi notification service"), "collapsible");
2427     $form->setFieldset('suivi_notification_service','F');
2428     $form->setFieldset('suivi_notification_tiers', 'D', __("Suivi notification tiers"), "collapsible");
2429     $form->setFieldset('suivi_notification_tiers','F');
2430 softime 12654 $form->setFieldset('suivi_notification_commune', 'D', __("Suivi notification commune"), "collapsible");
2431     $form->setFieldset('suivi_notification_commune','F');
2432 softime 10808
2433 softime 8593 if ($maj == 1) {
2434     // Récupère la collectivité du dossier d'instruction
2435     $collectivite_di = $this->get_dossier_instruction_om_collectivite();
2436 mbroquet 3730
2437 softime 8593 //
2438     if ($this->f->is_option_preview_pdf_enabled($collectivite_di) === true
2439     && $this->has_an_edition() === true) {
2440 softime 7521 //
2441 softime 8593 $form->setBloc('complement_om_html','D',"","container_instr_edition");
2442     $form->setBloc('complement_om_html','D',"","hidelabel box_instr_edition redaction_instr_edition");
2443     $form->setBloc('complement_om_html','D',"","box_instr_edition_main");
2444     $form->setFieldset('complement_om_html','D',_('Complement'));
2445     $form->setFieldset('bible','F','');
2446     $form->setFieldset('complement2_om_html','D',_('Complement 2'));
2447     $form->setFieldset('bible2','F','');
2448     $form->setFieldset('complement3_om_html','D',_('Complement 3'));
2449     $form->setFieldset('bible3','F','');
2450     $form->setFieldset('complement4_om_html','D',_('Complement 4'));
2451     $form->setFieldset('bible4','F','');
2452     $form->setFieldset('titre_om_htmletat','DF',_('Titre'), 'startClosed');
2453     $form->setFieldset('corps_om_htmletatex','DF',_('Corps'));
2454     $form->setBloc('corps_om_htmletatex','F');
2455     $form->setBloc('btn_preview','DF',"","box_instr_edition_btn");
2456     $form->setBloc('btn_preview','F');
2457     $form->setBloc('btn_redaction','D', '',"hidelabel box_instr_edition preview_instr_edition");
2458     $form->setBloc('btn_redaction','DF',"","box_instr_edition_btn");
2459     $form->setFieldset('btn_refresh','D',_('Prévisualisation'), "box_instr_edition_main");
2460     $form->setFieldset('live_preview','F');
2461     $form->setBloc('live_preview','F');
2462     $form->setBloc('live_preview','F');
2463 softime 7521 } else {
2464 softime 8593 $form->setBloc('complement_om_html','D',"","hidelabel");
2465 softime 7521 $form->setFieldset('complement_om_html','D',_('Complement'));
2466     $form->setFieldset('bible','F','');
2467     $form->setFieldset('complement2_om_html','D',_('Complement 2'));
2468     $form->setFieldset('bible2','F','');
2469     $form->setFieldset('complement3_om_html','D',_('Complement 3'));
2470     $form->setFieldset('bible3','F','');
2471     $form->setFieldset('complement4_om_html','D',_('Complement 4'));
2472     $form->setFieldset('bible4','F','');
2473 softime 8593 $form->setFieldset('titre_om_htmletat','DF',_('Titre'), 'startClosed');
2474     $form->setFieldset('corps_om_htmletatex','DF',_('Corps'));
2475     $form->setBloc('corps_om_htmletatex','F');
2476 softime 7521 }
2477 softime 8593 } else {
2478     $form->setBloc('complement_om_html','D',"","hidelabel");
2479     $form->setFieldset('complement_om_html','D',_('Complement'));
2480     $form->setFieldset('bible','F','');
2481     $form->setFieldset('complement2_om_html','D',_('Complement 2'));
2482     $form->setFieldset('bible2','F','');
2483     $form->setFieldset('complement3_om_html','D',_('Complement 3'));
2484     $form->setFieldset('bible3','F','');
2485     $form->setFieldset('complement4_om_html','D',_('Complement 4'));
2486     $form->setFieldset('bible4','F','');
2487     $form->setFieldset('titre_om_htmletat','DF',_('Titre'), 'startClosed');
2488     $form->setFieldset('corps_om_htmletatex','DF',_('Corps'));
2489     $form->setBloc('corps_om_htmletatex','F');
2490 mbroquet 3730 }
2491 softime 17542 $data = array('form' => &$form, 'maj' => &$maj);
2492     $this->f->module_manager->run_hooks('setLayout_post', $this, $data);
2493 mbroquet 3730 }
2494 softime 19307
2495 mbroquet 3730 function setLib(&$form, $maj) {
2496 softime 17542 $data = array('form' => &$form, 'maj' => &$maj);
2497     $this->f->module_manager->run_hooks('setLib_pre', $this, $data);
2498 mbroquet 3730 //
2499     parent::setLib($form, $maj);
2500     //
2501     $form->setLib('bible_auto', "");
2502     $form->setLib('bible', "");
2503     $form->setLib('bible2', "");
2504     $form->setLib('bible3', "");
2505     $form->setLib('bible4', "");
2506 softime 7521 $form->setLib('btn_refresh', "");
2507 softime 8593 $form->setLib('btn_preview', "");
2508     $form->setLib('btn_redaction', "");
2509 softime 7521 $form->setLib('live_preview', "");
2510 softime 18876 $form->setLib('om_final_instruction_utilisateur', __("finalise par"));
2511 softime 8989 $form->setLib('date_envoi_rar', __("date_envoi_ar"));
2512     $form->setLib('date_retour_rar', __("date_notification"));
2513 softime 10573 $form->setLib('statut_signature', __("statut"));
2514     $form->setLib('commentaire_signature', __("commentaire"));
2515     $form->setLib('historique_signature', '');
2516 softime 10808 $form->setLib('suivi_notification', '');
2517 softime 11585 $form->setLib('suivi_notification_service', '');
2518     $form->setLib('suivi_notification_tiers', '');
2519 softime 12654 $form->setLib('suivi_notification_commune', '');
2520 softime 10573 $form->setLib('preview_edition', "");
2521 softime 18436 $form->setLib('document_type_instruction', __("Type de document"));
2522 softime 8593
2523     // Ajout d'une infobulle d'aide lorsque le formulaire est en mode
2524     // ajout et que l'option de rédaction libre est activée sur la
2525     // collectivité du dossier
2526     if ($maj === '0' && $this->is_option_redaction_libre_enabled() === true) {
2527     //
2528     $help_text_template = '%s <span class="info-16" title="%s"></span>';
2529 softime 18876 $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.");
2530     $form->setLib('flag_edition_integrale', sprintf($help_text_template, __("Type de rédaction"), $help_text));
2531 softime 8593 }
2532     else {
2533 softime 18876 $form->setLib('flag_edition_integrale', __("Type de rédaction"));
2534 softime 8593 }
2535    
2536     // Ajout d'une infobulle d'aide lorsque le formulaire est en mode
2537     // modification et que l'option de prévisualisation de l'édition est
2538     // activée sur la collectivité du dossier
2539     if ($maj === '1'
2540     && $this->f->is_option_preview_pdf_enabled($this->get_dossier_instruction_om_collectivite()) === true) {
2541     //
2542     $help_text_template = '%s <span class="info-16" title="%s"></span>';
2543 softime 18876 $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.");
2544     $form->setLib('date_evenement', sprintf($help_text_template, __('date_evenement'), $help_text));
2545     $form->setLib('signataire_arrete', sprintf($help_text_template, __('signataire_arrete'), $help_text));
2546 softime 8593 }
2547 softime 17542 $data = array('form' => &$form, 'maj' => &$maj);
2548     $this->f->module_manager->run_hooks('setLib_post', $this, $data);
2549 mbroquet 3730 }
2550    
2551 softime 8989 /**
2552 softime 15835 * Surcharge om_dbform::set_form_specificity()
2553     *
2554     * Traitements spécifiques lié à l'affichage des formulaires.
2555     * Les traitements gérés ici sont les suivants :
2556     * - Affichage d'un message d'erreur si la lettretype de l'évènement n'a pas
2557     * pu être récupérée.
2558     * - Affichage d'un message d'information à l'attention de l'utilisateur si
2559     * la notification est activée mais qu'elle n'est pas possible à cause du
2560     * paramètrage.
2561     *
2562     * @param formulaire $form Instance formulaire.
2563     * @param string $maj
2564     *
2565     * @return void
2566     */
2567     function set_form_specificity(&$form, $maj) {
2568     parent::set_form_specificity($form, $maj);
2569 softime 19307
2570 softime 15835 // En consultation, vérifie si une lettretype est associée à l'instruction et a pu être récupérée.
2571     // Si ce n'est pas le cas affiche un message d'erreur.
2572     if ((! empty($maj) && $maj == 3)) {
2573     if (! empty($this->getVal('lettretype'))) {
2574    
2575     $om_edition = $this->f->get_inst__om_edition();
2576     $dossier_instruction_om_collectivite = $this->get_dossier_instruction_om_collectivite();
2577     $collectivite = $this->f->getCollectivite($dossier_instruction_om_collectivite);
2578     $edition = $om_edition->get_edition_from_collectivite('om_lettretype', $this->getVal("lettretype"), $collectivite['om_collectivite_idx']);
2579    
2580     if (empty($edition)) {
2581     $this->display_error_message(__("Erreur de paramétrage, le modèle de document n'a pas pu être récupéré. Contactez votre administrateur."));
2582     }
2583     }
2584     }
2585    
2586     $this->display_notification_info($maj);
2587     }
2588    
2589     /**
2590     * En consultation, pour les dossiers qui n'ont pas été transmis par le portail
2591     * citoyen, si la notification des demandeurs est activée sur l'évenement
2592     * d'instruction et que le paramétrage du demandeur principal n'est pas
2593     * correct alors un message a destination de l'instructeur est affiché.
2594     *
2595     * @param string $maj
2596     *
2597     * @return void
2598     */
2599     public function display_notification_info($maj) {
2600     if ((! empty($maj) && $maj == 3)) {
2601     // Si le dossier n'a pas été déposé sur le portail citoyen (ou si
2602     // la requête permettant de savoir le type de demande à échouée) et si
2603     // la notification se fait par mail vérifie si il y a des erreurs de
2604     // paramétrage et si c'est le cas on affiche un message d'information
2605     if ($this->dossier_depose_sur_portail() == null || ! $this->dossier_depose_sur_portail()) {
2606     $erreurParam = $this->get_info_notification_fail();
2607     // Récupération de l'évenement d'instruction
2608     $instEV = $this->get_inst_evenement();
2609     if (! empty($instEV->getVal('notification')) && $erreurParam != array()) {
2610     $class = 'text-info ui-state-highlight ui-state-info';
2611     $message = __("La notification n'est pas possible.");
2612     $this->f->display_panel_information(
2613     $class,
2614     $message,
2615     $erreurParam,
2616     __('Les données suivantes doivent être modifiées'),
2617     'erreur_param_notif'
2618     );
2619     }
2620     }
2621     }
2622     }
2623    
2624     /**
2625     * Méthode permettant d'afficher des messages d'erreur sur les formulaires.
2626     */
2627     public function display_error_message($msg) {
2628     $this->correct = false;
2629     $this->msg = $msg;
2630     }
2631    
2632     /**
2633 softime 8989 * TRIGGER - triggerajouter.
2634 softime 17036 * Réalise différents traitements avant d'ajouter l'instruction en base.
2635 softime 8989 *
2636 softime 17036 * Les traitements réalisés sont les suivant :
2637     * - TODO : documenter les traietements existant
2638     * - Intégre les bibles pré-chargé aux compléments de l'instruction.
2639     * Ce traitement n'est déclenché que si l'on est pas en rédaction libre, et que l'évènement a une lettretype.
2640     *
2641 softime 8989 * @return boolean
2642     */
2643     function triggerajouter($id, &$dnu1 = null, $val = array(), $dnu2 = null) {
2644     $this->addToLog(__METHOD__."(): start", EXTRA_VERBOSE_MODE);
2645 softime 18436 $parent_res = parent::triggerajouter($id, $dnu1, $val);
2646     if ($parent_res === false) return $parent_res;
2647    
2648     $data = array('val' => &$val, 'id' => $id, 'parent_res' => &$parent_res);
2649 softime 19307 if (! $this->f->module_manager->run_hooks('triggerajouter_override_pre', $this, $data)) {
2650     return false;
2651     }
2652    
2653 mbroquet 3730 /**
2654     * Le code suivant permet de récupérer des valeurs des tables evenement
2655     * et dossier pour les stocker dans l'instruction :
2656     * DEPUIS L'EVENEMENT
2657     * - action
2658     * - delai
2659     * - accord_tacite
2660     * - etat
2661     * - avis_decision
2662     * - delai_notification
2663     * - lettretype
2664     * - autorite_competente
2665 softime 10573 * - pec_metier
2666 softime 6565 * - complement_om_html
2667     * - complement2_om_html
2668     * - complement3_om_html
2669     * - complement4_om_html
2670     * - complement5_om_html
2671 mbroquet 3730 * DEPUIS LE DOSSIER D'INSTRUCTION
2672     * - archive_delai
2673     * - archive_accord_tacite
2674     * - archive_etat
2675     * - archive_avis
2676     * - date_complet
2677     * - date_rejet
2678     * - date_limite
2679     * - date_notification_delai
2680     * - date_decision
2681     * - date_validite
2682     * - date_achevement
2683     * - date_chantier
2684     * - date_conformite
2685     * - avis_decision
2686     */
2687     // Récupération de tous les paramètres de l'événement sélectionné
2688 softime 18436 $evenement = $this->f->get_inst__om_dbform(array(
2689     "obj" => "evenement",
2690     "idx" => intval($this->valF['evenement']),
2691     ));
2692     if ($evenement->exists() === true) {
2693 mbroquet 3730 // Récupération de l'identifiant de l'action
2694     // si une action est paramétrée dans l'événement
2695     $this->valF['action'] = NULL;
2696 softime 18436 if (!empty($evenement->getVal('action'))) {
2697     $this->valF['action']=$evenement->getVal('action');
2698 mbroquet 3730 }
2699     // Récupération de la valeur du délai
2700 softime 18436 $this->valF['delai'] = $evenement->getVal('delai');
2701 mbroquet 3730 // Récupération de l'identifiant de l'état
2702 softime 19307 // si un état est paramétré dans l'événement
2703 mbroquet 3730 $this->valF['etat']=NULL;
2704 softime 18436 if (!empty($evenement->getVal('etat'))) {
2705     $this->valF['etat']=$evenement->getVal('etat');
2706 mbroquet 3730 }
2707     // Récupération de la valeur d'accord tacite
2708 softime 18436 $this->valF['accord_tacite']=$evenement->getVal('accord_tacite');
2709 mbroquet 3730 // Récupération de la valeur du délai de notification
2710 softime 18436 $this->valF['delai_notification']=$evenement->getVal('delai_notification');
2711 mbroquet 3730 // Récupération de l'identifiant de l'avis
2712 softime 19307 // si un avis est paramétré dans l'événement
2713 mbroquet 3730 $this->valF['avis_decision'] = NULL;
2714 softime 18436 if(!empty($evenement->getVal('avis_decision'))) {
2715     $this->valF['avis_decision']=$evenement->getVal('avis_decision');
2716 mbroquet 3730 }
2717     // Récupération de la valeur de l'autorité compétente
2718 softime 19307 // si l'autorité compétente est paramétré dans l'événement
2719 mbroquet 3730 $this->valF['autorite_competente'] = NULL;
2720 softime 18436 if(!empty($evenement->getVal('autorite_competente'))) {
2721     $this->valF['autorite_competente']=$evenement->getVal('autorite_competente');
2722 mbroquet 3730 }
2723     // Récupération de la valeur de la lettre type
2724 softime 18436 $this->valF['lettretype']=$evenement->getVal('lettretype');
2725    
2726     // Récupération de la valeur du document_type
2727     if(!empty($evenement->getVal('document_type'))){
2728     $this->valF['document_type_instruction']= $evenement->getVal('document_type');
2729     }
2730 softime 10573 // Récupération de la valeur de la prise en compte métier
2731     // si la prise en compte métier est paramétrée dans l'événement
2732     $this->valF['pec_metier'] = NULL;
2733 softime 18436 if(!empty($evenement->getVal('pec_metier'))) {
2734     $this->valF['pec_metier'] = $evenement->getVal('pec_metier');
2735 softime 10573 }
2736 mbroquet 3730 }
2737     // Récupération de toutes les valeurs du dossier d'instruction en cours
2738 softime 14542 // TODO : remplacer cette requête par l'instanciation de l'objet
2739     $qres = $this->f->get_all_results_from_db_query(
2740     sprintf(
2741     'SELECT
2742     *
2743     FROM
2744     %1$sdossier
2745     WHERE
2746     dossier = \'%2$s\'',
2747     DB_PREFIXE,
2748     $this->f->db->escapeSimple($this->valF['dossier'])
2749     ),
2750     array(
2751     "origin" => __METHOD__,
2752     )
2753     );
2754     $row = array_shift($qres['result']);
2755 mbroquet 3730 $this->updateArchiveData($row);
2756 softime 17542
2757 mbroquet 3730 // Récupération de la duree de validite du dossier d'autorisation
2758 softime 14064 $qres = $this->f->get_one_result_from_db_query(
2759     sprintf(
2760     'SELECT
2761     duree_validite_parametrage
2762 softime 19307 FROM
2763 softime 14064 %1$sdossier_autorisation_type_detaille
2764     LEFT JOIN %1$sdossier_autorisation
2765     ON dossier_autorisation.dossier_autorisation_type_detaille = dossier_autorisation_type_detaille.dossier_autorisation_type_detaille
2766     LEFT JOIN %1$sdossier
2767     ON dossier.dossier_autorisation = dossier_autorisation.dossier_autorisation
2768 softime 19307 WHERE
2769 softime 14064 dossier.dossier = \'%2$s\'',
2770     DB_PREFIXE,
2771     $this->f->db->escapeSimple($this->valF['dossier'])
2772 softime 19307 ),
2773 softime 14064 array(
2774     "origin" => __METHOD__,
2775     )
2776     );
2777    
2778     if ($qres['result'] != '') {
2779     $this->valF['duree_validite_parametrage'] = $qres['result'];
2780 mbroquet 3730 }
2781    
2782     // Identifiant du type de courrier
2783     $idTypeCourrier = '11';
2784     $idCourrier = str_pad($this->valF["instruction"], 10, "0", STR_PAD_LEFT);
2785     // Code barres
2786     $this->valF["code_barres"] = $idTypeCourrier . $idCourrier;
2787 softime 17036
2788     // Set dans la propriété valF les valeurs des compléments pour qu'ils soient enregistrés
2789     // à l'ajout de l'instruction.
2790     // Le traitement n'est réalisé que si il y a une lettretype et qu'on est pas en rédaction libre
2791     if (! empty($this->valF['lettretype'])) {
2792     $this->set_precharge_complement($this->valF['evenement'], $this->valF['dossier']);
2793     }
2794 softime 17542
2795     $res = true;
2796     $data = array('val' => &$val, 'id' => $id, 'result' => &$res);
2797 softime 19307 if (! $this->f->module_manager->run_hooks('triggerajouter_override_post', $this, $data)) {
2798     return false;
2799     }
2800 softime 17542 return $res;
2801 mbroquet 3730 }
2802 softime 17036
2803     /**
2804     * Récupère pour chaque champ complementX_om_html le complément correspondant
2805     * et set l'entrée correspondante de valF avec.
2806 softime 19307 *
2807 softime 17036 * Problème potentiel : Le nombre de complément se base sur le champs complement ayant
2808     * l'indice le plus grand visible dans get_var_sql_forminc__champs().
2809     * Dans cette fonction on fait donc 15 itérations. Changer le nombre de complément
2810     * aura donc un impact sur cette méthode.
2811     *
2812     * @param string dossier : identifiant du dossier de l'instruction
2813     * @param int evenement : identifiant de l'évènement d'instruction
2814 softime 19307 *
2815 softime 17036 * @return void
2816     */
2817     public function set_precharge_complement($evenement, $dossier) {
2818     // Récupération des bibles et chargement dans les compléments
2819     for ($i = 1; $i <= 15; $i++) {
2820     // Constitution de l'id du champs.
2821     // Pour l'indice 1, l'id est complement_om_html, l'indice n'est pas visible dans ce cas.
2822     $field = "complement".($i === 1 ? '' : $i)."_om_html";
2823     // Récupération des compléments correspondant en fonction de l'évènement
2824     // et du dossier puis insertion dans la champs voulu
2825     $this->valF[$field] = $this->getBible($evenement, $dossier, $i, 'precharge');
2826     }
2827     }
2828    
2829 softime 19307
2830    
2831 softime 12124 /**
2832     * Test si une restriction est valide.
2833     *
2834     * @return boolean
2835     */
2836 mbroquet 3730 function restrictionIsValid($restriction){
2837     if($this->restriction_valid != null) {
2838     return $this->restriction_valid;
2839     }
2840     if(empty($restriction)) {
2841     $this->restriction_valid = true;
2842     return $this->restriction_valid;
2843     }
2844 nmeucci 3873 // Liste des opérateurs possibles sans espace
2845     $operateurs = array(">=", "<=", "+", "-", "&&", "||", "==", "!=");
2846     // Liste identique mais avec le marqueur §
2847     $mark = "§";
2848     $operateurs_marked = array();
2849     foreach ($operateurs as $operateur) {
2850     $operateurs_marked[] = $mark.$operateur.$mark;
2851     }
2852 mbroquet 3730
2853     // Supprime tous les espaces de la chaîne de caractère
2854 nmeucci 3873 $restriction = preg_replace('/\s+/', '', $restriction);
2855 softime 19307
2856 nmeucci 3873 // Met un marqueur avant et après les opérateurs
2857     // puis transforme la chaine en un tableau
2858 softime 19307 $restriction = str_replace($operateurs, $operateurs_marked,
2859 mbroquet 3730 $restriction);
2860    
2861 nmeucci 3873 // Pour chaque opérateur logique
2862     foreach (array('&&', '||') as $operator) {
2863    
2864     // S'il est absent on ne fait aucun traitement
2865     if (strpos($restriction, $mark.$operator.$mark) === false) {
2866     continue;
2867     }
2868     // Sinon on vérifie les deux conditions avec le OU/ET logique
2869     $restrictions = explode($mark.$operator.$mark, $restriction);
2870     $restrictions[0] = explode($mark, $restrictions[0]);
2871     $restrictions[1] = explode($mark, $restrictions[1]);
2872     $res_bool = false;
2873     if ($operator == '&&') {
2874     if ($this->is_restriction_satisfied($restrictions[0], $operateurs)
2875     && $this->is_restriction_satisfied($restrictions[1], $operateurs)) {
2876     $res_bool = true;
2877     }
2878     }
2879     if ($operator == '||') {
2880     if ($this->is_restriction_satisfied($restrictions[0], $operateurs)
2881     || $this->is_restriction_satisfied($restrictions[1], $operateurs)) {
2882     $res_bool = true;
2883     }
2884     }
2885     return $res_bool;
2886     }
2887     $tabRestriction = explode($mark, $restriction);
2888     return $this->is_restriction_satisfied($tabRestriction, $operateurs);
2889    
2890     }
2891    
2892     function is_restriction_satisfied($restriction, $operateurs) {
2893 mbroquet 3730 // Tableau comprenant les résultat
2894     $res = array();
2895     // Compteur pour les résultat
2896     // commence à 1 car le 0 doit rester inchangé tout au long du traitement
2897     $j = 1;
2898     // Comparateur du calcul
2899     $comparateur = '';
2900     // Booléen retourné
2901     $res_bool = true;
2902    
2903     // S'il y a un comparateur
2904 nmeucci 3873 if (in_array(">=", $restriction)
2905     || in_array("<=", $restriction)
2906     || in_array("==", $restriction)
2907     || in_array("!=", $restriction)) {
2908 mbroquet 3730
2909     // Si le tableau n'est pas vide
2910 nmeucci 3873 if (count($restriction) > 0) {
2911 mbroquet 3730
2912     // Boucle dans le tableau pour récupérer seulement les valeurs
2913 nmeucci 3873 foreach ($restriction as $key => $value) {
2914 mbroquet 3730 //
2915     if (!in_array($value, $operateurs)) {
2916     if ($this->getRestrictionValue($value) != false) {
2917     $res[] = $this->getRestrictionValue($value);
2918     } else {
2919     // Message d'erreur
2920 softime 18876 $error_message = sprintf(__("Le champ %s de l'instruction %s est vide"), "<span class='bold'>".$value."</span>", "<span class='bold'>".$this->valF["instruction"]."</span>");
2921 mbroquet 3730 $this->addToMessage($error_message);
2922     // Arrête le traitement
2923     return false;
2924     }
2925     }
2926     }
2927    
2928     // Boucle dans le tableau
2929 softime 19307 // commence à 1 car le 0 doit rester inchangé tout au long du
2930 mbroquet 3730 // traitement
2931 nmeucci 3873 for ($i = 1; $i<count($restriction); $i++) {
2932 softime 19307
2933 mbroquet 3730 // Récupère le comparateur
2934 softime 19307 if ($restriction[$i] === ">="
2935 nmeucci 3873 || $restriction[$i] === "<="
2936     || $restriction[$i] === "=="
2937     || $restriction[$i] === "!=") {
2938     $comparateur = $restriction[$i];
2939 mbroquet 3730 }
2940    
2941     // Si l'opérateur qui suit est un "+"
2942 nmeucci 3873 if ($restriction[$i] === "+") {
2943 mbroquet 3730 $dateDep = $res[$j];
2944     unset($res[$j]);$j++;
2945     $duree = $res[$j];
2946     unset($res[$j]);
2947     $res[$j] = $this->f->mois_date($dateDep, $duree, "+");
2948     }
2949    
2950     // Si l'opérateur qui suit est un "-"
2951 nmeucci 3873 if ($restriction[$i] === "-") {
2952 mbroquet 3730 $dateDep = $res[$j];
2953     unset($res[$j]);$j++;
2954     $duree = $res[$j];
2955     unset($res[$j]);
2956     $res[$j] = $this->f->mois_date($dateDep, $duree, "-");
2957     }
2958     }
2959 softime 19307
2960 mbroquet 3730 }
2961    
2962     // Si les tableau des résultats n'est pas vide
2963     if (count($res) > 0) {
2964     //
2965     $res_bool = false;
2966     // Effectue le test
2967     if ($comparateur === ">=") {
2968     //
2969     if (strtotime($res[0]) >= strtotime($res[$j])) {
2970     $res_bool = true;
2971     }
2972     }
2973     if ($comparateur === "<=") {
2974 nmeucci 3873 //
2975 mbroquet 3730 if (strtotime($res[0]) <= strtotime($res[$j])) {
2976     $res_bool = true;
2977     }
2978     }
2979 nmeucci 3873 if ($comparateur === "==") {
2980     //
2981     if (strtotime($res[0]) == strtotime($res[$j])) {
2982     $res_bool = true;
2983     }
2984     }
2985     if ($comparateur === "!=") {
2986     //
2987     if (strtotime($res[0]) != strtotime($res[$j])) {
2988     $res_bool = true;
2989     }
2990     }
2991 mbroquet 3730 }
2992     // Sinon une erreur s'affiche
2993     } else {
2994    
2995     // Message d'erreur
2996 softime 18876 $error_message = __("Mauvais parametrage de la restriction.")." ".
2997     __("Contactez votre administrateur");
2998 mbroquet 3730 $this->addToMessage($error_message);
2999     // Arrête le traitement
3000     return false;
3001     }
3002 softime 19307
3003 mbroquet 3730 return $res_bool;
3004    
3005     }
3006    
3007     /**
3008     * Permet de définir si l'événement passé en paramètre est un événement retour.
3009     * @param integer $evenement événement à tester
3010 softime 19307 *
3011 mbroquet 3730 * @return boolean retourne true si événement retour sinon false
3012     */
3013     function is_evenement_retour($evenement) {
3014     if(empty($evenement) || !is_numeric($evenement)) {
3015     return "";
3016     }
3017 softime 14064
3018     $evenement = $this->f->get_inst__om_dbform(array(
3019     "obj" => "evenement",
3020     "idx" => $evenement,
3021     ));
3022 softime 19307
3023 softime 14064 return $evenement->getVal('retour') == 't';
3024 mbroquet 3730 }
3025    
3026     /**
3027     * Retourne le champ restriction de l'événement passé en paramètre.
3028 softime 19307 *
3029 mbroquet 3730 * @param integer $evenement id de l'événement sur lequel récupérer la restriction
3030 softime 19307 *
3031 mbroquet 3730 * @return string contenu du champ restriction
3032     */
3033     function get_restriction($evenement) {
3034     if(empty($evenement) || !is_numeric($evenement)) {
3035     return "";
3036     }
3037     //Récupère la restriction
3038 softime 14064 $evenement = $this->f->get_inst__om_dbform(array(
3039     "obj" => "evenement",
3040     "idx" => $evenement,
3041     ));
3042 softime 19307
3043 softime 14064 return $evenement->getVal('restriction');
3044 mbroquet 3730 }
3045    
3046     /**
3047     * Récupère la valeur du champ dans la restriction
3048     * @param string $restrictionValue Nom du champ
3049     * @return mixed Valeur du champ
3050     */
3051     function getRestrictionValue($restrictionValue){
3052    
3053     // Initialisation de la valeur de retour
3054     $return = false;
3055    
3056     // Récupére les valeurs du dossier
3057     $value_dossier = $this->get_dossier_actual();
3058    
3059 softime 19307 //
3060 mbroquet 3730 if (is_numeric($restrictionValue)) {
3061     $return = $restrictionValue;
3062     }elseif (isset($value_dossier[$restrictionValue])) {
3063     $return = $value_dossier[$restrictionValue];
3064     }elseif (isset($this->valF[$restrictionValue])) {
3065     $return = $this->valF[$restrictionValue];
3066     }
3067    
3068     // Retourne la valeur du champ
3069     return $return;
3070     }
3071    
3072 softime 6565
3073 mbroquet 3730 /**
3074 softime 17542 * Calcul une regle à partir des données de l'url et affiche son
3075     * résultat au format json
3076     */
3077 softime 18436 public function is_date_limite_notification_dossier_depasse($contexte_notification_manuelle = False) {
3078 softime 17542 // Récupération de la date limite
3079     $dossier = $this->f->get_inst__om_dbform(array(
3080     'obj' => 'dossier',
3081     'idx' => $this->getVal('dossier')
3082     ));
3083     $date_limite = $dossier->getVal('incomplet_notifie') !== 't' ?
3084     $dossier->getVal('date_limite') :
3085     $dossier->getVal('date_limite_incompletude');
3086     // Ajout d'un jour à la date limite (reglementaire lors de la notification
3087     // par demat)
3088     $date_limite = $this->f->mois_date($date_limite, "1", "+", "jour");
3089     // Compare la date limite à j+1 et la date du jour
3090     // La date du jour est récupérée via la fonction date pour pouvoir comparer
3091     // des timestamps de début de journée
3092 softime 18436 if ($contexte_notification_manuelle === True) return strtotime($date_limite) < strtotime(date("Y-m-d")) ? True : False;
3093 softime 17542 echo strtotime($date_limite) < strtotime(date("Y-m-d")) ? 'True' : 'False';
3094     }
3095    
3096     /**
3097 softime 18876 * Vérifie si le type d'événement en cours fait partie des types autorisés en paramètres.
3098     *
3099     * @param object $ev Instance de l'événement associé à l'instruction
3100     * @param array $params Types d'événements autorisés
3101     * @return boolean
3102     */
3103     public function is_type_evenement_autorise($ev, $params = array()) {
3104     $type_evenement = $ev->getVal('type');
3105     if (isset($params["types_evenements_autorises"])
3106     && ! empty($params["types_evenements_autorises"])
3107     && in_array($type_evenement, $params["types_evenements_autorises"], true) === true) {
3108     return true;
3109     }
3110     return false;
3111     }
3112    
3113     /**
3114     * Vérifie si la date limite de notification au demandeur est dépassée.
3115     *
3116     * @param boolean $add_one_day Active ou non l'ajout d'un jour à la DLN
3117     * @return boolean
3118     */
3119     public function is_date_limite_notification_premier_mois_depasee($add_one_day = false) {
3120     $dln = $this->getVal('archive_date_notification_delai');
3121     if ($dln === ''
3122     || $dln === null) {
3123     //
3124     $dossier = $this->f->get_inst__om_dbform(array(
3125     'obj' => 'dossier',
3126     'idx' => $this->getVal('dossier')
3127     ));
3128     $dln = $dossier->getVal('date_notification_delai');
3129     }
3130     if ($dln === ''
3131     || $dln === null) {
3132     //
3133     return false;
3134     }
3135     // Ajout d'un jour à la date limite de notification
3136     if ($add_one_day === true) {
3137     $dln = $this->f->mois_date($dln, "1", "+", "jour");
3138     }
3139     // Compare la date limite de notification et la date du jour
3140     return strtotime($dln) <= strtotime(date("Y-m-d"));
3141     }
3142    
3143     /**
3144 softime 6565 * Calcul des règle d'action selon leur type.
3145     *
3146     * Types de règle :
3147     * - date
3148     * - numeric
3149     * - text
3150     * - bool
3151     * - specific
3152     * - technical_data
3153 softime 19307 *
3154 softime 6565 * @param string $rule Règle d'action.
3155     * @param string $rule_name Nom de la règle.
3156     * @param string $type Type de la règle.
3157 softime 19307 *
3158 mbroquet 3730 * @return mixed Résultat de la règle
3159     */
3160 softime 6565 public function regle($rule, $rule_name, $type = null) {
3161 mbroquet 3730
3162     // Supprime tous les espaces de la chaîne de caractère
3163     $rule = str_replace(' ', '', $rule);
3164 softime 17542 // On force les minuscules
3165     $rule = strtolower($rule);
3166 mbroquet 3730 // Coupe la chaîne au niveau de l'opérateur
3167     $operands = explode ("+", $rule);
3168     // Nombre d'opérande
3169     $nb_operands = count($operands);
3170    
3171     // Règle à null
3172     if ($rule == "null") {
3173     return null;
3174     }
3175    
3176     // Tableau des champs de type date
3177     $rule_type_date = array(
3178     "regle_date_limite",
3179     "regle_date_notification_delai",
3180     "regle_date_complet",
3181     "regle_date_validite",
3182     "regle_date_decision",
3183     "regle_date_chantier",
3184     "regle_date_achevement",
3185     "regle_date_conformite",
3186     "regle_date_rejet",
3187     "regle_date_dernier_depot",
3188     "regle_date_limite_incompletude",
3189 softime 6565 "regle_date_cloture_instruction",
3190     "regle_date_premiere_visite",
3191     "regle_date_derniere_visite",
3192     "regle_date_contradictoire",
3193     "regle_date_retour_contradictoire",
3194     "regle_date_ait",
3195     "regle_date_transmission_parquet",
3196 softime 8989 "regle_date_affichage",
3197 softime 17542 "duree_validite",
3198     "duree_validite_parametrage",
3199 mbroquet 3730 );
3200     // Tableau des champs de type numérique
3201     $rule_type_numeric = array(
3202 softime 17542 );
3203     // Tableau des champs de type text
3204     $rule_type_time_delai = array(
3205 mbroquet 3730 "regle_delai",
3206     "regle_delai_incompletude",
3207     );
3208 softime 6565 // Tableau des champs de type text
3209     $rule_type_text = array(
3210     );
3211     // Tableau des champs de type booléen
3212     $rule_type_bool = array(
3213 softime 10573 "regle_a_qualifier",
3214     "regle_incompletude",
3215     "regle_incomplet_notifie",
3216     "regle_evenement_suivant_tacite_incompletude",
3217 softime 6565 );
3218     // Tableau des champs spécifiques
3219     $rule_type_specific = array(
3220     "regle_autorite_competente",
3221     "regle_etat",
3222     "regle_accord_tacite",
3223     "regle_avis",
3224 softime 10573 "regle_pec_metier",
3225     "regle_etat_pendant_incompletude",
3226 softime 6565 );
3227     // Tableau des champs de données techniques
3228     $rule_type_technical_data = array(
3229     'regle_donnees_techniques1',
3230     'regle_donnees_techniques2',
3231     'regle_donnees_techniques3',
3232     'regle_donnees_techniques4',
3233     'regle_donnees_techniques5',
3234     );
3235 softime 8593 // Tableau des champs simple
3236     $rule_type_simple = array(
3237     "regle_dossier_instruction_type",
3238     );
3239 mbroquet 3730
3240     // Définit le type du champ
3241     if (in_array($rule_name, $rule_type_date) == true) {
3242     $type = "date";
3243     }
3244     if (in_array($rule_name, $rule_type_numeric) == true) {
3245     $type = "numeric";
3246     }
3247 softime 6565 if (in_array($rule_name, $rule_type_text) === true) {
3248     $type = "text";
3249     }
3250     if (in_array($rule_name, $rule_type_bool) === true) {
3251     $type = "bool";
3252     }
3253     if (in_array($rule_name, $rule_type_specific) === true) {
3254     $type = "specific";
3255     }
3256     if (in_array($rule_name, $rule_type_technical_data) === true) {
3257 softime 17542 $type = 'technical_text';
3258 softime 6565 }
3259 softime 8593 if (in_array($rule_name, $rule_type_simple) === true) {
3260     $type = 'simple';
3261     }
3262 softime 17542 if (in_array($rule_name, $rule_type_time_delai) === true) {
3263     $type = "time_delai";
3264     }
3265 mbroquet 3730
3266 softime 6565 // Si c'est un type spécifique ou booléen alors il n'a qu'un opérande
3267     // Récupère directement la valeur de l'opérande
3268 softime 10573 if ($type === 'specific') {
3269 softime 6565 //
3270     return $this->get_value_for_rule($rule);
3271     }
3272    
3273 mbroquet 3730 // Initialisation des variables
3274     $total_numeric = 0;
3275 softime 6565 $res_text = '';
3276 softime 18436 $final_date = null;
3277 mbroquet 3730
3278     // Pour chaque opérande
3279     foreach ($operands as $key => $operand) {
3280     // Si c'est une règle de type date
3281     if ($type == 'date') {
3282 softime 17542 if (is_numeric($operand) === false){
3283     $rule_value = $this->get_value_for_rule($operand);
3284     if (
3285     $rule_value !== null
3286     && (
3287     strpos($operand, 'mois') !== false
3288     || strpos($operand, 'jour') !== false
3289     )
3290     ){
3291     $rule_value = $operand;
3292     }
3293     if ($rule_value !== null){
3294     // Vérifie si l'opérande est une date
3295     if ($this->f->check_date($rule_value) == true) {
3296     // Affecte la date
3297     $final_date = $rule_value;
3298     }else{
3299     // Gère les opérandes
3300     preg_match_all('/(\d+) *([a-zA-Z]*)/', $rule_value, $matches, PREG_OFFSET_CAPTURE);
3301    
3302     // Ajoute l'opérande au total
3303     foreach ($matches[1] as $matche_key => $matche_value) {
3304     $timelength = $matches[1][$matche_key][0];
3305     $timetype = 'mois';
3306     if ( $matches[2][$matche_key][0] != ''){
3307     $timetype = $matches[2][$matche_key][0];
3308     }
3309     // Ajout au calcul de la date
3310     $final_date = $this->f->mois_date(
3311     $final_date,
3312     $timelength,
3313     "+",
3314     $timetype
3315     );
3316     }
3317     }
3318     }
3319 mbroquet 3730 }
3320     // Les autres opérandes doivent être que des numériques
3321     if (is_numeric($operand) == true) {
3322     // Ajoute l'opérande au total
3323 softime 17542 // Ajout au calcul de la date
3324 softime 19307 $final_date = $this->f->mois_date(
3325     $final_date,
3326     $operand,
3327     "+"
3328     );
3329 mbroquet 3730 }
3330     }
3331    
3332     // Si c'est une règle de type numérique
3333     if ($type == 'numeric') {
3334     // Les opérandes doivent être que des numériques
3335     if (is_numeric($operand) == true) {
3336     // Ajoute l'opérande au total
3337     $total_numeric += $operand;
3338     }
3339 softime 6565 if (is_numeric($operand) === false
3340     && $this->get_value_for_rule($operand) !== null
3341     && is_numeric($this->get_value_for_rule($operand)) == true) {
3342 mbroquet 3730 // Ajoute l'opérande au total
3343 softime 6565 $total_numeric += $this->get_value_for_rule($operand);
3344 mbroquet 3730 }
3345     }
3346 softime 6565
3347     // Si c'est une règle de type text
3348 softime 17542 if ($type === 'text' || $type === 'technical_text') {
3349 softime 6565 // Concatène toutes les chaînes de caractère
3350     $res_text .= $this->get_value_for_rule($operand);
3351     }
3352 softime 17542
3353     // Si c'est une règle de type time_delai
3354     if ($type === 'time_delai') {
3355     $rule_value = $this->get_value_for_rule($operand);
3356     if ( strlen($res_text) != 0) {
3357     $res_text .= "+";
3358     }
3359 softime 19307 if ($rule_value != null && $rule_value != '' && $rule_value != 'null'){
3360 softime 17542 // Supprime tous les espaces de la chaîne de caractère
3361     // Concatène toutes les chaînes de caractère
3362     $res_text .= $rule_value;
3363 softime 19307 } else if (! in_array($operand, action::EVENEMENT_FIELDS)) {
3364 softime 17542 $res_text .= $operand;
3365     }
3366     }
3367    
3368 mbroquet 3730 }
3369    
3370     // Résultat pour une règle de type date
3371     if ($type == 'date') {
3372 softime 19307 // Retourne la date
3373 softime 17542 return $final_date;
3374 mbroquet 3730 }
3375    
3376     // Résultat pour une règle de type numérique
3377     if ($type == 'numeric') {
3378 softime 19307 // Retourne le calcul
3379 mbroquet 3730 return $total_numeric;
3380     }
3381 softime 6565
3382     // Résultat pour une règle de type text
3383 softime 17542 if (in_array($type, array('text', 'technical_text')) === true) {
3384 softime 6565 // Retourne la chaîne de caractère
3385     return $res_text;
3386     }
3387 softime 17542
3388     // Résultat pour une règle de type text
3389     if (in_array($type, array('time_delai')) === true) {
3390     // Traitement de la valeur à afficher
3391     $res_text = str_replace(' ', '', $res_text);
3392     $res_text = preg_replace('/(\d+)/', '$1 ', $res_text);
3393     $res_text = preg_replace('/(\+)/', ' $1 ', $res_text);
3394     $res_text = trim(preg_replace('/\s\s+/', ' ', strtolower($res_text)));
3395     return $res_text;
3396     }
3397    
3398 softime 10573 if ($type === 'simple' || $type === 'bool') {
3399 softime 8593 // Retourne la valeur du champs rule
3400     return $rule;
3401     }
3402 softime 6565 }
3403    
3404    
3405     /**
3406     * Récupère la valeur du champs dans l'instruction ou dans les données
3407     * techniques.
3408     * Spécifique au calcul des règles.
3409     *
3410     * @param string $field Champ
3411     *
3412     * @return mixed Valeur du champ
3413     */
3414     private function get_value_for_rule($field) {
3415     // Si le champ n'existe pas dans la table instruction
3416     if (array_key_exists($field, $this->valF) === false) {
3417     // Récupère l'instance de la classe donnees_techniques
3418     $inst_donnees_techniques = $this->get_inst_donnees_techniques();
3419     // Retourne la valeur de la donnée technique
3420     return $inst_donnees_techniques->getVal($field);
3421     }
3422    
3423     //
3424     return $this->valF[$field];
3425     }
3426    
3427    
3428     /**
3429 softime 18436 * Cette méthode permet de générer le nom de fichier lors de la génération du PDF
3430     * (Édition et finalisation) en fonction de l'existence ou non du type de document.
3431 softime 19307 *
3432 softime 18436 * Pour générer le nom du fichier, si le type de document en lien avec l'évènement existe, on récupère son libellé
3433     * sinon on utilise l'id de la lettretype en lien avec l'évènement.
3434 softime 19307 *
3435 softime 18436 * @return string : le nom du fichier générer
3436     */
3437     function determinate_name_doc_pdf(){
3438     $id_DI = $this->getVal("dossier");
3439     $date = date('Ymd');
3440     $data = "";
3441    
3442     // Récupération de l'id de la lettre type associée à l'instruction
3443     $data = $this->getVal("lettretype");
3444    
3445     // Récupération de l'id de l'instruction
3446     $id_instr = $this->getVal("instruction");
3447    
3448     // Si il existe un type de document associé à l'instruction, on le prend à la place de l'id de la lettretype
3449     if(!empty($this->get_type_document_linked_with_instruction())){
3450     $data = strtolower(str_replace(" ", "-", $this->get_type_document_linked_with_instruction()));
3451     }
3452    
3453     // On retourne le nom du fichier généré
3454     return $this->f->normalize_string(
3455     sprintf(
3456     "%s_%s_%s_%s",
3457     $id_DI,
3458     $id_instr,
3459     $date,
3460     $data
3461     )
3462     );
3463     }
3464    
3465    
3466     /**
3467 softime 6565 * [get_inst_donnees_techniques description]
3468     *
3469     * @param [type] $donnees_techniques [description]
3470     *
3471     * @return [type] [description]
3472     */
3473     function get_inst_donnees_techniques($donnees_techniques = null) {
3474     //
3475 softime 18876 if (isset($this->inst_donnees_techniques) === false ||
3476 softime 6565 $this->inst_donnees_techniques === null) {
3477     //
3478     if (is_null($donnees_techniques)) {
3479     $donnees_techniques = $this->getDonneesTechniques();
3480     }
3481     //
3482 softime 7996 $this->inst_donnees_techniques = $this->f->get_inst__om_dbform(array(
3483     "obj" => "donnees_techniques",
3484     "idx" => $donnees_techniques,
3485     ));
3486 softime 6565 }
3487     //
3488     return $this->inst_donnees_techniques;
3489     }
3490    
3491    
3492     /**
3493     * Retourne l'identifiant des données techniques liées du dossier
3494     * @return string L'identifiant des données techniques liées du dossier
3495     */
3496     function getDonneesTechniques() {
3497 softime 19307
3498 softime 14064 $qres = $this->f->get_one_result_from_db_query(
3499     sprintf(
3500     'SELECT
3501     donnees_techniques
3502 softime 19307 FROM
3503 softime 14064 %1$sdonnees_techniques
3504 softime 19307 WHERE
3505 softime 14064 dossier_instruction = \'%2$s\'',
3506     DB_PREFIXE,
3507     $this->f->db->escapeSimple($this->valF["dossier"])
3508 softime 19307 ),
3509 softime 14064 array(
3510     "origin" => __METHOD__,
3511     )
3512     );
3513 softime 19307
3514 softime 14064 return $qres['result'];
3515 mbroquet 3730 }
3516    
3517 fmichon 4708 /**
3518     * TRIGGER - triggerajouterapres.
3519     *
3520     * - Mise à jour des informations liées au workflow sur le dossier
3521     * - Interface avec le référentiel ERP [105][111]
3522     * - Mise à jour du DA
3523     * - Historisation de la vie du DI
3524     *
3525     * @return boolean
3526     */
3527 softime 8989 function triggerajouterapres($id, &$dnu1 = null, $val = array(), $dnu2 = null) {
3528     $this->addToLog(__METHOD__."(): start", EXTRA_VERBOSE_MODE);
3529 fmichon 4708
3530 softime 18436 $parent_res = parent::triggerajouterapres($id, $dnu1, $val);
3531     if ($parent_res === false) return $parent_res;
3532    
3533     $data = array('val' => &$val, 'id' => $id, 'parent_res' => &$parent_res);
3534 softime 19307 if (! $this->f->module_manager->run_hooks('triggerajouterapres_override_pre', $this, $data)) {
3535     return false;
3536     }
3537 softime 18436
3538 fmichon 4708 // On a besoin de l'instance du dossier lié à l'événement d'instruction
3539     $inst_di = $this->get_inst_dossier($this->valF['dossier']);
3540     // Instance de la classe evenement
3541     $inst_evenement = $this->get_inst_evenement($this->valF['evenement']);
3542 softime 9245 // Instance de l'état courant du dossier d'instruction
3543     $inst_current_etat = $this->f->get_inst__om_dbform(array(
3544     "obj" => "etat",
3545     "idx" => $inst_di->get_id_etat(),
3546     ));
3547 fmichon 4708
3548 mbroquet 3730 /**
3549     * Mise à jour des valeurs du dossier en fonction des valeurs calculées
3550     * par l'action
3551     */
3552 fmichon 4708 // état de complétude actuel du dossier
3553     $incompletude = ($inst_di->getVal('incompletude') == 't' ? true : false);
3554 softime 10573 // L'événement suivant tacite paramétré est destiné à la gestion de l'incomplétude
3555     $ev_suiv_tacite_incompletude = false;
3556 mbroquet 3730 // Initialisation
3557 softime 9245 $valF = array();
3558     $valF_dt = array();
3559 fmichon 4708 //
3560 mbroquet 3730 // Récupération des paramètres de l'action
3561 softime 14542 // TODO : remplacer cette requête par l'instanciation de l'action
3562     $qres = $this->f->get_all_results_from_db_query(
3563     sprintf(
3564     'SELECT
3565     *
3566     FROM
3567     %1$saction
3568     WHERE
3569     action = \'%2$s\'',
3570     DB_PREFIXE,
3571     $this->f->db->escapeSimple($this->valF['action'])
3572     ),
3573     array(
3574     "origin" => __METHOD__
3575     )
3576     );
3577     foreach ($qres['result'] as $row) {
3578 mbroquet 3730
3579     // pour chacune des regles, on applique la regle
3580 softime 6565 if ($row['regle_delai'] != '') {
3581 mbroquet 3730 $valF['delai'] = $this->regle($row['regle_delai'], 'regle_delai');
3582     }
3583 softime 6565 if ($row['regle_accord_tacite'] != '') {
3584 mbroquet 3730 $valF['accord_tacite'] = $this->regle($row['regle_accord_tacite'], 'regle_accord_tacite');
3585     }
3586 softime 6565 if ($row['regle_avis'] != '') {
3587 mbroquet 3730 $valF['avis_decision'] = $this->regle($row['regle_avis'], 'regle_avis');
3588     }
3589 softime 6565 if ($row['regle_date_limite'] != '') {
3590     $valF['date_limite'] = $this->regle($row['regle_date_limite'], 'regle_date_limite');
3591 mbroquet 3730 }
3592 softime 6565 if ($row['regle_date_complet'] != '') {
3593     $valF['date_complet'] = $this->regle($row['regle_date_complet'], 'regle_date_complet');
3594 mbroquet 3730 }
3595 softime 6565 if ($row['regle_date_dernier_depot'] != '') {
3596     $valF['date_dernier_depot'] = $this->regle($row['regle_date_dernier_depot'], 'regle_date_dernier_depot');
3597 mbroquet 3730 }
3598 softime 6565 if ($row['regle_date_notification_delai'] != '') {
3599     $valF['date_notification_delai'] = $this->regle($row['regle_date_notification_delai'], 'regle_date_notification_delai');
3600 mbroquet 3730 }
3601 softime 6565 if ($row['regle_date_decision'] != '') {
3602     $valF['date_decision'] = $this->regle($row['regle_date_decision'], 'regle_date_decision');
3603 mbroquet 3730 }
3604 softime 6565 if ($row['regle_date_rejet'] != '') {
3605     $valF['date_rejet'] = $this->regle($row['regle_date_rejet'], 'regle_date_rejet');
3606 mbroquet 3730 }
3607 softime 6565 if ($row['regle_date_validite'] != '') {
3608     $valF['date_validite'] = $this->regle($row['regle_date_validite'], 'regle_date_validite');
3609 mbroquet 3730 }
3610 softime 6565 if ($row['regle_date_chantier'] != '') {
3611     $valF['date_chantier'] = $this->regle($row['regle_date_chantier'], 'regle_date_chantier');
3612 mbroquet 3730 }
3613 softime 6565 if ($row['regle_date_achevement'] != '') {
3614     $valF['date_achevement'] = $this->regle($row['regle_date_achevement'], 'regle_date_achevement');
3615 mbroquet 3730 }
3616 softime 6565 if ($row['regle_date_conformite'] != '') {
3617     $valF['date_conformite'] = $this->regle($row['regle_date_conformite'], 'regle_date_conformite');
3618 mbroquet 3730 }
3619 softime 6565 if ($row['regle_date_limite_incompletude'] != '') {
3620     $valF['date_limite_incompletude'] = $this->regle($row['regle_date_limite_incompletude'], 'regle_date_limite_incompletude');
3621 mbroquet 3730 }
3622 softime 6565 if ($row['regle_delai_incompletude'] != '') {
3623     $valF['delai_incompletude'] = $this->regle($row['regle_delai_incompletude'], 'regle_delai_incompletude');
3624 mbroquet 3730 }
3625 softime 6565 if ($row['regle_autorite_competente'] != '') {
3626     $valF['autorite_competente'] = $this->regle($row['regle_autorite_competente'], 'regle_autorite_competente');
3627 mbroquet 3730 }
3628 softime 6565 if ($row['regle_etat'] != '') {
3629 softime 10573 $valF['etat'] = $this->regle($row['regle_etat'], 'regle_etat');
3630 mbroquet 3730 }
3631 softime 6565 if ($row['regle_date_cloture_instruction'] !== '') {
3632     $valF['date_cloture_instruction'] = $this->regle($row['regle_date_cloture_instruction'], 'regle_date_cloture_instruction');
3633     }
3634     if ($row['regle_date_premiere_visite'] !== '') {
3635     $valF['date_premiere_visite'] = $this->regle($row['regle_date_premiere_visite'], 'regle_date_premiere_visite');
3636     }
3637     if ($row['regle_date_derniere_visite'] !== '') {
3638     $valF['date_derniere_visite'] = $this->regle($row['regle_date_derniere_visite'], 'regle_date_derniere_visite');
3639     }
3640     if ($row['regle_date_contradictoire'] !== '') {
3641     $valF['date_contradictoire'] = $this->regle($row['regle_date_contradictoire'], 'regle_date_contradictoire');
3642     }
3643     if ($row['regle_date_retour_contradictoire'] !== '') {
3644     $valF['date_retour_contradictoire'] = $this->regle($row['regle_date_retour_contradictoire'], 'regle_date_retour_contradictoire');
3645     }
3646     if ($row['regle_date_ait'] !== '') {
3647     $valF['date_ait'] = $this->regle($row['regle_date_ait'], 'regle_date_ait');
3648     }
3649     if ($row['regle_donnees_techniques1'] !== '') {
3650     $valF_dt[$row['cible_regle_donnees_techniques1']] = $this->regle($row['regle_donnees_techniques1'], 'regle_donnees_techniques1');
3651     }
3652     if ($row['regle_donnees_techniques2'] !== '') {
3653     $valF_dt[$row['cible_regle_donnees_techniques2']] = $this->regle($row['regle_donnees_techniques2'], 'regle_donnees_techniques2');
3654     }
3655     if ($row['regle_donnees_techniques3'] !== '') {
3656     $valF_dt[$row['cible_regle_donnees_techniques3']] = $this->regle($row['regle_donnees_techniques3'], 'regle_donnees_techniques3');
3657     }
3658     if ($row['regle_donnees_techniques4'] !== '') {
3659     $valF_dt[$row['cible_regle_donnees_techniques4']] = $this->regle($row['regle_donnees_techniques4'], 'regle_donnees_techniques4');
3660     }
3661     if ($row['regle_donnees_techniques5'] !== '') {
3662     $valF_dt[$row['cible_regle_donnees_techniques5']] = $this->regle($row['regle_donnees_techniques5'], 'regle_donnees_techniques5');
3663     }
3664     if ($row['regle_date_transmission_parquet'] !== '') {
3665     $valF['date_transmission_parquet'] = $this->regle($row['regle_date_transmission_parquet'], 'regle_date_transmission_parquet');
3666     }
3667 softime 8593 if ($row['regle_dossier_instruction_type'] !== '') {
3668     $valF['dossier_instruction_type'] = $this->regle($row['regle_dossier_instruction_type'], 'regle_dossier_instruction_type');
3669     }
3670 softime 8989 // La date d'affichage est modifiée seulement si le champ n'est pas
3671     // renseigné
3672     if ($row['regle_date_affichage'] !== ''
3673     && ($inst_di->getVal('date_affichage') === ''
3674     || $inst_di->getVal('date_affichage') === null)) {
3675     //
3676     $valF['date_affichage'] = $this->regle($row['regle_date_affichage'], 'regle_date_affichage');
3677     }
3678 softime 10573 //
3679     if ($row['regle_pec_metier'] != '') {
3680     $valF['pec_metier'] = $this->regle($row['regle_pec_metier'], 'regle_pec_metier');
3681     }
3682     if ($row['regle_a_qualifier'] != '') {
3683     $valF['a_qualifier'] = $this->regle($row['regle_a_qualifier'], 'regle_a_qualifier');
3684     }
3685     //
3686     if ($row['regle_incompletude'] != '') {
3687     $valF['incompletude'] = $this->regle($row['regle_incompletude'], 'regle_incompletude');
3688     }
3689     if ($row['regle_incomplet_notifie'] != '') {
3690     $valF['incomplet_notifie'] = $this->regle($row['regle_incomplet_notifie'], 'regle_incomplet_notifie');
3691     }
3692     if ($row['regle_etat_pendant_incompletude'] != '') {
3693     $valF['etat_pendant_incompletude'] = $this->regle($row['regle_etat_pendant_incompletude'], 'regle_etat_pendant_incompletude');
3694     }
3695     if ($row['regle_evenement_suivant_tacite_incompletude'] != '') {
3696     $resti = $this->regle($row['regle_evenement_suivant_tacite_incompletude'], 'regle_evenement_suivant_tacite_incompletude');
3697     if (strtolower($resti) === 't' || strtolower($resti) === 'true') {
3698     $ev_suiv_tacite_incompletude = true;
3699     }
3700     }
3701 mbroquet 3730 }
3702 softime 6063
3703     // Si l'événement a un événement suivant tacite
3704     if($inst_evenement->getVal('evenement_suivant_tacite') != '') {
3705 softime 10573 // En fonction de l'action de l'événement, l'événement suivant tacite ne sera
3706     // pas associé de le même façon au dossier d'instruction
3707     if ($ev_suiv_tacite_incompletude === false) {
3708 softime 6063 $valF['evenement_suivant_tacite'] = $inst_evenement->getVal('evenement_suivant_tacite');
3709 softime 10573 }
3710     if ($ev_suiv_tacite_incompletude === true) {
3711 softime 6063 $valF['evenement_suivant_tacite_incompletude'] = $inst_evenement->getVal('evenement_suivant_tacite');
3712 nhaye 5254 }
3713 mbroquet 3730 }
3714 softime 6565 // Si des valeurs de données techniques ont été calculées alors on met à jour l'enregistrement
3715 softime 9245 if (count($valF_dt) > 0) {
3716 softime 6565 $dt_id = $this->getDonneesTechniques();
3717     // On met à jour le dossier
3718     $cle = " donnees_techniques='".$dt_id."'";
3719 softime 12847 $res1 = $this->f->db->autoexecute(DB_PREFIXE.'donnees_techniques', $valF_dt, DB_AUTOQUERY_UPDATE, $cle);
3720     $this->addToLog(
3721     __METHOD__."(): db->autoexecute(\"".DB_PREFIXE."donnees_techniques\", ".print_r($valF_dt, true).", DB_AUTOQUERY_UPDATE, \"".$cle."\");",
3722     VERBOSE_MODE
3723     );
3724     $this->f->isDatabaseError($res1);
3725 softime 6565 // Affichage d'informations à l'utilisateur
3726 softime 18876 $this->addToMessage(__('enregistrement')." ".$this->valF['dossier']." ".__('table')." dossier [".$this->f->db->affectedRows()." ".__('enregistrement')." ".__('mis_a_jour')."]");
3727 softime 6565 }
3728 mbroquet 3730 // Si des valeurs ont été calculées alors on met à jour l'enregistrement
3729 softime 9245 if (count($valF) > 0) {
3730 softime 10573 //
3731     $inst_dossier = $this->f->get_inst__om_dbform(array(
3732     "obj" => "dossier",
3733     "idx" => $this->valF['dossier'],
3734     ));
3735     $valF['instruction'] = $id;
3736 softime 10968 $valF['crud'] = 'create';
3737 softime 10573 $update_by_instruction = $inst_dossier->update_by_instruction($valF);
3738     if ($update_by_instruction === false) {
3739     $this->cleanMessage();
3740     $this->addToMessage(sprintf('%s %s', __("Une erreur s'est produite lors de la mise à jour du dossier d'instruction."), __("Veuillez contacter votre administrateur.")));
3741     return false;
3742 mbroquet 3730 }
3743     // Affichage d'informations à l'utilisateur
3744 softime 18876 $this->addToMessage(__('enregistrement')." ".$this->valF['dossier']." ".__('table')." dossier [".$this->f->db->affectedRows()." ".__('enregistrement')." ".__('mis_a_jour')."]");
3745 mbroquet 3730 }
3746    
3747     /**
3748 fmichon 4708 * Interface avec le référentiel ERP.
3749     *
3750     * (WS->ERP)[105] Arrêté d'un dossier PC effectué -> PC qui concerne un ERP
3751     * (WS->ERP)[111] Décision de conformité effectuée -> PC qui concerne un ERP
3752     * Déclencheur :
3753     * - L'option ERP est activée
3754     * - Le dossier est marqué comme "connecté au référentiel ERP"
3755     * - Le dossier est de type PC
3756     * - Le formulaire d'ajout d'un événement d'instruction est validé
3757     * avec un événement pour lequel les services ERP doivent être
3758     * informé
3759 mbroquet 3730 */
3760 fmichon 4708 //
3761 softime 7521 if ($this->f->is_option_referentiel_erp_enabled() === true
3762 fmichon 4708 && $inst_di->is_connected_to_referentiel_erp() === true
3763     && $this->f->getDATCode($this->valF['dossier']) == $this->f->getParameter('erp__dossier__nature__pc')
3764     && in_array($inst_evenement->getVal($inst_evenement->clePrimaire), explode(";", $this->f->getParameter('erp__evenements__decision__pc')))) {
3765 mbroquet 3730 //
3766 fmichon 4708 $infos = array(
3767     "dossier_instruction" => $this->valF['dossier'],
3768     "decision" => $inst_evenement->getVal("libelle"),
3769     );
3770 mbroquet 3730 //
3771 fmichon 4708 $ret = $this->f->send_message_to_referentiel_erp(105, $infos);
3772     if ($ret !== true) {
3773     $this->cleanMessage();
3774 softime 18876 $this->addToMessage(__("Une erreur s'est produite lors de la notification (105) du référentiel ERP. Contactez votre administrateur."));
3775 fmichon 4708 return false;
3776 mbroquet 3730 }
3777 softime 18876 $this->addToMessage(__("Notification (105) du référentiel ERP OK."));
3778 fmichon 4708 }
3779 mbroquet 3730
3780 softime 8989 // Si le mode en rédaction intégrale est activé
3781     if (isset($this->valF['flag_edition_integrale']) === true
3782     && $this->valF['flag_edition_integrale'] === true) {
3783     $redactionIntegraleValF = array();
3784    
3785     // Récupère la collectivite du dossier d'instruction
3786     $dossier_instruction_om_collectivite = $this->get_dossier_instruction_om_collectivite();
3787     $collectivite = $this->f->getCollectivite($dossier_instruction_om_collectivite);
3788     // Récupère le corps de la lettre type
3789     $params = array(
3790     "specific" => array(
3791     "corps" => array(
3792     "mode" => "get",
3793     )
3794     ),
3795     );
3796     $result = $this->compute_pdf_output('lettretype', $this->valF['lettretype'], $collectivite, $id, $params);
3797     $redactionIntegraleValF['corps_om_htmletatex'] = $result['pdf_output'];
3798     // Récupère le titre de la lettre type
3799     $params = array(
3800     "specific" => array(
3801     "titre" => array(
3802     "mode" => "get",
3803     )
3804     ),
3805     );
3806     $result = $this->compute_pdf_output('lettretype', $this->valF['lettretype'], $collectivite, $id, $params);
3807     $redactionIntegraleValF['titre_om_htmletat'] = $result['pdf_output'];
3808    
3809     // mise à jour en base de données
3810     $res = $this->f->db->autoExecute(
3811     DB_PREFIXE.$this->table,
3812     $redactionIntegraleValF,
3813     DB_AUTOQUERY_UPDATE,
3814     $this->clePrimaire."=".$id
3815     );
3816     $this->addToLog(__METHOD__."(): db->autoexecute(\"".DB_PREFIXE.'.'.$this->table."\", ".print_r($redactionIntegraleValF, true).", DB_AUTOQUERY_UPDATE, \"".$this->clePrimaire."=".$id."\");", VERBOSE_MODE);
3817     if ($this->f->isDatabaseError($res, true) === true) {
3818     return false;
3819     }
3820     }
3821    
3822 fmichon 4708 /**
3823 softime 7996 * Finalisation automatique de l'instruction si le paramétrage de l'événement l'autorise
3824     */
3825     // Si la finalisation automatique de l'événement est activée
3826     // ET si l'instruction n'a pas déjà été finalisée
3827     // ET s'il existe une lettre type associée
3828     if ($inst_evenement->getVal('finaliser_automatiquement') === 't'
3829     && $inst_evenement->getVal('om_final_instruction') !== 't'
3830     && $inst_evenement->getVal('lettretype') !== ''
3831     && $inst_evenement->getVal('lettretype') !== null) {
3832    
3833     // On instancie l'instruction
3834     $inst_instruction = $this->f->get_inst__om_dbform(array(
3835     "obj" => "instruction",
3836     "idx" => $this->valF[$this->clePrimaire],
3837     ));
3838    
3839     // On finalise l'instruction dans le contexte de finalisation : action 100
3840     $inst_instruction->setParameter('maj', 100);
3841     $finalize = $inst_instruction->finalize($inst_instruction->valF);
3842    
3843     // Une erreur de finalisation renvoie 'false' : ajout dans les logs
3844     // et dans le message d'erreur
3845     if ($finalize === false) {
3846     $this->f->addToLog(__METHOD__."() : ERROR - Impossible de finaliser l'instruction.", DEBUG_MODE);
3847 softime 18876 $this->addToMessage(__("Erreur lors de la finalisation de l'instruction. Contactez votre administrateur."));
3848 softime 7996 return false;
3849     }
3850     }
3851    
3852     /**
3853 softime 7521 * Finalisation automatique des instructions tacites ou retours.
3854     */
3855 softime 7685 // Si l'option de finalisation automatique des instructions tacites ou
3856     // retours est activée et l'événement d'instruction a une lettre type
3857     // associée
3858     $collectivite_di = $this->get_dossier_instruction_om_collectivite($val['dossier']);
3859     if ($this->f->is_option_finalisation_auto_enabled($collectivite_di) === true
3860     && $inst_evenement->getVal('lettretype') !== ''
3861 softime 7521 && $inst_evenement->getVal('lettretype') !== null) {
3862    
3863     // Rècupère l'identifiant de l'événement
3864     $evenement_id = $inst_evenement->getVal($inst_evenement->clePrimaire);
3865    
3866     // Si l'événement d'instruction est identifié comme un événement
3867     // retour
3868     // OU l'événement d'instruction est l'événement suivant tacite du
3869     // dossier d'instruction (incomplétude prise en compte)
3870 softime 19307 // ET l'événement d'instruction n'a pas déjà été finalisé
3871 softime 7996 if (($inst_evenement->getVal("retour") === 't'
3872 softime 7521 || ($inst_di->getVal('evenement_suivant_tacite_incompletude') === $evenement_id
3873 softime 7996 || $inst_di->getVal('evenement_suivant_tacite') === $evenement_id))
3874     && ($inst_evenement->getVal('om_final_instruction') !== 't')) {
3875 softime 7521
3876     // Finalise l'instruction
3877 softime 7996 $inst_instruction = $this->f->get_inst__om_dbform(array(
3878     "obj" => "instruction",
3879     "idx" => $this->valF[$this->clePrimaire],
3880     ));
3881 softime 7521 $inst_instruction->setParameter('maj', 100);
3882     $finalize = $inst_instruction->finalize($inst_instruction->valF);
3883     if ($finalize === false) {
3884     //
3885     return false;
3886     }
3887     }
3888     }
3889    
3890     /**
3891 softime 9245 * Mise à jour de la version de clôture *version_clos* du dossier si et
3892     * seulement si l'instruction met à jour l'état du dossier.
3893     */
3894     if (isset($valF['etat']) === true
3895     && $valF['etat'] !== null
3896     && $valF['etat'] !== '') {
3897     // Instanciation de l'état appliqué sur le dossier par l'instruction
3898     $inst_etat = $this->f->get_inst__om_dbform(array(
3899     "obj" => "etat",
3900     "idx" => $valF['etat'],
3901     ));
3902     //
3903     $update_version_clos = null;
3904     // En cas d'instruction qui clôture le dossier
3905     if ($inst_etat->getVal('statut') === 'cloture') {
3906     $update_version_clos = $inst_di->update_version_clos('up');
3907     }
3908     // En cas d'instruction qui rouvre le dossier
3909     if ($inst_current_etat->getVal('statut') === 'cloture'
3910     && $inst_etat->getVal('statut') !== 'cloture') {
3911     //
3912     $update_version_clos = $inst_di->update_version_clos('down');
3913     //
3914     $params = array(
3915     'di_reopened' => true,
3916     );
3917     }
3918     //
3919     if ($update_version_clos === false) {
3920     $this->f->addToLog(sprintf(
3921     "%s() : ERREUR - %s %s",
3922     __METHOD__,
3923     sprintf(
3924     __("Impossible de mettre à jour la version de clôture du dossier d'instruction %s."),
3925     $inst_di->getVal($inst_di->clePrimaire)
3926     ),
3927     sprintf(
3928     __("L'instruction tente d'appliquer l'état %s."),
3929     $inst_etat->getVal($inst_etat->clePrimaire)
3930     )
3931     ));
3932     $this->addToMessage(sprintf(
3933     "%s %s",
3934     __("Erreur lors de la mise à jour de la version de clôture du dossier d'instruction."),
3935     __("Veuillez contacter votre administrateur.")
3936     ));
3937     return false;
3938     }
3939     }
3940    
3941     /**
3942 softime 10808 * Notification automatique
3943     */
3944     // Notification automatique à l'ajout de l'instruction si la notification
3945     // automatique est choisie et qu'il n'y a pas de lettretype associée à l'événement
3946     if ($inst_evenement->getVal('notification') === 'notification_automatique' &&
3947 softime 18876 ($inst_evenement->getVal('lettretype') === null || $inst_evenement->getVal('lettretype') === '')) {
3948    
3949 softime 13137 // Message à afficher dans les logs pour indiquer quelle notification a échouée
3950 softime 13528 $msgLog = sprintf(
3951     '%s %s : %d',
3952     __('Erreur lors de la notification automatique du(des) pétitionnaire(s).'),
3953     __('Instruction notifiée'),
3954     $id
3955     );
3956 softime 13137
3957 softime 10808 // Récupération de la liste des demandeurs à notifier et de la catégorie
3958     $categorie = $this->f->get_param_option_notification($collectivite_di);
3959 softime 14064 $isPortal = $categorie === PORTAL;
3960 softime 10869 $demandeursANotifie = $this->get_demandeurs_notifiable(
3961     $this->valF['dossier'],
3962     $isPortal
3963     );
3964 softime 10808
3965 softime 18876 //
3966     $msg_notif = '';
3967    
3968 softime 10808 // Création d'une notification et d'une tâche pour chaque demandeur à notifier
3969 softime 12124 $demandeurPrincipalNotifie = false;
3970 softime 10808 foreach ($demandeursANotifie as $demandeur) {
3971 softime 12124 // Identifie si le demandeur principal a été notifié ou pas
3972     // et récupère ses informations
3973     if ($demandeur['petitionnaire_principal'] == 't') {
3974     $demandeurPrincipalNotifie = true;
3975     // Si le demandeur principal est notifiable mais qu'il y a des erreurs dans
3976     // son paramétrage, on effectue pas le traitement et on passe à l'itération
3977     // suivante. On le considère également comme non notifié pour gérer l'envoie
3978     // des messages d'erreurs
3979     // Si la demande a été déposée via le portail alors le paramétrage n'a pas
3980     // d'impact sur la notification
3981     $erreursParam = $this->get_info_notification_fail($val['dossier']);
3982     if (! $this->dossier_depose_sur_portail($val['dossier']) && $erreursParam != array()) {
3983     $demandeurPrincipalNotifie = false;
3984     continue;
3985     }
3986     }
3987 softime 18876 // Récupération du contenu de l'option option_bloquer_notif_auto_dln
3988     $option_bloquer_notif_auto_dln_types_evenements = $this->f->getParameter("option_bloquer_notif_auto_dln") !== null ? explode(';', $this->f->getParameter("option_bloquer_notif_auto_dln")) : null;
3989     // On vérifie l'existence du paramètre 'option_bloquer_notif_auto_dln',
3990     // On vérifie si la date limite est dépassée ou si le type d'événement est erroné
3991     if (! empty($option_bloquer_notif_auto_dln_types_evenements)
3992     && $this->is_type_evenement_autorise($inst_evenement, array('types_evenements_autorises'=> $option_bloquer_notif_auto_dln_types_evenements)) === true
3993     && $this->is_date_limite_notification_premier_mois_depasee() === true) {
3994     // Ajout de la notif et récupération de son id
3995     $idNotif = $this->ajouter_notification(
3996     $this->valF[$this->clePrimaire],
3997     $this->f->get_connected_user_login_name(),
3998     $demandeur,
3999     $collectivite_di,
4000     array(),
4001     true,
4002     'Echec',
4003     __('La date limite de notification au demandeur est dépassée')
4004 softime 13528 );
4005 softime 18876 if ($idNotif === false) {
4006     // Termine le traitement
4007     $this->addToLog(
4008     sprintf('%s() : %s', __METHOD__, $msgLog),
4009     DEBUG_MODE
4010     );
4011     return $this->end_treatment(__METHOD__, false);
4012     }
4013     $msg_notif .= sprintf('%s<br/>%s', __("La notification n'a pas été générée, car la date limite de notification au demandeur est dépassée."), __("Le suivi de la notification est disponible depuis l'instruction."));
4014 softime 10808 }
4015 softime 18876 else {
4016     // Ajout de la notif et récupération de son id
4017     $idNotif = $this->ajouter_notification(
4018     $this->valF[$this->clePrimaire],
4019     $this->f->get_connected_user_login_name(),
4020     $demandeur,
4021     $collectivite_di,
4022     array(),
4023     true
4024 softime 13528 );
4025 softime 18876 if ($idNotif === false) {
4026     $this->addToLog(
4027     sprintf('%s() : %s', __METHOD__, $msgLog),
4028     DEBUG_MODE
4029     );
4030     return false;
4031     }
4032     // Création de la tache en lui donnant l'id de la notification
4033     $notification_by_task = $this->notification_by_task(
4034     $idNotif,
4035     $this->valF['dossier'],
4036     $categorie
4037 softime 10808 );
4038 softime 18876 if ($notification_by_task === false) {
4039     $this->addToLog(
4040     sprintf('%s() : %s', __METHOD__, $msgLog),
4041     DEBUG_MODE
4042     );
4043     $this->addToMessage(
4044     __("Erreur lors de la génération de la notification au(x) pétitionnaire(s).")
4045     );
4046     return false;
4047     }
4048     $msg_notif .= sprintf('%s<br/>%s', __("La notification a été générée."), __("Le suivi de la notification est disponible depuis l'instruction."));
4049 softime 10808 }
4050     }
4051 softime 12847 // Pour la notification par mail ou la notification via portal si le dossier a
4052     // été déposés via portal, si le demandeur principal n'est pas notifiable,
4053     // on créé une nouvelle notification en erreur avec en commentaire la raison pour
4054     // laquelle le demandeur principal n'a pas pu être notifié
4055     $depotPortal = $this->dossier_depose_sur_portail();
4056     if (! $demandeurPrincipalNotifie && ($isPortal === false || $depotPortal === true)) {
4057 softime 13137 // Précision dans les logs que le pétitionnaire principal n'est pas notifiable.
4058     // ' ' permet de mettre un espace entre les 2 msg de log.
4059 softime 13528 $msgLog .= sprintf(' %s', __('Le pétitionnaire principale n\'est pas notifiable.'));
4060 softime 12124 // Analyse pour savoir pourquoi le demandeur principal n'est pas notifiable
4061     $erreursParam = $this->get_info_notification_fail($val['dossier']);
4062     $demandeurPrincipal = $this->get_info_petitionnaire_principal_dossier($val['dossier']);
4063     // Ajout de la notif et récupération de son id
4064     $idNotif = $this->ajouter_notification(
4065     $this->valF[$this->clePrimaire],
4066     $this->f->get_connected_user_login_name(),
4067     $demandeurPrincipal,
4068     $collectivite_di,
4069 softime 12433 array(),
4070 softime 12124 true,
4071     'Echec',
4072     implode(' ', $erreursParam)
4073     );
4074     if ($idNotif === false) {
4075 softime 13528 $this->addToLog(
4076     sprintf('%s() : %s', __METHOD__, $msgLog),
4077     DEBUG_MODE
4078     );
4079 softime 12124 $this->addToMessage(
4080     __('Erreur : la création de la notification a échouée.').
4081     __("Veuillez contacter votre administrateur.")
4082     );
4083     return false;
4084     }
4085     // Prépare un message d'alerte à destination de l'instructeur pour l'informer
4086     // de l'échec de la notification
4087     $dossier_message = $this->get_inst_dossier_message(0);
4088     $dossier_message_val = array(
4089     'dossier' => $val['dossier'],
4090 softime 18876 'type' => __('erreur expedition'),
4091 softime 12124 'emetteur' => $this->f->get_connected_user_login_name().' (automatique)',
4092     'login' => $_SESSION['login'],
4093     'date_emission' => date('Y-m-d H:i:s'),
4094 softime 18876 'contenu' => __('Échec lors de la notification de l\'instruction ').
4095 softime 12124 $inst_evenement->getVal('libelle').
4096     '.<br>'.
4097     implode("\n", $erreursParam).
4098     '<br>'.
4099 softime 18876 __('Veuillez corriger ces informations avant de renvoyer la notification.')
4100 softime 12124 );
4101     $add = $dossier_message->add_notification_message($dossier_message_val, true);
4102     // Si une erreur se produit pendant l'ajout
4103     if ($add !== true) {
4104     $this->addToLog(__METHOD__."(): Le message d'alerte concernant l'echec de l'envoi de la notification n'a pas pu être envoyé.", DEBUG_MODE);
4105     return false;
4106     }
4107     }
4108 softime 18876 $this->addToMessage($msg_notif);
4109 softime 10808 }
4110    
4111 softime 12654 // Notification automatique en cas de dépôt de dossier dématérialisé
4112     // Vérifie si l'option de notification est active et si il s'agit bien d'une
4113     // instruction de récépissé
4114     if (
4115     $this->f->is_option_notification_depot_demat_enabled($collectivite_di)
4116     && $this->is_instruction_recepisse()
4117     ) {
4118 softime 13137 // Message à afficher dans les logs pour indiquer quelle notification a échouée
4119 softime 13528 $msgLog = sprintf(
4120     __('Erreur lors de la notification de dépôt du dossier dématérialisé : %s.'),
4121     $val['dossier']
4122     );
4123 softime 12654 // Récupère l'instance de la demande
4124     $demande = $inst_di->get_inst_demande();
4125 softime 13137 // Vérifie que le dossier a été déposé via platau ou portal
4126 softime 12654 if (
4127 softime 13137 ($demande->getVal('source_depot') == PLATAU ||
4128     $demande->getVal('source_depot') == PORTAL)
4129 softime 12654 ) {
4130 softime 13137 // Récupère la liste des mails fournis en paramètre. Si aucun adresse n'a été récupéré
4131     // l'envoi de la notification n'est pas effectué et un message d'erreur est affiché.
4132     $listeEmails = $this->f->get_param_courriel_de_notification_commune($collectivite_di);
4133     if (empty($listeEmails)) {
4134     $this->addToLog(
4135 softime 13528 sprintf(
4136     '%s(): %s %s',
4137     __METHOD__,
4138     $msgLog,
4139     __('Aucun courriel paramétré.')
4140     ),
4141 softime 13137 DEBUG_MODE
4142 softime 12654 );
4143 softime 13137 } else {
4144     foreach ($listeEmails as $email) {
4145     // Ajout de la notif et récupération de son id
4146     $destinataire = array(
4147     'destinataire' => $email,
4148     'courriel' => $email
4149 softime 12654 );
4150 softime 13137 $idNotif = $this->ajouter_notification(
4151     $this->valF[$this->clePrimaire],
4152     $this->f->get_connected_user_login_name(),
4153     $destinataire,
4154     $collectivite_di,
4155     array(),
4156     true
4157     );
4158     if ($idNotif === false) {
4159 softime 13528 $this->addToLog(
4160     sprintf('%s(): %s', __METHOD__, $msgLog),
4161     DEBUG_MODE
4162     );
4163 softime 13137 return false;
4164     }
4165     // Création de la tache en lui donnant l'id de la notification
4166     $notification_by_task = $this->notification_by_task(
4167     $idNotif,
4168     $this->valF['dossier'],
4169     'mail',
4170     'notification_depot_demat'
4171     );
4172     if ($notification_by_task === false) {
4173     $this->addToMessage(
4174     __("Erreur lors de la génération de la notification de dépot de dossier par voie dématérialisée.")
4175     );
4176 softime 13528 $this->addToLog(
4177     sprintf('%s(): %s', __METHOD__, $msgLog),
4178     DEBUG_MODE
4179     );
4180 softime 13137 return false;
4181     }
4182 softime 12654 }
4183     }
4184     }
4185     }
4186    
4187 softime 10808 /**
4188 softime 7996 * Mise à jour de la date de dernière modification du dossier
4189     */
4190     $inst_di->update_last_modification_date();
4191    
4192     /**
4193 softime 8640 * Mise à jour des données du DA.
4194     */
4195     $inst_da = $inst_di->get_inst_dossier_autorisation();
4196 softime 9245 $params['di_id'] = $this->valF['dossier'];
4197 softime 8640 if ($inst_da->majDossierAutorisation($params) === false) {
4198 softime 18876 $this->addToMessage(__("Erreur lors de la mise a jour des donnees du dossier d'autorisation. Contactez votre administrateur."));
4199 softime 8640 $this->correct = false;
4200     return false;
4201     }
4202    
4203     /**
4204 fmichon 4708 * Historisation de la vie du DI.
4205     */
4206 softime 17542
4207     $res = $this->add_log_to_dossier($id, array_merge($val, $this->valF));
4208    
4209     $data = array('val' => &$val, 'id' => $id, 'result' => &$res);
4210 softime 19307 if (! $this->f->module_manager->run_hooks('triggerajouterapres_override_post', $this, $data)) {
4211     return false;
4212     }
4213 softime 17542 return $res;
4214 nmeucci 3876 }
4215 mbroquet 3730
4216 softime 12124 /**
4217     * Cette méthode vérifie si toutes les conditions de l'envoi de la notification
4218     * sont remplies.
4219     * Les conditions vérifiées sont les suivantes :
4220 softime 14064 * - L'option de notification *option_notification* doit être définie
4221 softime 12124 * - Le petitionnaire principal doit accepter les notifications
4222     * - Le pétitionnaire principal doit avoir une adresse mail renseignée
4223     * - Le pétitionnaire principal doit avoir une adresse mail correcte
4224     * Pour chaque vérification effectué un message d'erreur est ajouté si la
4225     * condition n'est pas remplie.
4226     * Renvoie le message d'erreur en sortie.
4227     *
4228     * @param string identifiant du dossier sur lequel les notifications ont échouée
4229 softime 19307 * @return string
4230 softime 12124 */
4231 softime 18436 public function get_info_notification_fail($dossier = null) {
4232 softime 12124 // Utilise l'identifiant du dossier passé en paramètre et si aucun dossier n'a été récupéré
4233     // utilise celui associé à l'instruction
4234     if ($dossier == null) {
4235     $dossier = $this->getVal('dossier');
4236     }
4237     // Tableau contenant la liste des messages d'erreur
4238     $errorMessage = array();
4239 softime 14064 // Récupère l'option de notification
4240     $collectivite_di = $this->get_dossier_instruction_om_collectivite($dossier);
4241     $option_notification = $this->f->get_param_option_notification($collectivite_di);
4242     if ($option_notification !== PORTAL && $option_notification !== 'mail') {
4243     $errorMessage[] = __("L'option de notification option_notification doit obligatoirement être définie.");
4244     }
4245 softime 12124 // Récupère les informations du demandeurs principal
4246     $infoPetitionnaire = $this->get_info_petitionnaire_principal_dossier($dossier);
4247     // Vérifie si le pétitionnaire principal à bien la case "accepte les notification" cochée
4248     if (isset($infoPetitionnaire['notification']) && $infoPetitionnaire['notification'] != 't') {
4249     $errorMessage[] = __('Le pétitionnaire principal n\'accepte pas les notifications.');
4250     }
4251     // Vérifie si l'adresse mail du pétitionnaire principale est renseignée
4252     if (isset($infoPetitionnaire['courriel']) && ! empty($infoPetitionnaire['courriel'])) {
4253     // Vérifie si le format de l'adresse mail est pas correct et, si ce n'est pas le cas, informe l'utilisateur
4254     // qu'il doit le corriger avant de pouvoir ajouter l'nstruction
4255     if (! $this->f->checkValidEmailAddress($infoPetitionnaire['courriel'])) {
4256     $errorMessage[] = __('Le courriel du pétitionnaire principal n\'est pas correct : ').
4257     $infoPetitionnaire['courriel'].
4258 softime 19307 '.';
4259 softime 12124 }
4260     } else {
4261     // Si le courriel du pétitionnaire principal
4262     $errorMessage[] = __('Le courriel du pétitionnaire principal n\'est pas renseigné.');
4263     }
4264 softime 11585
4265 softime 12124 return $errorMessage;
4266     }
4267    
4268     /**
4269     * Méthode servant à vérifier si un dossier a été déposé sur
4270     * le portail citoyen ou pas.
4271     * La verification se fait via une requête sql dans laquelle
4272     * on va chercher un dossier ayant pour id l'identifiant de
4273     * dossier associé à l'instruction et pour lequel la demande
4274     * associée la plus ancienne est une demande de création de
4275     * dossier via portail
4276     *
4277     * @param string identifiant du dossier. Si non renseigné c'est le dossier
4278     * associé à l'instruction qui est utilisé
4279     * @return boolean|void true : dossier déposé via portail, false : dossier
4280     * non déposé via portail et null : erreur de base de données.
4281     */
4282     protected function dossier_depose_sur_portail($dossier = null) {
4283     if (empty($dossier)) {
4284     $dossier = $this->getVal('dossier');
4285     }
4286 softime 13137 $qres = $this->f->get_one_result_from_db_query(
4287     sprintf(
4288     'SELECT
4289     dossier
4290     FROM
4291     %1$sdossier
4292     -- Récuperation de la première demande associée au dossier
4293     LEFT JOIN (
4294     SELECT
4295     demande,
4296     dossier_instruction,
4297     source_depot
4298     FROM
4299     %1$sdemande
4300     WHERE
4301     dossier_instruction = \'%2$s\'
4302     ORDER BY
4303     demande ASC
4304     LIMIT 1
4305 softime 14064 ) AS demande
4306     ON dossier.dossier = demande.dossier_instruction
4307 softime 13137 WHERE
4308     dossier.dossier = \'%2$s\'
4309     AND demande.source_depot = \'portal\'',
4310     DB_PREFIXE,
4311     $this->f->db->escapeSimple($dossier)
4312     ),
4313     array(
4314     "origin" => __METHOD__,
4315     "force_return" => true,
4316     )
4317 softime 12124 );
4318 softime 13137 if ($qres["code"] !== "OK") {
4319 softime 12124 $this->addToMessage(__('Erreur : La vérification du mode de dépôt du dossier à échoué'));
4320     return;
4321     }
4322     // Si on a un résultat c'est que le dossier a été déposé via le portail
4323 softime 13137 return ! empty($qres["result"]);
4324 softime 12124 }
4325    
4326 softime 11585 public function is_service_notifiable() {
4327     $evenement = $this->get_inst_evenement($this->getVal('evenement'));
4328    
4329     // Si l'instruction a une édition non finalisé quel que soit
4330     // le type de notification, il n'est pas notifiable
4331     if ($this->has_an_edition() === true) {
4332     if ($this->is_unfinalizable_without_bypass() === false) {
4333     return false;
4334     }
4335     }
4336     // Vérifie si la notification des tiers est active pour l'évènement
4337     return $this->get_boolean_from_pgsql_value($evenement->getVal('notification_service'));
4338     }
4339    
4340     public function is_tiers_notifiable() {
4341     $evenement = $this->get_inst_evenement($this->getVal('evenement'));
4342    
4343     // Si l'instruction a une édition non finalisé quel que soit
4344     // le type de notification, il n'est pas notifiable
4345     if ($this->has_an_edition() === true) {
4346     if ($this->is_unfinalizable_without_bypass() === false) {
4347     return false;
4348     }
4349     }
4350     // Vérifie si la notification des tiers est active pour l'évènement
4351 softime 13137 return ! empty($evenement->getVal('notification_tiers'));
4352 softime 11585 }
4353    
4354 softime 12124 /**
4355     * Méthode permettant de savoir si une instruction peut
4356     * être notifiée manuellement selon les différents types
4357     * de notification.
4358     *
4359     * Si l'instruction a une édition non finalisée alors elle n'est pas
4360     * manuellement notifiable.
4361     * Si l'instruction est associé à un événement de notification pour
4362     * lequel un retour signature est recquis, elle n'est notifiable que
4363     * si la date de retour de signature est remplie.
4364     * Par défaut si le type de notification n'est pas connu alors l'instruction
4365     * n'est pas notifiable.
4366     * Pour tous les autres cas l'instruction est manuellement notifiable.
4367     *
4368     * @return boolean true : notifiable | false : non notifiable
4369     */
4370 softime 10808 public function is_notifiable_by_task_manual() {
4371     $ev = $this->get_inst_evenement($this->getVal('evenement'));
4372    
4373     // Si l'instruction a une édition non finalisé quel que soit
4374     // le type de notification, il n'est pas notifiable
4375     if ($this->has_an_edition() === true) {
4376     if ($this->is_unfinalizable_without_bypass() === false) {
4377     return false;
4378     }
4379     }
4380    
4381     // Gestion des différents cas selon la valeur du champs notification
4382 softime 12124 if ($ev->getVal('notification') == 'notification_manuelle' ||
4383     $ev->getVal('notification') == 'notification_manuelle_annexe' ||
4384     $ev->getVal('notification') == 'notification_automatique'
4385     ) {
4386     return true;
4387     } elseif (($ev->getVal('notification') == 'notification_auto_signature_requise' ||
4388     $ev->getVal('notification') == 'notification_manuelle_signature_requise' ||
4389     $ev->getVal('notification') == 'notification_manuelle_annexe_signature_requise') &&
4390     $this->getVal('date_retour_signature') != null &&
4391     $this->getVal('date_retour_signature') != ''
4392     ) {
4393     return true ;
4394 softime 10808 }
4395 softime 12124 return false;
4396 softime 10808 }
4397    
4398 softime 8989 /**
4399 softime 14542 * Crée une instance de notification et une tache notification_instruction de catégorie portal
4400     * pour le demandeur principal.
4401 softime 10808 *
4402     * @return boolean true si le traitement à réussi
4403     */
4404 softime 14542 protected function notifier_demandeur_principal_via_portal() {
4405 softime 10808 $this->begin_treatment(__METHOD__);
4406     $message = '';
4407     // Récupération des informations concernant le demandeur
4408     $dossier = $this->getVal('dossier');
4409 softime 10968 $collectivite_di = $this->get_dossier_instruction_om_collectivite($dossier);
4410 softime 10808 $demandeur = $this->get_demandeurs_notifiable(
4411     $dossier,
4412     true
4413     );
4414     if ($demandeur !== array()) {
4415 softime 10869 $destinataire = array_values($demandeur);
4416 softime 10808 // Ajout de la notif et récupération de son id
4417     $idNotification = $this->ajouter_notification(
4418     $this->getVal($this->clePrimaire),
4419     $this->f->get_connected_user_login_name(),
4420 softime 10968 $destinataire[0],
4421     $collectivite_di,
4422 softime 12433 array(),
4423 softime 10968 true
4424 softime 10808 );
4425     if ($idNotification === false) {
4426     return $this->end_treatment(__METHOD__, false);
4427     }
4428     // Création de la tâche en lui donnant l'id de la notification
4429 softime 14542 $notification_by_task = $this->notification_by_task($idNotification, $dossier, PORTAL);
4430 softime 10808 if ($notification_by_task === false) {
4431     $this->addToMessage(
4432     __("Erreur lors de la génération de la notification au(x) pétitionnaire(s).")
4433     );
4434     return $this->end_treatment(__METHOD__, false);
4435     }
4436     $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.")));
4437     return $this->end_treatment(__METHOD__, true);
4438     }
4439     $this->addToMessage( __("Le demandeur principal n'est pas notifiable."));
4440 softime 12124 return $this->end_treatment(__METHOD__, false);
4441 softime 10808 }
4442    
4443     public function notification_by_task($object_id, $dossier, $category = null, $type = null) {
4444     // Si le type n'est pas correctement spécifié, alors il est calculé
4445 softime 11585 if ($type !== 'notification_recepisse'
4446     && $type !== 'notification_instruction'
4447     && $type !== 'notification_decision'
4448     && $type !== 'notification_service_consulte'
4449 softime 12654 && $type !== 'notification_tiers_consulte'
4450     && $type !== 'notification_depot_demat'
4451 softime 15037 && $type !== 'notification_commune'
4452     && $type !== 'notification_signataire') {
4453 softime 10808 //
4454     $type = 'notification_instruction';
4455     // Vérifie si l'instruction est un récépissé
4456 softime 12654 if ($this->is_instruction_recepisse()) {
4457     $type = 'notification_recepisse';
4458    
4459 softime 10808 }
4460     // Vérifie si l'instruction est une décision
4461     if ($type !== 'notification_recepisse') {
4462     $avis_decision = $this->getVal('avis_decision') !== null ? $this->getVal('avis_decision') : $this->valF['avis_decision'];
4463     if ($avis_decision !== null && $avis_decision !== '') {
4464     $type = 'notification_decision';
4465     }
4466     }
4467     }
4468 softime 14064 // Préparation des valeurs de la tâche
4469 softime 10808 $task_val = array(
4470     'type' => $type,
4471     'object_id' => $object_id,
4472     'dossier' => $dossier,
4473     'category' => $category,
4474     );
4475 softime 14064 // Préparation de la tache de notification
4476     $inst_task = $this->f->get_inst__om_dbform(array(
4477     "obj" => "task",
4478     "idx" => 0,
4479     ));
4480 softime 10808
4481     $add_task = $inst_task->add_task(array('val' => $task_val));
4482     if ($add_task === false) {
4483 softime 13528 $this->addToLog(
4484     sprintf(
4485     '%s(): %s %s : %s',
4486     __METHOD__,
4487     __('Echec de l\'ajout de la tâche de notification.'),
4488     __('Paramétrage de la tâche'),
4489     var_export($task_val, true)
4490     ),
4491     DEBUG_MODE
4492     );
4493 softime 10808 return false;
4494     }
4495    
4496     return true;
4497     }
4498    
4499 softime 10968 /**
4500 softime 12654 * Cette méthode permet de savoir si l'instruction est une instruction
4501     * de recepisse (instruction lié à l'ajout du dossier).
4502     *
4503     * Pour cela, on récupère la liste des actions qui ont menées à la création
4504     * de l'instruction. Si une de ces actions est lié à un objet "demande" on
4505     * en deduis que c'est l'ajout d'une demande qui a déclenché la création de
4506     * l'instruction et donc qu'il s'agit d'un recepisse.
4507     *
4508     * @return boolean
4509     */
4510     protected function is_instruction_recepisse() {
4511     // Récupère la liste des actions qui ont mené à la création de
4512     // l'instruction
4513     $trace = debug_backtrace();
4514     // Parcours la liste des actions et si une de ces actions est lié
4515     // à la classe demande on cosidère que l'instruction est un recepisse
4516     foreach ($trace as $key => $value) {
4517     if (isset($trace[$key]['class']) === true
4518     && empty($trace[$key]['class']) === false) {
4519     if (strtolower($trace[$key]['class']) === 'demande') {
4520     return true;
4521     }
4522     }
4523     }
4524     return false;
4525     }
4526    
4527     /**
4528 softime 10968 * A partir des informations passée en argument ajoute un nouvel élément
4529     * dans la table instruction_notification.
4530     * Avant l'ajout vérifie en utilisant l'id de la collectivité passée en
4531     * paramètre si le paramétrage attendus est ok.
4532     * Ajoute également un nouvel élement dans instruction_notification_document
4533     * si l'instruction possède une lettretype.
4534     * Si un identifiant d'une instruction annexe est donnée ajoute un deuxième
4535     * élement dans la table instruction_notification_document qui correspondra
4536     * à l'annexe de la notification.
4537 softime 19307 *
4538 softime 10968 * @param integer identifiant de l'instruction notifiée
4539     * @param string information concernant l'emetteur
4540     * @param array tableau contenant 2 entrées
4541 softime 19307 * - destinatire : nom, prenom ou raison sociale, dénomination et courriel
4542 softime 10968 * - courriel : adresse mail de la personne à notifier
4543     * @param integer identifiant de la collectivité permettant de récupèrer les
4544     * paramètres à valider
4545     * @param boolean indique si la notification est automatique ou manuelle
4546     * @param integer identifiant d'une instruction dont l'édition sera annexé
4547     * à la notification
4548 softime 19307 *
4549 softime 10968 * @return integer|boolean identifiant de la notification créée si le traitement
4550     * a réussie, false sinon.
4551     */
4552 softime 10869 protected function ajouter_notification(
4553     $idInstruction,
4554     $emetteur,
4555     $destinataire,
4556 softime 10968 $collectiviteId,
4557 softime 12433 $annexes = array(),
4558 softime 10968 $demandeAuto = false,
4559 softime 12124 $statut = 'en cours d\'envoi',
4560 softime 12433 $commentaire = 'Notification en cours de traitement'
4561 softime 10869 ) {
4562 softime 10968 // Vérification que les paramètres nécessaires à l'envoi de la notification existe avant
4563     // de créer la notification
4564     if (! $this->is_parametrage_notification_correct($collectiviteId)) {
4565 softime 13137 $msgErreur = __("Erreur de paramétrage. L'url d'accès au(x) document(s) notifié(s) n'est pas paramétrée.");
4566     $this->addToMessage($msgErreur);
4567 softime 13528 $this->addToLog(
4568     sprintf('%s() : %s', __METHOD__, $msgErreur),
4569     DEBUG_MODE
4570     );
4571 softime 10968 return false;
4572     }
4573 softime 10808 // Préparation de la notification
4574     $inst_notif = $this->f->get_inst__om_dbform(array(
4575     "obj" => "instruction_notification",
4576     "idx" => "]",
4577     ));
4578     $notif_val = array(
4579     'instruction_notification' => null,
4580     'instruction' => $idInstruction,
4581     'automatique' => $demandeAuto,
4582     'emetteur' => $emetteur,
4583     'date_envoi' => null,
4584 softime 10869 'destinataire' => $destinataire['destinataire'],
4585     'courriel' => $destinataire['courriel'],
4586 softime 10808 'date_premier_acces' => null,
4587 softime 12124 'statut' => $statut,
4588     'commentaire' => $commentaire
4589 softime 10808 );
4590    
4591     // Création de la notification
4592     $add_notif = $inst_notif->ajouter($notif_val);
4593     if ($add_notif === false) {
4594 softime 10968 $this->addToMessage(__("Erreur lors de la génération de la notification au(x) pétitionnaire(s)."));
4595 softime 13528 $this->addToLog(
4596     sprintf(
4597     '%s() : %s %s : %s',
4598     __METHOD__,
4599     __("Echec de l'ajout de la notification en base de données."),
4600     __('Paramétrage de la notification'),
4601     var_export($notif_val, true)
4602     ),
4603     DEBUG_MODE
4604     );
4605 softime 10808 return false;
4606     }
4607    
4608 softime 10869 // Si il y a une lettretype finalisé stockage de la clé d'accès au documents
4609     if ($this->evenement_has_an_edition($this->getVal('evenement')) === true) {
4610 softime 12433 $add_notif_doc = $this->ajouter_notification_document(
4611     $inst_notif->getVal($inst_notif->clePrimaire),
4612 softime 10869 $this->getVal($this->clePrimaire),
4613 softime 12433 'instruction'
4614 softime 10808 );
4615     if ($add_notif_doc === false) {
4616 softime 10968 $this->addToMessage(__("Erreur lors de la génération de la notification du document."));
4617 softime 10808 return false;
4618     }
4619 softime 10869 }
4620     // Si une annexe a été choisie stockage de la clé d'accès à l'annexe
4621 softime 12433 if (! empty($annexes) && is_array($annexes)) {
4622     $add_notif_annexe = $this->ajouter_notification_document_multiple(
4623 softime 10869 $inst_notif->getVal($inst_notif->clePrimaire),
4624 softime 12433 $annexes
4625 softime 10869 );
4626     if ($add_notif_annexe === false) {
4627 softime 10968 $this->addToMessage(__("Erreur lors de la génération de la notification de l'annexe."));
4628 softime 10869 return false;
4629     }
4630     }
4631 softime 10808
4632     // Renvoie l'id de la nouvelle instance de instruction_notification
4633     return $inst_notif->getVal($inst_notif->clePrimaire);
4634     }
4635    
4636     /**
4637 softime 11585 * Pour chaque élément du tableau passé en paramètre ajoute une nouvelle
4638     * instance dans la table instruction_notification_document lié a la
4639     * notification dont l'id est passé en paramètre.
4640 softime 19307 *
4641 softime 11585 * @param array tableau contenant les informations nécessaires pour créer les annexes
4642 softime 19307 *
4643 softime 11585 * @return integer|boolean identifiant de la notification créée si le traitement
4644     * a réussie, false sinon.
4645     */
4646     protected function ajouter_notification_document_multiple($idNotification, $listeDocument) {
4647 softime 12433 foreach ($listeDocument as $paramDoc) {
4648     if (! $this->ajouter_notification_document($idNotification, $paramDoc['id'], $paramDoc['tableDocument'], $paramDoc['isAnnexe'])) {
4649 softime 11585 $this->addToMessage(__("Erreur lors de la génération des documents à notifier."));
4650     return false;
4651     }
4652     }
4653     return true;
4654     }
4655    
4656     /**
4657     * Ajoute un élément dans la table instruction_notification_document en utilisant
4658     * les éléments fourni en paramètre
4659     *
4660     * @param integer $idNotification : id de la notification à laquelle on associe le document
4661     * @param integer $idDocument : id de l'objet auquel est rattaché le document
4662     * @param string $tableDocument : nom de la table a laquelle est rattaché le document
4663     * @param boolean $isAnnexe : indique si le document est une annexe ou pas
4664 softime 19307 *
4665 softime 11585 * @return boolean indique si le traitement a réussi
4666     */
4667     protected function ajouter_notification_document($idNotification, $idDocument, $tableDocument, $isAnnexe = false) {
4668     $inst_notif_doc = $this->f->get_inst__om_dbform(array(
4669     "obj" => "instruction_notification_document",
4670     "idx" => "]",
4671     ));
4672     // l'attribut instruction doit obligatoirement être renseigné
4673     // pour éviter toutes confusion avec d'autres instruction l'id
4674     // 0 est donné au document n'appartenant pas aux instructions
4675     $notif_doc_val = array(
4676     'instruction_notification_document' => null,
4677     'instruction_notification' => $idNotification,
4678     'instruction' => $tableDocument == 'instruction' ? $idDocument : 0,
4679     'document_type' => $tableDocument,
4680     'document_id' => $idDocument,
4681     'cle' => $this->getCleAccesDocument(),
4682     'annexe' => $isAnnexe
4683     );
4684    
4685     $add_notif_doc = $inst_notif_doc->ajouter($notif_doc_val);
4686     if ($add_notif_doc === false) {
4687 softime 13528 $this->addToLog(
4688     sprintf(
4689     '%s() : %s %s : %s',
4690     __METHOD__,
4691     __('Echec de l\'ajout du paramétrage du document notifié en base de données.'),
4692     __('Paramétrage du document'),
4693     var_export($notif_doc_val, true)
4694     ),
4695     DEBUG_MODE
4696     );
4697 softime 11585 return false;
4698     }
4699     return true;
4700     }
4701 softime 18436
4702 softime 11585 /**
4703 softime 18436 * Récupère via une requête la liste des identifiants des éléments de la table
4704     * parametrage_annexe liés à une instruction.
4705     * Boucle sur cette liste pour instancier le parametrage_annexe correspondant
4706     * et lui appliquer le traitement de suppression.
4707     *
4708     * @param integer identifiant d'une instruction
4709     * @return boolean état du traitement. True : OK, False : Echec
4710     */
4711     function supprimer_parametrage_annexe($id_instruction) {
4712     // Récupère la liste des parametrage_annexe associés à l'instruction
4713     $qres = $this->f->get_all_results_from_db_query(sprintf(
4714     'SELECT parametrage_annexe
4715     FROM %sparametrage_annexe
4716     WHERE parametrage_annexe.instruction = %d',
4717     DB_PREFIXE,
4718     intval($id_instruction)),
4719     array('origin' => __METHOD__));
4720     // Instancie puis supprime chacun des éléments de la liste
4721     foreach ($qres['result'] as $res) {
4722     $parametrage_annexe = $this->f->get_inst__om_dbform(array(
4723     'obj' => 'parametrage_annexe',
4724     'idx' => $res['parametrage_annexe']
4725     ));
4726     foreach ($parametrage_annexe->champs as $champ) {
4727     $val[$champ] = $parametrage_annexe->getVal($champ);
4728     }
4729     $suppression = $parametrage_annexe->supprimer($val);
4730     // En cas d'échec arrête le traitement et renvoie false
4731     if ($suppression === false) {
4732     return false;
4733     }
4734     }
4735     return true;
4736     }
4737    
4738     /**
4739 softime 10968 * Vérifie si le paramétrage de la notification des demandeurs est correct.
4740 softime 19307 *
4741 softime 10968 * @param integer identifiant de la collectivité
4742     * @return boolean
4743     */
4744     protected function is_parametrage_notification_correct($collectiviteId) {
4745     $categorie = $this->f->get_param_option_notification($collectiviteId);
4746     $urlAccesNotif = $this->f->get_parametre_notification_url_acces($collectiviteId);
4747 softime 14064 if ($categorie === 'mail' && $urlAccesNotif === null) {
4748 softime 10968 return false;
4749     }
4750     return true;
4751     }
4752    
4753     /**
4754 softime 19307 * Calcule les nouvelles métadonnées pour un fichier d'instruction.
4755     * Ajoute des métadonnées spécifiques si l'événement est de type "arrêté".
4756     *
4757     * @return array|false Les métadonnées ou false en cas d'erreur.
4758     */
4759     protected function calculate_metadata() {
4760     // Calculs des nouvelles métadonnées
4761     $metadata = $this->getMetadata("om_fichier_instruction");
4762    
4763     // On vérifie si l'instruction à finaliser a un événement de type arrete
4764     // TODO : A voir pour remplacer par une instanciation de l'événement.
4765     // Voir également si l'événement ne dois pas être instancié en début de
4766     // méthode pour pouvoir être réutilisé.
4767     $qres = $this->f->get_one_result_from_db_query(
4768     sprintf(
4769     'SELECT
4770     type
4771     FROM
4772     %1$sevenement
4773     WHERE
4774     evenement = \'%2$d\'',
4775     DB_PREFIXE,
4776     intval($this->getVal("evenement"))
4777     ),
4778     array(
4779     "origin" => __METHOD__,
4780     "force_return" => true,
4781     )
4782     );
4783     if ($qres["code"] !== "OK") {
4784     return false;
4785     }
4786     // Si l'événement est de type arrete, on ajoute les métadonnées spécifiques
4787     if ($qres['result'] == 'arrete'){
4788     $metadata = array_merge($metadata, $this->getMetadata("arrete"));
4789     }
4790    
4791     //
4792     return $metadata;
4793     }
4794    
4795     /**
4796 softime 8989 * TRIGGER - triggermodifierapres.
4797     *
4798     * @return boolean
4799     */
4800     function triggermodifierapres($id, &$dnu1 = null, $val = array(), $dnu2 = null) {
4801     $this->addToLog(__METHOD__."(): start", EXTRA_VERBOSE_MODE);
4802 softime 19307
4803 softime 17542 $data = array('val' => &$val, 'id' => $id);
4804 softime 19307 if (! $this->f->module_manager->run_hooks('triggermodifierapres_pre', $this, $data)) {
4805     return false;
4806     }
4807    
4808 softime 10808 $collectivite_di = $this->get_dossier_instruction_om_collectivite($val['dossier']);
4809     $message = '';
4810 softime 18769 $res = true;
4811 softime 13137 // Définit si le dossier d'instruction doit être mis à jour
4812     $update_dossier = true;
4813     // Les actions de mise à jour des dates ne doivent pas appliquer
4814     // l'action de l'événement et donc ne pas mettre à jour le dossier
4815     if ($this->getParameter("maj") == 125
4816     || $this->getParameter("maj") == 170
4817     || $this->getParameter("maj") == 175) {
4818     $update_dossier = false;
4819     }
4820    
4821     // Traitement en cas de mise à jour du dossier
4822     if ($update_dossier === true) {
4823     /**
4824     * L'objectif ici est d'effectuer les recalculs de date dans le dossier
4825     * si la date de l'evenement est modifiee
4826 softime 19307 */
4827 softime 13137 // Initialisation
4828     $valF = array();
4829     $valF_dt = array();
4830     // Initialisation du type d'événement
4831     $type_evmt = "";
4832     // Récupération de l'action correspondante à l'événement
4833 softime 14064 $evenement = $this->f->get_inst__om_dbform(array(
4834     "obj" => "evenement",
4835     "idx" => $this->valF['evenement']
4836     ));
4837 softime 13137
4838     // Récupération des paramètres de l'action
4839 softime 14542 // TODO : remplacer cette requête par l'instanciation de l'action
4840     $qres = $this->f->get_all_results_from_db_query(
4841     sprintf(
4842     'SELECT
4843     *
4844     FROM
4845     %1$saction
4846     WHERE
4847     action = \'%2$s\'',
4848     DB_PREFIXE,
4849     $this->f->db->escapeSimple($evenement->getVal('action'))
4850     ),
4851     array(
4852     "origin" => __METHOD__
4853     )
4854 softime 14064 );
4855 softime 14542 foreach ($qres['result'] as $row) {
4856 softime 13137 // application des regles sur le courrier + delai
4857     if(preg_match("/date_evenement/",$row['regle_date_limite'])){
4858     $valF['date_limite']= $this->regle($row['regle_date_limite'], 'regle_date_limite');
4859     }
4860     if(preg_match("/date_evenement/",$row['regle_date_complet'])){
4861     $valF['date_complet']= $this->regle($row['regle_date_complet'], 'regle_date_complet');
4862     }
4863     if(preg_match("/date_evenement/",$row['regle_date_dernier_depot'])){
4864     $valF['date_dernier_depot']= $this->regle($row['regle_date_dernier_depot'], 'regle_date_dernier_depot');
4865     }
4866     if(preg_match("/date_evenement/",$row['regle_date_notification_delai'])){
4867     $valF['date_notification_delai']= $this->regle($row['regle_date_notification_delai'], 'regle_date_notification_delai');
4868     }
4869     if(preg_match("/date_evenement/",$row['regle_date_decision'])){
4870     $valF['date_decision']= $this->regle($row['regle_date_decision'], 'regle_date_decision');
4871     }
4872     if(preg_match("/date_evenement/",$row['regle_date_rejet'])){
4873     $valF['date_rejet']= $this->regle($row['regle_date_rejet'], 'regle_date_rejet');
4874     }
4875     if(preg_match("/date_evenement/",$row['regle_date_validite'])){
4876     $valF['date_validite']= $this->regle($row['regle_date_validite'], 'regle_date_validite');
4877     }
4878     if(preg_match("/date_evenement/",$row['regle_date_chantier'])){
4879     $valF['date_chantier']= $this->regle($row['regle_date_chantier'], 'regle_date_chantier');
4880     }
4881     if(preg_match("/date_evenement/",$row['regle_date_achevement'])){
4882     $valF['date_achevement']= $this->regle($row['regle_date_achevement'], 'regle_date_achevement');
4883     }
4884     if(preg_match("/date_evenement/",$row['regle_date_conformite'])){
4885     $valF['date_conformite']= $this->regle($row['regle_date_conformite'], 'regle_date_conformite');
4886     }
4887     if(preg_match("/date_evenement/",$row['regle_date_cloture_instruction'])){
4888     $valF['date_cloture_instruction']= $this->regle($row['regle_date_cloture_instruction'], 'regle_date_cloture_instruction');
4889     }
4890     if(preg_match("/date_evenement/",$row['regle_date_premiere_visite'])){
4891     $valF['date_premiere_visite']= $this->regle($row['regle_date_premiere_visite'], 'regle_date_premiere_visite');
4892     }
4893     if(preg_match("/date_evenement/",$row['regle_date_derniere_visite'])){
4894     $valF['date_derniere_visite']= $this->regle($row['regle_date_derniere_visite'], 'regle_date_derniere_visite');
4895     }
4896     if(preg_match("/date_evenement/",$row['regle_date_contradictoire'])){
4897     $valF['date_contradictoire']= $this->regle($row['regle_date_contradictoire'], 'regle_date_contradictoire');
4898     }
4899     if(preg_match("/date_evenement/",$row['regle_date_retour_contradictoire'])){
4900     $valF['date_retour_contradictoire']= $this->regle($row['regle_date_retour_contradictoire'], 'regle_date_retour_contradictoire');
4901     }
4902     if(preg_match("/date_evenement/",$row['regle_date_ait'])){
4903     $valF['date_ait']= $this->regle($row['regle_date_ait'], 'regle_date_ait');
4904     }
4905     if(preg_match("/date_evenement/",$row['regle_date_transmission_parquet'])){
4906     $valF['date_transmission_parquet']= $this->regle($row['regle_date_transmission_parquet'], 'regle_date_transmission_parquet');
4907     }
4908     if ($row['regle_donnees_techniques1'] !== '') {
4909     $valF_dt[$row['cible_regle_donnees_techniques1']] = $this->regle($row['regle_donnees_techniques1'], 'regle_donnees_techniques1');
4910     }
4911     if ($row['regle_donnees_techniques2'] !== '') {
4912     $valF_dt[$row['cible_regle_donnees_techniques2']] = $this->regle($row['regle_donnees_techniques2'], 'regle_donnees_techniques2');
4913     }
4914     if ($row['regle_donnees_techniques3'] !== '') {
4915     $valF_dt[$row['cible_regle_donnees_techniques3']] = $this->regle($row['regle_donnees_techniques3'], 'regle_donnees_techniques3');
4916     }
4917     if ($row['regle_donnees_techniques4'] !== '') {
4918     $valF_dt[$row['cible_regle_donnees_techniques4']] = $this->regle($row['regle_donnees_techniques4'], 'regle_donnees_techniques4');
4919     }
4920     if ($row['regle_donnees_techniques5'] !== '') {
4921     $valF_dt[$row['cible_regle_donnees_techniques5']] = $this->regle($row['regle_donnees_techniques5'], 'regle_donnees_techniques5');
4922     }
4923     if ($row['regle_dossier_instruction_type'] !== '') {
4924     $valF['dossier_instruction_type'] = $this->regle($row['regle_dossier_instruction_type'], 'regle_dossier_instruction_type');
4925     }
4926 mbroquet 3730 }
4927 softime 13137 // Si des valeurs de données techniques ont été calculées alors on met à jour l'enregistrement
4928     if (count($valF_dt) > 0) {
4929     $dt_id = $this->getDonneesTechniques();
4930     // On met à jour le dossier
4931     $cle = " donnees_techniques='".$dt_id."'";
4932     $res1 = $this->f->db->autoExecute(DB_PREFIXE.'donnees_techniques', $valF_dt, DB_AUTOQUERY_UPDATE, $cle);
4933     $this->addToLog(
4934     __METHOD__."(): db->autoexecute(\"".DB_PREFIXE."donnees_techniques\", ".print_r($valF_dt, true).", DB_AUTOQUERY_UPDATE, \"".$cle."\");",
4935     VERBOSE_MODE
4936     );
4937     $this->f->isDatabaseError($res1);
4938     // Affichage d'informations à l'utilisateur
4939 softime 18876 $this->addToMessage(__('enregistrement')." ".$this->valF['dossier']." ".__('table')." dossier [".$this->f->db->affectedRows()." ".__('enregistrement')." ".__('mis_a_jour')."]");
4940 mbroquet 3730 }
4941 softime 13137 // Si des valeurs ont été calculées alors on met à jour l'enregistrement
4942     if (count($valF) > 0) {
4943     $inst_dossier = $this->f->get_inst__om_dbform(array(
4944     "obj" => "dossier",
4945     "idx" => $this->valF['dossier'],
4946     ));
4947     $valF['instruction'] = $id;
4948     $valF['crud'] = 'update';
4949     $update_by_instruction = $inst_dossier->update_by_instruction($valF);
4950     if ($update_by_instruction === false) {
4951     $this->cleanMessage();
4952     $this->addToMessage(sprintf('%s %s', __("Une erreur s'est produite lors de la mise à jour du dossier d'instruction."), __("Veuillez contacter votre administrateur.")));
4953     return false;
4954     }
4955     // Affichage d'informations à l'utilisateur
4956 softime 18876 $this->addToMessage(__('enregistrement')." ".$this->valF['dossier']." ".__('table')." dossier [".$this->f->db->affectedRows()." ".__('enregistrement')." ".__('mis_a_jour')."]");
4957 mbroquet 3730 }
4958     }
4959    
4960 softime 14064 // Par défaut les instructions à ajouter suite à la saisie d'une date
4961     // de retour signature ou de notification, utilisent l'action 0
4962     // Si la création d'événement d'instruction suivant est déclenchée par
4963     // une notification suite au traitement d'une tâche (démat') alors l'ajout
4964     // de la nouvelle instruction se fait avec l'action 176
4965     // Cela permet de ne pas contrôler la restriction lors de l'ajout de la
4966     // nouvelle instruction, depuis la méthode verifier()
4967     $code_action_add = 0;
4968     if ($this->getParameter("maj") == 175) {
4969     $code_action_add = 176;
4970     }
4971 mbroquet 3730 $restriction = $this->get_restriction($val['evenement']);
4972     $this->restriction_valid = $this->restrictionIsValid($restriction);
4973    
4974     if($restriction == "" || $this->restriction_valid ){
4975     // Récupération de tous les paramètres de l'événement sélectionné
4976 softime 14542 // TODO : remplacer cette requête par l'instanciation de l'evenement
4977     $qres = $this->f->get_all_results_from_db_query(
4978     sprintf(
4979     'SELECT
4980     *
4981     FROM
4982     %1$sevenement
4983     WHERE
4984     evenement = %2$d',
4985     DB_PREFIXE,
4986     intval($this->valF['evenement'])
4987     ),
4988     array(
4989     "origin" => __METHOD__
4990     )
4991     );
4992 nmeucci 3965 $current_id = $this->getVal($this->clePrimaire);
4993 softime 14542 foreach ($qres['result'] as $row) {
4994 softime 18436 // Si la date de retour signature est éditée
4995     if (
4996 softime 19307 $this->getVal('date_retour_signature') == "" &&
4997     $this->valF['date_retour_signature'] != ""
4998 softime 18436 ){
4999     // On Lance le hook
5000     $data = array('val' => $this->valF);
5001     $data['dossier'] = $this->valF['dossier'];
5002     $this->f->module_manager->run_hooks('update_date_retour_signature_pre', $this, $data);
5003    
5004 softime 19307 // On vérifie si il existe un événement automatique
5005 softime 18436 if (
5006     $row['evenement_retour_signature'] != ""
5007     ) {
5008     $new_instruction = $this->f->get_inst__om_dbform(array(
5009     "obj" => "instruction",
5010     "idx" => "]",
5011     ));
5012     // Création d'un tableau avec la liste des champs de l'instruction
5013     foreach($new_instruction->champs as $champ) {
5014 softime 19307 $valNewInstr[$champ] = "";
5015 softime 18436 }
5016     // Définition des valeurs de la nouvelle instruction
5017     $valNewInstr["evenement"] = $row['evenement_retour_signature'];
5018     $valNewInstr["destinataire"] = $this->valF['destinataire'];
5019     $valNewInstr["dossier"] = $this->valF['dossier'];
5020     $valNewInstr["date_evenement"] = $this->f->formatDate($this->valF['date_retour_signature']);
5021     $valNewInstr["date_envoi_signature"] = $this->f->formatDate($this->valF['date_envoi_signature']);
5022     $valNewInstr["date_retour_signature"] = $this->f->formatDate($this->valF['date_retour_signature']);
5023     $valNewInstr["date_envoi_rar"] = $this->f->formatDate($this->valF['date_envoi_rar']);
5024     $valNewInstr["date_retour_rar"] = $this->f->formatDate($this->valF['date_retour_rar']);
5025     $valNewInstr["date_envoi_controle_legalite"] = $this->f->formatDate($this->valF['date_envoi_controle_legalite']);
5026     $valNewInstr["date_retour_controle_legalite"] = $this->f->formatDate($this->valF['date_retour_controle_legalite']);
5027     $new_instruction->setParameter("maj", $code_action_add);
5028 softime 19307 $new_instruction->class_actions[$code_action_add]["identifier"] =
5029 softime 18436 sprintf(
5030     __("Ajout suite au retour signature de l'instruction %s"),
5031     $current_id
5032     );
5033     $retour = $new_instruction->ajouter($valNewInstr);
5034 softime 19307
5035 softime 18436 //Si une erreur s'est produite et qu'il s'agit d'un problème
5036     //de restriction
5037     if ($retour == false && !$new_instruction->restriction_valid){
5038     $error_message = $this->get_restriction_error_message($restriction);
5039     $this->f->displayMessage("error", $error_message);
5040     $this->addToLog(__METHOD__."(): evenement retour ".
5041     "instruction ".$this->valF[$this->clePrimaire]." : ".
5042     $new_instruction->msg);
5043     }
5044     //Si une erreur s'est produite après le test de la restriction
5045     elseif ($retour == false && $new_instruction->restriction_valid){
5046     $this->correct = false ;
5047     $this->msg .= $new_instruction->msg;
5048     return false;
5049     }
5050 mbroquet 3730 }
5051 softime 18436
5052     $this->f->module_manager->run_hooks('update_date_retour_signature_post', $this, $data);
5053 mbroquet 3730 }
5054 softime 18436
5055 softime 19307 // Si la date de retour AR est éditée
5056 softime 18436 if (
5057 softime 19307 $this->getVal('date_retour_rar') == "" &&
5058     $this->valF['date_retour_rar'] != ""
5059 softime 18436 ){
5060     // On Lance le hook Notification/Date retour Accusée Reception
5061     $data = array('val' => $this->valF);
5062     $data['dossier'] = $this->valF['dossier'];
5063     $this->f->module_manager->run_hooks('update_date_retour_rar_pre', $this, $data);
5064    
5065     // On vérifie si il existe un événement automatique
5066     if ( $row['evenement_retour_ar'] != "" ) {
5067 softime 7996 $new_instruction = $this->f->get_inst__om_dbform(array(
5068     "obj" => "instruction",
5069     "idx" => "]",
5070     ));
5071 mbroquet 3730 // Création d'un tableau avec la liste des champs de l'instruction
5072     foreach($new_instruction->champs as $champ) {
5073 softime 19307 $valNewInstr[$champ] = "";
5074 mbroquet 3730 }
5075     // Définition des valeurs de la nouvelle instruction
5076     $valNewInstr["evenement"] = $row['evenement_retour_ar'];
5077     $valNewInstr["destinataire"] = $this->valF['destinataire'];
5078     $valNewInstr["dossier"] = $this->valF['dossier'];
5079     $valNewInstr["date_evenement"] = $this->f->formatDate($this->valF['date_retour_rar']);
5080     $valNewInstr["date_envoi_signature"] = $this->f->formatDate($this->valF['date_envoi_signature']);
5081     $valNewInstr["date_retour_signature"] = $this->f->formatDate($this->valF['date_retour_signature']);
5082     $valNewInstr["date_envoi_rar"] = $this->f->formatDate($this->valF['date_envoi_rar']);
5083     $valNewInstr["date_retour_rar"] = $this->f->formatDate($this->valF['date_retour_rar']);
5084     $valNewInstr["date_envoi_controle_legalite"] = $this->f->formatDate($this->valF['date_envoi_controle_legalite']);
5085     $valNewInstr["date_retour_controle_legalite"] = $this->f->formatDate($this->valF['date_retour_controle_legalite']);
5086 softime 14064 $new_instruction->setParameter("maj", $code_action_add);
5087 softime 19307 $new_instruction->class_actions[$code_action_add]["identifier"] =
5088 softime 13137 sprintf(__("Ajout suite à la notification de l'instruction %s"), $current_id);
5089 softime 8989 $retour = $new_instruction->ajouter($valNewInstr);
5090 mbroquet 3730
5091     //Si une erreur s'est produite et qu'il s'agit d'un problème
5092     //de restriction
5093     if ($retour == false && !$new_instruction->restriction_valid) {
5094     $error_message = $this->get_restriction_error_message($restriction);
5095     $this->f->displayMessage("error", $error_message);
5096     $this->addToLog(
5097 softime 8989 __METHOD__."(): evenement retour instruction ".
5098 mbroquet 3730 $this->valF[$this->clePrimaire]." : ".
5099     $new_instruction->msg
5100     );
5101     }
5102     //Si une erreur s'est produite après le test de la restriction
5103     elseif ($retour == false && $new_instruction->restriction_valid){
5104     $this->correct = false ;
5105     $this->msg .= $new_instruction->msg;
5106     return false;
5107     }
5108     }
5109 softime 18436 $this->f->module_manager->run_hooks('update_date_retour_rar_post', $this, $data);
5110 mbroquet 3730 }
5111 softime 18436
5112     // Si la date_envoi_signature est éditée
5113     if (
5114 softime 19307 $this->getVal('date_envoi_signature') == "" &&
5115     $this->valF['date_envoi_signature'] != ""
5116 softime 18436 ){
5117     // On Lance le hook
5118     $data = array('val' => $this->valF);
5119     $data['dossier'] = $this->valF['dossier'];
5120     $this->f->module_manager->run_hooks('update_date_envoi_signature', $this, $data);
5121     }
5122     // Si la date de envoi AR est éditée
5123     if (
5124 softime 19307 $this->getVal('date_envoi_rar') == "" &&
5125     $this->valF['date_envoi_rar'] != ""
5126 softime 18436 ){
5127     // On Lance le hook
5128     $data = array('val' => $this->valF);
5129     $data['dossier'] = $this->valF['dossier'];
5130     $this->f->module_manager->run_hooks('update_date_envoi_rar', $this, $data);
5131     }
5132     // Si la date de envoi controle legalite est éditée
5133     if (
5134 softime 19307 $this->getVal('date_envoi_controle_legalite') == "" &&
5135     $this->valF['date_envoi_controle_legalite'] != ""
5136 softime 18436 ){
5137     // On Lance le hook
5138     $data = array('val' => $this->valF);
5139     $data['dossier'] = $this->valF['dossier'];
5140     $this->f->module_manager->run_hooks('update_date_envoi_controle_legalite', $this, $data);
5141     }
5142     // Si la date de retour controle legalite est éditée
5143     if (
5144 softime 19307 $this->getVal('date_retour_controle_legalite') == "" &&
5145     $this->valF['date_retour_controle_legalite'] != ""
5146 softime 18436 ){
5147     // On Lance le hook
5148     $data = array('val' => $this->valF);
5149     $data['dossier'] = $this->valF['dossier'];
5150     $this->f->module_manager->run_hooks('update_date_retour_controle_legalite', $this, $data);
5151     }
5152 mbroquet 3730 }
5153     }
5154    
5155 softime 13137 // Traitement en cas de mise à jour du dossier
5156     if ($update_dossier === true) {
5157     /**
5158     * Mise à jour de la date de dernière modification du dossier
5159     * d'instruction
5160     */
5161     $inst_di = $this->get_inst_dossier($this->getVal('dossier'));
5162     $inst_di->update_last_modification_date();
5163 softime 8640
5164 softime 13137 // Mise à jour des données du dossier d'autorisation
5165     $da = $this->f->get_inst__om_dbform(array(
5166     "obj" => "dossier_autorisation",
5167     "idx" => $this->getNumDemandeAutorFromDossier($this->valF['dossier']),
5168     ));
5169     $params = array(
5170     'di_id' => $this->getVal('dossier'),
5171     );
5172     if($da->majDossierAutorisation($params) === false) {
5173 softime 18876 $this->addToMessage(__("Erreur lors de la mise a jour des donnees du dossier d'autorisation. Contactez votre administrateur."));
5174 softime 13137 $this->correct = false;
5175     return false;
5176     }
5177 mbroquet 3730 }
5178 softime 7996
5179 softime 10573 // mise à jour des métadonnées issues des dates de suivi
5180     $dateRetourSignatureModified = ($this->valF['date_retour_signature'] != $this->getVal('date_retour_signature'));
5181     $dateRetourRARModified = ($this->valF['date_retour_rar'] != $this->getVal('date_retour_rar'));
5182     if ($dateRetourSignatureModified || $dateRetourRARModified) {
5183    
5184 softime 19307 $docUid = $this->getVal("om_fichier_instruction");
5185    
5186 softime 10573 // Calculs des nouvelles métadonnées
5187 softime 19307 $metadata = $this->calculate_metadata();
5188     if ($metadata === false) {
5189 softime 10573 $this->correct = false;
5190     $this->addToMessage(__("Erreur de traitement de fichier."));
5191 softime 19307 $log_msg_error = "Modification non enregistrée - id instruction = %s - uid fichier = %s";
5192     $this->addToLog(sprintf(__METHOD__.'() %s : %s', sprintf($log_msg_error, $this->getVal($this->clePrimaire), $docUid), __('Erreur lors du calcule des métadonnées du fichier')), DEBUG_MODE);
5193 softime 10573 return false;
5194     }
5195    
5196     // Filtre pour conserver uniquement les métadonnées liées aux dates
5197     $metadataToKeep = array(
5198     "statutAutorisation",
5199     "dateEvenementDocument",
5200     'date_cloture_metier',
5201     "NotificationArrete",
5202     "dateNotificationArrete",
5203     "controleLegalite",
5204     "dateSignature",
5205     "nomSignataire",
5206     "qualiteSignataire",
5207     "dateControleLegalite",
5208     );
5209     $metadata = array_filter(
5210     $metadata,
5211     function($key) use ($metadataToKeep) { return in_array($key, $metadataToKeep); },
5212     ARRAY_FILTER_USE_KEY
5213     );
5214    
5215     // Mise à jour des métadonnées du document en GED
5216     $operationOrUID = $this->f->storage->update_metadata($docUid, $metadata);
5217     if ($operationOrUID == 'OP_FAILURE') {
5218     $this->correct = false;
5219     $this->addToMessage(__("Erreur de traitement de fichier."));
5220     $this->addToLog(__METHOD__."() failed to update metadata: ".var_export($operationOrUID, true), DEBUG_MODE);
5221     return false;
5222     }
5223    
5224     // mise à jour de l'UID du document en BDD
5225     else {
5226     $valF = array('om_fichier_instruction' => $operationOrUID);
5227     $res = $this->f->db->autoExecute(DB_PREFIXE.$this->table, $valF, DB_AUTOQUERY_UPDATE, $this->getCle($id));
5228     $this->addToLog(__METHOD__.'() : db->autoExecute("'.DB_PREFIXE.$this->table.'", '.print_r($valF, true).', DB_AUTOQUERY_UPDATE, "'.$this->getCle($id).'")', VERBOSE_MODE);
5229     if ($this->f->isDatabaseError($res, true) === true) {
5230     $this->correct = false;
5231     $this->addToMessage(__("Erreur de traitement de fichier."));
5232     $this->addToLog(__METHOD__."() erreur BDD: ".var_export($res->getMessage(), true), DEBUG_MODE);
5233     return false;
5234     }
5235     $this->addToMessage(__("La mise a jour du document s'est effectuee avec succes."));
5236     }
5237     }
5238    
5239 softime 13137 // Déclenchement des notifications automatique après finalisation et
5240     // retour de signature
5241 softime 10808 if ($dateRetourSignatureModified === true
5242     && $this->valF['date_retour_signature'] !== ''
5243     && $this->valF['date_retour_signature'] !== null) {
5244 softime 13137
5245     // Message à afficher dans les logs pour indiquer quelle notification a échouée
5246 softime 13528 $msgLog = sprintf(
5247     '%s %s : %d',
5248     __('Erreur lors de la notification automatique du(des) pétitionnaire(s) après retour signature.'),
5249     __('Instruction notifiée'),
5250     $id
5251     );
5252 softime 13137
5253     // Récupération de l'instance de l'événement pour accéder au paramètrage
5254     // des notifications
5255 softime 10808 $ev = $this->get_inst_evenement($this->valF['evenement']);
5256 softime 13137 // Si la notification automatique des tiers consulté est active
5257     // déclenche le traitement de notification.
5258     // Ce traitement va envoyer des courriels de notification à tous les tiers concernés
5259     $typeNotifTiers = $ev->getVal('notification_tiers');
5260     $inst_di = $this->get_inst_dossier($this->getVal('dossier'));
5261     if ($typeNotifTiers === 'notification_automatique') {
5262     if ($this->traitement_notification_automatique_tiers_consulte($ev, $inst_di) === false) {
5263     $this->addToMessage(__('Le traitement de la notification automatique de tiers à échoué.'));
5264     $this->correct = false;
5265     }
5266     }
5267    
5268 softime 10808 if ($ev->getVal('notification') === 'notification_auto_signature_requise') {
5269     // Récupération de la liste des demandeurs à notifier et de la catégorie
5270     $categorie = $this->f->get_param_option_notification($collectivite_di);
5271 softime 14064 $isPortal = $categorie === PORTAL;
5272 softime 10869 $demandeursANotifie = $this->get_demandeurs_notifiable(
5273     $this->valF['dossier'],
5274     $isPortal
5275     );
5276 softime 10808
5277 softime 18876 //
5278     $msg_notif = '';
5279    
5280 softime 10808 // Création d'une notification et d'une tâche pour chaque demandeur à notifier
5281 softime 12124 $demandeurPrincipalNotifie = false;
5282 softime 10808 foreach ($demandeursANotifie as $demandeur) {
5283 softime 12124 // Identifie si le demandeur principal a été notifié ou pas
5284     // et récupère ses informations
5285     if ($demandeur['petitionnaire_principal'] == 't') {
5286     $demandeurPrincipalNotifie = true;
5287     // Si le demandeur principal est notifiable mais qu'il y a des erreurs dans
5288     // son paramétrage, on effectue pas le traitement et on passe à l'itération
5289     // suivante. On le considère également comme non notifié pour gérer l'envoie
5290     // des messages d'erreurs
5291     // Si la demande a été déposée via le portail alors le paramétrage n'a pas
5292     // d'impact sur la notification
5293     $erreursParam = $this->get_info_notification_fail();
5294     if (! $this->dossier_depose_sur_portail() && $erreursParam != array()) {
5295     $demandeurPrincipalNotifie = false;
5296     continue;
5297     }
5298     }
5299 softime 18876 // Récupération du contenu de l'option option_bloquer_notif_auto_dln
5300     $option_bloquer_notif_auto_dln_types_evenements = $this->f->getParameter("option_bloquer_notif_auto_dln") !== null ? explode(';', $this->f->getParameter("option_bloquer_notif_auto_dln")) : null;
5301     // On vérifie l'existence du paramètre 'option_bloquer_notif_auto_dln',
5302     // On vérifie si la date limite est dépassée ou si le type d'événement est erroné
5303     if (! empty($option_bloquer_notif_auto_dln_types_evenements)
5304     && $this->is_type_evenement_autorise($ev, array('types_evenements_autorises'=> $option_bloquer_notif_auto_dln_types_evenements)) === true
5305     && $this->is_date_limite_notification_premier_mois_depasee() === true) {
5306     // Ajout de la notif et récupération de son id
5307     $idNotif = $this->ajouter_notification(
5308     $this->valF[$this->clePrimaire],
5309     $this->f->get_connected_user_login_name(),
5310     $demandeur,
5311     $collectivite_di,
5312     array(),
5313     true,
5314     'Echec',
5315     __('La date limite de notification au demandeur est dépassée')
5316     );
5317     if ($idNotif === false) {
5318     // Termine le traitement
5319     $this->addToLog(
5320     sprintf('%s() : %s', __METHOD__, $msgLog),
5321     DEBUG_MODE
5322     );
5323     return $this->end_treatment(__METHOD__, false);
5324     }
5325     $msg_notif .= sprintf('%s<br/>%s', __("La notification n'a pas été générée, car la date limite de notification au demandeur est dépassée."), __("Le suivi de la notification est disponible depuis l'instruction."));
5326 softime 10808 }
5327 softime 18876 else {
5328     // Ajout de la notif et récupération de son id
5329     $idNotif = $this->ajouter_notification(
5330     $this->valF[$this->clePrimaire],
5331     $this->f->get_connected_user_login_name(),
5332     $demandeur,
5333     $collectivite_di,
5334     array(),
5335     true
5336 softime 13528 );
5337 softime 18876 if ($idNotif === false) {
5338     $this->addToLog(
5339     sprintf('%s() : %s',__METHOD__, $msgLog),
5340     DEBUG_MODE
5341     );
5342     return false;
5343     }
5344     // Création de la tache en lui donnant l'id de la notification
5345     $notification_by_task = $this->notification_by_task(
5346     $idNotif,
5347     $this->valF['dossier'],
5348     $categorie
5349 softime 10808 );
5350 softime 18876 if ($notification_by_task === false) {
5351     $this->addToLog(
5352     sprintf('%s() : %s',__METHOD__, $msgLog),
5353     DEBUG_MODE
5354     );
5355     $this->addToMessage(
5356     __("Erreur lors de la génération de la notification au(x) pétitionnaire(s).")
5357     );
5358     return false;
5359     }
5360     $msg_notif .= sprintf('%s<br/>%s', __("La notification a été générée."), __("Le suivi de la notification est disponible depuis l'instruction."));
5361 softime 10808 }
5362     }
5363 softime 18876
5364 softime 12847 // Pour la notification par mail ou la notification via portal si le dossier a
5365     // été déposés via portal, si le demandeur principal n'est pas notifiable,
5366     // on créé une nouvelle notification en erreur avec en commentaire la raison pour
5367     // laquelle le demandeur principal n'a pas pu être notifié
5368     $depotPortal = $this->dossier_depose_sur_portail();
5369     if (! $demandeurPrincipalNotifie && ($isPortal === false || $depotPortal === true)) {
5370 softime 13137 // Précise dans les logs que le pétitionnaire principal n'a pas été notifié
5371 softime 13528 $msgLog .= sprintf(' %s', __('Le pétitionnaire principale n\'est pas notifiable.'));
5372 softime 12124 // Analyse pour savoir pourquoi le demandeur principal n'est pas notifiable
5373     $erreursParam = $this->get_info_notification_fail();
5374     $demandeurPrincipal = $this->get_info_petitionnaire_principal_dossier($this->getVal('dossier'));
5375     // Ajout de la notif et récupération de son id
5376     $idNotif = $this->ajouter_notification(
5377     $this->valF[$this->clePrimaire],
5378     $this->f->get_connected_user_login_name(),
5379     $demandeurPrincipal,
5380     $collectivite_di,
5381 softime 12433 array(),
5382 softime 12124 true,
5383     'Echec',
5384     implode(' ', $erreursParam)
5385     );
5386     if ($idNotif === false) {
5387 softime 13528 $this->addToLog(
5388     sprintf('%s() : %s', __METHOD__, $msgLog),
5389     DEBUG_MODE
5390     );
5391 softime 12124 $this->addToMessage(
5392     __('Erreur : la création de la notification a échouée.').
5393     __("Veuillez contacter votre administrateur.")
5394     );
5395     return false;
5396     }
5397     // Prépare un message d'alerte à destination de l'instructeur pour l'informer
5398     // de l'échec de la notification
5399     $dossier_message = $this->get_inst_dossier_message(0);
5400     $dossier_message_val = array(
5401     'dossier' => $this->getVal('dossier'),
5402 softime 18876 'type' => __('erreur expedition'),
5403 softime 12124 'emetteur' => $this->f->get_connected_user_login_name(),
5404     'login' => $_SESSION['login'],
5405     'date_emission' => date('Y-m-d H:i:s'),
5406 softime 18876 'contenu' => __('Échec lors de la notification de l\'instruction ').
5407 softime 12124 $ev->getVal('libelle').
5408     '.<br>'.
5409     implode("\n", $erreursParam).
5410     '<br>'.
5411 softime 18876 __('Veuillez corriger ces informations avant de renvoyer la notification.')
5412 softime 12124 );
5413     $add = $dossier_message->add_notification_message($dossier_message_val, true);
5414     // Si une erreur se produit pendant l'ajout
5415     if ($add !== true) {
5416 softime 13528 $this->addToLog(
5417     sprintf(
5418     '%s() : %s',
5419     __METHOD__,
5420     __("Le message d'alerte concernant l'echec de l'envoi de la notification n'a pas pu être envoyé.")
5421     ),
5422     DEBUG_MODE
5423     );
5424 softime 12124 return false;
5425     }
5426     }
5427 softime 18876 $this->addToMessage($msg_notif);
5428 softime 10808 }
5429     }
5430 softime 18769 // Assigner les champs 'valF' à 'val' lorsque la modification a réussi
5431     if ($res !== false) {
5432     foreach($this->champs as $index => $champ) {
5433     // if (get_class($this) == 'instruction') {
5434     $this->f->log(__METHOD__, "[".var_export(get_class($this), true)."] this->valF[$champ]): ".var_export($this->valF[$champ] ?? null, true).", this->val[$index]: ".var_export($this->val[$index] ?? null, true), 'DEBUG', 'seb');
5435     // }
5436     $this->val[$index] = $this->valF[$champ] ?? null;
5437     }
5438     }
5439 softime 19307
5440 softime 17542 $res = $this->add_log_to_dossier($id, $val);
5441     $data = array('val' => &$val, 'id' => $id, 'result' => &$res);
5442 softime 19307 if (! $this->f->module_manager->run_hooks('triggermodifierapres_post', $this, $data)) {
5443     return false;
5444     }
5445 softime 17542 return $res;
5446 fmichon 4708 }
5447 mbroquet 3730
5448 softime 8989 /**
5449     * TRIGGER - triggersupprimer.
5450     *
5451     * @return boolean
5452     */
5453     function triggersupprimer($id, &$dnu1 = null, $val = array(), $dnu2 = null) {
5454     $this->addToLog(__METHOD__."(): start", EXTRA_VERBOSE_MODE);
5455 softime 17542 $data = array('val' => &$val, 'id' => $id);
5456 softime 19307 if (! $this->f->module_manager->run_hooks('triggersupprimer_pre', $this, $data)) {
5457     return false;
5458     }
5459    
5460 mbroquet 3730 /**
5461     * L'objectif ici est de repositionner les valeurs récupérées en
5462     * archive dans le dossier d'instruction avant de supprimer l'événement
5463 softime 10573 * d'instruction si les valeurs du dossier sont différentes
5464 mbroquet 3730 */
5465 softime 10573 $valF = array();
5466     $inst_di = $this->get_inst_dossier($this->getVal('dossier'));
5467     foreach ($inst_di->champs as $key => $champ) {
5468     // Si le champ du DI à une archive dans l'instruction
5469     if (isset($val[sprintf('archive_%s', $champ)]) === true) {
5470     // Si la valeur entre le champ du DI et son archive dans instruction
5471     // est différente
5472     if ($inst_di->getVal($champ) !== $val[sprintf('archive_%s', $champ)]) {
5473     $val[sprintf('archive_%s', $champ)] === '' ? $valF[$champ] = null : $valF[$champ] = $val[sprintf('archive_%s', $champ)];
5474 softime 15037 // Gestion du cas particulier 'accord_tacite' pour renvoyer la valeur ' ' (3 espaces vides) au lieu de null
5475     // Car les valeurs possibles du champ accord_tacite sont : 'Oui', 'Non' ou ' '
5476     if ($champ === "accord_tacite" && $valF[$champ] === null) {
5477     $valF[$champ] = ' ';
5478     }
5479 softime 10573 }
5480     }
5481 softime 5024 }
5482 softime 10573 // Spécificité du champ avis_decision dont le champ archive est nommé
5483     // différemment
5484     if ($inst_di->getVal('avis_decision') !== $val['archive_avis']) {
5485     $val['archive_avis'] === '' ? $valF['avis_decision'] = null : $valF['avis_decision'] = $val['archive_avis'];
5486 softime 5024 }
5487 softime 10573 // Spécificité de la date d'affichage dont la valeur n'ai jamais modifiée
5488     // par l'archive
5489     unset($valF['date_affichage']);
5490 softime 6565
5491 softime 9245 /**
5492     * Mise à jour de la version de clôture *version_clos* du dossier si et
5493     * seulement si l'instruction met à jour l'état du dossier.
5494     */
5495 softime 10573 if (isset($valF['etat']) === true
5496     && $valF['etat'] !== null
5497 softime 9245 && $valF['etat'] !== '') {
5498 softime 10573 // Récupère l'état actuel du dossier d'instruction
5499     $inst_current_etat = $this->f->get_inst__om_dbform(array(
5500     "obj" => "etat",
5501     "idx" => $inst_di->get_id_etat(),
5502     ));
5503 softime 9245 // Instanciation de l'état archivé appliqué sur le dossier
5504     $inst_etat = $this->f->get_inst__om_dbform(array(
5505     "obj" => "etat",
5506     "idx" => $valF['etat'],
5507     ));
5508     //
5509     $update_version_clos = null;
5510     // En cas de clôture du dossier par l'état archivé
5511     if ($inst_etat->getVal('statut') === 'cloture') {
5512     $update_version_clos = $inst_di->update_version_clos('up');
5513     }
5514     // En cas de réouverture du dossier par l'état archivé
5515     if ($inst_current_etat->getVal('statut') === 'cloture'
5516     && $inst_etat->getVal('statut') !== 'cloture') {
5517     //
5518     $update_version_clos = $inst_di->update_version_clos('down');
5519     //
5520     $this->set_att_di_reopened(true);
5521     }
5522     //
5523     if ($update_version_clos === false) {
5524     $this->f->addToLog(sprintf(
5525     "%s() : ERREUR - %s %s",
5526     __METHOD__,
5527     sprintf(
5528     __("Impossible de mettre à jour la version de clôture du dossier d'instruction %s."),
5529     $inst_di->getVal($inst_di->clePrimaire)
5530     ),
5531     sprintf(
5532     __("L'instruction tente d'appliquer l'état %s."),
5533     $inst_etat->getVal($inst_etat->clePrimaire)
5534     )
5535     ));
5536     $this->addToMessage(sprintf(
5537     "%s %s",
5538     __("Erreur lors de la mise à jour de la version de clôture du dossier d'instruction."),
5539     __("Veuillez contacter votre administrateur.")
5540     ));
5541     return false;
5542     }
5543     }
5544 softime 10808 // On supprime toutes les notications liées à l'instruction
5545 softime 12654 $notifASupprimer = $this->get_instruction_notification(
5546     $this->getVal($this->clePrimaire),
5547     array(
5548     'notification_recepisse',
5549     'notification_instruction',
5550     'notification_decision',
5551     'notification_service_consulte',
5552     'notification_tiers_consulte',
5553 softime 13137 'notification_depot_demat',
5554 softime 15037 'notification_commune',
5555     'notification_signataire'
5556 softime 12654 ),
5557     true
5558     );
5559 softime 19307
5560 softime 10808 foreach ($notifASupprimer as $idNotif) {
5561     $inst_notif = $this->f->get_inst__om_dbform(array(
5562     "obj" => "instruction_notification",
5563     "idx" => $idNotif,
5564     ));
5565     $val_notif = array();
5566     foreach ($inst_notif->champs as $champ) {
5567     $val_notif[$champ] = $inst_notif->getVal($champ);
5568     }
5569     // La suppression des notifications entrainera la suppression des tâches qui y sont
5570     // liées
5571     $supprNotif = $inst_notif->supprimer($val_notif);
5572     if ($supprNotif == false) {
5573     $this->addToMessage(sprintf(
5574     "%s %s",
5575     __("Erreur lors de la suppression des notifications de l'instruction."),
5576     __("Veuillez contacter votre administrateur.")
5577     ));
5578     return false;
5579     }
5580     }
5581 softime 9245
5582 softime 18436 // Suppression du paramétrage de l'annexe lié à l'évènement
5583     if ($this->supprimer_parametrage_annexe($this->getVal($this->clePrimaire)) === false) {
5584     $this->addToLog(sprintf(
5585     "%s %s",
5586     __("Erreur lors de la suppression du paramétrage des annexes de l'instruction."),
5587     __("Veuillez contacter votre administrateur.")
5588     ), DEBUG_MODE);
5589     return false;
5590     }
5591    
5592 softime 10573 // On met à jour le dossier
5593     $valF['instruction'] = $id;
5594 softime 10968 $valF['crud'] = 'delete';
5595 softime 10573 $update_by_instruction = $inst_di->update_by_instruction($valF);
5596     if ($update_by_instruction === false) {
5597     $this->cleanMessage();
5598     $this->addToMessage(sprintf('%s %s', __("Une erreur s'est produite lors de la mise à jour du dossier d'instruction."), __("Veuillez contacter votre administrateur.")));
5599     return false;
5600     }
5601    
5602 softime 5024 // Affichage d'informations à l'utilisateur
5603 softime 18876 $this->addToMessage(__("Suppression de l'instruction")." [".$this->f->db->affectedRows()." ".__('enregistrement')." ".__('mis_a_jour')."]");
5604 softime 5024
5605     // Mise à jour de la demande si un récépissé d'instruction correspond à l'instruction à supprimer
5606 softime 17542
5607     $res = true;
5608     $data = array('val' => &$val, 'id' => $id, 'result' => &$res);
5609 softime 19307 if (! $this->f->module_manager->run_hooks('triggersupprimer_post', $this, $data)) {
5610     return false;
5611     }
5612 softime 17542 return $res;
5613 mbroquet 3730 }
5614    
5615 softime 8989 /**
5616     * TRIGGER - triggersupprimerapres.
5617     *
5618     * @return boolean
5619     */
5620     function triggersupprimerapres($id, &$dnu1 = null, $val = array(), $dnu2 = null) {
5621     $this->addToLog(__METHOD__."(): start", EXTRA_VERBOSE_MODE);
5622 softime 17542 $data = array('val' => &$val, 'id' => $id);
5623 softime 19307 if (! $this->f->module_manager->run_hooks('triggersupprimerapres_pre', $this, $data)) {
5624     return false;
5625     }
5626    
5627 softime 8640 /**
5628     * Mise à jour de la date de dernière modification du dossier
5629     * d'instruction
5630     */
5631     $inst_di = $this->get_inst_dossier($this->getVal('dossier'));
5632     $inst_di->update_last_modification_date();
5633    
5634     /**
5635     * Mise à jour des données du dossier d'autorisation
5636     */
5637 softime 7996 $da = $this->f->get_inst__om_dbform(array(
5638     "obj" => "dossier_autorisation",
5639     "idx" => $this->getNumDemandeAutorFromDossier($val["dossier"]),
5640     ));
5641 softime 8640 $params = array(
5642     'di_id' => $this->getVal('dossier'),
5643 softime 9245 'di_reopened' => $this->get_att_di_reopened(),
5644 softime 8640 );
5645     if($da->majDossierAutorisation($params) === false) {
5646 softime 18876 $this->addToMessage(__("Erreur lors de la mise a jour des donnees du dossier d'autorisation. Contactez votre administrateur."));
5647 mbroquet 3730 $this->correct = false;
5648     return false;
5649     }
5650 softime 7996
5651 softime 10573 /**
5652     * Gestion des tâches pour la dématérialisation
5653     */
5654     $inst_task_empty = $this->f->get_inst__om_dbform(array(
5655     "obj" => "task",
5656     "idx" => 0,
5657     ));
5658     foreach ($inst_di->task_types as $task_type) {
5659     $task_exists = $inst_task_empty->task_exists($task_type, $id);
5660     if ($task_exists !== false) {
5661     $inst_task = $this->f->get_inst__om_dbform(array(
5662     "obj" => "task",
5663     "idx" => $task_exists,
5664     ));
5665 softime 18436 if ($inst_task->getVal('state') === task::STATUS_NEW || $inst_task->getVal('state') === task::STATUS_DRAFT) {
5666 softime 10573 $task_val = array(
5667 softime 18436 'state' => task::STATUS_CANCELED,
5668 softime 10573 );
5669     $update_task = $inst_task->update_task(array('val' => $task_val));
5670     if ($update_task === false) {
5671     $this->addToMessage(sprintf('%s %s',
5672     sprintf(__("Une erreur s'est produite lors de la modification de la tâche %."), $inst_task->getVal($inst_task->clePrimaire)),
5673     __("Veuillez contacter votre administrateur.")
5674     ));
5675     $this->correct = false;
5676     return false;
5677     }
5678     }
5679     }
5680     }
5681    
5682 softime 7996 //
5683 softime 8640 $val['evenement'] = $this->getVal('evenement');
5684 softime 19307
5685 softime 17542 $res = $this->add_log_to_dossier($id, $val);
5686     $data = array('val' => &$val, 'id' => $id, 'result' => &$res);
5687 softime 19307 if (! $this->f->module_manager->run_hooks('triggersupprimerapres_post', $this, $data)) {
5688     return false;
5689     }
5690 softime 17542 return $res;
5691 mbroquet 3730 }
5692    
5693     /**
5694 softime 9245 * Permet de mettre la valeur passée en paramètre dans l'attribut de classe
5695     * "di_reopened".
5696     *
5697     * @param boolean $val
5698     */
5699     function set_att_di_reopened($val) {
5700     $this->di_reopened = $val;
5701     }
5702    
5703     /**
5704     * Permet de récupérer la valeur de l'attribut de classe "di_reopened".
5705     *
5706     * @return boolean
5707     */
5708     function get_att_di_reopened() {
5709     return $this->di_reopened;
5710     }
5711    
5712     /**
5713 softime 19307 * Permet de composer un message d'erreur sur restriction non valide en
5714 mbroquet 3730 * fonction du contexte.
5715     *
5716     * @param string $restriction formule de la restriction
5717     *
5718     * @return string message d'erreur
5719     */
5720     function get_restriction_error_message($restriction) {
5721     // Affichage du message si la restriction s'applique
5722     // Contexte du suivi des dates (message simple)
5723 softime 18876 $message_restrict = __("Probleme de dates :");
5724 mbroquet 3730 // Split restriction
5725     $champs_restrict = preg_split(
5726     '/(\W+)/',
5727     $restriction,
5728     null,
5729     PREG_SPLIT_NO_EMPTY|PREG_SPLIT_DELIM_CAPTURE
5730     );
5731     $formated_restrict = "";
5732     // Ajout des chaînes à traduire
5733     foreach ($champs_restrict as $value) {
5734 softime 18876 $formated_restrict .= __($value)." ";
5735 mbroquet 3730 }
5736     $formated_restrict = substr($formated_restrict, 0, -1);
5737     // Message d'erreur dans le contexte du suivi des dates
5738     if($this->getParameter("maj") == 170) {
5739 softime 18876 $message_restrict .= " ".__("contactez l'instructeur du dossier");
5740 mbroquet 3730 $message_restrict .= "<br/>(".$formated_restrict.")";
5741     } else {
5742     // Affichage du message si la restriction s'applique
5743     // Contexte instruction
5744     $message_restrict .= "<br/>".$formated_restrict;
5745     }
5746    
5747     return $message_restrict;
5748     }
5749    
5750     /**
5751 softime 12124 * Surcharge de la méthode verifier() de la classe om_dbform pour y ajouter
5752     * les vérifications suivantes :
5753     * - Si l'instruction à un événement associé et que cet événement à des restrictions :
5754     * 1. vérifie si la restriction est valide, si ce n'est pas le cas récupère et affiche
5755     * le message d'erreur associé à la restriction
5756     * 2. vérifie si les restrictions sont respectées. Si ce n'est pas le cas bloque l'ajout
5757     * et / ou la modification et affiche un message d'erreur
5758     * -
5759 softime 19307 * -
5760     * -
5761     * -
5762     * -
5763     * -
5764     *
5765 softime 12124 * @param array val : tableau contenant les valeurs issues du formulaire.
5766     * @param - dnu1 : Paramètre déprécié et non utilisé.
5767     * @param - dnu2 : Paramètre déprécié et non utilisé.
5768     *
5769 softime 8989 * @return void
5770 mbroquet 3730 */
5771 softime 8989 function verifier($val = array(), &$dnu1 = null, $dnu2 = null) {
5772     parent::verifier($val);
5773     //
5774 mbroquet 3730 if ( isset($val['evenement']) && is_numeric($val['evenement'])){
5775     $restriction = $this->get_restriction($val['evenement']);
5776 softime 19307
5777 mbroquet 3730 //Test qu'une restriction est présente
5778     if ($restriction != "" ){
5779 softime 19307
5780 softime 14064 // Vérifie le contexte de la modification et test si la restriction est valide.
5781     // Si l'instruction est modifiée par une tache le dossier n'est pas impacté.
5782     // Il n'est donc pas nécessaire de vérifier les restrictions.
5783 mbroquet 3730 $this->restriction_valid = $this->restrictionIsValid($restriction);
5784 softime 14064 if ($this->getParameter("maj") != 176
5785     && !$this->restriction_valid) {
5786 mbroquet 3730
5787     // Affichage du message si la restriction s'applique
5788     $this->addToMessage(
5789     $this->get_restriction_error_message($restriction)
5790     );
5791     $this->correct=false;
5792     return false;
5793     }
5794    
5795     // Liste des opérateurs possible
5796 nmeucci 3873 $operateurs = array(">=", "<=", "+", "-", "&&", "||", "==", "!=");
5797 mbroquet 3730 // Supprime tous les espaces de la chaîne de caractère
5798     $restriction = str_replace(' ', '', $restriction);
5799 softime 19307
5800     // Met des espace avant et après les opérateurs puis transforme la
5801     // chaine en un tableau
5802 mbroquet 3730 $tabRestriction = str_replace($operateurs, " ", $restriction);
5803     // Tableau des champ
5804     $tabRestriction = explode(" ", $tabRestriction);
5805     // Supprime les numériques du tableau
5806     foreach ($tabRestriction as $key => $value) {
5807     if (is_numeric($value)) {
5808     unset($tabRestriction[$key]);
5809     }
5810     }
5811    
5812     // Vérifie les champs utilisés pour la restriction
5813     $check_field_exist = $this->f->check_field_exist($tabRestriction, 'instruction');
5814     if ($check_field_exist !== true) {
5815    
5816     // Liste des champs en erreur
5817     $string_error_fields = implode(", ", $check_field_exist);
5818    
5819     // Message d'erreur
5820 softime 18876 $error_message = __("Le champ %s n'est pas utilisable pour le champ %s");
5821 mbroquet 3730 if (count($check_field_exist) > 1) {
5822 softime 18876 $error_message = __("Les champs %s ne sont pas utilisable pour le champ %s");
5823 mbroquet 3730 }
5824    
5825     // Affiche l'erreur
5826     $this->correct=false;
5827 softime 18876 $this->addToMessage(sprintf($error_message, $string_error_fields, __("restriction")));
5828     $this->addToMessage(__("Veuillez contacter votre administrateur."));
5829 mbroquet 3730 }
5830     }
5831    
5832     }
5833     if(!$this->updateDate("date_envoi_signature")) {
5834     return false;
5835     }
5836     if(!$this->updateDate("date_retour_signature")) {
5837     return false;
5838     }
5839     if(!$this->updateDate("date_envoi_rar")) {
5840     return false;
5841     }
5842     if(!$this->updateDate("date_retour_rar")) {
5843     return false;
5844     }
5845     if(!$this->updateDate("date_envoi_controle_legalite")) {
5846     return false;
5847     }
5848     if(!$this->updateDate("date_retour_controle_legalite")) {
5849     return false;
5850     }
5851    
5852     }
5853 softime 12124
5854     /**
5855     * Récupère et stocket dans un tableau toutes les infos du pétitionnaire
5856     * principal du dossier auquel appartiens l'instruction.
5857     * Renvoie un tableau contenant les informations du pétitionnaire principal.
5858     *
5859     * Si l'identifiant de l'instruction n'a pas pu etre récupéré renvoie false
5860     * et affiche un message dans les logs.
5861     * En cas d'erreur de base de donnée renvoie false et affiche un message d'erreur.
5862     *
5863     * @param string identifiant du dossier
5864     * @return array|boolean
5865     */
5866 softime 18436 public function get_info_petitionnaire_principal_dossier($dossier = null) {
5867 softime 12124 // Si l'identifiant de l'instruction n'a pas été fournit on récupère celui de
5868     // l'objet courant
5869     if (empty($dossier)) {
5870     $dossier = $this->getVal('dossier');
5871     // Si la récupération de l'identifiant de l'instruction a échoué la méthode renvoie
5872     // false et on affiche un message d'erreur dans les logs
5873     if (empty($dossier)) {
5874     $this->addToLog(__METHOD__.' : L\'identifiant du dossier n\'a pas pu être récupéré');
5875     return false;
5876     }
5877     }
5878    
5879     // Requête sql servant à récupérer toutes les informations relatives au demandeurs
5880     // principal
5881 softime 13137 $qres = $this->f->get_all_results_from_db_query(
5882     sprintf(
5883     'SELECT
5884     -- Récupère toutes les informations du demandeur principal
5885     demandeur.*,
5886     CASE
5887 softime 19307 WHEN demandeur.qualite=\'particulier\'
5888     THEN TRIM(CONCAT(demandeur.particulier_nom, \' \', demandeur.particulier_prenom, \' \', demandeur.courriel))
5889 softime 13137 ELSE
5890 softime 19307 TRIM(CONCAT(demandeur.personne_morale_raison_sociale, \' \', demandeur.personne_morale_denomination, \' \', demandeur.courriel))
5891 softime 13137 END AS destinataire
5892     FROM
5893     %1$sdossier
5894     LEFT JOIN %1$slien_dossier_demandeur
5895 softime 19307 ON lien_dossier_demandeur.dossier = dossier.dossier
5896 softime 13137 LEFT JOIN %1$sdemandeur
5897 softime 19307 ON demandeur.demandeur = lien_dossier_demandeur.demandeur
5898 softime 13137 WHERE
5899     dossier.dossier = \'%2$s\'
5900     AND lien_dossier_demandeur.petitionnaire_principal IS TRUE',
5901     DB_PREFIXE,
5902     $this->f->db->escapeSimple($dossier)
5903     ),
5904     array(
5905     "origin" => __METHOD__,
5906     )
5907 softime 12124 );
5908 softime 13137 if (is_array($qres["result"]) === true
5909     && array_key_exists(0, $qres["result"]) === true) {
5910     //
5911     return $qres["result"][0];
5912 softime 12124 }
5913 softime 13137 return null;
5914 softime 12124 }
5915    
5916    
5917 softime 19307
5918 mbroquet 3730 /**
5919     * Finalisation des documents.
5920     * @param string $champ champ du fichier à finaliser
5921     * @param booleen $status permet de définir si on finalise ou définalise
5922     * @param string $sousform permet de savoir si se trouve dans un sousformulaire (passé au javascript)
5923     */
5924     function manage_finalizing($mode = null, $val = array()) {
5925 softime 5024 //
5926     $this->begin_treatment(__METHOD__);
5927 mbroquet 3730
5928 softime 5024 //
5929     $id_inst = $this->getVal($this->clePrimaire);
5930 mbroquet 3730
5931 softime 5024 //
5932 softime 18876 $admin_msg_error = __("Veuillez contacter votre administrateur.");
5933     $file_msg_error = __("Erreur de traitement de fichier.")
5934 softime 5024 ." ".$admin_msg_error;
5935 softime 18876 $bdd_msg_error = __("Erreur de base de données.")
5936 softime 5024 ." ".$admin_msg_error;
5937 softime 5169 $log_msg_error = "Finalisation non enregistrée - id instruction = %s - uid fichier = %s";
5938 mbroquet 3730
5939     // Si on finalise le document
5940     if ($mode == "finalize"){
5941 softime 5024 //
5942 softime 18876 $etat = __('finalisation');
5943 mbroquet 3730
5944     // Récupère la collectivite du dossier d'instruction
5945     $dossier_instruction_om_collectivite = $this->get_dossier_instruction_om_collectivite();
5946    
5947     //
5948     $collectivite = $this->f->getCollectivite($dossier_instruction_om_collectivite);
5949 softime 8593
5950     //
5951     $params = array(
5952     "specific" => array(),
5953     );
5954     // Si la rédaction libre est activée sur l'instruction
5955     if ($this->getVal("flag_edition_integrale") == 't') {
5956     $params["specific"]["corps"] = array(
5957     "mode" => "set",
5958     "value" => $this->getVal("corps_om_htmletatex"),
5959     );
5960     $params["specific"]["titre"] = array(
5961     "mode" => "set",
5962     "value" => $this->getVal("titre_om_htmletat"),
5963     );
5964     }
5965 mbroquet 3730 // Génération du PDF
5966 softime 8593 $result = $this->compute_pdf_output('lettretype', $this->getVal('lettretype'), $collectivite, null, $params);
5967 mbroquet 3730 $pdf_output = $result['pdf_output'];
5968 softime 10573
5969 mbroquet 3730 //Métadonnées du document
5970     $metadata = array(
5971 softime 18436 'filename' => $this->determinate_name_doc_pdf().'.pdf',
5972 mbroquet 3730 'mimetype' => 'application/pdf',
5973     'size' => strlen($pdf_output)
5974     );
5975    
5976     // Récupération des métadonnées calculées après validation
5977 softime 19307 $spe_metadata = $this->calculate_metadata();
5978     if ($spe_metadata === false) {
5979 softime 5024 $this->correct = false;
5980     $this->addToMessage($bdd_msg_error);
5981 softime 19307 $this->addToLog(sprintf(__METHOD__.'() %s : %s', sprintf($log_msg_error, $id_inst, $uid), __('Erreur lors du calcule des métadonnées du fichier')), DEBUG_MODE);
5982 softime 5024 return $this->end_treatment(__METHOD__, false);
5983 mbroquet 3730 }
5984    
5985 softime 19307 $metadata = array_merge($metadata, $spe_metadata);
5986 mbroquet 3730
5987 softime 18436 // Mise à jour du nom du fichier en bdd suite à la finalisation de l'instruction
5988     $res = $this->f->db->autoExecute(
5989 softime 19307 DB_PREFIXE.$this->table,
5990     ['fichier_instruction_name' => $metadata['filename']],
5991 softime 18436 DB_AUTOQUERY_UPDATE,
5992     "instruction='".$this->getVal("instruction")."'"
5993     );
5994 softime 10573
5995 softime 5024 // Si le document a déjà été finalisé on le met à jour
5996     // en conservant son UID
5997 mbroquet 3730 if ($this->getVal("om_fichier_instruction") != ''){
5998     $uid = $this->f->storage->update(
5999 softime 18436 $this->getVal("om_fichier_instruction"), $pdf_output, $metadata
6000     );
6001 mbroquet 3730 }
6002 softime 5024 // Sinon on crée un nouveau document et dont on récupère l'UID
6003 mbroquet 3730 else {
6004 softime 10573 $uid = $this->f->storage->create($pdf_output, $metadata, "from_content", $this->table.".om_fichier_instruction");
6005 mbroquet 3730 }
6006     }
6007    
6008 softime 5024 // Si on définalise le document
6009 mbroquet 3730 if ($mode == "unfinalize") {
6010 softime 5024 //
6011 softime 18876 $etat = __('définalisation');
6012 mbroquet 3730 // Récupération de l'uid du document finalisé
6013     $uid = $this->getVal("om_fichier_instruction");
6014     }
6015 softime 19307
6016 softime 5024 // Si on définalise l'UID doit être défini
6017     // Si on finalise la création/modification du fichier doit avoir réussi
6018 mbroquet 3730 if ($uid == '' || $uid == 'OP_FAILURE' ) {
6019 softime 5024 $this->correct = false;
6020     $this->addToMessage($file_msg_error);
6021 softime 8989 $this->addToLog(sprintf($log_msg_error, $id_inst, $uid), DEBUG_MODE);
6022 softime 5024 return $this->end_treatment(__METHOD__, false);
6023 mbroquet 3730 }
6024    
6025     //
6026     foreach ($this->champs as $key => $champ) {
6027     //
6028     $val[$champ] = $this->val[$key];
6029     }
6030    
6031     //
6032 softime 6565 $val['date_evenement'] = $this->dateDBToForm($val['date_evenement']);
6033     $val['archive_date_complet'] = $this->dateDBToForm($val['archive_date_complet']);
6034     $val['archive_date_rejet'] = $this->dateDBToForm($val['archive_date_rejet']);
6035     $val['archive_date_limite'] = $this->dateDBToForm($val['archive_date_limite']);
6036     $val['archive_date_notification_delai'] = $this->dateDBToForm($val['archive_date_notification_delai']);
6037     $val['archive_date_decision'] = $this->dateDBToForm($val['archive_date_decision']);
6038     $val['archive_date_validite'] = $this->dateDBToForm($val['archive_date_validite']);
6039     $val['archive_date_achevement'] = $this->dateDBToForm($val['archive_date_achevement']);
6040     $val['archive_date_chantier'] = $this->dateDBToForm($val['archive_date_chantier']);
6041     $val['archive_date_conformite'] = $this->dateDBToForm($val['archive_date_conformite']);
6042     $val['archive_date_dernier_depot'] = $this->dateDBToForm($val['archive_date_dernier_depot']);
6043     $val['archive_date_limite_incompletude'] = $this->dateDBToForm($val['archive_date_limite_incompletude']);
6044     $val['date_finalisation_courrier'] = $this->dateDBToForm($val['date_finalisation_courrier']);
6045     $val['date_envoi_signature'] = $this->dateDBToForm($val['date_envoi_signature']);
6046     $val['date_retour_signature'] = $this->dateDBToForm($val['date_retour_signature']);
6047     $val['date_envoi_rar'] = $this->dateDBToForm($val['date_envoi_rar']);
6048     $val['date_retour_rar'] = $this->dateDBToForm($val['date_retour_rar']);
6049     $val['date_envoi_controle_legalite'] = $this->dateDBToForm($val['date_envoi_controle_legalite']);
6050     $val['date_retour_controle_legalite'] = $this->dateDBToForm($val['date_retour_controle_legalite']);
6051     $val['archive_date_cloture_instruction'] = $this->dateDBToForm($val['archive_date_cloture_instruction']);
6052     $val['archive_date_premiere_visite'] = $this->dateDBToForm($val['archive_date_premiere_visite']);
6053     $val['archive_date_derniere_visite'] = $this->dateDBToForm($val['archive_date_derniere_visite']);
6054     $val['archive_date_contradictoire'] = $this->dateDBToForm($val['archive_date_contradictoire']);
6055     $val['archive_date_retour_contradictoire'] = $this->dateDBToForm($val['archive_date_retour_contradictoire']);
6056     $val['archive_date_ait'] = $this->dateDBToForm($val['archive_date_ait']);
6057     $val['archive_date_transmission_parquet'] = $this->dateDBToForm($val['archive_date_transmission_parquet']);
6058 softime 8989 $val['archive_date_affichage'] = $this->dateDBToForm($val['archive_date_affichage']);
6059 mbroquet 3730 $this->setvalF($val);
6060    
6061     // Verification de la validite des donnees
6062 softime 8989 $this->verifier($this->val);
6063 mbroquet 3730 // Si les verifications precedentes sont correctes, on procede a
6064     // la modification, sinon on ne fait rien et on retourne une erreur
6065 softime 5024 if ($this->correct === true) {
6066 mbroquet 3730 //
6067     $valF = array(
6068     "om_fichier_instruction" => $uid,
6069     "date_finalisation_courrier" => date('Y-m-d')
6070     );
6071     //
6072     if($mode=="finalize") {
6073     // état finalisé vrai
6074 softime 5024 $valF["om_final_instruction"] = true;
6075 mbroquet 3730 // ajout log utilisateur
6076     $login = $_SESSION['login'];
6077     $nom = "";
6078     $this->f->getUserInfos();
6079     if (isset($this->f->om_utilisateur["nom"])
6080     && !empty($this->f->om_utilisateur["nom"])) {
6081     $nom = $this->f->om_utilisateur["nom"];
6082     }
6083     $valF["om_final_instruction_utilisateur"] = $_SESSION['login'];
6084     if ($nom != "") {
6085     $valF["om_final_instruction_utilisateur"] .= " (".$nom.")";
6086     }
6087     } else {
6088     // état finalisé faux
6089 softime 5024 $valF["om_final_instruction"] = false;
6090 mbroquet 3730 // suppression log utilisateur
6091     $valF["om_final_instruction_utilisateur"] = '';
6092     }
6093    
6094     // Execution de la requête de modification des donnees de l'attribut
6095     // valF de l'objet dans l'attribut table de l'objet
6096 softime 19307 $res = $this->f->db->autoExecute(DB_PREFIXE.$this->table, $valF,
6097 softime 5024 DB_AUTOQUERY_UPDATE, $this->getCle($id_inst));
6098     $this->addToLog(__METHOD__."() : db->autoExecute(\"".DB_PREFIXE.$this->table."\", ".print_r($valF, true).", DB_AUTOQUERY_UPDATE, \"".$this->getCle($id_inst)."\")", VERBOSE_MODE);
6099     //
6100     if ($this->f->isDatabaseError($res, true) === true) {
6101     $this->correct = false;
6102     $this->addToMessage($bdd_msg_error);
6103     return $this->end_treatment(__METHOD__, false);
6104     }
6105 mbroquet 3730
6106 softime 5024 //
6107 softime 18876 $this->addToMessage(sprintf(__("La %s du document s'est effectuee avec succes."), $etat));
6108 softime 5024 //
6109     if ($this->add_log_to_dossier($id_inst, $val) === false) {
6110     return $this->end_treatment(__METHOD__, false);
6111     }
6112     //
6113     return $this->end_treatment(__METHOD__, true);
6114 mbroquet 3730 }
6115 softime 5024 // L'appel de verifier() a déjà positionné correct à false
6116     // et défini un message d'erreur.
6117 softime 8989 $this->addToLog(sprintf($log_msg_error, $id_inst, $uid), DEBUG_MODE);
6118 softime 5024 return $this->end_treatment(__METHOD__, false);
6119 mbroquet 3730 }
6120    
6121     /**
6122     * Récupération du numéro de dossier d'instruction à ajouter aux métadonnées
6123     * @return string numéro de dossier d'instruction
6124     */
6125 softime 10573 protected function getDossier($champ = null) {
6126 mbroquet 3730 if(empty($this->specificMetadata)) {
6127     $this->getSpecificMetadata();
6128     }
6129     return $this->specificMetadata->dossier;
6130     }
6131     /**
6132     * Récupération la version du dossier d'instruction à ajouter aux métadonnées
6133     * @return int Version
6134     */
6135     protected function getDossierVersion() {
6136     if(empty($this->specificMetadata)) {
6137     $this->getSpecificMetadata();
6138     }
6139     return $this->specificMetadata->version;
6140     }
6141     /**
6142     * Récupération du numéro de dossier d'autorisation à ajouter aux métadonnées
6143     * @return string numéro de dossier d'autorisation
6144     */
6145     protected function getNumDemandeAutor() {
6146     if(empty($this->specificMetadata)) {
6147     $this->getSpecificMetadata();
6148     }
6149     return $this->specificMetadata->dossier_autorisation;
6150     }
6151     /**
6152     * Récupération de la date de demande initiale du dossier à ajouter aux métadonnées
6153     * @return date de la demande initiale
6154     */
6155     protected function getAnneemoisDemandeAutor() {
6156     if(empty($this->specificMetadata)) {
6157     $this->getSpecificMetadata();
6158     }
6159     return $this->specificMetadata->date_demande_initiale;
6160     }
6161     /**
6162     * Récupération du type de dossier d'instruction à ajouter aux métadonnées
6163     * @return string type du dossier d'instruction
6164     */
6165     protected function getTypeInstruction() {
6166     if(empty($this->specificMetadata)) {
6167     $this->getSpecificMetadata();
6168     }
6169     return $this->specificMetadata->dossier_instruction_type;
6170     }
6171     /**
6172     * Récupération du statut du dossier d'autorisation à ajouter aux métadonnées
6173     * @return string avis
6174     */
6175     protected function getStatutAutorisation() {
6176     if(empty($this->specificMetadata)) {
6177     $this->getSpecificMetadata();
6178     }
6179     return $this->specificMetadata->statut;
6180     }
6181     /**
6182     * Récupération du type de dossier d'autorisation à ajouter aux métadonnées
6183     * @return string type du dossier d'autorisation
6184     */
6185     protected function getTypeAutorisation() {
6186     if(empty($this->specificMetadata)) {
6187     $this->getSpecificMetadata();
6188     }
6189     return $this->specificMetadata->dossier_autorisation_type;
6190     }
6191     /**
6192     * Récupération de la date d'ajout de document à ajouter aux métadonnées
6193     * @return date de l'évènement
6194     */
6195     protected function getDateEvenementDocument() {
6196     return date("Y-m-d");
6197     }
6198     /**
6199     * Récupération du groupe d'instruction à ajouter aux métadonnées
6200     * @return string Groupe d'instruction
6201     */
6202     protected function getGroupeInstruction() {
6203     if(empty($this->specificMetadata)) {
6204     $this->getSpecificMetadata();
6205     }
6206     return $this->specificMetadata->groupe_instruction;
6207     }
6208     /**
6209     * Récupération du libellé du type du document à ajouter aux métadonnées
6210     * @return string Groupe d'instruction
6211     */
6212     protected function getTitle() {
6213    
6214     // Récupère le champ événement
6215 softime 18876 if (isset($this->valF["evenement"]) && $this->valF["evenement"] != "") {
6216 mbroquet 3730 $evenement = $this->valF["evenement"];
6217     } else {
6218     $evenement = $this->getVal("evenement");
6219     }
6220    
6221     // Requête sql
6222 softime 14064 $evenement = $this->f->get_inst__om_dbform(array(
6223     "obj" => "evenement",
6224     "idx" => $evenement
6225     ));
6226    
6227 mbroquet 3730 // Retourne le libelle de l'événement
6228 softime 14064 return $evenement->getVal('libelle');
6229 mbroquet 3730 }
6230    
6231 softime 6272
6232 mbroquet 3730 /**
6233 softime 6272 * Récupération du champ ERP du dossier d'instruction.
6234     *
6235     * @return boolean
6236     */
6237     public function get_concerne_erp() {
6238     //
6239     if(empty($this->specificMetadata)) {
6240     $this->getSpecificMetadata();
6241     }
6242     //
6243     return $this->specificMetadata->erp;
6244     }
6245    
6246    
6247     /**
6248 mbroquet 3730 * Cette méthode permet de stocker en attribut toutes les métadonnées
6249     * nécessaire à l'ajout d'un document.
6250     */
6251     public function getSpecificMetadata() {
6252 softime 18876 if (isset($this->valF["dossier"]) && $this->valF["dossier"] != "") {
6253 mbroquet 3730 $dossier = $this->valF["dossier"];
6254     } else {
6255     $dossier = $this->getVal("dossier");
6256     }
6257     //Requête pour récupérer les informations essentiels sur le dossier d'instruction
6258 softime 14542 $qres = $this->f->get_all_results_from_db_query(
6259     sprintf(
6260     'SELECT
6261     dossier.dossier AS dossier,
6262 softime 19307 dossier_autorisation.dossier_autorisation AS dossier_autorisation,
6263 softime 14542 to_char(dossier.date_demande, \'YYYY/MM\') AS date_demande_initiale,
6264 softime 19307 dossier_instruction_type.code AS dossier_instruction_type,
6265 softime 14542 etat_dossier_autorisation.libelle AS statut,
6266     dossier_autorisation_type.code AS dossier_autorisation_type,
6267     groupe.code AS groupe_instruction,
6268     CASE WHEN dossier.erp IS TRUE
6269     THEN \'true\'
6270     ELSE \'false\'
6271     END AS erp
6272     FROM
6273 softime 19307 %1$sdossier
6274     LEFT JOIN %1$sdossier_instruction_type
6275 mbroquet 3730 ON dossier.dossier_instruction_type = dossier_instruction_type.dossier_instruction_type
6276 softime 19307 LEFT JOIN %1$sdossier_autorisation
6277     ON dossier.dossier_autorisation = dossier_autorisation.dossier_autorisation
6278 softime 14542 LEFT JOIN %1$setat_dossier_autorisation
6279 mbroquet 3730 ON dossier_autorisation.etat_dossier_autorisation = etat_dossier_autorisation.etat_dossier_autorisation
6280 softime 14542 LEFT JOIN %1$sdossier_autorisation_type_detaille
6281 mbroquet 3730 ON dossier_autorisation.dossier_autorisation_type_detaille = dossier_autorisation_type_detaille.dossier_autorisation_type_detaille
6282 softime 14542 LEFT JOIN %1$sdossier_autorisation_type
6283 mbroquet 3730 ON dossier_autorisation_type_detaille.dossier_autorisation_type = dossier_autorisation_type.dossier_autorisation_type
6284 softime 14542 LEFT JOIN %1$sgroupe
6285 mbroquet 3730 ON dossier_autorisation_type.groupe = groupe.groupe
6286 softime 14542 WHERE
6287     dossier.dossier = \'%2$s\'',
6288     DB_PREFIXE,
6289     $this->f->db->escapeSimple($dossier)
6290     ),
6291     array(
6292     "origin" => __METHOD__,
6293     )
6294     );
6295     $row = array_shift($qres['result']);
6296 mbroquet 3730
6297     //Si il y a un résultat
6298 softime 14542 if (! empty($row)) {
6299 mbroquet 3730
6300 fmichon 3892 // Instrance de la classe dossier
6301     $inst_dossier = $this->get_inst_dossier($dossier);
6302 softime 14542 // TODO : améliorer ce code
6303 softime 19307 //
6304 softime 14542 // Avant l e résultat été récupéré dans un objet à partir de la requête mais en modifiant pour
6305     // utiliser la méthode get_all_results_from_db_query() c'est maintenant un tableau
6306     // qu'on obtiens. Pour garder le même fonctionnement on transforme le tableau des
6307     // valeurs issues de la requête en objet.
6308     $metadata = (object)$row;
6309 fmichon 3892 // Insère l'attribut version à l'objet
6310 softime 14542 $metadata->version = $inst_dossier->get_di_numero_suffixe();
6311 fmichon 3892
6312 mbroquet 3730 //Alors on créé l'objet dossier_instruction
6313 softime 14542 $this->specificMetadata = $metadata;
6314 mbroquet 3730
6315     }
6316     }
6317 softime 19307
6318 mbroquet 3730 /**
6319     * Retourne le statut du dossier d'instruction
6320     * @param string $idx Identifiant du dossier d'instruction
6321     * @return string Le statut du dossier d'instruction
6322     */
6323     function getStatutAutorisationDossier($idx){
6324 softime 19307
6325 mbroquet 3730 $statut = '';
6326 softime 19307
6327 mbroquet 3730 //Si l'identifiant du dossier d'instruction fourni est correct
6328     if ( $idx != '' ){
6329 softime 19307
6330 mbroquet 3730 //On récupère le statut de l'état du dossier à partir de l'identifiant du
6331     //dossier
6332 softime 14064 $qres = $this->f->get_one_result_from_db_query(
6333     sprintf(
6334     'SELECT
6335     etat.statut
6336 softime 19307 FROM
6337 softime 14064 %1$sdossier
6338     LEFT JOIN
6339     %1$setat
6340     ON
6341     dossier.etat = etat.etat
6342 softime 19307 WHERE
6343 softime 14064 dossier = \'%2$s\'',
6344     DB_PREFIXE,
6345     $this->f->db->escapeSimple($idx)
6346 softime 19307 ),
6347 softime 14064 array(
6348     "origin" => __METHOD__,
6349     )
6350     );
6351 mbroquet 3730 }
6352 softime 14064
6353     return $qres['result'];
6354 mbroquet 3730 }
6355    
6356     /**
6357     * Récupère les données du dossier
6358     * @return array
6359     */
6360     function get_dossier_actual() {
6361    
6362     // Initialisation de la valeur de retour
6363     $return = array();
6364    
6365     // Récupération de toutes les valeurs du dossier d'instruction en cours
6366 softime 14542 // TODO : remplacer cette requête par une instanciation de l'objet
6367     $qres = $this->f->get_all_results_from_db_query(
6368     sprintf(
6369     'SELECT
6370     *
6371     FROM
6372     %1$sdossier
6373     WHERE
6374     dossier = \'%2$s\'',
6375     DB_PREFIXE,
6376     $this->f->db->escapeSimple($this->valF['dossier'])
6377     ),
6378     array(
6379     'origin' => __METHOD__
6380     )
6381     );
6382 mbroquet 3730
6383 softime 14542 foreach ($qres['result'] as $row) {
6384 mbroquet 3730
6385     // Récupération de la valeur actuelle du délai, de l'accord tacite,
6386     // de l'état et de l'avis du dossier d'instruction
6387 softime 6565 $return['archive_delai'] = $row['delai'];
6388     $return['archive_accord_tacite'] = $row['accord_tacite'];
6389     $return['archive_etat'] = $row['etat'];
6390     $return['archive_avis'] = $row['avis_decision'];
6391     // Récupération de la valeur actuelle des dates du dossier
6392 mbroquet 3730 // d'instruction
6393 softime 6565 $return['archive_date_complet'] = $row['date_complet'];
6394     $return['archive_date_dernier_depot'] = $row['date_dernier_depot'];
6395     $return['archive_date_rejet'] = $row['date_rejet'];
6396     $return['archive_date_limite'] = $row['date_limite'];
6397     $return['archive_date_notification_delai'] = $row['date_notification_delai'];
6398     $return['archive_date_decision'] = $row['date_decision'];
6399     $return['archive_date_validite'] = $row['date_validite'];
6400     $return['archive_date_achevement'] = $row['date_achevement'];
6401     $return['archive_date_chantier'] = $row['date_chantier'];
6402     $return['archive_date_conformite'] = $row['date_conformite'];
6403     $return['archive_incompletude'] = $row['incompletude'];
6404     $return['archive_incomplet_notifie'] = $row['incomplet_notifie'];
6405     $return['archive_evenement_suivant_tacite'] = $row['evenement_suivant_tacite'];
6406     $return['archive_evenement_suivant_tacite_incompletude'] = $row['evenement_suivant_tacite_incompletude'];
6407     $return['archive_etat_pendant_incompletude'] = $row['etat_pendant_incompletude'];
6408     $return['archive_date_limite_incompletude'] = $row['date_limite_incompletude'];
6409     $return['archive_delai_incompletude'] = $row['delai_incompletude'];
6410     $return['archive_autorite_competente'] = $row['autorite_competente'];
6411 softime 8593 $return['archive_dossier_instruction_type'] = $row['dossier_instruction_type'];
6412 softime 6565 $return['duree_validite'] = $row['duree_validite'];
6413     $return['date_depot'] = $row['date_depot'];
6414 softime 10573 $return['date_depot_mairie'] = $row['date_depot_mairie'];
6415 softime 6565 $return['archive_date_cloture_instruction'] = $row['date_cloture_instruction'];
6416     $return['archive_date_premiere_visite'] = $row['date_premiere_visite'];
6417     $return['archive_date_derniere_visite'] = $row['date_derniere_visite'];
6418     $return['archive_date_contradictoire'] = $row['date_contradictoire'];
6419     $return['archive_date_retour_contradictoire'] = $row['date_retour_contradictoire'];
6420     $return['archive_date_ait'] = $row['date_ait'];
6421     $return['archive_date_transmission_parquet'] = $row['date_transmission_parquet'];
6422 softime 8989 $return['archive_date_affichage'] = $row['date_affichage'];
6423 softime 10573 $return['archive_pec_metier'] = $row['pec_metier'];
6424     $return['archive_a_qualifier'] = $row['a_qualifier'];
6425 mbroquet 3730 }
6426    
6427     // Retour de la fonction
6428     return $return;
6429    
6430     }
6431    
6432     /**
6433     * Permet de vérifier qu'un événement est verrouillable
6434     * @param integer $idx Identifiant de l'instruction
6435 softime 19307 * @return boolean
6436 mbroquet 3730 */
6437     function checkEvenementNonVerrouillable($idx) {
6438     // Si la condition n'est pas vide
6439     if ($idx != "") {
6440    
6441     // Requête SQL
6442 softime 14064 $qres = $this->f->get_one_result_from_db_query(
6443     sprintf(
6444     'SELECT
6445     evenement.non_verrouillable
6446 softime 19307 FROM
6447 softime 14064 %1$sevenement
6448     LEFT JOIN %1$sinstruction
6449     ON instruction.evenement = evenement.evenement
6450 softime 19307 WHERE
6451 softime 14064 instruction.instruction = \'%2$s\'',
6452     DB_PREFIXE,
6453     intval($idx)
6454 softime 19307 ),
6455 softime 14064 array(
6456     "origin" => __METHOD__,
6457     )
6458     );
6459 mbroquet 3730 }
6460    
6461 softime 14064 // Si on a un résultat et que ce résultat indique que l'événement n'est
6462     // pas vérrouillable renvoie true, sinon renvoie false
6463     return isset($qres) && isset($qres['result']) && $qres['result'] == 't';
6464 mbroquet 3730 }
6465 softime 19307
6466 mbroquet 3730 /**
6467     * Mise à jour des champs archive_*
6468     * @param mixed $row La ligne de données
6469     */
6470     public function updateArchiveData($row){
6471 softime 19307
6472 mbroquet 3730 // Récupération de la valeur actuelle du délai, de l'accord tacite,
6473     // de l'état et de l'avis du dossier d'instruction
6474     $this->valF['archive_delai']=$row['delai'];
6475     $this->valF['archive_accord_tacite']=$row['accord_tacite'];
6476     $this->valF['archive_etat']=$row['etat'];
6477     $this->valF['archive_avis']=$row['avis_decision'];
6478     // Récupération de la valeur actuelle des 9 dates du dossier
6479     // d'instruction
6480     if ($row['date_complet'] != '') {
6481     $this->valF['archive_date_complet']=$row['date_complet'];
6482     }
6483     if ($row['date_dernier_depot'] != '') {
6484     $this->valF['archive_date_dernier_depot']=$row['date_dernier_depot'];
6485     }
6486 softime 6565 if ($row['date_rejet'] != '') {
6487 mbroquet 3730 $this->valF['archive_date_rejet']= $row['date_rejet'];
6488     }
6489 softime 6565 if ($row['date_limite'] != '') {
6490 mbroquet 3730 $this->valF['archive_date_limite']= $row['date_limite'];
6491     }
6492 softime 6565 if ($row['date_notification_delai'] != '') {
6493 mbroquet 3730 $this->valF['archive_date_notification_delai']= $row['date_notification_delai'];
6494     }
6495 softime 6565 if ($row['date_decision'] != '') {
6496 mbroquet 3730 $this->valF['archive_date_decision']= $row['date_decision'];
6497     }
6498 softime 6565 if ($row['date_validite'] != '') {
6499 mbroquet 3730 $this->valF['archive_date_validite']= $row['date_validite'];
6500     }
6501 softime 6565 if ($row['date_achevement'] != '') {
6502 mbroquet 3730 $this->valF['archive_date_achevement']= $row['date_achevement'];
6503     }
6504 softime 6565 if ($row['date_chantier'] != '') {
6505 mbroquet 3730 $this->valF['archive_date_chantier']= $row['date_chantier'];
6506     }
6507 softime 6565 if ($row['date_conformite'] != '') {
6508 softime 19307 $this->valF['archive_date_conformite']= $row['date_conformite'];
6509 mbroquet 3730 }
6510 softime 6565 if ($row['incompletude'] != '') {
6511 softime 19307 $this->valF['archive_incompletude']= $row['incompletude'];
6512 mbroquet 3730 }
6513 softime 6565 if ($row['incomplet_notifie'] != '') {
6514 softime 19307 $this->valF['archive_incomplet_notifie']= $row['incomplet_notifie'];
6515 mbroquet 3730 }
6516 softime 6565 if ($row['evenement_suivant_tacite'] != '') {
6517 softime 19307 $this->valF['archive_evenement_suivant_tacite']= $row['evenement_suivant_tacite'];
6518 mbroquet 3730 }
6519 softime 6565 if ($row['evenement_suivant_tacite_incompletude'] != '') {
6520 softime 19307 $this->valF['archive_evenement_suivant_tacite_incompletude']= $row['evenement_suivant_tacite_incompletude'];
6521 mbroquet 3730 }
6522 softime 6565 if ($row['etat_pendant_incompletude'] != '') {
6523 softime 19307 $this->valF['archive_etat_pendant_incompletude']= $row['etat_pendant_incompletude'];
6524 mbroquet 3730 }
6525 softime 6565 if ($row['date_limite_incompletude'] != '') {
6526 softime 19307 $this->valF['archive_date_limite_incompletude']= $row['date_limite_incompletude'];
6527 mbroquet 3730 }
6528 softime 6565 if ($row['delai_incompletude'] != '') {
6529 softime 19307 $this->valF['archive_delai_incompletude']= $row['delai_incompletude'];
6530 mbroquet 3730 }
6531 softime 6565 if ($row['autorite_competente'] != '') {
6532 softime 19307 $this->valF['archive_autorite_competente']= $row['autorite_competente'];
6533 mbroquet 3730 }
6534 softime 6565 if ($row['duree_validite'] != '') {
6535 softime 19307 $this->valF['duree_validite']= $row['duree_validite'];
6536 mbroquet 3730 }
6537 softime 6565 if ($row['date_depot'] != '') {
6538 softime 19307 $this->valF['date_depot']= $row['date_depot'];
6539 nmeucci 3873 }
6540 softime 10573 if ($row['date_depot_mairie'] != '') {
6541 softime 19307 $this->valF['date_depot_mairie']= $row['date_depot_mairie'];
6542 softime 10573 }
6543 softime 6565 // Dates concernant les dossiers contentieux
6544     if ($row['date_cloture_instruction'] != '') {
6545 softime 19307 $this->valF['archive_date_cloture_instruction']= $row['date_cloture_instruction'];
6546 softime 6565 }
6547     if ($row['date_premiere_visite'] != '') {
6548 softime 19307 $this->valF['archive_date_premiere_visite']= $row['date_premiere_visite'];
6549 softime 6565 }
6550     if ($row['date_derniere_visite'] != '') {
6551 softime 19307 $this->valF['archive_date_derniere_visite']= $row['date_derniere_visite'];
6552 softime 6565 }
6553     if ($row['date_contradictoire'] != '') {
6554 softime 19307 $this->valF['archive_date_contradictoire']= $row['date_contradictoire'];
6555 softime 6565 }
6556     if ($row['date_retour_contradictoire'] != '') {
6557 softime 19307 $this->valF['archive_date_retour_contradictoire']= $row['date_retour_contradictoire'];
6558 softime 6565 }
6559     if ($row['date_ait'] != '') {
6560 softime 19307 $this->valF['archive_date_ait']= $row['date_ait'];
6561 softime 6565 }
6562     if ($row['date_transmission_parquet'] != '') {
6563 softime 19307 $this->valF['archive_date_transmission_parquet']= $row['date_transmission_parquet'];
6564 softime 6565 }
6565 softime 8989 //
6566 softime 8593 if ($row['dossier_instruction_type'] != '') {
6567 softime 19307 $this->valF['archive_dossier_instruction_type']= $row['dossier_instruction_type'];
6568 softime 8593 }
6569 softime 8989 if ($row['date_affichage'] != '') {
6570 softime 19307 $this->valF['archive_date_affichage']= $row['date_affichage'];
6571 softime 8989 }
6572 softime 10573 if (isset($row['pec_metier']) === true && $row['pec_metier'] != '') {
6573 softime 19307 $this->valF['archive_pec_metier']= $row['pec_metier'];
6574 softime 10573 }
6575     if (isset($row['a_qualifier']) === true && $row['a_qualifier'] != '') {
6576 softime 19307 $this->valF['archive_a_qualifier']= $row['a_qualifier'];
6577 softime 10573 }
6578 mbroquet 3730 }
6579    
6580     // {{{
6581     // Méthodes de récupération des métadonnées arrêté
6582     /**
6583     * @return string Retourne le numéro d'arrêté
6584     */
6585     function getNumArrete() {
6586     return $this->getVal("numero_arrete");
6587     }
6588     /**
6589     * @return chaîne vide
6590     */
6591     function getReglementaireArrete() {
6592     return 'true';
6593     }
6594     /**
6595     * @return boolean de notification au pétitionnaire
6596     */
6597     function getNotificationArrete() {
6598     return 'true';
6599     }
6600     /**
6601     * @return date de notification au pétitionnaire
6602     */
6603     function getDateNotificationArrete() {
6604     if (empty($this->metadonneesArrete)) {
6605     $this->getArreteMetadata();
6606     }
6607     return $this->metadonneesArrete["datenotification"];
6608     }
6609     /**
6610     * @return boolean check si le document est passé au contrôle de légalité
6611     */
6612     function getControleLegalite() {
6613     return 'true';
6614     }
6615     /**
6616     * @return date de signature de l'arrêté
6617     */
6618     function getDateSignature() {
6619     if (empty($this->metadonneesArrete)) {
6620     $this->getArreteMetadata();
6621     }
6622     return $this->metadonneesArrete["datesignaturearrete"];
6623     }
6624     /**
6625     * @return string nom du signataire
6626     */
6627     function getNomSignataire() {
6628     if (empty($this->metadonneesArrete)) {
6629     $this->getArreteMetadata();
6630     }
6631     return $this->metadonneesArrete["nomsignataire"];
6632     }
6633     /**
6634     * @return string qualité du signataire
6635     */
6636     function getQualiteSignataire() {
6637     if (empty($this->metadonneesArrete)) {
6638     $this->getArreteMetadata();
6639     }
6640     return $this->metadonneesArrete["qualitesignataire"];
6641     }
6642     /**
6643     * @return string numéro du terrain
6644     */
6645     function getAp_numRue() {
6646     if (empty($this->metadonneesArrete)) {
6647     $this->getArreteMetadata();
6648     }
6649     return $this->metadonneesArrete["ap_numrue"];
6650     }
6651     /**
6652     * @return string nom de la rue du terrain
6653     */
6654     function getAp_nomDeLaVoie() {
6655     if (empty($this->metadonneesArrete)) {
6656     $this->getArreteMetadata();
6657     }
6658     return $this->metadonneesArrete["ap_nomdelavoie"];
6659     }
6660     /**
6661     * @return string code postal du terrain
6662     */
6663     function getAp_codePostal() {
6664     if (empty($this->metadonneesArrete)) {
6665     $this->getArreteMetadata();
6666     }
6667     return $this->metadonneesArrete["ap_codepostal"];
6668     }
6669     /**
6670     * @return string ville du terrain
6671     */
6672     function getAp_ville() {
6673     if (empty($this->metadonneesArrete)) {
6674     $this->getArreteMetadata();
6675     }
6676     return $this->metadonneesArrete["ap_ville"];
6677     }
6678     /**
6679     * @return string activité
6680     */
6681     function getActivite() {
6682     return "Droit du sol";
6683     }
6684     /**
6685     * @return string date du retour de controle légalité
6686     */
6687     function getDateControleLegalite() {
6688     if (empty($this->metadonneesArrete)) {
6689     $this->getArreteMetadata();
6690     }
6691     return $this->metadonneesArrete["datecontrolelegalite"];
6692     }
6693    
6694     // Fin des méthodes de récupération des métadonnées
6695     // }}}
6696    
6697     /**
6698     * Méthode de récupération des métadonnées arrêtés dans la base de données,
6699     * les données sont stockés dans l'attribut $this->metadonneesArrete
6700     */
6701     function getArreteMetadata() {
6702    
6703 softime 14542 //Récupération de la dernière instruction dont l'événement est de type 'arrete'
6704     $this->metadonneesArrete = array("nomsignataire"=>"", "qualitesignataire"=>"",
6705     "decisionarrete"=>"", "datenotification"=>"", "datesignaturearrete"=>"",
6706     "datecontrolelegalite"=>"", "ap_numrue"=>"", "ap_nomdelavoie"=>"",
6707     "ap_codepostal"=>"", "ap_ville"=>"");
6708 mbroquet 3730
6709 softime 14542 $qres = $this->f->get_all_results_from_db_query(
6710     sprintf(
6711     'SELECT
6712     signataire_arrete.prenom || \' \' ||signataire_arrete.nom as nomsignataire,
6713     signataire_arrete.qualite as qualitesignataire,
6714     instruction.etat as decisionarrete,
6715     instruction.date_retour_rar as datenotification,
6716     instruction.date_retour_signature as datesignaturearrete,
6717     instruction.date_retour_controle_legalite as datecontrolelegalite,
6718     dossier.terrain_adresse_voie_numero as ap_numrue,
6719     dossier.terrain_adresse_voie as ap_nomdelavoie,
6720     dossier.terrain_adresse_code_postal as ap_codepostal,
6721     dossier.terrain_adresse_localite as ap_ville
6722     FROM
6723     %1$sinstruction
6724     LEFT JOIN %1$ssignataire_arrete
6725     ON instruction.signataire_arrete = signataire_arrete.signataire_arrete
6726     LEFT JOIN %1$sdossier
6727     ON instruction.dossier = dossier.dossier
6728     LEFT JOIN %1$sdonnees_techniques
6729     ON donnees_techniques.dossier_instruction = dossier.dossier
6730     WHERE
6731     instruction.instruction = %2$d',
6732     DB_PREFIXE,
6733     intval($this->getVal('instruction'))
6734     ),
6735     array(
6736     'origin' => __METHOD__
6737     )
6738     );
6739     $this->metadonneesArrete = array_shift($qres['result']);
6740 mbroquet 3730 }
6741    
6742     /**
6743     * CONDITION - has_an_edition.
6744     *
6745     * Condition pour afficher le bouton de visualisation de l'édition.
6746     *
6747     * @return boolean
6748     */
6749     function has_an_edition() {
6750     // Récupère la valeur du champ lettretype
6751     $lettretype = $this->getVal("lettretype");
6752     // Si le champ est vide
6753 softime 7521 if ($lettretype !== '' && $lettretype !== null) {
6754 mbroquet 3730 //
6755 softime 7521 return true;
6756 mbroquet 3730 }
6757    
6758     //
6759 softime 7521 return false;
6760 mbroquet 3730 }
6761    
6762     /**
6763 softime 10573 * CONDITION - is_modifiable.
6764     *
6765     * Controle si l'évenement est modifiable.
6766     *
6767     * @return boolean
6768     */
6769     function is_evenement_modifiable() {
6770     $evenement = $this->get_inst_evenement($this->getVal('evenement'));
6771     return ! $this->get_boolean_from_pgsql_value($evenement->getVal('non_modifiable'));
6772     }
6773    
6774     /**
6775 mbroquet 3730 * CONDITION - is_editable.
6776     *
6777     * Condition pour la modification.
6778     *
6779     * @return boolean
6780     */
6781     function is_editable() {
6782 softime 10573
6783     // XXX
6784     // 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é)
6785     // Si cette tâche identifiée est DONE alors la suppression/modification de cette intruction est impossible
6786    
6787 mbroquet 3730 // Contrôle si l'utilisateur possède un bypass
6788 softime 7996 $bypass = $this->f->isAccredited($this->get_absolute_class_name()."_modifier_bypass");
6789 mbroquet 3730 //
6790     if ($bypass == true) {
6791     //
6792     return true;
6793     }
6794 softime 19307
6795 mbroquet 3730 // Si l'utilisateur est un instructeur, que le dossier est cloturé et
6796     // que l'événement n'est pas identifié comme non verrouillable
6797     if ($this->f->isUserInstructeur()
6798     && $this->getStatutAutorisationDossier($this->getParameter("idxformulaire")) == "cloture"
6799     && $this->checkEvenementNonVerrouillable($this->getVal("instruction")) === false) {
6800     //
6801     return false;
6802     }
6803    
6804 softime 6565 // Si l'utilisateur est un intructeur qui correspond à la division du
6805     // dossier
6806     if ($this->is_instructeur_from_division_dossier() === true) {
6807     //
6808     return true;
6809     }
6810    
6811     // Si l'utilisateur est instructeur de la commune du dossier et que
6812     // l'instruction est créée par un instructeur de la commune
6813 softime 18876 if ($this->is_instructeur_from_collectivite_dossier() === true &&
6814 softime 6565 $this->getVal('created_by_commune') === 't') {
6815     return true;
6816     }
6817    
6818 mbroquet 3730 //
6819 softime 6565 return false;
6820 mbroquet 3730 }
6821    
6822     /**
6823 softime 10573 * Vérifie si l'événement est supprimable ou pas.
6824     *
6825     * @return boolean
6826     */
6827     function is_evenement_supprimable() {
6828     // Controle si l'évenement est supprimable
6829     $evenement = $this->get_inst_evenement($this->getVal('evenement'));
6830     return ! $this->get_boolean_from_pgsql_value($evenement->getVal('non_supprimable'));
6831     }
6832    
6833     /**
6834 mbroquet 3730 * CONDITION - is_deletable.
6835     *
6836 softime 6864 * Condition pour la suppression.
6837 mbroquet 3730 *
6838     * @return boolean
6839     */
6840     function is_deletable() {
6841 softime 10573
6842     // XXX
6843     // 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é)
6844     // Si cette tâche identifiée est DONE alors la suppression/modification de cette intruction est impossible
6845    
6846 softime 6864 // Contrôle si l'utilisateur possède un bypass intégral
6847 softime 7996 $bypass = $this->f->isAccredited($this->get_absolute_class_name()."_supprimer_bypass");
6848 mbroquet 3730 //
6849     if ($bypass == true) {
6850    
6851     //
6852     return true;
6853     }
6854    
6855     // Si l'utilisateur est un intructeur qui ne correspond pas à la
6856 softime 6864 // division du dossier et si l'utilisateur n'a pas la permission bypass
6857     // de la division
6858     if ($this->is_instructeur_from_division_dossier() === false
6859 softime 7996 && $this->f->isAccredited($this->get_absolute_class_name()."_supprimer_bypass_division") === false) {
6860 mbroquet 3730
6861     //
6862     return false;
6863     }
6864 softime 19307
6865 softime 5024 // l'événement est-il le dernier ?
6866     $dernier_evenement = false;
6867     // instanciation dossier
6868 softime 7996 $dossier = $this->f->get_inst__om_dbform(array(
6869     "obj" => "dossier",
6870     "idx" => $this->getVal('dossier'),
6871     ));
6872 softime 5024 // récupération dernier événement
6873     $id_dernier_evenement = $dossier->get_dernier_evenement();
6874     if ($id_dernier_evenement == $this->getVal($this->clePrimaire)) {
6875     $dernier_evenement = true;
6876     }
6877 mbroquet 3730
6878 softime 5024 // Si dossier cloturé ou si pas dernier événement
6879     // ou de type retour ou si une date est renseignée
6880     // ET utilisateur non administrateur
6881     if ($this->getStatutAutorisationDossier($this->getVal('dossier')) == 'cloture'
6882     || $dernier_evenement == false
6883     || $this->is_evenement_retour($this->getVal("evenement")) == true
6884     || $this->getVal('date_envoi_signature') != ''
6885     || $this->getVal('date_retour_signature') != ''
6886     || $this->getVal('date_envoi_rar') != ''
6887     || $this->getVal('date_retour_rar') != ''
6888     || $this->getVal('date_envoi_controle_legalite') != ''
6889     || $this->getVal('date_retour_controle_legalite') != '') {
6890     // pas le droit de supprimer
6891     return false;;
6892     }
6893    
6894 mbroquet 3730 //
6895     return true;
6896     }
6897 softime 19307
6898    
6899 mbroquet 3730 /**
6900 softime 6565 * Vérifie que l'utilisateur est instructeur et qu'il est de la division du
6901     * dossier.
6902     *
6903     * @return, boolean true/false
6904     */
6905     function is_instructeur_from_collectivite_dossier() {
6906 softime 18876 if ($this->f->isUserInstructeur() === true &&
6907 softime 6565 $this->f->om_utilisateur["om_collectivite"] == $this->get_dossier_instruction_om_collectivite()) {
6908     return true;
6909     }
6910     return false;
6911     }
6912 softime 19307
6913 softime 6565 /**
6914 mbroquet 3730 * CONDITION - is_addable.
6915 softime 19307 *
6916 mbroquet 3730 * Condition pour afficher les boutons modifier et supprimer.
6917     *
6918     * @return boolean
6919     */
6920     function is_addable() {
6921     // Contrôle si l'utilisateur possède un bypass
6922 softime 7996 $bypass = $this->f->isAccredited($this->get_absolute_class_name()."_ajouter_bypass");
6923 mbroquet 3730 //
6924     if ($bypass == true) {
6925    
6926     //
6927     return true;
6928     }
6929 softime 6565 // Si l'utilisateur est un intructeur qui correspond à la
6930     // division du dossier ou qu'il peut changer la décision
6931 softime 18876 if ($this->is_instructeur_from_division_dossier() === true ||
6932 softime 6565 $this->isInstrCanChangeDecision($this->getParameter('idxformulaire')) === true) {
6933 mbroquet 3730 //
6934 softime 6565 return true;
6935 mbroquet 3730 }
6936    
6937     //
6938 softime 6565 return false;
6939 mbroquet 3730 }
6940    
6941     /**
6942     * CONDITION - is_finalizable.
6943     *
6944     * Condition pour afficher le bouton.
6945     *
6946     * @return boolean
6947     */
6948     function is_finalizable() {
6949     // Contrôle si l'utilisateur possède un bypass
6950 softime 7996 $bypass = $this->f->isAccredited($this->get_absolute_class_name()."_finaliser_bypass");
6951 mbroquet 3730 //
6952     if ($bypass == true) {
6953     //
6954     return true;
6955     }
6956 softime 19307
6957 mbroquet 3730 // Si l'utilisateur est un instructeur, que le dossier est cloturé et
6958     // que l'événement n'est pas identifié comme non verrouillable
6959     if ($this->f->isUserInstructeur()
6960     && $this->getStatutAutorisationDossier($this->getParameter("idxformulaire")) == "cloture"
6961     && $this->checkEvenementNonVerrouillable($this->getVal("instruction")) === false) {
6962     //
6963     return false;
6964     }
6965 softime 19307
6966 softime 6565 // Si l'utilisateur est un intructeur qui correspond à la division du
6967     // dossier
6968     if ($this->is_instructeur_from_division_dossier() === true) {
6969     //
6970     return true;
6971     }
6972 mbroquet 3730
6973 softime 6565 // Si l'utilisateur est instructeur de la commune du dossier et que
6974     // l'instruction est créée par un instructeur de la commune
6975 softime 18876 if ($this->is_instructeur_from_collectivite_dossier() === true &&
6976 softime 6565 $this->getVal('created_by_commune') === 't') {
6977     return true;
6978     }
6979    
6980 mbroquet 3730 //
6981 softime 6565 return false;
6982 mbroquet 3730 }
6983    
6984     /**
6985     * CONDITION - is_finalize_without_bypass.
6986     *
6987     * Condition pour afficher le bouton sans le bypass.
6988     *
6989     * @return boolean [description]
6990     */
6991     function is_finalizable_without_bypass() {
6992     // Récupère la valeur du champ finalisé
6993     $om_final_instruction = $this->getVal('om_final_instruction');
6994    
6995     // Si le rapport n'est pas finalisé
6996     if (empty($om_final_instruction)
6997     || $om_final_instruction == 'f') {
6998     //
6999     return true;
7000     }
7001    
7002     //
7003     return false;
7004     }
7005    
7006     /**
7007     * CONDITION - is_unfinalizable.
7008     *
7009     * Condition pour afficher le bouton.
7010     *
7011     * @return boolean
7012     */
7013     function is_unfinalizable(){
7014     // Contrôle si l'utilisateur possède un bypass
7015 softime 7996 $bypass = $this->f->isAccredited($this->get_absolute_class_name()."_definaliser_bypass");
7016 mbroquet 3730 //
7017     if ($bypass == true) {
7018     //
7019     return true;
7020     }
7021 softime 19307
7022 softime 6565 // Si l'utilisateur est un instructeur, que le dossier est cloturé et
7023     // que l'événement n'est pas identifié comme non verrouillable
7024 mbroquet 3730 if ($this->f->isUserInstructeur()
7025 softime 6565 && $this->getStatutAutorisationDossier($this->getParameter("idxformulaire")) == "cloture"
7026     && $this->checkEvenementNonVerrouillable($this->getVal("instruction")) === false) {
7027 mbroquet 3730 //
7028     return false;
7029     }
7030    
7031 softime 6565 // Si l'utilisateur est un intructeur qui correspond à la division du
7032     // dossier
7033     if ($this->is_instructeur_from_division_dossier() === true) {
7034     //
7035     return true;
7036 mbroquet 3730 }
7037    
7038 softime 6565 // Si l'utilisateur est instructeur de la commune du dossier et que
7039     // l'instruction est créée par un instructeur de la commune
7040 softime 18876 if ($this->is_instructeur_from_collectivite_dossier() === true &&
7041 softime 6565 $this->getVal('created_by_commune') === 't') {
7042     return true;
7043 mbroquet 3730 }
7044    
7045     //
7046 softime 6565 return false;
7047 mbroquet 3730 }
7048    
7049     /**
7050     * CONDITION - is_unfinalizable_without_bypass.
7051     *
7052     * Condition pour afficher le bouton sans le bypass.
7053     *
7054     * @return boolean
7055     */
7056     function is_unfinalizable_without_bypass() {
7057     // Récupère la valeur du champ finalisé
7058     $om_final_instruction = $this->getVal('om_final_instruction');
7059    
7060     // Si l'instruction est finalisée
7061     if ($om_final_instruction == 't') {
7062     //
7063     return true;
7064     }
7065    
7066     //
7067     return false;
7068     }
7069    
7070 softime 5169
7071 mbroquet 3730 /**
7072 softime 6565 * Permet de définir si un instructeur commune peut editer une instruction
7073     *
7074     * @return boolean true si il peut
7075     */
7076     function isInstrCanChangeDecision($idx) {
7077 softime 19307
7078 softime 18876 if ($this->f->isAccredited(array("instruction", "instruction_changer_decision"), "OR") !== true ||
7079 softime 6565 $this->f->isUserInstructeur() !== true) {
7080     return false;
7081     }
7082    
7083 softime 19307
7084    
7085 softime 6565 // Sinon on vérifie l'éligibilité du dossier au changement de décision
7086 softime 11876 // /!\ Requête lié à celles du widget indiquant les dossiers éligible au changement
7087     // de décision :
7088     // * dossier_instruction.class.php : view_widget_dossiers_evenement_retour_finalise()
7089     // * dossier_instruction.inc.php : si le paramètre filtre_decision = true
7090     $sql = sprintf(
7091     'SELECT
7092 softime 6565 dossier.dossier
7093     FROM
7094 softime 11876 %1$sdossier
7095     JOIN %1$setat
7096     ON dossier.etat = etat.etat AND etat.statut = \'encours\'
7097     JOIN %1$slien_dossier_demandeur
7098     ON dossier.dossier = lien_dossier_demandeur.dossier AND lien_dossier_demandeur.petitionnaire_principal IS TRUE
7099     JOIN %1$sdossier_instruction_type
7100     ON dossier.dossier_instruction_type=dossier_instruction_type.dossier_instruction_type
7101     JOIN %1$sinstruction
7102     -- Recherche de la dernière instruction qui ne soit pas liée à un événement retour
7103     ON instruction.instruction = (
7104     SELECT instruction
7105     FROM %1$sinstruction
7106     JOIN %1$sevenement ON instruction.evenement=evenement.evenement
7107     AND evenement.retour IS FALSE
7108     WHERE instruction.dossier = dossier.dossier
7109     ORDER BY date_evenement DESC, instruction DESC
7110     LIMIT 1
7111     )
7112     -- On ne garde que les dossiers pour lesquels la dernière instruction est finalisée
7113     -- ou alors pour laquelle l instruction a été ajouté par la commune et est
7114     -- non signée, non notifié, etc.
7115     AND (instruction.om_final_instruction IS TRUE
7116     OR instruction.created_by_commune IS TRUE)
7117     AND instruction.date_retour_signature IS NULL
7118     AND instruction.date_envoi_rar IS NULL
7119     AND instruction.date_retour_rar IS NULL
7120     AND instruction.date_envoi_controle_legalite IS NULL
7121     AND instruction.date_retour_controle_legalite IS NULL
7122     -- On vérifie que l instruction soit un arrêté ou un changement de décision
7123     JOIN %1$sevenement
7124     ON instruction.evenement=evenement.evenement
7125     AND (evenement.type = \'arrete\'
7126     OR evenement.type = \'changement_decision\')
7127     -- Recherche les informations du pétitionnaire principal pour l affichage
7128     JOIN %1$sdemandeur
7129     ON lien_dossier_demandeur.demandeur = demandeur.demandeur
7130     -- Recherche la collectivité rattachée à l instructeur
7131     JOIN %1$sinstructeur
7132     ON dossier.instructeur=instructeur.instructeur
7133     JOIN %1$sdivision
7134     ON instructeur.division=division.division
7135     JOIN %1$sdirection
7136     ON division.direction=direction.direction
7137     JOIN %1$som_collectivite
7138     ON direction.om_collectivite=om_collectivite.om_collectivite
7139 softime 6565 WHERE
7140 softime 11876 -- Vérification que la décision a été prise par l agglo
7141     om_collectivite.niveau = \'2\'
7142     AND dossier.dossier = \'%2$s\'
7143     ',
7144     DB_PREFIXE,
7145 softime 14064 $this->f->db->escapeSimple($idx)
7146 softime 11876 );
7147 softime 6565
7148    
7149     // Si collectivité de l'utilisateur niveau mono alors filtre sur celle-ci
7150     if ($this->f->isCollectiviteMono($_SESSION['collectivite']) === true) {
7151 softime 11876 $sql .= sprintf(
7152 softime 14064 ' AND dossier.om_collectivite = %1$d',
7153     intval($_SESSION['collectivite'])
7154 softime 11876 );
7155 softime 6565 }
7156 softime 14064 $qres = $this->f->get_one_result_from_db_query(
7157 softime 19307 $sql,
7158 softime 14064 array(
7159     "origin" => __METHOD__,
7160     )
7161     );
7162    
7163     return $qres['result'] !== null;
7164 softime 6565 }
7165    
7166    
7167     /**
7168 softime 5169 * CONDITION - can_monitoring_dates.
7169     *
7170     * Condition pour afficher le bouton de suivi des dates.
7171     *
7172     * @return boolean
7173     */
7174     public function can_monitoring_dates() {
7175     // Récupère la valeur du champ finalisé
7176     $om_final_instruction = $this->getVal('om_final_instruction');
7177    
7178     // Si l'instruction n'est pas finalisée
7179     if ($om_final_instruction !== 't') {
7180     //
7181     return false;
7182     }
7183    
7184     // Contrôle si l'utilisateur possède un bypass
7185 softime 7996 $bypass = $this->f->isAccredited($this->get_absolute_class_name()."_modification_dates_bypass");
7186 softime 5169 if ($bypass === true) {
7187     return true;
7188     }
7189    
7190 softime 8989 // Permission de modifier le suivi des dates sur un dossier cloturé pour
7191     // un utilisateur lié à un instructeur
7192     $perm_moni_dates_d_closed = $this->f->isAccredited($this->get_absolute_class_name()."_modification_dates_cloture");
7193    
7194     // On vérifie en premier lieu que le DI n'est pas clôturé et que
7195     // l'utilisateur ne possède pas la permission de modifier le suivi des
7196     // dates sur un dossier clôturé
7197 softime 5169 $inst_dossier = $this->get_inst_dossier();
7198 softime 8989 if ($inst_dossier->getStatut() === 'cloture'
7199     && $perm_moni_dates_d_closed === false) {
7200 softime 5169 //
7201     return false;
7202     }
7203     // On récupère ses infos
7204     $coll_di = $inst_dossier->getVal('om_collectivite');
7205     $div_di = $this->getDivisionFromDossier();
7206     // et celles de son éventuel instructeur
7207     $instr_di = $inst_dossier->getVal('instructeur');
7208    
7209 softime 6565 // Il faut disposer d'une entrée instructeur
7210     if ($this->f->isUserInstructeur() === false) {
7211     return false;
7212     }
7213    
7214 softime 5169 // Par défaut on prétend que l'instructeur n'est pas multi
7215     $instr_di_coll_multi = false;
7216     // Si un instructeur est affecté au dossier
7217     if ($instr_di !== '' && $instr_di !== null) {
7218     // Vérifie si l'instructeur est de la collectivité de niveau 2
7219 softime 5295 $instr_di_coll = $this->get_instructeur_om_collectivite($instr_di);
7220 softime 5169 if ($this->f->isCollectiviteMono($instr_di_coll) === false) {
7221     //
7222     $instr_di_coll_multi = true;
7223     }
7224     }
7225    
7226 softime 6565 // Il faut qu'il instruise le dossier ou soit de la même division
7227     if ($this->f->om_utilisateur['instructeur'] === $instr_di
7228     || $this->f->om_utilisateur['division'] === $div_di) {
7229 softime 5169 //
7230     return true;
7231     }
7232    
7233 softime 6565 // On donne également le droit s'il est de la même collectivité que
7234     // le dossier ET si l'instruction est déléguée à la communauté
7235     if ($this->f->isCollectiviteMono($this->f->om_utilisateur['om_collectivite']) === true
7236     && $this->f->om_utilisateur['om_collectivite'] === $coll_di
7237     && $instr_di_coll_multi === true) {
7238 softime 5169 //
7239     return true;
7240     }
7241    
7242 softime 6565 // Si l'instructeur ne rentre pas dans les deux cas précédents
7243 softime 5169 return false;
7244     }
7245    
7246    
7247     /**
7248 softime 12847 * CONDITION - is_finalized.
7249     *
7250     * Condition pour vérifier si une instruction est finalisée.
7251     *
7252     * @return boolean
7253     */
7254     public function is_finalized() {
7255    
7256     return $this->getVal('om_final_instruction') === "t";
7257     }
7258    
7259     /**
7260     * CONDITION - is_not_date_retour_signature_set.
7261     *
7262     * Condition pour vérifier si une date de retour signature n'est pas définie.
7263     *
7264     * @return boolean
7265     */
7266     public function is_not_date_retour_signature_set() {
7267    
7268     return $this->getVal('date_retour_signature') == null;
7269    
7270     }
7271    
7272    
7273     /**
7274 mbroquet 3730 * TREATMENT - finalize.
7275     *
7276     * Permet de finaliser un enregistrement.
7277     *
7278     * @param array $val valeurs soumises par le formulaire
7279     *
7280     * @return boolean
7281     */
7282     function finalize($val = array()) {
7283     // Cette méthode permet d'exécuter une routine en début des méthodes
7284     // dites de TREATMENT.
7285     $this->begin_treatment(__METHOD__);
7286 softime 10808 $message = '';
7287 softime 11585 $ev = $this->get_inst_evenement($this->getVal('evenement'));
7288 mbroquet 3730
7289 softime 18436 $this->f->log(__METHOD__, 'BEGIN');
7290     $collectivite_di = null;
7291     $data = array('val' => &$val);
7292     $data['ev'] = $ev;
7293     $data['collectivite_di'] = $collectivite_di;
7294     $this->f->module_manager->run_hooks('finalize_pre', $this, $data);
7295    
7296 softime 11585 // Controle du signataire
7297     if (! $this->controle_signataire($ev)) {
7298     $this->addToMessage(__("Le document ne peut pas être finalisé car aucun signataire n'a été sélectionné."));
7299     // Termine le traitement
7300     return $this->end_treatment(__METHOD__, false);
7301     }
7302    
7303 mbroquet 3730 // Traitement de la finalisation
7304     $ret = $this->manage_finalizing("finalize", $val);
7305    
7306     // Si le traitement retourne une erreur
7307     if ($ret !== true) {
7308    
7309     // Termine le traitement
7310 softime 5024 return $this->end_treatment(__METHOD__, false);
7311 mbroquet 3730 }
7312    
7313 softime 10808 // Envoi des notifications aux demandeurs si la notification est automatique
7314     // et que la signature n'est pas requise
7315     if ($ev->getVal('notification') === 'notification_automatique') {
7316 softime 13137 // Préparation du message de log en cas d'erreur de notification
7317 softime 13528 $msgLog = sprintf(
7318     '%s %s : %d',
7319     __('Erreur lors de la notification automatique du(des) pétitionnaire(s) suite à la finalisation de l\'instruction.'),
7320     __('Instruction notifiée'),
7321     $this->getVal($this->clePrimaire)
7322     );
7323 softime 10808 // Récupération de la catégorie et envoie des notifications au(x) demandeur(s)
7324     $collectivite_di = $this->get_dossier_instruction_om_collectivite($this->getVal('dossier'));
7325     // Récupération de la liste des demandeurs à notifier et de la catégorie
7326     $categorie = $this->f->get_param_option_notification($collectivite_di);
7327 softime 14064 $isPortal = $categorie === PORTAL;
7328 softime 10869 $demandeursANotifie = $this->get_demandeurs_notifiable(
7329     $this->getVal('dossier'),
7330     $isPortal
7331     );
7332 softime 10808
7333     // Création d'une notification et d'une tâche pour chaque demandeur à notifier
7334 softime 12124 $demandeurPrincipalNotifie = false;
7335 softime 10813 if (count($demandeursANotifie) > 0) {
7336     foreach ($demandeursANotifie as $demandeur) {
7337 softime 12124 // Identifie si le demandeur principal a été notifié ou pas
7338     // et récupère ses informations
7339     if ($demandeur['petitionnaire_principal'] == 't') {
7340     $demandeurPrincipalNotifie = true;
7341     // Si le demandeur principal est notifiable mais qu'il y a des erreurs dans
7342     // son paramétrage, on effectue pas le traitement et on passe à l'itération
7343     // suivante. On le considère également comme non notifié pour gérer l'envoie
7344     // des messages d'erreurs
7345     // Si la demande a été déposée via le portail alors le paramétrage n'a pas
7346     // d'impact sur la notification
7347     $erreursParam = $this->get_info_notification_fail();
7348     if (! $this->dossier_depose_sur_portail() && $erreursParam != array()) {
7349     $demandeurPrincipalNotifie = false;
7350     continue;
7351     }
7352     }
7353 softime 18876 //
7354     $msg_notif = '';
7355    
7356     $option_bloquer_notif_auto_dln_types_evenements = $this->f->getParameter("option_bloquer_notif_auto_dln") !== null ? explode(';', $this->f->getParameter("option_bloquer_notif_auto_dln")) : null;
7357     // On vérifie l'existence du paramètre 'option_bloquer_notif_auto_dln',
7358     // On vérifie si la date limite est dépassée ou si le type d'événement est erroné
7359     if (! empty($option_bloquer_notif_auto_dln_types_evenements)
7360     && $this->is_type_evenement_autorise($ev, array('types_evenements_autorises'=> $option_bloquer_notif_auto_dln_types_evenements)) === true
7361     && $this->is_date_limite_notification_premier_mois_depasee() === true) {
7362     // Ajout de la notif et récupération de son id
7363     $idNotif = $this->ajouter_notification(
7364     $this->getVal($this->clePrimaire),
7365     $this->f->get_connected_user_login_name(),
7366     $demandeur,
7367     $collectivite_di,
7368     array(),
7369     true,
7370     'Echec',
7371     __('La date limite de notification au demandeur est dépassée')
7372 softime 13528 );
7373 softime 18876 if ($idNotif === false) {
7374     // Termine le traitement
7375     $this->addToLog(
7376     sprintf('%s() : %s', __METHOD__, $msgLog),
7377     DEBUG_MODE
7378     );
7379     return $this->end_treatment(__METHOD__, false);
7380     }
7381     $msg_notif = sprintf('%s<br/>%s', __("La notification n'a pas été générée, car la date limite de notification au demandeur est dépassée."), __("Le suivi de la notification est disponible depuis l'instruction."));
7382 softime 10813 }
7383 softime 18876 else {
7384     // Ajout de la notif et récupération de son id
7385     $idNotif = $this->ajouter_notification(
7386     $this->getVal($this->clePrimaire),
7387     $this->f->get_connected_user_login_name(),
7388     $demandeur,
7389     $collectivite_di,
7390     array(),
7391     true
7392 softime 13528 );
7393 softime 18876 if ($idNotif === false) {
7394     // Termine le traitement
7395     $this->addToLog(
7396     sprintf('%s() : %s', __METHOD__, $msgLog),
7397     DEBUG_MODE
7398     );
7399     return $this->end_treatment(__METHOD__, false);
7400     }
7401     $notification_by_task = $this->notification_by_task(
7402     $idNotif,
7403     $this->getVal('dossier'),
7404     $categorie
7405 softime 10813 );
7406 softime 18876 if ($notification_by_task === false) {
7407     $this->addToLog(
7408     sprintf('%s() : %s', __METHOD__, $msgLog),
7409     DEBUG_MODE
7410     );
7411     $this->addToMessage(
7412     __("Erreur lors de la génération de la notification au(x) pétitionnaire(s).")
7413     );
7414     // Termine le traitement
7415     return $this->end_treatment(__METHOD__, false);
7416     }
7417     $msg_notif = sprintf('%s<br/>%s', __("La notification a été générée."), __("Le suivi de la notification est disponible depuis l'instruction."));
7418 softime 10813 }
7419 softime 10808 }
7420 softime 18876 $this->addToMessage($message .= $msg_notif);
7421 softime 10808 }
7422 softime 12847 // Pour la notification par mail ou la notification via portal si le dossier a
7423     // été déposés via portal, si le demandeur principal n'est pas notifiable,
7424     // on créé une nouvelle notification en erreur avec en commentaire la raison pour
7425     // laquelle le demandeur principal n'a pas pu être notifié
7426     $depotPortal = $this->dossier_depose_sur_portail();
7427     if (! $demandeurPrincipalNotifie && ($isPortal === false || $depotPortal === true)) {
7428 softime 13137 // Préparation des logs pour indiquer que le pétitionnaire principale n'est pas notifiable
7429 softime 13528 $msgLog .= sprintf(' %s', __('Le pétitionnaire principale n\'est pas notifiable.'));
7430 softime 12124 // Analyse pour savoir pourquoi le demandeur principal n'est pas notifiable
7431     $erreursParam = $this->get_info_notification_fail();
7432     $demandeurPrincipal = $this->get_info_petitionnaire_principal_dossier($this->getVal('dossier'));
7433     // Ajout de la notif et récupération de son id
7434     $idNotif = $this->ajouter_notification(
7435     $this->valF[$this->clePrimaire],
7436     $this->f->get_connected_user_login_name(),
7437     $demandeurPrincipal,
7438     $collectivite_di,
7439 softime 12433 array(),
7440 softime 12124 true,
7441     'Echec',
7442     implode(' ', $erreursParam)
7443     );
7444     if ($idNotif === false) {
7445     $this->addToMessage(
7446     __('Erreur : la création de la notification a échouée.').
7447     __("Veuillez contacter votre administrateur.")
7448     );
7449 softime 13528 $this->addToLog(
7450     sprintf('%s() : %s', __METHOD__, $msgLog),
7451     DEBUG_MODE
7452     );
7453 softime 12124 return false;
7454     }
7455     // Prépare un message d'alerte à destination de l'instructeur pour l'informer
7456     // de l'échec de la notification
7457     $dossier_message = $this->get_inst_dossier_message(0);
7458     $dossier_message_val = array(
7459     'dossier' => $this->getVal('dossier'),
7460 softime 18876 'type' => __('erreur expedition'),
7461 softime 12124 'emetteur' => $this->f->get_connected_user_login_name(),
7462     'login' => $_SESSION['login'],
7463     'date_emission' => date('Y-m-d H:i:s'),
7464 softime 18876 'contenu' => __('Échec lors de la notification de l\'instruction ').
7465 softime 12124 $ev->getVal('libelle').
7466     '.<br>'.
7467     implode("\n", $erreursParam).
7468     '<br>'.
7469 softime 18876 __('Veuillez corriger ces informations avant de renvoyer la notification.')
7470 softime 12124 );
7471     $add = $dossier_message->add_notification_message($dossier_message_val, true);
7472     // Si une erreur se produit pendant l'ajout
7473     if ($add !== true) {
7474     $this->addToLog(__METHOD__."(): Le message d'alerte concernant l'echec de l'envoi de la notification n'a pas pu être envoyé.", DEBUG_MODE);
7475     return false;
7476     }
7477     }
7478 softime 10808 }
7479    
7480 mbroquet 3730 // Termine le traitement
7481 softime 18436 // Événement
7482     $data['ev'] = $ev;
7483     $data['collectivite_di'] = $collectivite_di;
7484     $this->f->module_manager->run_hooks('finalize_post', $this, $data);
7485     $this->f->log(__METHOD__, 'END');
7486 softime 19307
7487 mbroquet 3730 return $this->end_treatment(__METHOD__, true);
7488     }
7489    
7490     /**
7491 softime 12124 * Récupère l'instance de dossier message.
7492     *
7493     * @param string $dossier_message Identifiant du message.
7494     *
7495     * @return object
7496     */
7497     private function get_inst_dossier_message($dossier_message = null) {
7498     //
7499     return $this->get_inst_common("dossier_message", $dossier_message);
7500     }
7501    
7502     /**
7503 softime 11585 * Vérifie si le signataire est obligatoire pour finaliser
7504     * le document apartir du paramétrage de l'événement.
7505     * Si c'est le cas, vérifie si il y a bien un signataire
7506     * renseigné.
7507     * Si c'est le cas renvoie true, sinon renvoie false.
7508     *
7509     * @param evenement évenement de l'instruction permettant de
7510     * récupérer le paramétrage
7511     * @return boolean
7512     */
7513     protected function controle_signataire($evenement) {
7514     // Vérifie si le signataire est obligatoire et si c'est le cas
7515     // vérifie si il y a bien un signataire pour le document
7516     if ($evenement->is_signataire_obligatoire() &&
7517     ($this->getVal('signataire_arrete') === null ||
7518     $this->getVal('signataire_arrete') === '')) {
7519     return false;
7520     }
7521     return true;
7522     }
7523    
7524     /**
7525 mbroquet 3730 * TREATMENT - unfinalize.
7526     *
7527     * Permet de définaliser un enregistrement.
7528     *
7529     * @param array $val valeurs soumises par le formulaire
7530     *
7531     * @return boolean
7532     */
7533     function unfinalize($val = array()) {
7534    
7535     // Cette méthode permet d'exécuter une routine en début des méthodes
7536     // dites de TREATMENT.
7537     $this->begin_treatment(__METHOD__);
7538    
7539     // Traitement de la finalisation
7540     $ret = $this->manage_finalizing("unfinalize", $val);
7541    
7542     // Si le traitement retourne une erreur
7543     if ($ret !== true) {
7544    
7545     // Termine le traitement
7546 softime 5024 return $this->end_treatment(__METHOD__, false);
7547 mbroquet 3730 }
7548    
7549     // Termine le traitement
7550     return $this->end_treatment(__METHOD__, true);
7551     }
7552    
7553     /**
7554     * VIEW - view_edition
7555 softime 19307 *
7556 mbroquet 3730 * Edite l'édition de l'instruction ou affiche celle contenue dans le stockage.
7557     *
7558     * @return null Si l'action est incorrecte
7559     */
7560     function view_edition() {
7561    
7562     // Si l'instruction est finalisée
7563     if($this->getVal("om_final_instruction") == 't'
7564     && $this->getVal("om_final_instruction") != null) {
7565    
7566     // Ouvre le document
7567 softime 7996 $lien = '../app/index.php?module=form&snippet=file&obj='.$this->table.'&'.
7568 mbroquet 3730 'champ=om_fichier_instruction&id='.$this->getVal($this->clePrimaire);
7569     //
7570     header("Location: ".$lien);
7571     } else {
7572    
7573     // Récupère la collectivite du dossier d'instruction
7574     $dossier_instruction_om_collectivite = $this->get_dossier_instruction_om_collectivite();
7575    
7576     //
7577     $collectivite = $this->f->getCollectivite($dossier_instruction_om_collectivite);
7578    
7579     // Paramètre du PDF
7580     $params = array(
7581 softime 19307 "watermark" => true,
7582 mbroquet 3730 "specific" => array(
7583     "mode" => "previsualisation",
7584     ),
7585     );
7586 softime 8593 // Si la rédaction libre est activée sur l'instruction
7587     if ($this->getVal("flag_edition_integrale") == 't') {
7588     $params["specific"]["corps"] = array(
7589     "mode" => "set",
7590     "value" => $this->getVal("corps_om_htmletatex"),
7591     );
7592     $params["specific"]["titre"] = array(
7593     "mode" => "set",
7594     "value" => $this->getVal("titre_om_htmletat"),
7595     );
7596     }
7597 mbroquet 3730
7598     // Génération du PDF
7599     $result = $this->compute_pdf_output('lettretype', $this->getVal("lettretype"), $collectivite, null, $params);
7600 softime 18436 $result['filename'] = $this->determinate_name_doc_pdf();
7601 mbroquet 3730 // Affichage du PDF
7602     $this->expose_pdf_output(
7603 softime 19307 $result['pdf_output'],
7604 mbroquet 3730 $result['filename']
7605     );
7606     }
7607     }
7608    
7609     /**
7610     * Récupère la collectivité du dossier d'instruction.
7611     *
7612 softime 7685 * @param string $dossier_instruction_id Identifiant du DI.
7613     *
7614 mbroquet 3730 * @return integer
7615     */
7616 softime 7685 function get_dossier_instruction_om_collectivite($dossier_instruction_id = null) {
7617 mbroquet 3730
7618 softime 7685 // Si l'identifiant n'est pas renseigné
7619     if ($dossier_instruction_id === null) {
7620 softime 8593 // Récupère la valeur
7621     if ($this->getVal('dossier') !== null && $this->getVal('dossier') !== '') {
7622     $dossier_instruction_id = $this->getVal('dossier');
7623     } elseif ($this->getParameter('idxformulaire') !== null
7624     && $this->getParameter('idxformulaire') !== '') {
7625     //
7626     $dossier_instruction_id = $this->getParameter('idxformulaire');
7627     } elseif ($this->f->get_submitted_get_value('idxformulaire') !== null
7628     && $this->f->get_submitted_get_value('idxformulaire') !== '') {
7629     //
7630     $dossier_instruction_id = $this->f->get_submitted_get_value('idxformulaire');
7631     }
7632 softime 7685 }
7633    
7634 mbroquet 3730 //
7635 softime 7996 $dossier_instruction = $this->f->get_inst__om_dbform(array(
7636     "obj" => "dossier_instruction",
7637     "idx" => $dossier_instruction_id,
7638     ));
7639 mbroquet 3730
7640     //
7641     return $dossier_instruction->getVal('om_collectivite');
7642     }
7643    
7644     /**
7645     * VIEW - view_bible
7646     *
7647     * Affiche la bible manuelle.
7648     *
7649     * @return void
7650     */
7651     function view_bible() {
7652     // Vérification de l'accessibilité sur l'élément
7653     $this->checkAccessibility();
7654    
7655     /**
7656     * Affichage de la structure HTML
7657     */
7658     //
7659 softime 8989 if ($this->f->isAjaxRequest()) {
7660 mbroquet 3730 //
7661     header("Content-type: text/html; charset=".HTTPCHARSET."");
7662     } else {
7663     //
7664 softime 8989 $this->f->setFlag("htmlonly");
7665     $this->f->display();
7666 mbroquet 3730 }
7667     //
7668 softime 8989 $this->f->displayStartContent();
7669 mbroquet 3730 //
7670 softime 18876 $this->f->setTitle(__("Liste des éléments de la bible en lien avec un evenement"));
7671 softime 8989 $this->f->displayTitle();
7672 mbroquet 3730
7673     /**
7674     *
7675     */
7676     //
7677 softime 8989 ($this->f->get_submitted_get_value("ev") ? $evenement = $this->f->get_submitted_get_value("ev") : $evenement = "");
7678 mbroquet 3730 $evenement = intval($evenement);
7679     //
7680 softime 8989 ($this->f->get_submitted_get_value("idx") ? $idx = $this->f->get_submitted_get_value("idx") : $idx = "");
7681 softime 19307 // Récupération du code du type de DA
7682 softime 5169 $code_da_type = '';
7683 softime 19307 if (preg_match('/[A-Za-z]{2,3}/', $idx, $matches) !== false) {
7684     $code_da_type = $matches[0];
7685 softime 5169 }
7686 mbroquet 3730 //
7687 softime 8989 ($this->f->get_submitted_get_value("complement") ? $complement = $this->f->get_submitted_get_value("complement") : $complement = "1");
7688 mbroquet 3730
7689     // Récupération de la collectivité du dossier
7690 softime 7996 $dossier = $this->f->get_inst__om_dbform(array(
7691     "obj" => "dossier",
7692     "idx" => $idx,
7693     ));
7694 mbroquet 3730
7695 softime 14542 $qres = $this->f->get_all_results_from_db_query(
7696     sprintf(
7697     'SELECT
7698     *,
7699     bible.libelle as bible_lib
7700     FROM
7701     %1$sbible
7702 softime 19307 LEFT OUTER JOIN %1$sdossier_autorisation_type
7703 softime 14542 ON bible.dossier_autorisation_type = dossier_autorisation_type.dossier_autorisation_type
7704     LEFT JOIN %1$som_collectivite
7705     ON bible.om_collectivite = om_collectivite.om_collectivite
7706     WHERE
7707     (evenement = %2$d
7708     OR evenement IS NULL)
7709     AND (complement = %3$d
7710     OR complement IS NULL)
7711     AND (bible.dossier_autorisation_type IS NULL
7712     OR dossier_autorisation_type.code = \'%4$s\')
7713     AND (om_collectivite.niveau = \'2\'
7714     OR bible.om_collectivite = %5$d)
7715     ORDER BY
7716     bible_lib ASC',
7717     DB_PREFIXE,
7718     intval($evenement),
7719     intval($complement),
7720     $this->f->db->escapeSimple($code_da_type),
7721     intval($dossier->getVal("om_collectivite"))
7722     ),
7723     array(
7724     'origin' => __METHOD__
7725     )
7726     );
7727 mbroquet 3730 //
7728     echo "<form method=\"post\" name=\"f3\" action=\"#\">\n";
7729     //
7730 softime 15835 if ($qres['row_count'] > 0) {
7731 mbroquet 3730 //
7732     echo "\t<table id='tab-bible' width='100%'>\n";
7733     //
7734     echo "\t\t<tr class=\"ui-tabs-nav ui-accordion ui-state-default tab-title\">";
7735 softime 18876 echo "<th>".__("Choisir")."</th>";
7736     echo "<th>".__("Libelle")."</th>";
7737 mbroquet 3730 echo "</tr>\n";
7738     //
7739     $i = 0;
7740     //
7741 softime 14542 foreach ($qres['result'] as $row) {
7742 mbroquet 3730 //
7743     echo "\t\t<tr";
7744     echo " class=\"".($i % 2 == 0 ? "odd" : "even")."\"";
7745     echo ">";
7746     //
7747     echo "<td class=\"center\"><input type=\"checkbox\" name=\"choix[]\" value=\"".$i."\" id=\"checkbox".$i."\" /></td>";
7748     // XXX utilisation de l'attribut titre pour afficher une infobulle
7749     echo "<td><span class=\"content\" title=\"".htmlentities($row['contenu'])."\" id=\"content".$i."\">".$row['bible_lib']."</span></td>";
7750     //
7751     echo "</tr>\n";
7752     //
7753     $i++;
7754     }
7755     echo "\t</table>\n";
7756     //
7757     echo "<div class=\"formControls\">\n";
7758 softime 8989 $this->f->layout->display_form_button(array(
7759 softime 18876 "value" => __("Valider"),
7760 mbroquet 3730 "onclick" => "bible_return('f2', 'complement".($complement == "1" ? "" : $complement)."_om_html'); return false;",
7761     ));
7762 softime 8989 $this->f->displayLinkJsCloseWindow();
7763 mbroquet 3730 echo "</div>\n";
7764    
7765     } else {
7766     //
7767     $message_class = "error";
7768 softime 18876 $message = __("Aucun element dans la bible pour l'evenement")." : ".$evenement;
7769 softime 8989 $this->f->displayMessage($message_class, $message);
7770 mbroquet 3730 //
7771     echo "<div class=\"formControls\">\n";
7772 softime 8989 $this->f->displayLinkJsCloseWindow();
7773 mbroquet 3730 echo "</div>\n";
7774     }
7775     //
7776     echo "</form>\n";
7777    
7778     /**
7779     * Affichage de la structure HTML
7780     */
7781     //
7782 softime 8989 $this->f->displayEndContent();
7783 mbroquet 3730 }
7784    
7785     /**
7786 softime 5169 * VIEW - view_bible_auto
7787 mbroquet 3730 *
7788 softime 5169 * Renvoie les valeurs de la bible à placer dans les compléments de l'instruction.
7789 mbroquet 3730 *
7790     * @return void
7791     */
7792     function view_bible_auto() {
7793     // Vérification de l'accessibilité sur l'élément
7794     $this->checkAccessibility();
7795     //
7796 softime 8989 $this->f->disableLog();
7797 mbroquet 3730
7798     $formatDate="AAAA-MM-JJ";
7799    
7800     // Récupération des paramètres
7801 softime 8989 $idx = $this->f->get_submitted_get_value('idx');
7802     $evenement = $this->f->get_submitted_get_value('ev');
7803 mbroquet 3730
7804     // Initialisation de la variable de retour
7805     $retour['complement_om_html'] = '';
7806     $retour['complement2_om_html'] = '';
7807     $retour['complement3_om_html'] = '';
7808     $retour['complement4_om_html'] = '';
7809 softime 14064
7810 mbroquet 3730 // Vérification d'une consultation liée à l'événement
7811 softime 14064 $instEvenement = $this->f->get_inst__om_dbform(array(
7812     "obj" => "evenement",
7813     "idx" => $evenement,
7814     ));
7815    
7816 mbroquet 3730 // Si consultation liée, récupération du retour d'avis
7817 softime 14064 if($instEvenement->getVal('consultation') == 'Oui'){
7818 softime 14542
7819     $qres = $this->f->get_all_results_from_db_query(
7820     sprintf(
7821     'SELECT
7822     date_retour,
7823     avis_consultation.libelle as avis_consultation,
7824     COALESCE(service.libelle, tiers_consulte.libelle) as service
7825     FROM
7826     %1$sconsultation
7827     LEFT JOIN %1$stiers_consulte
7828     ON consultation.tiers_consulte = tiers_consulte.tiers_consulte
7829     LEFT JOIN %1$sservice
7830     ON consultation.service = service.service
7831     LEFT JOIN %1$savis_consultation
7832     ON consultation.avis_consultation = avis_consultation.avis_consultation
7833     WHERE
7834     dossier = \'%2$s\'
7835     AND consultation.visible',
7836     DB_PREFIXE,
7837     $this->f->db->escapeSimple($idx)
7838     ),
7839     array(
7840     'origin' => __METHOD__
7841     )
7842 softime 11876 );
7843 mbroquet 3730 // Récupération des consultations
7844 softime 14542 foreach ($qres['result'] as $row) {
7845 mbroquet 3730 $correct=false;
7846     // date retour
7847     if ($row['date_retour']<>""){
7848     if ($formatDate=="AAAA-MM-JJ"){
7849     $date = explode("-", $row['date_retour']);
7850     // controle de date
7851 softime 18876 if (count($date) == 3 &&
7852 mbroquet 3730 checkdate($date[1], $date[2], $date[0])) {
7853     $date_retour_f= $date[2]."/".$date[1]."/".$date[0];
7854     $correct=true;
7855     }else{
7856     $msg= $msg."<br>La date ".$row['date_retour']." n'est pas une date.";
7857     $correct=false;
7858     }
7859     }
7860     }
7861 softime 19307 //
7862 mbroquet 3730 $temp="Vu l'avis ".$row['avis_consultation']." du service ".$row['service'];
7863     if($correct == true){
7864     $temp=$temp." du ".$date_retour_f;
7865     }
7866 softime 19307 // Concaténation des retours d'avis de consultation
7867 softime 7067 $retour['complement_om_html'] .= $temp . "<br/><br/>";
7868 mbroquet 3730 } // while
7869 softime 19307
7870 mbroquet 3730 } // consultation
7871     // Récupération des bibles automatiques pour le champ complement_om_html
7872 softime 8989 $retour['complement_om_html'] .= $this->getBible($evenement, $idx, '1');
7873 mbroquet 3730 // Récupération des bibles automatiques pour le champ complement2_om_html
7874 softime 8989 $retour['complement2_om_html'] .= $this->getBible($evenement, $idx, '2');
7875 mbroquet 3730 // Récupération des bibles automatiques pour le champ complement3_om_html
7876 softime 8989 $retour['complement3_om_html'] .= $this->getBible($evenement, $idx, '3');
7877 mbroquet 3730 // Récupération des bibles automatiques pour le champ complement4_om_html
7878 softime 8989 $retour['complement4_om_html'] .= $this->getBible($evenement, $idx, '4');
7879 mbroquet 3730
7880    
7881    
7882     echo json_encode($retour);
7883     }
7884    
7885     /**
7886 softime 7521 * VIEW - view_pdf_temp
7887     *
7888     * @return void
7889     */
7890     function view_pdf_temp() {
7891     $this->checkAccessibility();
7892 softime 8593 // Utilisation de $_POST pour ne pas que les textes soient altérés.
7893 softime 7521 $this->f->set_submitted_value();
7894 softime 8593 $merge_fields = array();
7895     //
7896     if (array_key_exists('c1', $_POST) === true) {
7897 softime 11876 $merge_fields['[complement_instruction]'] = $_POST['c1'];
7898     $merge_fields['[complement1_instruction]'] = $_POST['c1'];
7899 softime 8593 }
7900     if (array_key_exists('c2', $_POST) === true) {
7901 softime 11876 $merge_fields['[complement2_instruction]'] = $_POST['c2'];
7902 softime 8593 }
7903     if (array_key_exists('c3', $_POST) === true) {
7904 softime 11876 $merge_fields['[complement3_instruction]'] = $_POST['c3'];
7905 softime 8593 }
7906     if (array_key_exists('c4', $_POST) === true) {
7907 softime 11876 $merge_fields['[complement4_instruction]'] = $_POST['c4'];
7908 softime 8593 }
7909 softime 7521 $params = array(
7910     "watermark" => true,
7911     "specific" => array(
7912     "merge_fields" => $merge_fields,
7913     ),
7914     );
7915 softime 8593 //
7916     if (array_key_exists('corps', $_POST) === true) {
7917     $params["specific"]["corps"] = array(
7918     "mode" => "set",
7919 softime 11876 "value" => $_POST['corps'],
7920 softime 8593 );
7921     }
7922     if (array_key_exists('titre', $_POST) === true) {
7923     $params["specific"]["titre"] = array(
7924     "mode" => "set",
7925 softime 11876 "value" => $_POST['titre'],
7926 softime 8593 );
7927     }
7928 softime 7521 $dossier_instruction_om_collectivite = $this->get_dossier_instruction_om_collectivite();
7929     $collectivite = $this->f->getCollectivite($dossier_instruction_om_collectivite);
7930     $result = $this->compute_pdf_output('lettretype', $this->getVal('lettretype'), $collectivite, null, $params);
7931     $retour = array(
7932     'base' => base64_encode($result['pdf_output']),
7933     );
7934     echo json_encode($retour);
7935     }
7936    
7937     /**
7938     * Dans le contexte de prévisualisation des éditions, génère le rendu du
7939     * PDF sans prise en compte de la valeur des compléments et le retourne en
7940     * base 64.
7941     *
7942     * @return string Rendu PDF converti en base 64.
7943     */
7944     function init_pdf_temp() {
7945     $params = array(
7946     "watermark" => true,
7947     );
7948 softime 8593 // Si la rédaction libre est activée sur l'instruction
7949     if ($this->getVal("flag_edition_integrale") == 't') {
7950     $params["specific"]["corps"] = array(
7951     "mode" => "set",
7952     "value" => $this->getVal("corps_om_htmletatex"),
7953     );
7954     $params["specific"]["titre"] = array(
7955     "mode" => "set",
7956     "value" => $this->getVal("titre_om_htmletat"),
7957     );
7958     }
7959 softime 7521 $dossier_instruction_om_collectivite = $this->get_dossier_instruction_om_collectivite();
7960     $collectivite = $this->f->getCollectivite($dossier_instruction_om_collectivite);
7961     $result = $this->compute_pdf_output('lettretype', $this->getVal('lettretype'), $collectivite, null, $params);
7962    
7963     return base64_encode($result['pdf_output']);
7964     }
7965    
7966     /**
7967 mbroquet 3730 * Récupération des éléments de bible.
7968     *
7969     * @param integer $event id de l'événement
7970     * @param string $idx id du dossier
7971     * @param integer $compnb numéro du champ complement
7972 softime 17036 * @param string $type types possibles : automatique ou precharge
7973 mbroquet 3730 *
7974     * @return string Chaîne de texte à insérer dans le champ complement
7975     */
7976 softime 17036 function getBible($event, $idx, $compnb, $type = 'automatique') {
7977 mbroquet 3730 // Récupération de la collectivité du dossier
7978 softime 7996 $dossier = $this->f->get_inst__om_dbform(array(
7979     "obj" => "dossier",
7980     "idx" => $idx,
7981     ));
7982 softime 19307 // Récupération du code du type de DA
7983 softime 5169 $code_da_type = '';
7984 softime 19307 if (preg_match('/[A-Za-z]{2,3}/', $idx, $matches) !== false) {
7985     $code_da_type = $matches[0];
7986 softime 5169 }
7987 mbroquet 3730
7988 softime 17036 // Prépare le filtre de la requête selon le type de remplissage voulu
7989     $sql_filter_type = '';
7990     if ($type === 'automatique') {
7991     $sql_filter_type = "AND automatique = 'Oui'";
7992     } elseif ($type === 'precharge') {
7993     $sql_filter_type = "AND precharge IS TRUE";
7994     }
7995    
7996 softime 14542 $qres = $this->f->get_all_results_from_db_query(
7997     sprintf(
7998     'SELECT
7999     *
8000     FROM
8001     %1$sbible
8002 softime 19307 LEFT OUTER JOIN %1$sdossier_autorisation_type
8003 softime 14542 ON bible.dossier_autorisation_type =
8004     dossier_autorisation_type.dossier_autorisation_type
8005     LEFT JOIN %1$som_collectivite
8006     ON bible.om_collectivite = om_collectivite.om_collectivite
8007     WHERE
8008     (evenement = %2$d
8009     OR evenement IS NULL)
8010     AND (complement = %3$d
8011     OR complement IS NULL)
8012     AND (dossier_autorisation_type.code = \'%4$s\'
8013     OR bible.dossier_autorisation_type IS NULL)
8014     AND (om_collectivite.niveau = \'2\'
8015 softime 17036 OR bible.om_collectivite = %5$d)
8016     %6$s',
8017 softime 14542 DB_PREFIXE,
8018     intval($event),
8019     intval($compnb),
8020     $this->f->db->escapeSimple($code_da_type),
8021 softime 17036 intval($dossier->getVal("om_collectivite")),
8022     $sql_filter_type
8023 softime 14542 ),
8024     array(
8025     "origin" => __METHOD__
8026     )
8027     );
8028 mbroquet 3730 $temp = "";
8029 softime 14542 foreach ($qres['result'] as $row) {
8030 mbroquet 3730 // Remplacement des retours à la ligne par des br
8031     $temp .= preg_replace(
8032     '#(\\\r|\\\r\\\n|\\\n)#', '<br/>', $row['contenu']
8033     );
8034 softime 7521 // Ajout d'un saut de ligne entre chaque bible.
8035     $temp .= '<br/>';
8036 mbroquet 3730 } // fin while
8037     return $temp;
8038     }
8039    
8040     /**
8041     * VIEW - view_suivi_bordereaux.
8042     *
8043 nmeucci 4317 * Formulaire de choix du bordereau de suivi, permettant de générer les 4 bordereaux.
8044     * Si l'utilisateur est d'une collectivité de niveau 2 il a le choix de la
8045     * collectivité des dossiers affichés.
8046 mbroquet 3730 *
8047     * @return void
8048     */
8049     function view_suivi_bordereaux() {
8050     // Vérification de l'accessibilité sur l'élément
8051     $this->checkAccessibility();
8052    
8053     /**
8054     * Validation du formulaire
8055     */
8056     // Si le formulaire a été validé
8057 softime 8989 if ($this->f->get_submitted_post_value("validation") !== null) {
8058 mbroquet 3730 // Si un bordereau à été sélectionné
8059 softime 8989 if ($this->f->get_submitted_post_value("bordereau") !== null && $this->f->get_submitted_post_value("bordereau") == "" ) {
8060 mbroquet 3730 // Si aucun bordereau n'a été sélectionné
8061     $message_class = "error";
8062 softime 18876 $message = __("Veuillez selectionner un bordereau.");
8063 mbroquet 3730 }
8064 softime 19307 // Sinon si les dates ne sont pas valide
8065 softime 8989 elseif (($this->f->get_submitted_post_value("date_bordereau_debut") !== null
8066     && $this->f->get_submitted_post_value("date_bordereau_debut") == "")
8067 softime 19307 || ($this->f->get_submitted_post_value("date_bordereau_fin") !== null
8068 softime 8989 && $this->f->get_submitted_post_value("date_bordereau_fin") == "")) {
8069 mbroquet 3730 // Si aucune date n'a été saisie
8070     $message_class = "error";
8071 softime 18876 $message = __("Veuillez saisir une date valide.");
8072 softime 19307 }
8073 softime 7366 // Sinon si les dates ne sont pas valides
8074 softime 8989 elseif ($this->f->get_submitted_post_value("bordereau") === "bordereau_avis_maire_prefet"
8075     && $this->f->getParameter("id_evenement_bordereau_avis_maire_prefet") == null) {
8076 softime 7366 // Si aucune date n'a été saisie
8077     $message_class = "error";
8078 softime 18876 $message = __("Erreur de parametrage. Contactez votre administrateur.");
8079 softime 7366 }
8080 mbroquet 3730 // Affiche le message de validation
8081     else {
8082     // On récupère le libellé du bordereau pour l'afficher à l'utilisateur
8083 softime 14064 $etat = $this->f->get_inst__om_dbform(array(
8084     "obj" => "om_etat",
8085     "idx" => $this->f->get_submitted_post_value("bordereau")
8086     ));
8087     $qres = $this->f->get_one_result_from_db_query(
8088     sprintf(
8089     'SELECT
8090     om_etat.libelle
8091     FROM
8092     %som_etat
8093     WHERE
8094     om_etat.id = \'%s\'',
8095     DB_PREFIXE,
8096     $this->f->db->escapeSimple($this->f->get_submitted_post_value("bordereau"))
8097 softime 19307 ),
8098 softime 14064 array(
8099     "origin" => __METHOD__,
8100     )
8101     );
8102 softime 19307
8103 mbroquet 3730 //
8104     $message_class = "valid";
8105 softime 18876 $message = __("Cliquez sur le lien ci-dessous pour telecharger votre bordereau");
8106 mbroquet 3730 $message .= " : <br/><br/>";
8107     $message .= "<a class='om-prev-icon pdf-16'";
8108 softime 18876 $message .= " title=\"".__("Bordereau")."\"";
8109 softime 7996 $message .= "href='".OM_ROUTE_FORM."&obj=instruction";
8110 nmeucci 4317 $message .= "&action=220";
8111     $message .= "&idx=0";
8112 softime 8989 $message .= "&type_bordereau=".$this->f->get_submitted_post_value("bordereau");
8113     $message .= "&date_bordereau_debut=".$this->f->get_submitted_post_value("date_bordereau_debut");
8114     $message .= "&date_bordereau_fin=".$this->f->get_submitted_post_value("date_bordereau_fin");
8115 mbroquet 3730 // Si l'utilisateur est MULTI alors on ajoute le paramètre collectivite
8116 softime 8989 if ($this->f->get_submitted_post_value("om_collectivite") !== null) {
8117     $message .= "&collectivite=".$this->f->get_submitted_post_value("om_collectivite");
8118 mbroquet 3730 }
8119     $message .= "'"." target='_blank'>";
8120 softime 18876 $message .= $qres['result']." ".__("du")." ".$this->f->get_submitted_post_value("date_bordereau_debut")
8121     ." ".__("au")." ".$this->f->get_submitted_post_value("date_bordereau_fin");
8122 mbroquet 3730 $message .= "</a>";
8123     }
8124     }
8125    
8126     /**
8127     * Affichage des messages et du formulaire
8128     */
8129     // Affichage du message de validation ou d'erreur
8130     if (isset($message) && isset($message_class) && $message != "") {
8131 softime 8989 $this->f->displayMessage($message_class, $message);
8132 mbroquet 3730 }
8133     // Ouverture du formulaire
8134     printf("\t<form");
8135     printf(" method=\"post\"");
8136     printf(" id=\"suivi_bordereaux_form\"");
8137     printf(" action=\"\"");
8138     printf(">\n");
8139     // Paramétrage des champs du formulaire
8140     $champs = array("date_bordereau_debut", "date_bordereau_fin", "bordereau");
8141 softime 8989 // Si l'utilisateur est d'une collectivité de niveau 2 on affiche un select
8142 mbroquet 3730 // collectivité dans le formulaire
8143 softime 8989 if ($_SESSION["niveau"] == 2) {
8144 mbroquet 3730 array_push($champs, "om_collectivite");
8145     }
8146     // Création d'un nouvel objet de type formulaire
8147 softime 7996 $form = $this->f->get_inst__om_formulaire(array(
8148     "validation" => 0,
8149     "maj" => 0,
8150     "champs" => $champs,
8151     ));
8152 mbroquet 3730 // Paramétrage du champ date_bordereau_debut
8153 softime 18876 $form->setLib("date_bordereau_debut", __("date_bordereau_debut"));
8154 mbroquet 3730 $form->setType("date_bordereau_debut", "date");
8155     $form->setTaille("date_bordereau_debut", 12);
8156     $form->setMax("date_bordereau_debut", 12);
8157     $form->setRequired("date_bordereau_debut");
8158     $form->setOnchange("date_bordereau_debut", "fdate(this)");
8159     $form->setVal("date_bordereau_debut", date("d/m/Y"));
8160     // Paramétrage du champ date_bordereau_fin
8161 softime 18876 $form->setLib("date_bordereau_fin", __("date_bordereau_fin"));
8162 mbroquet 3730 $form->setType("date_bordereau_fin", "date");
8163     $form->setTaille("date_bordereau_fin", 12);
8164     $form->setMax("date_bordereau_fin", 12);
8165     $form->setRequired("date_bordereau_fin");
8166     $form->setOnchange("date_bordereau_fin", "fdate(this)");
8167     $form->setVal("date_bordereau_fin", date("d/m/Y"));
8168     // Paramétrage du champ bordereau
8169 softime 18876 $form->setLib("bordereau", __("bordereau"));
8170 mbroquet 3730 $form->setType("bordereau", "select");
8171     $form->setRequired("bordereau");
8172     // Valeurs des champs
8173 softime 8989 if ($this->f->get_submitted_post_value("validation") !== null) {
8174     $form->setVal("date_bordereau_debut", $this->f->get_submitted_post_value("date_bordereau_debut"));
8175     $form->setVal("date_bordereau_fin", $this->f->get_submitted_post_value("date_bordereau_fin"));
8176     $form->setVal("bordereau", $this->f->get_submitted_post_value("bordereau"));
8177     $form->setVal("om_collectivite", $this->f->get_submitted_post_value("om_collectivite"));
8178 mbroquet 3730 }
8179     // Données du select - On récupère ici la liste de tous les états disponibles
8180     // dans la table om_etat qui ont un id qui commence par la cahine de caractères
8181     // 'bordereau_'
8182 softime 14542 $qres = $this->f->get_all_results_from_db_query(
8183     sprintf(
8184     'SELECT
8185     om_etat.id,
8186     om_etat.libelle
8187     FROM
8188     %1$som_etat
8189     WHERE
8190     om_etat.id LIKE \'bordereau_%%\'
8191     ORDER BY
8192     om_etat.id',
8193     DB_PREFIXE
8194     ),
8195     array(
8196     "origin" => __METHOD__
8197     )
8198     );
8199 mbroquet 3730 // Données du select
8200     $contenu = array(
8201     0 => array("", ),
8202 softime 18876 1 => array(__("choisir bordereau")),
8203 mbroquet 3730 );
8204 softime 14542 foreach ($qres['result'] as $row) {
8205 mbroquet 3730 $contenu[0][] = $row['id'];
8206     $contenu[1][] = $row['libelle'];
8207     }
8208     $form->setSelect("bordereau", $contenu);
8209 softime 8989 //
8210     if ($_SESSION["niveau"] == 2) {
8211 softime 18876 $form->setLib("om_collectivite", __("collectivite"));
8212 softime 8989 $form->setType("om_collectivite", "select");
8213 mbroquet 3730
8214 softime 8989 // Données du select - On récupère ici la liste de tous toutes les collectivités
8215     // de niveau 1
8216 softime 14542 $qres = $this->f->get_all_results_from_db_query(
8217     sprintf(
8218     'SELECT
8219     om_collectivite,
8220     libelle
8221     FROM
8222     %1$som_collectivite
8223     WHERE
8224     niveau = \'1\'
8225     ORDER BY
8226     libelle',
8227     DB_PREFIXE
8228     ),
8229     array(
8230     "origin" => __METHOD__
8231     )
8232     );
8233 softime 8989 // La valeur par défaut du select est Toutes
8234     $list_collectivites = array(
8235     0 => array("", ),
8236 softime 18876 1 => array(__("toutes"))
8237 softime 8989 );
8238 mbroquet 3730
8239 softime 8989 $id_colls = "";
8240     // On stocke dans $id_colls l'id de toutes les collectivités de niveau 1 séparées
8241     // par des virgules, pour un traitement plus facile dans la requête de sous-état
8242 softime 14542 foreach ($qres['result'] as $row) {
8243 softime 8989 if ($id_colls != "") {
8244     $id_colls .= ",";
8245     }
8246     $id_colls .= $row['om_collectivite'];
8247     $list_collectivites[0][] = $row['om_collectivite'];
8248     $list_collectivites[1][] = $row['libelle'];
8249 mbroquet 3730 }
8250 softime 8989 // On affecte la liste d'identifiants à l'option Toutes
8251     $list_collectivites[0][0] = $id_colls ;
8252     $form->setSelect("om_collectivite", $list_collectivites);
8253 mbroquet 3730 }
8254     // Affichage du formulaire
8255     $form->entete();
8256     $form->afficher($champs, 0, false, false);
8257     $form->enpied();
8258     // Affichage du bouton
8259     printf("\t<div class=\"formControls\">\n");
8260 softime 18876 $this->f->layout->display_form_button(array("value" => __("Valider"), "name" => "validation"));
8261 mbroquet 3730 printf("\t</div>\n");
8262     // Fermeture du formulaire
8263     printf("\t</form>\n");
8264     }
8265    
8266 nmeucci 4317
8267 softime 19307 /**
8268 nmeucci 4317 * VIEW - view_generate_suivi_bordereaux.
8269 softime 19307 *
8270 nmeucci 4317 * Génère et affiche les bordereaux de suivi.
8271 softime 19307 *
8272     * @return [void]
8273     */
8274 nmeucci 4317 function view_generate_suivi_bordereaux() {
8275     // Vérification de l'accessibilité sur l'élément
8276     $this->checkAccessibility();
8277     // Récupération du type de bordereau
8278     $bordereau = $this->f->get_submitted_get_value('type_bordereau');
8279     // Génération du PDF
8280     $result = $this->compute_pdf_output('etat', $bordereau, null, $this->getVal($this->clePrimaire));
8281     // Affichage du PDF
8282     $this->expose_pdf_output(
8283     $result['pdf_output'],
8284     $result['filename']
8285     );
8286     }
8287    
8288    
8289 mbroquet 3730 /**
8290     * VIEW - view_suivi_envoi_lettre_rar.
8291     *
8292 softime 8989 * Vue pour imprimer les AR.
8293 mbroquet 3730 *
8294     * @return void
8295     */
8296     function view_suivi_envoi_lettre_rar() {
8297     // Vérification de l'accessibilité sur l'élément
8298     $this->checkAccessibility();
8299    
8300     //
8301 softime 8989 if ($this->f->get_submitted_post_value("date") !== null) {
8302     $date = $this->f->get_submitted_post_value("date");
8303 mbroquet 3730 } else {
8304     $date = "";
8305     }
8306     //
8307 softime 8989 if ($this->f->get_submitted_post_value("liste_code_barres_instruction") !== null) {
8308     $liste_code_barres_instruction = $this->f->get_submitted_post_value("liste_code_barres_instruction");
8309 mbroquet 3730 } else {
8310     $liste_code_barres_instruction = "";
8311     }
8312    
8313     // Compteur du nombre de page générées
8314     $nbLettres = 0;
8315     // Liste d'id des instructions
8316     $id4Gen = array();
8317     //
8318     $error = "";
8319    
8320 softime 5504 // Initialisation du tableau qui va contenir les DI pour lister les liens
8321     $dossierTab = array();
8322     // On vérifie que l'utilisateur ait les droits pour afficher des consultations
8323     $isAccredited = $this->f->isAccredited(array("dossier_instruction","dossier_instruction_consulter"), "OR");
8324     $hasHidden = true;
8325     // S'il ne peut pas les consulter il aura des dossiers caché
8326     if ($isAccredited === true) {
8327     $hasHidden = false;
8328     }
8329    
8330 mbroquet 3730 /**
8331     * Validation du formulaire
8332     */
8333     // Si le formulaire a été validé
8334 softime 8989 if ($this->f->get_submitted_post_value('validation') !== null) {
8335 mbroquet 3730 //
8336     if (empty($date) || empty($liste_code_barres_instruction)) {
8337     //
8338     $message_class = "error";
8339 softime 18876 $message = __("Tous les champs doivent etre remplis.");
8340 mbroquet 3730 } else {
8341     // Création d'un tableau d'instruction
8342 softime 8989 $liste = explode("\r\n", $this->f->get_submitted_post_value("liste_code_barres_instruction"));
8343 mbroquet 3730 //
8344     foreach ($liste as $code_barres) {
8345     // On enlève les éventuels espaces saisis
8346     $code_barres = trim($code_barres);
8347     // Vérification de l'existence de l'instruction
8348     if ($code_barres != "") {
8349     // Si la valeur transmise est numérique
8350     if (is_numeric($code_barres)) {
8351 softime 19307 //
8352 softime 6565 $sql = "SELECT count(*)
8353     FROM ".DB_PREFIXE."instruction
8354     INNER JOIN ".DB_PREFIXE."dossier
8355     ON dossier.dossier=instruction.dossier
8356     INNER JOIN ".DB_PREFIXE."dossier_instruction_type
8357     ON dossier.dossier_instruction_type = dossier_instruction_type.dossier_instruction_type
8358     INNER JOIN ".DB_PREFIXE."dossier_autorisation_type_detaille
8359     ON dossier_instruction_type.dossier_autorisation_type_detaille = dossier_autorisation_type_detaille.dossier_autorisation_type_detaille
8360     INNER JOIN ".DB_PREFIXE."dossier_autorisation_type
8361     ON dossier_autorisation_type_detaille.dossier_autorisation_type = dossier_autorisation_type.dossier_autorisation_type
8362     INNER JOIN ".DB_PREFIXE."groupe
8363     ON dossier_autorisation_type.groupe = groupe.groupe
8364     WHERE code_barres='".$this->f->db->escapesimple($code_barres)."'";
8365 softime 19307
8366 softime 7067 // Ajout d'un filtre sur les groupes auxquels l'utilisateur a accès
8367     $group_clause = array();
8368     foreach ($_SESSION["groupe"] as $key => $value) {
8369     $group_clause[$key] = "(groupe.code = '".$key."'";
8370     if($value["confidentiel"] !== true) {
8371     $group_clause[$key] .= " AND dossier_autorisation_type.confidentiel IS NOT TRUE";
8372     }
8373     $group_clause[$key] .= ")";
8374     }
8375     $conditions = implode(" OR ", $group_clause);
8376     $sql .= " AND (" . $conditions . ")";
8377    
8378 softime 14064 $qres = $this->f->get_one_result_from_db_query(
8379 softime 19307 $sql,
8380 softime 14064 array(
8381     "origin" => __METHOD__,
8382     )
8383     );
8384    
8385     if ($qres['result'] == "1") {
8386 mbroquet 3730 // Récupération de la date d'envoi de l'instruction bippé
8387 softime 14542 $qres = $this->f->get_all_results_from_db_query(
8388     sprintf(
8389     'SELECT
8390     to_char(date_envoi_rar, \'DD/MM/YYYY\') as date_envoi_rar,
8391     instruction
8392     FROM
8393     %1$sinstruction
8394     WHERE
8395     code_barres = \'%2$s\'',
8396     DB_PREFIXE,
8397     $this->f->db->escapeSimple($code_barres)
8398     ),
8399     array(
8400     'origin' => __METHOD__
8401     )
8402     );
8403     $row = array_shift($qres['result']);
8404 softime 19307 // Si pas de date ou correspond à la date du formulaire on
8405 mbroquet 3730 // effectue le traitement
8406     if ($row["date_envoi_rar"] == "" || $row["date_envoi_rar"] == $date) {
8407 softime 7996 $instr = $this->f->get_inst__om_dbform(array(
8408     "obj" => "instruction",
8409     "idx" => $row['instruction'],
8410     ));
8411 mbroquet 3730 $valF = array();
8412     foreach($instr->champs as $id => $champ) {
8413     $valF[$champ] = $instr->val[$id];
8414     }
8415 softime 5504
8416     # Si on peut consulter les dossiers et que le dossier n'existe pas déjà dans la liste
8417     if ($isAccredited === true
8418     && array_key_exists($instr->getVal("dossier"), $dossierTab) === false) {
8419 softime 7996 $dossier = $this->f->get_inst__om_dbform(array(
8420     "obj" => "dossier",
8421     "idx" => $instr->getVal("dossier"),
8422     ));
8423 softime 5504 if ($dossier->is_user_from_allowed_collectivite()){
8424     $dossierTab[$instr->getVal("dossier")] = $dossier;
8425     } else {
8426     $hasHidden = true;
8427     }
8428     }
8429    
8430 mbroquet 3730 $valF['date_evenement']=
8431     $instr->dateDBToForm($valF['date_evenement']);
8432     $valF['archive_date_complet']=
8433     $instr->dateDBToForm($valF['archive_date_complet']);
8434     $valF['archive_date_rejet']=
8435     $instr->dateDBToForm($valF['archive_date_rejet']);
8436     $valF['archive_date_limite']=
8437     $instr->dateDBToForm($valF['archive_date_limite']);
8438     $valF['archive_date_notification_delai']=
8439     $instr->dateDBToForm($valF['archive_date_notification_delai']);
8440     $valF['archive_date_decision']=
8441     $instr->dateDBToForm($valF['archive_date_decision']);
8442     $valF['archive_date_validite']=
8443     $instr->dateDBToForm($valF['archive_date_validite']);
8444     $valF['archive_date_achevement']=
8445     $instr->dateDBToForm($valF['archive_date_achevement']);
8446     $valF['archive_date_chantier']=
8447     $instr->dateDBToForm($valF['archive_date_chantier']);
8448     $valF['archive_date_conformite']=
8449     $instr->dateDBToForm($valF['archive_date_conformite']);
8450     $valF['archive_date_dernier_depot']=
8451     $instr->dateDBToForm($valF['archive_date_dernier_depot']);
8452     $valF['archive_date_limite_incompletude']=
8453     $instr->dateDBToForm($valF['archive_date_limite_incompletude']);
8454     $valF['date_finalisation_courrier']=
8455     $instr->dateDBToForm($valF['date_finalisation_courrier']);
8456     $valF['date_envoi_signature']=
8457     $instr->dateDBToForm($valF['date_envoi_signature']);
8458     $valF['date_retour_signature']=
8459     $instr->dateDBToForm($valF['date_retour_signature']);
8460     $valF['date_envoi_rar']=
8461     $instr->dateDBToForm($valF['date_envoi_rar']);
8462     $valF['date_retour_rar']=
8463     $instr->dateDBToForm($valF['date_retour_rar']);
8464     $valF['date_envoi_controle_legalite']=
8465     $instr->dateDBToForm($valF['date_envoi_controle_legalite']);
8466     $valF['date_retour_controle_legalite']=
8467     $instr->dateDBToForm($valF['date_retour_controle_legalite']);
8468     $valF['date_envoi_rar'] = $date;
8469    
8470     // Vérification de la finalisation du document
8471     // correspondant au code barres
8472     if($instr->getVal("om_final_instruction") === 't') {
8473     $instr->setParameter('maj', 1);
8474 softime 19307 $instr->class_actions[1]["identifier"] =
8475 nmeucci 3971 "envoi lettre RAR (depuis le menu suivi des pièces)";
8476 softime 8989 if ($instr->modifier($valF) == true) {
8477 mbroquet 3730 $id4Gen[] = $code_barres;
8478     $nbLettres ++;
8479     } else {
8480     //
8481     if ($error != "") {
8482     $error .= "<br/>";
8483     }
8484 softime 18876 $error .= sprintf(__("Une erreur s'est produite lors de la modification de l'instruction %s."),
8485 mbroquet 3730 $code_barres);
8486     $error .= " ";
8487 softime 18876 $error .= __("Veuillez contacter votre administrateur.");
8488 mbroquet 3730 }
8489     } else {
8490     //
8491     if ($error != "") {
8492     $error .= "<br/>";
8493     }
8494 softime 19307 $error .= sprintf(__("Le document correspondant au
8495     code barres %s n'est pas finalise,
8496 mbroquet 3730 le bordereau ne sera pas genere."),
8497     $code_barres);
8498     }
8499 softime 19307
8500 mbroquet 3730 } else {
8501     //
8502     if ($error != "") {
8503     $error .= "<br/>";
8504     }
8505 softime 18876 $error .= __("Une lettre correspondante a l'instruction ayant pour code barres")." ".$code_barres." ".__("a deja ete envoyee, le bordereau ne sera pas genere.");
8506 mbroquet 3730 }
8507     } else {
8508     //
8509     if ($error != "") {
8510     $error .= "<br/>";
8511     }
8512 softime 18876 $error .= __("Le numero")." ".$code_barres." ".__("ne correspond a aucun code barres d'instruction.");
8513 mbroquet 3730 }
8514     } else {
8515     //
8516     if ($error != "") {
8517     $error .= "<br/>";
8518     }
8519 softime 18876 $error .= __("Le code barres d'instruction")." ".$code_barres." ".__("n'est pas valide.");
8520 mbroquet 3730 }
8521     }
8522     }
8523     }
8524     }
8525    
8526     /**
8527     * Affichage des messages et du formulaire
8528     */
8529     // Affichage du message de validation ou d'erreur
8530     if (isset($message) && isset($message_class) && $message != "") {
8531 softime 8989 $this->f->displayMessage($message_class, $message);
8532 mbroquet 3730 }
8533     // Affichage du message d'erreur
8534     if(!empty($error)) {
8535 softime 8989 $this->f->displayMessage("error", $error);
8536 mbroquet 3730 }
8537     // Affichage du message de validation de la saisie
8538     if ($nbLettres > 0) {
8539     //
8540 softime 5504 echo "\n<div class=\"message ui-widget ui-corner-all ui-state-highlight ui-state-valid\" >";
8541     echo "\n<p>";
8542     echo "\n<span class=\"ui-icon ui-icon-info\"></span>";
8543     echo "\n<span class=\"text\">";
8544 softime 18876 echo __("Cliquez sur le lien ci-dessous pour telecharger votre document");
8545 softime 5504 echo " : \n<br/><br/>";
8546     echo "\n<a class='om-prev-icon pdf-16'";
8547 softime 18876 echo "\n title=\"".__("imprimer les AR")."\"";
8548 softime 7996 echo "\n href=\"".OM_ROUTE_FORM."&obj=instruction&action=180&idx=0&liste=".implode(",",$id4Gen)."\"";
8549 softime 5504 echo "\n target='_blank'>";
8550 softime 18876 echo __("Telecharger le document pour")." ".$nbLettres." ".__("AR");
8551 softime 5504 echo "\n</a>";
8552     echo "\n</span>";
8553     echo "\n</p>";
8554     echo "\n<br/>\n";
8555     if ($isAccredited === true) {
8556     echo '<fieldset id="fieldset-form-rar-lien_di" class="cadre ui-corner-all startClosed" style="background-color: inherite;">';
8557     echo "\n<legend class=\"ui-corner-all ui-widget-content ui-state-active\" style=\"background-color: transparent; color: inherit;\">\n";
8558 softime 18876 echo __('Dossiers concernés par ce traitement');
8559 softime 5504 echo "\n</legend>";
8560     echo "\n<div class=\"fieldsetContent\" style=\"display: none;background-color: inherite\">";
8561 softime 19307
8562 softime 5504 if ($hasHidden === true) {
8563     echo "\n<br/>";
8564     echo "\n<p>";
8565     echo "\n<span class='text'>";
8566 softime 18876 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.");
8567 softime 5504 echo "</span>";
8568     echo "\n</p>";
8569     echo "\n<br/>";
8570     }
8571     foreach ($dossierTab as $dossier) {
8572 softime 19307
8573 softime 7067 $inst_da = $this->get_inst_common("dossier_autorisation", $dossier->getVal('dossier_autorisation'));
8574     $inst_datd = $this->get_inst_common("dossier_autorisation_type_detaille", $inst_da->getVal('dossier_autorisation_type_detaille'));
8575     $code_datd = $inst_datd->getVal('code');
8576    
8577     $obj = "dossier_instruction";
8578 softime 18876 if ($code_datd === 'REC' || $code_datd === 'REG') {
8579 softime 7067 $obj = "dossier_contentieux_tous_recours";
8580     }
8581     if ($code_datd === 'IN') {
8582     $obj = "dossier_contentieux_toutes_infractions";
8583     }
8584    
8585 softime 5504 echo "\n<div class=\"bloc group\">";
8586     echo "\n<div class=\"field field-type-text\">";
8587    
8588     echo "\n<p>";
8589     echo "\n<span class='text'>";
8590 softime 18876 echo "\n<a class=\"om-icon om-icon-16 consult-16\" title=\"" . __('Consulter') . "\"";
8591 softime 7996 echo "\n href=\"".OM_ROUTE_FORM."&obj=dossier_instruction&action=3&idx=";
8592 softime 5504 echo $dossier->getVal("dossier");
8593     echo "\">";
8594     echo "\n</a>";
8595    
8596 softime 18876 echo "\n<a title=\"".__("Consulter")."\" style=\"vertical-align:middle;\"";
8597 softime 7996 echo " href=\"".OM_ROUTE_FORM."&obj=";
8598 softime 7067 echo $obj;
8599     echo "&action=3&idx=";
8600 softime 5504 echo $dossier->getVal("dossier");
8601     echo "\">";
8602     echo $dossier->getVal("dossier_libelle");
8603     echo "\n</a>";
8604     echo "\n</span>";
8605     echo "\n</p>";
8606    
8607     echo "\n</div>";
8608     echo "\n</div>";
8609     }
8610     echo "\n</div>";
8611     echo "\n</fieldset>";
8612     }
8613     echo "\n</div>";
8614     echo "\n</div>";
8615 mbroquet 3730 }
8616     // Ouverture du formulaire
8617     echo "\t<form";
8618     echo " method=\"post\"";
8619     echo " id=\"suivi_envoi_lettre_rar_form\"";
8620     echo " action=\"\"";
8621     echo ">\n";
8622     // Paramétrage des champs du formulaire
8623     $champs = array("date", "liste_code_barres_instruction");
8624     // Création d'un nouvel objet de type formulaire
8625 softime 7996 $form = $this->f->get_inst__om_formulaire(array(
8626     "validation" => 0,
8627     "maj" => 0,
8628     "champs" => $champs,
8629     ));
8630 mbroquet 3730 // Paramétrage du champ date du formulaire
8631 softime 18876 $form->setLib("date", __("Date")."* :");
8632 mbroquet 3730 $form->setType("date", "date");
8633     $form->setOnchange("date", "fdate(this)");
8634     $form->setVal("date", ($date == "" ? date("d/m/Y") : $date));
8635     $form->setTaille("date", 10);
8636     $form->setMax("date", 10);
8637     // Paramétrage du champ liste_code_barres_instruction du formulaire
8638 softime 18876 $form->setLib("liste_code_barres_instruction", __("Liste des codes barres d'instructions scannes")."* :");
8639 mbroquet 3730 $form->setType("liste_code_barres_instruction", "textarea");
8640     $form->setVal("liste_code_barres_instruction", $liste_code_barres_instruction);
8641     $form->setTaille("liste_code_barres_instruction", 20);
8642     $form->setMax("liste_code_barres_instruction", 20);
8643     // Affichage du formulaire
8644     $form->entete();
8645     $form->afficher($champs, 0, false, false);
8646     $form->enpied();
8647     // Affichage du bouton
8648     echo "\t<div class=\"formControls\">\n";
8649 softime 18876 $this->f->layout->display_form_button(array("value" => __("Valider"), "name" => "validation"));
8650 mbroquet 3730 echo "\t</div>\n";
8651     // Fermeture du formulaire
8652     echo "\t</form>\n";
8653     }
8654    
8655     /**
8656     * VIEW - view_suivi_mise_a_jour_des_dates.
8657     *
8658     * Vu pour mettre à jour les dates de suivi de l'instruction.
8659     *
8660     * @return void
8661     */
8662     function view_suivi_mise_a_jour_des_dates() {
8663     // Vérification de l'accessibilité sur l'élément
8664     $this->checkAccessibility();
8665    
8666     // Récupération des valeur passées en POST ou GET
8667 softime 8989 if($this->f->get_submitted_post_value("type_mise_a_jour") !== null) {
8668     $type_mise_a_jour = $this->f->get_submitted_post_value("type_mise_a_jour");
8669     } elseif($this->f->get_submitted_get_value('type_mise_a_jour') !== null) {
8670     $type_mise_a_jour = $this->f->get_submitted_get_value('type_mise_a_jour');
8671 mbroquet 3730 } else {
8672     $type_mise_a_jour = "";
8673     }
8674 softime 8989 if($this->f->get_submitted_post_value('date') !== null) {
8675     $date = $this->f->get_submitted_post_value('date');
8676     } elseif($this->f->get_submitted_get_value('date') !== null) {
8677     $date = $this->f->get_submitted_get_value('date');
8678 mbroquet 3730 } else {
8679     $date = "";
8680     }
8681 softime 8989 if($this->f->get_submitted_post_value('code_barres') !== null) {
8682     $code_barres = $this->f->get_submitted_post_value('code_barres');
8683     } elseif($this->f->get_submitted_get_value('code_barres') !== null) {
8684     $code_barres = $this->f->get_submitted_get_value('code_barres');
8685 mbroquet 3730 } else {
8686     $code_barres = "";
8687     }
8688     // Booléen permettant de définir si un enregistrement à eu lieu
8689     $correct = false;
8690     // Booléen permettant de définir si les dates peuvent êtres enregistrées
8691     $date_error = false;
8692     // Champs date à mettre à jour
8693     $liste_champs=array();
8694    
8695     // Si le formulaire a été validé
8696 softime 8989 if ($this->f->get_submitted_post_value('validation') !== null) {
8697 softime 18876 if(!empty($type_mise_a_jour) && !empty($date) && !empty($code_barres)) {
8698 mbroquet 3730
8699 softime 7067 // Ajout d'un filtre sur les groupes auxquels l'utilisateur a accès
8700     $group_clause = array();
8701     foreach ($_SESSION["groupe"] as $key => $value) {
8702     $group_clause[$key] = "(groupe.code = '".$key."'";
8703     if($value["confidentiel"] !== true) {
8704     $group_clause[$key] .= " AND dossier_autorisation_type.confidentiel IS NOT TRUE";
8705     }
8706     $group_clause[$key] .= ")";
8707     }
8708     $conditions = implode(" OR ", $group_clause);
8709 softime 14542 $groupFilter = " AND (" . $conditions . ")";
8710 softime 7067
8711 softime 14542 $qres = $this->f->get_all_results_from_db_query(
8712     sprintf(
8713     'SELECT
8714     instruction
8715     FROM
8716     %1$sinstruction
8717     INNER JOIN %1$sdossier
8718     ON dossier.dossier = instruction.dossier
8719     INNER JOIN %1$sdossier_instruction_type
8720     ON dossier.dossier_instruction_type = dossier_instruction_type.dossier_instruction_type
8721     INNER JOIN %1$sdossier_autorisation_type_detaille
8722     ON dossier_instruction_type.dossier_autorisation_type_detaille = dossier_autorisation_type_detaille.dossier_autorisation_type_detaille
8723     INNER JOIN %1$sdossier_autorisation_type
8724     ON dossier_autorisation_type_detaille.dossier_autorisation_type = dossier_autorisation_type.dossier_autorisation_type
8725     INNER JOIN %1$sgroupe
8726     ON dossier_autorisation_type.groupe = groupe.groupe
8727     WHERE
8728     code_barres = \'%2$s\'
8729     %3$s',
8730     DB_PREFIXE,
8731     $this->f->db->escapeSimple($code_barres),
8732     $groupFilter
8733     ),
8734     array(
8735     'origin' => __METHOD__
8736     )
8737     );
8738 softime 15835 if($qres['row_count'] === 1) {
8739 mbroquet 3730 $liste_champs = explode(";", $type_mise_a_jour);
8740 softime 14542 $row = array_shift($qres['result']);
8741 softime 11418 $instr = $this->f->get_inst__om_dbform(array(
8742     "obj" => "instruction",
8743     "idx" => $row['instruction'],
8744     ));
8745 mbroquet 3730 // Mise à jour des dates après l'écran de verification
8746 softime 18876 if($this->f->get_submitted_post_value('is_valid') !== null && $this->f->get_submitted_post_value('is_valid') == "true") {
8747 mbroquet 3730 $valF = array();
8748     foreach($instr->champs as $id => $champ) {
8749     $valF[$champ] = $instr->val[$id];
8750     }
8751 softime 6565 $valF['date_evenement'] = $instr->dateDBToForm($valF['date_evenement']);
8752     $valF['archive_date_complet'] = $instr->dateDBToForm($valF['archive_date_complet']);
8753     $valF['archive_date_rejet'] = $instr->dateDBToForm($valF['archive_date_rejet']);
8754     $valF['archive_date_limite'] = $instr->dateDBToForm($valF['archive_date_limite']);
8755     $valF['archive_date_notification_delai'] = $instr->dateDBToForm($valF['archive_date_notification_delai']);
8756     $valF['archive_date_decision'] = $instr->dateDBToForm($valF['archive_date_decision']);
8757     $valF['archive_date_validite'] = $instr->dateDBToForm($valF['archive_date_validite']);
8758     $valF['archive_date_achevement'] = $instr->dateDBToForm($valF['archive_date_achevement']);
8759     $valF['archive_date_chantier'] = $instr->dateDBToForm($valF['archive_date_chantier']);
8760     $valF['archive_date_conformite'] = $instr->dateDBToForm($valF['archive_date_conformite']);
8761     $valF['archive_date_dernier_depot'] = $instr->dateDBToForm($valF['archive_date_dernier_depot']);
8762     $valF['archive_date_limite_incompletude'] = $instr->dateDBToForm($valF['archive_date_limite_incompletude']);
8763     $valF['date_finalisation_courrier'] = $instr->dateDBToForm($valF['date_finalisation_courrier']);
8764     $valF['date_envoi_signature'] = $instr->dateDBToForm($valF['date_envoi_signature']);
8765     $valF['date_retour_signature'] = $instr->dateDBToForm($valF['date_retour_signature']);
8766     $valF['date_envoi_rar'] = $instr->dateDBToForm($valF['date_envoi_rar']);
8767     $valF['date_retour_rar'] = $instr->dateDBToForm($valF['date_retour_rar']);
8768     $valF['date_envoi_controle_legalite'] = $instr->dateDBToForm($valF['date_envoi_controle_legalite']);
8769     $valF['date_retour_controle_legalite'] = $instr->dateDBToForm($valF['date_retour_controle_legalite']);
8770     $valF['archive_date_cloture_instruction'] = $instr->dateDBToForm($valF['archive_date_cloture_instruction']);
8771     $valF['archive_date_premiere_visite'] = $instr->dateDBToForm($valF['archive_date_premiere_visite']);
8772     $valF['archive_date_derniere_visite'] = $instr->dateDBToForm($valF['archive_date_derniere_visite']);
8773     $valF['archive_date_contradictoire'] = $instr->dateDBToForm($valF['archive_date_contradictoire']);
8774     $valF['archive_date_retour_contradictoire'] = $instr->dateDBToForm($valF['archive_date_retour_contradictoire']);
8775     $valF['archive_date_ait'] = $instr->dateDBToForm($valF['archive_date_ait']);
8776     $valF['archive_date_transmission_parquet'] = $instr->dateDBToForm($valF['archive_date_transmission_parquet']);
8777 mbroquet 3730
8778     foreach(explode(";", $type_mise_a_jour) as $maj_date) {
8779     $valF[$maj_date]=$date;
8780     }
8781    
8782     // Vérification de la finalisation du document
8783     // correspondant au code barres
8784 softime 18876 if($valF["om_final_instruction"] === 't' ||
8785 mbroquet 3730 $valF["lettretype"] == '') {
8786     $code_barres = "";
8787 softime 19307
8788 mbroquet 3730 //Désactivation de l'autocommit
8789 softime 8989 $this->f->db->autoCommit(false);
8790 softime 19307
8791 mbroquet 3730 //On modifie les valeurs de l'instruction
8792     $instr->setParameter('maj', 170);
8793 softime 19307 $instr->class_actions[170]["identifier"] =
8794 nmeucci 3972 "mise à jour des dates (depuis le menu suivi des pièces)";
8795 softime 8989 $retour = $instr->modifier($valF);
8796 softime 19307
8797     //Si une erreur s'est produite, on défait les modifications
8798 mbroquet 3730 //qui ont été faites
8799     if (!$retour){
8800     $instr->undoValidation();
8801     }
8802     //Sinon, on valide en base de données les modifications
8803     else {
8804 softime 8989 $this->f->db->commit();
8805 mbroquet 3730 }
8806 softime 19307
8807 mbroquet 3730 // Variable correct retourné depuis la classe instruction
8808     $correct = $instr->correct;
8809 softime 19307
8810 mbroquet 3730 // Si la modification sur l'instruction a échoué
8811     if ($correct === false) {
8812 softime 19307
8813 mbroquet 3730 // Message d'erreur de la classe instruction
8814     $error = $instr->msg;
8815     }
8816 softime 19307
8817 mbroquet 3730 } else {
8818     // Indique que le traitement est en erreur
8819     $correct = false;
8820     // Message d'erreur
8821 softime 18876 $error = sprintf(__("Le document n'est pas finalise."),
8822 mbroquet 3730 "<span class='bold'>".$code_barres."</span>");
8823     }
8824     } else {
8825     // Récupération des infos du dossier
8826 softime 14542 $qres = $this->f->get_all_results_from_db_query(
8827     sprintf(
8828     'SELECT
8829     dossier.dossier_libelle,
8830     evenement.libelle as evenement,
8831     autorite_competente.code as autorite_competente_code,
8832     autorite_competente.libelle as autorite_competente,
8833     evenement.type as evenement_type,
8834     to_char(date_envoi_signature,\'DD/MM/YYYY\') as date_envoi_signature,
8835     to_char(date_retour_signature,\'DD/MM/YYYY\') as date_retour_signature,
8836     to_char(date_envoi_controle_legalite,\'DD/MM/YYYY\') as date_envoi_controle_legalite,
8837     to_char(date_retour_controle_legalite,\'DD/MM/YYYY\') as date_retour_controle_legalite,
8838     to_char(date_envoi_rar,\'DD/MM/YYYY\') as date_envoi_rar,
8839     to_char(date_retour_rar,\'DD/MM/YYYY\') as date_retour_rar
8840     FROM
8841     %1$sinstruction
8842     INNER JOIN %1$sdossier
8843     ON dossier.dossier=instruction.dossier
8844     LEFT JOIN %1$sautorite_competente
8845     ON dossier.autorite_competente=autorite_competente.autorite_competente
8846     INNER JOIN %1$sevenement
8847     ON instruction.evenement=evenement.evenement
8848     WHERE
8849     code_barres = \'%2$s\'',
8850     DB_PREFIXE,
8851     $this->f->db->escapeSimple($code_barres)
8852     ),
8853     array(
8854     "origin" => __METHOD__
8855     )
8856     );
8857     $infos = array_shift($qres['result']);
8858 mbroquet 3730
8859     // Vérification de la non modification des dates de suivi
8860     foreach(explode(";", $type_mise_a_jour) as $champ) {
8861 softime 11418 if ($champ === 'date_envoi_controle_legalite') {
8862     if ($instr->is_sent_to_cl() === true) {
8863     $error = __("Les dates de suivis ne peuvent etre modifiees");
8864     $date_error = true;
8865     break;
8866     }
8867     }
8868 softime 18876 if($infos[$champ] != "" && $infos[$champ] != $date) {
8869     $error = __("Les dates de suivis ne peuvent etre modifiees");
8870 mbroquet 3730 $date_error = true;
8871 softime 11418 break;
8872 mbroquet 3730 }
8873     }
8874     }
8875     } else {
8876 softime 18876 $error = __("Le numero saisi ne correspond a aucun code barres d'instruction.");
8877 mbroquet 3730 }
8878    
8879     } else {
8880 softime 18876 $error = __("Tous les champs doivent etre remplis.");
8881 mbroquet 3730 }
8882     }
8883    
8884     /**
8885     * Affichage des messages et du formulaire
8886     */
8887     // Affichage du message de validation ou d'erreur
8888     if (isset($message) && isset($message_class) && $message != "") {
8889 softime 8989 $this->f->displayMessage($message_class, $message);
8890 mbroquet 3730 }
8891     // Affichage du message d'erreur
8892     if(!empty($error)) {
8893 softime 8989 $this->f->displayMessage("error", $error);
8894 mbroquet 3730 }
8895    
8896     // Affichage du message de validation de la saisie
8897     if($correct === true) {
8898 softime 18876 $this->f->displayMessage("ok", __("Saisie enregistree"));
8899 mbroquet 3730 }
8900     // Ouverture du formulaire
8901     echo "\t<form";
8902     echo " method=\"post\"";
8903     echo " id=\"suivi_mise_a_jour_des_dates_form\"";
8904     echo " action=\"\"";
8905     echo ">\n";
8906     // Paramétrage des champs du formulaire
8907     if(isset($infos)) {
8908     $champs = array("type_mise_a_jour", "date", "code_barres", "dossier_libelle", "evenement"
8909     , "autorite_competente", "date_envoi_signature",
8910     "date_retour_signature", "date_envoi_controle_legalite",
8911     "date_retour_controle_legalite", "date_envoi_rar",
8912     "date_retour_rar", "is_valid");
8913     } else {
8914     $champs = array("type_mise_a_jour", "date", "code_barres");
8915     }
8916     // Création d'un nouvel objet de type formulaire
8917 softime 7996 $form = $this->f->get_inst__om_formulaire(array(
8918     "validation" => 0,
8919     "maj" => 0,
8920     "champs" => $champs,
8921     ));
8922 mbroquet 3730 // Paramétrage des champs du formulaire
8923     // Parametrage du champ type_mise_a_jour
8924 softime 18876 $form->setLib("type_mise_a_jour", __("Date a mettre a jour")."* :");
8925 mbroquet 3730 if(isset($infos)) {
8926     $form->setType("type_mise_a_jour", "selecthiddenstatic");
8927    
8928     } else {
8929     $form->setType("type_mise_a_jour", "select");
8930    
8931     }
8932     $form->setVal("type_mise_a_jour", $type_mise_a_jour);
8933     $contenu = array();
8934    
8935     $contenu[0][0] = "date_envoi_signature";
8936 softime 18876 $contenu[1][0] = __("date d'envoi pour signature Mairie/Prefet");
8937 mbroquet 3730
8938     $contenu[0][1] = "date_retour_signature";
8939 softime 18876 $contenu[1][1] = __("date de retour de signature Mairie/Prefet");
8940 mbroquet 3730
8941     $contenu[0][2] = "date_retour_signature;date_envoi_controle_legalite";
8942 softime 18876 $contenu[1][2] = __("date de retour de signature + Envoi controle legalite");
8943 mbroquet 3730
8944     $contenu[0][3] = "date_envoi_controle_legalite";
8945 softime 18876 $contenu[1][3] = __("date d'envoi au controle de legalite");
8946 mbroquet 3730
8947     $contenu[0][4] = "date_retour_controle_legalite";
8948 softime 18876 $contenu[1][4] = __("date de retour de controle de legalite");
8949 mbroquet 3730
8950     $contenu[0][5] = "date_retour_rar";
8951 softime 8989 $contenu[1][5] = __("date de notification du correspondant");
8952 mbroquet 3730
8953     $form->setSelect("type_mise_a_jour", $contenu);
8954    
8955     // Parametrage du champ date
8956 softime 18876 $form->setLib("date", __("Date")."* :");
8957 mbroquet 3730 if(isset($infos)) {
8958     $form->setType("date", "hiddenstaticdate");
8959    
8960     } else {
8961     $form->setType("date", "date");
8962     }
8963     $form->setVal("date", $date);
8964     $form->setTaille("date", 10);
8965     $form->setMax("date", 10);
8966    
8967     // Parametrage du champ code_barres
8968 softime 18876 $form->setLib("code_barres", __("Code barres d'instruction")."* :");
8969 mbroquet 3730 if(isset($infos)) {
8970     $form->setType("code_barres", "hiddenstatic");
8971     } else {
8972     $form->setType("code_barres", "text");
8973     }
8974     $form->setVal("code_barres", $code_barres);
8975     $form->setTaille("code_barres", 20);
8976     $form->setMax("code_barres", 20);
8977    
8978     // Ajout des infos du dossier correspondantes à l'instruction séléctionnée
8979     if(isset($infos)) {
8980    
8981     // Tous les champs sont défini par defaut à static
8982     foreach ($infos as $key => $value) {
8983     $form->setType($key, "static");
8984     if(in_array($key, $liste_champs)) {
8985     $form->setVal($key, $date);
8986     } else {
8987     $form->setVal($key, $value);
8988     }
8989     }
8990    
8991     // Les champs dont on viens de définir la valeur sont en gras
8992     foreach ($liste_champs as $value) {
8993     $form->setBloc($value,'DF',"",'bold');
8994     }
8995    
8996     // Parametrage du champ dossier
8997 softime 18876 $form->setLib("dossier_libelle", __("dossier_libelle")." :");
8998 mbroquet 3730 $form->setType("dossier_libelle", "static");
8999     $form->setVal("dossier_libelle", $infos['dossier_libelle']);
9000    
9001     // Parametrage du champ evenement
9002 softime 18876 $form->setLib("evenement", __("evenement")." :");
9003 mbroquet 3730 $form->setType("evenement", "static");
9004     $form->setVal("evenement", $infos['evenement']);
9005    
9006     // Parametrage du champ autorite_competente
9007 softime 18876 $form->setLib("autorite_competente", __("Autorite competente")." :");
9008 mbroquet 3730 $form->setType("autorite_competente", "static");
9009     $form->setVal("autorite_competente", $infos['autorite_competente']);
9010    
9011 softime 8989 // Parametrage des libellés d'envoi avec AR
9012     $form->setLib("date_envoi_rar", __("date_envoi_ar")." :");
9013     $form->setLib("date_retour_rar", __("date_notification")." :");
9014 mbroquet 3730
9015 softime 18876 $form->setLib("date_envoi_signature", __("date_envoi_signature")." :");
9016     $form->setLib("date_retour_signature", __("date_retour_signature")." :");
9017     $form->setLib("date_envoi_controle_legalite", __("date_envoi_controle_legalite")." :");
9018     $form->setLib("date_retour_controle_legalite", __("date_retour_controle_legalite")." :");
9019 mbroquet 3730 // Configuration des libellé en fonction de l'autorité compétente
9020     if($infos['autorite_competente_code'] == 'ETAT') {
9021     $form->setType("date_envoi_controle_legalite", "hiddendate");
9022     $form->setType("date_retour_controle_legalite", "hiddendate");
9023     }
9024    
9025     // Ajout d'un champ hidden permettant de savoir que le formulaire précédant est celui de vérification
9026 softime 18876 $form->setLib("is_valid", __("Valide")." :");
9027 mbroquet 3730 $form->setType("is_valid", "hidden");
9028     $form->setVal("is_valid", 'true');
9029    
9030     $form->setFieldset('dossier_libelle','D',_('Synthese'));
9031     $form->setFieldset('is_valid','F');
9032 softime 19307
9033 mbroquet 3730 }
9034    
9035    
9036     // Création du fieldset regroupant les champs permettant la mise à jour des date
9037     $form->setFieldset('type_mise_a_jour','D',_('Mise a jour'));
9038     $form->setFieldset('code_barres','F');
9039     // Affichage du formulaire
9040     $form->entete();
9041     $form->afficher($champs, 0, false, false);
9042     $form->enpied();
9043     // Affichage du bouton
9044     echo "\t<div class=\"formControls\">\n";
9045     //
9046     if(!$date_error) {
9047 softime 18876 $this->f->layout->display_form_button(array("value" => __("Valider"), "name" => "validation"));
9048 mbroquet 3730 }
9049     // Si pas sur l'écran de validation
9050     if(isset($infos)) {
9051 softime 7996 echo "<a class=\"retour\" href=\"".OM_ROUTE_FORM."&obj=instruction_suivi_mise_a_jour_des_dates&action=170&idx=0";
9052 mbroquet 3730 echo "&amp;type_mise_a_jour=".$type_mise_a_jour."&amp;date=".$date."&amp;code_barres=".$code_barres;
9053     echo "\">Retour</a>";
9054     }
9055     echo "\t</div>\n";
9056     // Fermeture du formulaire
9057     echo "\t</form>\n";
9058     }
9059    
9060     /**
9061     * [view_pdf_lettre_rar description]
9062     *
9063     * @return [type] [description]
9064     */
9065     function view_pdf_lettre_rar() {
9066     // Vérification de l'accessibilité sur l'élément
9067     $this->checkAccessibility();
9068 softime 8989 //
9069     $this->f->disableLog();
9070 mbroquet 3730
9071 softime 8989 if($this->f->get_submitted_get_value('liste') != null) {
9072     $listeCodeBarres = explode(',',$this->f->get_submitted_get_value('liste'));
9073 mbroquet 3730
9074     // Classe permettant la mise en page de l'édition pdf
9075     require_once "../obj/pdf_lettre_rar.class.php";
9076     $pdf_lettre_rar = new pdf_lettre_rar('P', 'mm', 'A4');
9077     // Initialisation de la mise en page
9078 softime 8989 $pdf_lettre_rar->init($this->f);
9079 mbroquet 3730
9080     foreach ($listeCodeBarres as $code_barres) {
9081    
9082 softime 7067 // On récupère le dossier
9083 softime 14064 $qres = $this->f->get_one_result_from_db_query(
9084     sprintf(
9085     'SELECT
9086     dossier
9087 softime 19307 FROM
9088 softime 14064 %1$sinstruction
9089 softime 19307 WHERE
9090 softime 14064 code_barres = \'%2$s\'',
9091     DB_PREFIXE,
9092     $this->f->db->escapeSimple($code_barres)
9093 softime 19307 ),
9094 softime 14064 array(
9095     "origin" => __METHOD__,
9096     )
9097     );
9098 softime 19307
9099 softime 7996 $inst_dossier = $this->f->get_inst__om_dbform(array(
9100     "obj" => "dossier",
9101 softime 14064 "idx" => $qres['result'],
9102 softime 7996 ));
9103 softime 7067
9104     // En fonction du type de dossier, on récupère un demandeur différent dans les requêtes
9105     $groupe = $inst_dossier->get_type_affichage_formulaire();
9106     switch ($groupe) {
9107     case 'CTX IN':
9108     $sql_demandeur = "(lien_dossier_demandeur.petitionnaire_principal IS TRUE AND demandeur.type_demandeur='plaignant')";
9109     break;
9110     case 'CTX RE':
9111     $sql_demandeur = "(lien_dossier_demandeur.petitionnaire_principal IS TRUE AND demandeur.type_demandeur='requerant')";
9112     break;
9113     case 'ADS':
9114     case 'DPC':
9115 softime 10573 case 'CONSULTATION ENTRANTE':
9116 softime 7067 default:
9117     $sql_demandeur = "((lien_dossier_demandeur.petitionnaire_principal IS TRUE AND demandeur.type_demandeur='petitionnaire') OR demandeur.type_demandeur='delegataire')";
9118     break;
9119     }
9120    
9121 mbroquet 3730 // Test si l'evenement est de type arrete et si un délégataire a été nommé
9122 softime 14542 $qres = $this->f->get_all_results_from_db_query(
9123     sprintf(
9124 softime 19307 'SELECT
9125 mbroquet 3730 dossier.dossier_libelle,
9126     evenement.type,
9127 softime 3834 count(lien_dossier_demandeur) as nbdemandeur,
9128     CASE
9129     WHEN division.libelle IS NOT NULL AND phase.code IS NOT NULL
9130 softime 14542 THEN CONCAT(phase.code, \' - \', division.libelle)
9131 softime 3834 ELSE
9132     phase.code
9133     END AS code_phase
9134 softime 14542 FROM
9135     %1$sinstruction
9136     LEFT JOIN %1$sdossier
9137     ON instruction.dossier = dossier.dossier
9138     LEFT JOIN %1$sdivision
9139     ON dossier.division = division.division
9140     INNER JOIN %1$sevenement
9141     ON instruction.evenement=evenement.evenement
9142     LEFT JOIN %1$sphase
9143     ON evenement.phase = phase.phase
9144     inner JOIN %1$slien_dossier_demandeur
9145     ON instruction.dossier=lien_dossier_demandeur.dossier
9146     inner join %1$sdemandeur
9147     ON demandeur.demandeur=lien_dossier_demandeur.demandeur
9148     WHERE
9149     code_barres = \'%2$s\'
9150     AND %3$s
9151     GROUP BY
9152     dossier.dossier_libelle,
9153     evenement.type,
9154     phase.code,
9155     division.libelle',
9156     DB_PREFIXE,
9157     $this->f->db->escapeSimple($code_barres),
9158     $sql_demandeur
9159     ),
9160     array(
9161     "origin" => __METHOD__
9162     )
9163     );
9164     $testDemandeur = array_shift($qres['result']);
9165 mbroquet 3730
9166 softime 19307
9167 mbroquet 3730 // Recuperation de l'adresse de destination
9168     // Envoi pour delegataire ou petitionnaire principal selon le type d'evenement
9169 softime 14542 $sqlAdresse = " AND demandeur.type_demandeur='petitionnaire' AND lien_dossier_demandeur.petitionnaire_principal IS TRUE";
9170 softime 18876 if($testDemandeur['type'] != 'arrete' && $testDemandeur['nbdemandeur'] > 1) {
9171 softime 14542 $sqlAdresse = " AND demandeur.type_demandeur='delegataire'";
9172 mbroquet 3730 }
9173    
9174 softime 14542 $qres = $this->f->get_all_results_from_db_query(
9175     sprintf(
9176 softime 19307 'SELECT
9177 softime 14542 CASE WHEN demandeur.qualite = \'particulier\'
9178     THEN TRIM(CONCAT_WS(\' \', pc.libelle, demandeur.particulier_nom, demandeur.particulier_prenom))
9179     ELSE TRIM(demandeur.personne_morale_denomination)
9180     END as ligne1,
9181     CASE WHEN demandeur.qualite = \'personne_morale\'
9182     THEN TRIM(demandeur.personne_morale_raison_sociale)
9183     ELSE \'\'
9184     END as ligne1_1,
9185     CASE WHEN demandeur.qualite = \'personne_morale\' AND (demandeur.personne_morale_nom IS NOT NULL OR demandeur.personne_morale_prenom IS NOT NULL)
9186     THEN TRIM(CONCAT_WS(\' \', \'rep. par\', demandeur.personne_morale_nom, demandeur.personne_morale_prenom))
9187     ELSE \'\'
9188     END as ligne1_2,
9189     trim(concat(demandeur.numero,\' \',demandeur.voie)) as ligne2,
9190     CASE demandeur.complement
9191     WHEN null THEN \'\'
9192     ELSE trim(demandeur.complement)
9193     END as ligne3,
9194     CASE demandeur.lieu_dit
9195     WHEN null THEN \'\'
9196     ELSE trim(demandeur.lieu_dit)
9197     END as ligne4,
9198 softime 19307 CONCAT_WS(\' \', demandeur.code_postal, demandeur.localite,
9199     (CASE WHEN demandeur.bp IS NOT NULL
9200 softime 14542 THEN CONCAT_WS(\' \', \'BP\', demandeur.bp)
9201     ELSE \'\'
9202 softime 19307 END),
9203     (CASE WHEN demandeur.cedex IS NOT NULL
9204 softime 14542 THEN CONCAT_WS(\' \', \'CEDEX\', demandeur.cedex)
9205     ELSE \'\'
9206     END))
9207     as ligne5,
9208     code_barres as code_barres
9209     FROM
9210     %1$sinstruction
9211     INNER JOIN %1$sdossier
9212     ON dossier.dossier = instruction.dossier
9213     INNER JOIN %1$slien_dossier_demandeur
9214     ON dossier.dossier = lien_dossier_demandeur.dossier
9215     INNER JOIN %1$sdemandeur
9216     ON lien_dossier_demandeur.demandeur = demandeur.demandeur
9217     LEFT OUTER JOIN %1$scivilite AS pc
9218     ON demandeur.particulier_civilite = pc.civilite
9219     OR demandeur.personne_morale_civilite = pc.civilite
9220     WHERE
9221     instruction.code_barres = \'%2$s\'
9222     %3$s',
9223     DB_PREFIXE,
9224     $this->f->db->escapeSimple($code_barres),
9225     $sqlAdresse
9226     ),
9227     array(
9228     "origin" => __METHOD__
9229     )
9230     );
9231     $adresse_dest = array_shift($qres['result']);
9232 mbroquet 3730
9233     // Création adresse destinataire sans ligne vide
9234     $adresse_destinataire = array();
9235     if (!empty($adresse_dest['ligne1'])) {
9236     $adresse_destinataire[] = $adresse_dest['ligne1'];
9237     }
9238     if (!empty($adresse_dest['ligne1_1'])) {
9239     $adresse_destinataire[] = $adresse_dest['ligne1_1'];
9240     }
9241     if (!empty($adresse_dest['ligne1_2'])) {
9242     $adresse_destinataire[] = $adresse_dest['ligne1_2'];
9243     }
9244     $adresse_destinataire[] = $adresse_dest['ligne2'];
9245     if (!empty($adresse_dest['ligne3'])) {
9246     $adresse_destinataire[] = $adresse_dest['ligne3'];
9247     }
9248     if (!empty($adresse_dest['ligne4'])) {
9249     $adresse_destinataire[] = $adresse_dest['ligne4'];
9250 softime 19307 }
9251 mbroquet 3730 $adresse_destinataire[] = $adresse_dest['ligne5'];
9252    
9253     // Création du champ specifique
9254     $specifique_content = array();
9255     $specifique_content[] = $adresse_dest['ligne1'];
9256     $specifique_content[] = $adresse_dest['ligne1_1'];
9257     $specifique_content[] = $adresse_dest['ligne1_2'];
9258     $specifique_content[] = $testDemandeur['dossier_libelle'];
9259     $specifique_content[] = "|||||".$adresse_dest['code_barres']."|||||";
9260     unset($adresse_dest['code_barres']);
9261     // Ajout d'une page aux pdf
9262 softime 3834 $pdf_lettre_rar->addLetter($adresse_destinataire, $specifique_content, $testDemandeur['code_phase']);
9263 mbroquet 3730
9264     }
9265     $pdf_output = $pdf_lettre_rar->output("lettre_rar".date("dmYHis").".pdf","S");
9266 softime 7685 $om_edition = $this->f->get_inst__om_edition();
9267 softime 17542 $om_edition->set_object_linked($this);
9268 mbroquet 3730 $om_edition->expose_pdf_output($pdf_output, "lettre_rar".date("dmYHis").".pdf");
9269     }
9270     }
9271    
9272     /**
9273     * VIEW - view_bordereau_envoi_maire.
9274     *
9275     * Formulaire demandant :
9276     * - le code-barres de l'événement d'instruction
9277     * - la date d'envoi du courrier pour signature par le maire
9278 softime 19307 *
9279 mbroquet 3730 * Lors de la validation :
9280     * => met à jour cette date dans l'événement d'instruction
9281     * => crée un lien permettant de générer en PDF le bordereau
9282     *
9283     * @return void
9284     */
9285     function view_bordereau_envoi_maire() {
9286     // Vérification de l'accessibilité sur l'élément
9287     $this->checkAccessibility();
9288    
9289     // Récupération des valeur passées en POST ou GET
9290     $code_barres = "";
9291     if($this->f->get_submitted_post_value('code_barres') !== null) {
9292     $code_barres = $this->f->get_submitted_post_value('code_barres');
9293     } elseif($this->f->get_submitted_get_value('code_barres')!==null) {
9294     $code_barres = $this->f->get_submitted_get_value('code_barres');
9295     }
9296     $date = "";
9297     if($this->f->get_submitted_post_value('date') !== null) {
9298     $date = $this->f->get_submitted_post_value('date');
9299     } elseif($this->f->get_submitted_get_value('date') !== null) {
9300     $date = $this->f->get_submitted_get_value('date');
9301     }
9302     $validation = 0;
9303     if($this->f->get_submitted_post_value('validation') !== null) {
9304     $validation = $this->f->get_submitted_post_value('validation');
9305     } elseif($this->f->get_submitted_get_value('validation') !== null) {
9306     $validation = $this->f->get_submitted_get_value('validation');
9307     }
9308    
9309     // Si le formulaire a été validé
9310     if ($this->f->get_submitted_post_value('validation') !== null) {
9311     // Tous les champs doivent obligatoirement être remplis
9312     if (!empty($date) && !empty($code_barres)) {
9313     $date_en = $this->dateDB($date);
9314     // Si date valide
9315     if ($date_en != "") {
9316     $id_instruction = $this->get_instruction_by_barcode($code_barres);
9317     // Si un événement d'instruction a été trouvé pour ce code-barres
9318     if ($id_instruction !== null) {
9319     $ret = $this->update_date_envoi_signature($id_instruction, $date_en);
9320     // Si mise à jour réussie de la date d'envoi du courrier
9321 softime 19307 // pour signature par l'autorité compétente
9322 mbroquet 3730 if($ret === true) {
9323     // Message de validation avec lien PDF
9324     $message_class = "valid";
9325 softime 18876 $message = '&bullet; '.__("Veuillez cliquer sur le lien ci-dessous pour telecharger votre bordereau");
9326 mbroquet 3730 $message .= " : <br/><br/>";
9327     $message .= "<a class='om-prev-icon pdf-16'";
9328     $message .= " id=\"generer_bordereau_envoi_maire\"";
9329 softime 18876 $message .= " title=\"".__("Bordereau")."\"";
9330 softime 7996 $message .= " href='".OM_ROUTE_FORM."&obj=instruction";
9331 mbroquet 3730 $message .= "&action=200";
9332     $message .= "&idx=".$id_instruction."'";
9333     $message .= " target='_blank'>";
9334 softime 18876 $message .= __("Bordereau d'envoi au maire");
9335 mbroquet 3730 $message .= "</a><br/><br/>";
9336 softime 18876 $message .= '&bullet; '.__("Rappel des informations saisies")." :<br/><br/>";
9337     $message .= __("Code du courrier")." : ".$code_barres."<br/>";
9338     $message .= __("Date d'envoi du courrier pour signature par le maire")." : ".$date;
9339 softime 19307
9340 mbroquet 3730 } else {
9341     // Message d'erreur
9342     $message_class = "error";
9343 softime 18876 $message = sprintf(__("Erreur lors de la mise a jour de l'evenement d'instruction correspondant au code barres %s."),
9344 mbroquet 3730 $code_barres);
9345     }
9346     }
9347     else {
9348     $message_class = "error";
9349 softime 18876 $message = __("Le numero saisi ne correspond a aucun code-barres d'evenement d'instruction.");
9350 mbroquet 3730 }
9351     }
9352     else {
9353     $message_class = "error";
9354 softime 18876 $message = __("La date est invalide.");
9355 mbroquet 3730 }
9356     } else {
9357     $message_class = "error";
9358 softime 18876 $message = __("Tous les champs doivent etre remplis.");
9359 mbroquet 3730 }
9360     }
9361    
9362     /**
9363     * Affichage des messages et du formulaire
9364     */
9365    
9366     // Affichage du message de validation ou d'erreur
9367     if (isset($message) && isset($message_class) && $message != "") {
9368     $this->f->displayMessage($message_class, $message);
9369     }
9370    
9371     // Ouverture du formulaire
9372     $datasubmit = $this->getDataSubmit();
9373     echo "\n<!-- ########## START DBFORM ########## -->\n";
9374     echo "<form";
9375     echo " id=\"bordereau_envoi_maire\"";
9376     echo " method=\"post\"";
9377     echo " name=\"f1\"";
9378     echo " action=\"";
9379     echo $datasubmit;
9380     echo "\"";
9381     echo ">\n";
9382    
9383     // Paramétrage des champs du formulaire
9384     $champs = array("code_barres","date");
9385    
9386     // Création d'un nouvel objet de type formulaire
9387 softime 7996 $form = $this->f->get_inst__om_formulaire(array(
9388     "validation" => 0,
9389     "maj" => 0,
9390     "champs" => $champs,
9391     ));
9392 mbroquet 3730
9393     $template_required_label = '%s *';
9394     // Parametrage du champ code_barres
9395     $form->setLib("code_barres", sprintf($template_required_label,_("Code du courrier")));
9396     $form->setType("code_barres", "text");
9397     $form->setVal("code_barres", $code_barres);
9398     $form->setTaille("code_barres", 20);
9399     $form->setMax("code_barres", 20);
9400     // Parametrage du champ date
9401     $form->setLib("date", sprintf($template_required_label,_("Date d'envoi du courrier pour signature par le maire")));
9402     $form->setType("date", "date") ;
9403     if (empty($date)) {
9404     $date = date('d/m/Y');
9405     }
9406     $form->setVal("date", $date);
9407     $form->setTaille("date", 10);
9408     $form->setMax("date", 10);
9409    
9410     // Création du bloc regroupant les champs
9411     $form->setBloc('code_barres','D');
9412     $form->setBloc('date','F');
9413     // Affichage du formulaire
9414     $form->entete();
9415     $form->afficher($champs, 0, false, false);
9416     $form->enpied();
9417     // Affichage du bouton
9418     printf("\t<div class=\"formControls\">\n");
9419     //
9420 softime 18876 $this->f->layout->display_form_button(array("value" => __("Valider"), "name" => "validation"));
9421 mbroquet 3730 printf("\t</div>\n");
9422     // Fermeture du formulaire
9423     printf("\t</form>\n");
9424     }
9425    
9426     /**
9427     * VIEW - view_bordereau_envoi_maire.
9428 softime 19307 *
9429 mbroquet 3730 * PDF de bordereau d'envoi au maire pour l'événement d'instruction instancié
9430 softime 19307 *
9431 mbroquet 3730 * @return [void]
9432     */
9433     function view_generate_bordereau_envoi_maire() {
9434     // Vérification de l'accessibilité sur l'élément
9435     $this->checkAccessibility();
9436     // Récupération de la collectivité du dossier d'instruction
9437     $collectivite_di = $this->get_dossier_instruction_om_collectivite();
9438     // Récupération de ses paramètres
9439     $collectivite = $this->f->getCollectivite($collectivite_di);
9440     // Génération du PDF
9441     $result = $this->compute_pdf_output('etat', 'communaute_bordereau_envoi_maire', $collectivite, $this->getVal(($this->clePrimaire)));
9442     // Affichage du PDF
9443     $this->expose_pdf_output(
9444 softime 19307 $result['pdf_output'],
9445 mbroquet 3730 $result['filename']
9446     );
9447     }
9448    
9449     /**
9450 softime 10808 * VIEW - view_rapport_instruction.
9451     *
9452     * Ouvre le sous-formulaire en ajaxIt dans un overlay.
9453     * Cette action est bindée pour utiliser la fonction popUpIt.
9454     *
9455     * @return void
9456     */
9457     function view_overlay_notification_manuelle() {
9458    
9459     // Vérification de l'accessibilité sur l'élément
9460     $this->checkAccessibility();
9461    
9462     printf(
9463     '<script type="text/javascript" >
9464     overlayIt(\'%1$s\',\'%2$s&objsf=%1$s&idxformulaire=%4$s&retourformulaire=dossier_instruction&obj=%1$s&action=411&idx=%3$s\', 1);
9465     </script>',
9466     'instruction_notification_manuelle',
9467     OM_ROUTE_SOUSFORM,
9468     $this->getVal($this->clePrimaire),
9469     $this->getVal('dossier')
9470     );
9471     }
9472    
9473     /**
9474 softime 11585 * VIEW - view_overlay_notification_service_consulte.
9475     *
9476     * Ouvre le sous-formulaire de notification des services consulte
9477     * en ajaxIt dans un overlay.
9478     * Cette action est bindée pour utiliser la fonction popUpIt.
9479     *
9480     * @return void
9481     */
9482     function view_overlay_notification_service_consulte() {
9483    
9484     // Vérification de l'accessibilité sur l'élément
9485     $this->checkAccessibility();
9486    
9487     printf(
9488     '<script type="text/javascript" >
9489     overlayIt(\'%1$s\',\'%2$s&objsf=%1$s&idxformulaire=%4$s&retourformulaire=dossier_instruction&obj=%1$s&action=420&idx=%3$s\', 1);
9490     </script>',
9491     'instruction_notification_manuelle',
9492     OM_ROUTE_SOUSFORM,
9493     $this->getVal($this->clePrimaire),
9494     $this->getVal('dossier')
9495     );
9496     }
9497 softime 19307
9498 softime 11585 /**
9499     * VIEW - overlay_notification_tiers_consulte.
9500     *
9501     * Ouvre le sous-formulaire de notification des tiers consulte
9502     * en ajaxIt dans un overlay.
9503     * Cette action est bindée pour utiliser la fonction popUpIt.
9504     *
9505     * @return void
9506     */
9507     function view_overlay_notification_tiers_consulte() {
9508    
9509     // Vérification de l'accessibilité sur l'élément
9510     $this->checkAccessibility();
9511    
9512     printf(
9513     '<script type="text/javascript" >
9514     overlayIt(\'%1$s\',\'%2$s&objsf=%1$s&idxformulaire=%4$s&retourformulaire=dossier_instruction&obj=%1$s&action=430&idx=%3$s\', 1);
9515     </script>',
9516     'instruction_notification_manuelle',
9517     OM_ROUTE_SOUSFORM,
9518     $this->getVal($this->clePrimaire),
9519     $this->getVal('dossier')
9520     );
9521     }
9522 softime 12847
9523 softime 11585 /**
9524 softime 12847 * VIEW - view_modale_selection_document_signe
9525     *
9526     * Ouvre le sous-formulaire de notification des services consulte
9527     * en ajaxIt dans un overlay.
9528     * Cette action est bindée pour utiliser la fonction popUpIt.
9529     *
9530     * @return void
9531     */
9532     function view_modale_selection_document_signe() {
9533    
9534     // Vérification de l'accessibilité sur l'élément
9535     $this->checkAccessibility();
9536    
9537     printf(
9538     '<script type="text/javascript" >
9539     overlayIt(\'%1$s\',\'%2$s&objsf=%1$s&idxformulaire=%4$s&retourformulaire=dossier_instruction&obj=%1$s&action=115&idx=%3$s\', 1);
9540     </script>',
9541     'instruction_modale',
9542     OM_ROUTE_SOUSFORM,
9543     $this->getVal($this->clePrimaire),
9544     $this->getVal('dossier')
9545     );
9546     }
9547 softime 19307
9548 softime 12847 /**
9549 softime 6565 * Retourne l'événement d'instruction dont on donne le code-barres, avec un filtre
9550     * pour exclure les dossiers du groupe contentieux.
9551 softime 19307 *
9552 mbroquet 3730 * @param [string] $barcode numéro du code-barres
9553     * @return [mixed] ID de son instruction ou null si aucun code
9554     */
9555     function get_instruction_by_barcode($barcode) {
9556     // Begin
9557     $this->begin_treatment(__METHOD__);
9558 softime 14064
9559 mbroquet 3730 // Vérification de l'existence de l'événement d'instruction
9560 softime 6565 // pour le code-barres donné, en excluant les dossiers liés au groupe CTX
9561 softime 14064 $qres = $this->f->get_one_result_from_db_query(
9562     sprintf(
9563     'SELECT
9564     instruction
9565 softime 19307 FROM
9566 softime 14064 %1$sinstruction
9567     INNER JOIN %1$sdossier
9568 softime 6565 ON dossier.dossier=instruction.dossier
9569 softime 14064 INNER JOIN %1$sdossier_instruction_type
9570 softime 6565 ON dossier.dossier_instruction_type = dossier_instruction_type.dossier_instruction_type
9571 softime 14064 INNER JOIN %1$sdossier_autorisation_type_detaille
9572 softime 6565 ON dossier_instruction_type.dossier_autorisation_type_detaille = dossier_autorisation_type_detaille.dossier_autorisation_type_detaille
9573 softime 14064 INNER JOIN %1$sdossier_autorisation_type
9574 softime 6565 ON dossier_autorisation_type_detaille.dossier_autorisation_type = dossier_autorisation_type.dossier_autorisation_type
9575 softime 14064 INNER JOIN %1$sgroupe
9576 softime 6565 ON dossier_autorisation_type.groupe = groupe.groupe
9577 softime 14064 AND groupe.code != \'CTX\'
9578 softime 19307 WHERE
9579 softime 14064 code_barres = \'%2$s\'',
9580     DB_PREFIXE,
9581     $this->f->db->escapeSimple($barcode)
9582 softime 19307 ),
9583 softime 14064 array(
9584     "origin" => __METHOD__,
9585     )
9586     );
9587 softime 19307
9588 mbroquet 3730 // Retourne résultat
9589 softime 14064 return $this->end_treatment(__METHOD__, $qres['result']);
9590 mbroquet 3730 }
9591    
9592     /**
9593     * Met à jour le champ date d'envoi signature
9594     * avec la date fournie et pour l'instruction donnée
9595 softime 19307 *
9596 mbroquet 3730 * @param [string] $id ID de l'événement d'instruction
9597     * @param [string] $date date au format EN
9598     * @return [boolean] true si mise à jour avec succès
9599     */
9600     function update_date_envoi_signature($id, $date) {
9601     // Préparation du tableau
9602     $valF = array();
9603     $valF['date_envoi_signature'] = $date;
9604     // Begin
9605     $this->begin_treatment(__METHOD__);
9606     // Requête
9607 softime 12847 $res = $this->f->db->autoexecute(
9608 mbroquet 3730 DB_PREFIXE.$this->table,
9609     $valF,
9610     DB_AUTOQUERY_UPDATE,
9611     $this->getCle($id)
9612     );
9613 softime 12847 $this->addToLog(
9614     __METHOD__."(): db->autoexecute(\"".DB_PREFIXE.'.'.$this->table."\", ".print_r($valF, true).", DB_AUTOQUERY_UPDATE, \"".$this->getCle($id)."\");",
9615     VERBOSE_MODE
9616     );
9617     if ($this->f->isDatabaseError($res, true) !== false) {
9618 mbroquet 3730 $this->end_treatment(__METHOD__, false);
9619     }
9620     //
9621     return $this->end_treatment(__METHOD__, true);
9622     }
9623    
9624     /**
9625     * Méthode permettant de définir des valeurs à envoyer en base après
9626     * validation du formulaire d'ajout.
9627     * @param array $val tableau des valeurs retournées par le formulaire
9628     */
9629 softime 6929 function setValFAjout($val = array()) {
9630 mbroquet 3730 // Mise à jour du flag created_by_commune lors d'un changement de décision
9631     // par un utilisateur de commune sur un dossier instruit par la comcom
9632 softime 6565 if ($this->isInstrCanChangeDecision($this->valF["dossier"])) {
9633 mbroquet 3730 $this->valF['created_by_commune'] = true;
9634     }
9635 softime 8593
9636     //
9637     if ($this->evenement_has_an_edition($this->valF['evenement']) === false) {
9638     if (isset($this->valF['flag_edition_integrale']) === true) {
9639     unset($this->valF['flag_edition_integrale']);
9640     }
9641     if (isset($this->valF['signataire_arrete']) === true) {
9642     unset($this->valF['signataire_arrete']);
9643     }
9644     }
9645 mbroquet 3730 }
9646 nmeucci 3876
9647 fmichon 3892
9648 fmichon 4708 /**
9649     * Récupère l'instance d'un événement de workflow.
9650     *
9651     * @param mixed $evenement Identifiant de l'événement.
9652     *
9653     * @return object
9654     */
9655     function get_inst_evenement($evenement = null) {
9656     //
9657     return $this->get_inst_common("evenement", $evenement);
9658     }
9659 softime 3976
9660 fmichon 3892 /**
9661 softime 3976 * Logue l'action de l'instruction dans son DI.
9662 nmeucci 3933 *
9663 softime 3976 * @param string $id Clé primaire de l'instruction.
9664     * @param array $val Valeurs de l'instruction.
9665     *
9666     * @return bool Vrai si traitement effectué avec succès
9667 nmeucci 3876 */
9668 softime 3976 private function add_log_to_dossier($id, array $val) {
9669 nmeucci 3933 $maj = $this->getParameter("maj");
9670 nmeucci 3943 // Action = Trace par défaut
9671     $action = $this->get_backtrace();
9672     // Action = Identifant de l'action si contexte connu
9673     if (empty($maj) === false
9674     || (empty($maj) === true && $maj === 0)) {
9675     $action = $this->get_action_param($maj, 'identifier');
9676 nmeucci 3965 if ($action === 'modifier_suivi') {
9677     $action = "modifier (via l'action suivi des dates)";
9678     }
9679 nmeucci 4108 if ($action === 'notifier_commune'
9680     && isset($val['mails_destinataires']) === true) {
9681     $action = "notification de la commune (courriels : ";
9682     $action .= $val['mails_destinataires'].")";
9683     }
9684 nmeucci 3943 }
9685 nmeucci 3876 // Création du log
9686     $log = array(
9687     'date' => date('Y-m-d H:i:s'),
9688     'user' => $_SESSION['login'],
9689     'action' => $action,
9690     'values' => array(
9691     'date_evenement' => $this->dateDB($val['date_evenement']),
9692     'date_retour_rar' => $this->dateDB($val['date_retour_rar']),
9693     'date_retour_signature' => $this->dateDB($val['date_retour_signature']),
9694     'evenement' => $val['evenement'],
9695     'action' => $val['action'],
9696 nmeucci 3963 'instruction' => $id,
9697 nmeucci 3876 'etat' => $val['etat'],
9698     ),
9699     );
9700     // Ajout du log
9701 softime 3976 $di = $this->get_inst_dossier($val['dossier']);
9702 nmeucci 3876 $ret = $di->add_log_instructions($log);
9703     if ($ret === false) {
9704     $this->correct = false;
9705     $this->msg = '';
9706     $this->addToMessage($di->msg);
9707     }
9708     return $ret;
9709     }
9710 nmeucci 3943
9711 softime 3976
9712 nmeucci 3943 /**
9713 softime 3976 * Retourne le contexte de déboguage formaté en HTML.
9714 softime 19307 *
9715 softime 3976 * @return string Une ligne par trace
9716 nmeucci 3943 */
9717     private function get_backtrace() {
9718     $trace = debug_backtrace();
9719 nmeucci 3957 $backtrace = '';
9720     $i = 1;
9721 nmeucci 3943 foreach ($trace as $key => $value) {
9722 nmeucci 3957 $func = $trace[$key]['function'];
9723     // On ne s'autolog pas
9724     if ($func === 'get_backtrace'
9725     || $func === 'add_log_to_dossier') {
9726     continue;
9727     }
9728     $backtrace .= $i.') ';
9729     // Si dans une classe
9730     if (isset($trace[$key]['class']) === true
9731     && empty($trace[$key]['class']) === false) {
9732 nmeucci 3963 $backtrace .= $trace[$key]['class'].'->'.$func;
9733 nmeucci 3957 }
9734     // Si procédural
9735     else {
9736     $file = $trace[$key]['file'];
9737 nmeucci 3963 $line = $trace[$key]['line'];
9738 softime 3976 $truncated_file = $this->f->get_relative_path($file);
9739 nmeucci 3963 if ($truncated_file !== false) {
9740     $file = $truncated_file;
9741     }
9742     $backtrace .= $func.' IN<br/>&nbsp;&nbsp;&nbsp;&nbsp; '.$file.':'.$line;
9743 nmeucci 3957 }
9744     $backtrace .= '<br/>';
9745     $i++;
9746 nmeucci 3943 }
9747 nmeucci 3957 return $backtrace;
9748 nmeucci 3943 }
9749 nmeucci 3963
9750 nmeucci 4108 /**
9751     * CONDITION - is_notifiable.
9752     *
9753     * Condition pour afficher l'action notifier_commune.
9754     *
9755     * @return boolean
9756     */
9757     public function is_notifiable() {
9758     // L'instruction doit être finalisée, ce qui revient à dire
9759     // définalisable sans bypass
9760     if ($this->is_unfinalizable_without_bypass() === false) {
9761     return false;
9762     }
9763     // La collectivité de l'utilisateur doit être de niveau multi
9764     if ($this->f->has_collectivite_multi() === false) {
9765     return false;
9766     }
9767     // Le paramètre multi de l'objet du courriel doit exister
9768     if ($this->f->getParameter('param_courriel_de_notification_commune_objet_depuis_instruction') === NULL) {
9769     return false;
9770     }
9771     // Le paramètre multi du modèle du courriel doit exister
9772     if ($this->f->getParameter('param_courriel_de_notification_commune_modele_depuis_instruction') === NULL) {
9773     return false;
9774     }
9775     // A ce stade toutes les conditions sont satisfaites
9776     return true;
9777     }
9778 nmeucci 3963
9779 nmeucci 4108 /**
9780     * TREATMENT - notifier_commune.
9781     *
9782     * Notifie aux communes et par courriel la finalisation d'une instruction.
9783     *
9784     * @return boolean
9785     */
9786     public function notifier_commune() {
9787     // Cette méthode permet d'exécuter une routine en début des méthodes
9788     // dites de TREATMENT.
9789     $this->begin_treatment(__METHOD__);
9790 softime 14542 $message = __('Erreur de paramétrage :');
9791 softime 12654 $erreurParametrage = false;
9792     // Récupération du paramétrage de la collectivité du dossier
9793 nmeucci 4108 $id_di = $this->getVal('dossier');
9794     $di = $this->get_inst_dossier($id_di);
9795     $collectivite_di = $di->getVal('om_collectivite');
9796 softime 12654 // Récupération de l'url permettant d'accèder à l'instruction et au dossier
9797     $urlAcces = $this->f->get_parametre_notification_url_acces($collectivite_di);
9798     if (empty($urlAcces) && empty(PATH_BASE_URL)) {
9799     $erreurParametrage = true;
9800     $message .= '<br>'.__("* l'url de notification n'est pas correctement paramétré");
9801 nmeucci 4108 }
9802 softime 12654
9803     // Récupération de la liste des mails
9804     $adresses = $this->f->get_param_courriel_de_notification_commune($collectivite_di);
9805     if (empty($adresses)) {
9806     $erreurParametrage = true;
9807     $message .= '<br>'.__("* aucun courriel valide de destinataire de la commune");
9808 nmeucci 4108 }
9809 softime 12654
9810     // Vérification du paramétrage des mails
9811     $paramMail = $this->f->get_notification_commune_parametre_courriel_type($collectivite_di);
9812     if (empty($paramMail) || empty($paramMail['parametre_courriel_type_message'])) {
9813     $erreurParametrage = true;
9814     $message .= '<br>'.__("* le modèle du courriel envoyé aux communes est vide");
9815 nmeucci 4108 }
9816 softime 12654 if (empty($paramMail) || empty($paramMail['parametre_courriel_type_titre'])) {
9817     $erreurParametrage = true;
9818     $message .= '<br>'.__("* l'objet du courriel envoyé aux communes est vide");
9819 nmeucci 4108 }
9820 softime 12654
9821     // Si il y a des erreurs de paramétrage on ne déclenche pas la notification et
9822     // un message a destination de l'utilisateur est affiché
9823     if ($erreurParametrage) {
9824     $message .= '<br>'.__("Veuillez contacter votre administrateur.");
9825     $this->addToMessage($message);
9826 nmeucci 4108 return $this->end_treatment(__METHOD__, false);
9827     }
9828 softime 12654
9829     // Création d'un notification et de sa tâche associé pour chaque mail
9830     foreach ($adresses as $adresse) {
9831     // Ajout de la notif et récupération de son id
9832     $destinataire = array(
9833     'destinataire' => $adresse,
9834     'courriel' => $adresse
9835     );
9836     $idNotif = $this->ajouter_notification(
9837     $this->getVal($this->clePrimaire),
9838     $this->f->get_connected_user_login_name(),
9839     $destinataire,
9840     $collectivite_di
9841     );
9842     if ($idNotif === false) {
9843     $this->addToMessage(__("Veuillez contacter votre administrateur."));
9844     return $this->end_treatment(__METHOD__, false);
9845 nmeucci 4108 }
9846 softime 12654 // Création de la tache en lui donnant l'id de la notification
9847     $notification_by_task = $this->notification_by_task(
9848     $idNotif,
9849     $this->getVal('dossier'),
9850     'mail',
9851     'notification_commune'
9852     );
9853     if ($notification_by_task === false) {
9854     $this->addToMessage(__("Erreur lors de la préparation de la notification des communes."));
9855     $this->addToMessage(__("Veuillez contacter votre administrateur."));
9856     return $this->end_treatment(__METHOD__, false);
9857     }
9858 nmeucci 4108 }
9859 softime 12654 $this->addToMessage(__('La commune a été notifiée.'));
9860 nmeucci 4108 return $this->end_treatment(__METHOD__, true);
9861     }
9862    
9863     /**
9864 softime 5169 * Récupère l'instance de l'instructeur
9865     *
9866     * @param integer $instructeur Identifiant de l'instructeur.
9867     *
9868     * @return object
9869     */
9870     protected function get_inst_instructeur($instructeur) {
9871     //
9872     return $this->get_inst_common("instructeur", $instructeur);
9873     }
9874    
9875    
9876     /**
9877     * Récupère l'instance de l'utilisateur
9878     *
9879     * @param integer $om_utilisateur Identifiant de l'utilisateur.
9880     *
9881     * @return object
9882     */
9883     protected function get_inst_om_utilisateur($om_utilisateur) {
9884     //
9885     return $this->get_inst_common("om_utilisateur", $om_utilisateur);
9886     }
9887    
9888    
9889 softime 6565 /**
9890 softime 5295 * Récupère l'instance de la division.
9891     *
9892     * @param integer $division Identifiant de la division.
9893     *
9894     * @return object
9895     */
9896     protected function get_inst_division($division) {
9897     //
9898     return $this->get_inst_common("division", $division);
9899     }
9900    
9901    
9902     /**
9903     * Récupère l'instance de la direction.
9904     *
9905     * @param integer $direction Identifiant de la direction.
9906     *
9907     * @return object
9908     */
9909     protected function get_inst_direction($direction) {
9910     //
9911     return $this->get_inst_common("direction", $direction);
9912     }
9913    
9914    
9915     /**
9916     * Récupère la collectivité d'un instructeur en passant par sa division puis
9917     * par sa direction.
9918     *
9919     * @param integer $instructeur Identifiant de l'instructeur.
9920     *
9921     * @return integer
9922     */
9923     protected function get_instructeur_om_collectivite($instructeur) {
9924     // Chemin vers la collectivité d'un instructeur
9925     $inst_instr = $this->get_inst_instructeur($instructeur);
9926     $inst_division = $this->get_inst_division($inst_instr->getVal('division'));
9927     $inst_direction = $this->get_inst_direction($inst_division->getVal('direction'));
9928    
9929     // Collectivité
9930     $om_collectivite = $inst_direction->getVal('om_collectivite');
9931    
9932     //
9933     return $om_collectivite;
9934     }
9935    
9936 softime 6565 /*
9937     * CONDITION - can_user_access_dossier_contexte_ajout
9938     *
9939     * Vérifie que l'utilisateur a bien accès au dossier d'instruction passé dans le
9940     * formulaire d'ajout.
9941     * Cette méthode vérifie que l'utilisateur est lié au groupe du dossier, et si le
9942     * dossier est confidentiel qu'il a accès aux confidentiels de ce groupe.
9943 softime 19307 *
9944 softime 6565 */
9945     function can_user_access_dossier_contexte_ajout() {
9946 softime 5295
9947 softime 19307 ($this->f->get_submitted_get_value('idxformulaire') !== null ? $id_dossier =
9948 softime 6565 $this->f->get_submitted_get_value('idxformulaire') : $id_dossier = "");
9949     //
9950     if ($id_dossier !== "") {
9951 softime 7996 $dossier = $this->f->get_inst__om_dbform(array(
9952     "obj" => "dossier_instruction",
9953     "idx" => $id_dossier,
9954     ));
9955 softime 6565 //
9956     return $dossier->can_user_access_dossier();
9957     }
9958     return false;
9959     }
9960    
9961     /*
9962     * CONDITION - can_user_access_dossier
9963     *
9964     * Vérifie que l'utilisateur a bien accès au dossier lié à l'instruction instanciée.
9965     * Cette méthode vérifie que l'utilisateur est lié au groupe du dossier, et si le
9966     * dossier est confidentiel qu'il a accès aux confidentiels de ce groupe.
9967 softime 19307 *
9968 softime 6565 */
9969     function can_user_access_dossier_contexte_modification() {
9970    
9971     $id_dossier = $this->getVal('dossier');
9972     //
9973     if ($id_dossier !== "" && $id_dossier !== null) {
9974 softime 7996 $dossier = $this->f->get_inst__om_dbform(array(
9975     "obj" => "dossier_instruction",
9976     "idx" => $id_dossier,
9977     ));
9978 softime 6565 //
9979     return $dossier->can_user_access_dossier();
9980     }
9981     return false;
9982     }
9983    
9984 softime 8593 /**
9985 softime 10713 * TREATMENT - envoyer_a_signature_sans_relecture
9986     *
9987     * Permet d'envoyer le document de l'instruction au parapheur pour signature sans relecture
9988     *
9989     * @return boolean true si l'envoi a été effectué avec succès false sinon
9990     */
9991     function envoyer_a_signature_sans_relecture() {
9992     return $this->envoyer_a_signature();
9993     }
9994    
9995     /**
9996     * TREATMENT - envoyer_a_signature_avec_relecture
9997     *
9998     * Permet d'envoyer le document de l'instruction au parapheur pour signature avec relecture
9999     *
10000     * @return boolean true si l'envoi a été effectué avec succès false sinon
10001     */
10002     function envoyer_a_signature_avec_relecture() {
10003 softime 10808 $is_forced_view_files = true;
10004     return $this->envoyer_a_signature($is_forced_view_files);
10005 softime 10713 }
10006    
10007     /**
10008 softime 10573 * TREATMENT - envoyer_a_signature
10009     *
10010     * Permet d'envoyer le document de l'instruction au parapheur pour signature
10011 softime 19307 *
10012 softime 10713 * @param boolean $is_forced_view_files Indique si il y a une relecture (true) ou non (false)
10013 softime 10573 *
10014     * @return boolean true si l'envoi a été effectué avec succès false sinon
10015     */
10016 softime 10713 function envoyer_a_signature($is_forced_view_files = false) {
10017 softime 10573 $this->begin_treatment(__METHOD__);
10018     $this->correct = true;
10019    
10020     // Instanciation de l'objet signataire_arrete
10021     $inst_signataire_arrete = $this->f->get_inst__om_dbform(array(
10022     'obj' => 'signataire_arrete',
10023     'idx' => $this->getVal('signataire_arrete'),
10024     ));
10025    
10026     // Instanciation de l'objet dossier
10027     $inst_dossier = $this->f->get_inst__om_dbform(array(
10028     'obj' => 'dossier',
10029     'idx' => $this->getVal('dossier'),
10030     ));
10031    
10032 softime 15037 //Instanciation de la classe electronicsignature
10033     $inst_es = $this->get_electronicsignature_instance();
10034     if ($inst_es === false) {
10035     $this->correct = false;
10036     return $this->end_treatment(__METHOD__, false);
10037     }
10038    
10039     // Vérifie si la notification se fait via l'application ou via le parapheur
10040     try {
10041     $notification_required = $inst_es->signer_notification_is_delegated();
10042     } catch(electronicsignature_connector_method_not_implemented_exception $_) {
10043     // Si la méthode n'existe pas, on considère que la notification est faite par le parapheur
10044     $notification_required = false;
10045     }
10046    
10047     // Si la notification est faite par l'application vérifie que l'adresse mail du
10048     // signataire est correcte. Si ce n'est pas le cas le document n'est pas envoyé
10049     // au parapheur car il ne sera pas accessible sans le lien transmis dans la
10050     // notification
10051     if ($notification_required === true) {
10052     $signer_mail = $inst_signataire_arrete->getVal('email');
10053     $signer_name = trim($inst_signataire_arrete->getVal('prenom').' '.$inst_signataire_arrete->getVal('nom'));
10054 softime 19307
10055 softime 15037 $err_msg = __('Le document n\'a pas pu être envoyé en signature car ');
10056    
10057     if (empty($signer_mail)) {
10058     $this->correct = false;
10059     $err_detail = sprintf(__("l'email du signataire '%s' est vide."), $signer_name);
10060     $this->addToMessage($err_msg.$err_detail);
10061     $this->addToLog(__METHOD__.$err_msg.$err_detail.' Instruction : '.$this->getVal($this->clePrimaire), DEBUG_MODE);
10062     return $this->end_treatment(__METHOD__, false);
10063     }
10064     if (! $this->f->checkValidEmailAddress($signer_mail)) {
10065     $this->correct = false;
10066     $err_detail = sprintf(__("l'email du signataire '%s' est invalide (%s)."), $signer_name, $signer_mail);
10067     $this->addToMessage($err_msg.$err_detail);
10068     $this->addToLog(__METHOD__.$err_msg.$err_detail.' Instruction : '.$this->getVal($this->clePrimaire), DEBUG_MODE);
10069     return $this->end_treatment(__METHOD__, false);
10070     }
10071     }
10072    
10073 softime 10573 // Récupération du document à signer
10074     $file = $this->f->storage->get($this->getVal('om_fichier_instruction'));
10075     if ($file === OP_FAILURE) {
10076     $this->correct = false;
10077     $this->addToMessage(__("Une erreur est survenue lors de la récupération du contenu du document de l'instruction."));
10078     // Termine le traitement
10079     return $this->end_treatment(__METHOD__, false);
10080     }
10081    
10082     // Initialisation des paramètre à passer pour l'envoi en signature
10083 softime 18769 $this->f->getUserInfos();
10084 softime 10808 $data = array(
10085 softime 10573 "om_utilisateur_email" => $this->f->om_utilisateur['email'],
10086     "om_utilisateur_nom" => $this->f->om_utilisateur['nom'],
10087     "signataire_arrete_email" => $inst_signataire_arrete->getVal('email'),
10088     "signataire_arrete_nom" => $inst_signataire_arrete->getVal('nom'),
10089     "signataire_arrete_prenom" => $inst_signataire_arrete->getVal('prenom'),
10090 softime 11876 // Permet d'envoyer en signature l'instruction le jour de la date limite
10091 softime 14064 "date_limite_instruction" => $this->compute_date_limite(1) != null ? $this->compute_date_limite(1) : null,
10092 softime 10573 "dossier" => $this->getVal('dossier'),
10093 softime 10713 "is_forced_view_files" => $is_forced_view_files,
10094 softime 18876 'commentaire_signature' => $is_forced_view_files === true ? __('relecture demandee.') : null,
10095     'instruction' => $this->getVal($this->clePrimaire),
10096     'last_statut_signature' => $this->getVal('statut_signature'),
10097     'last_commentaire_signature' => $this->getVal('commentaire_signature'),
10098 softime 10573 );
10099    
10100 softime 10808 // Initialisation des métadonnées
10101     $metadonnee_dossier = $file['metadata'];
10102 softime 18436 // Récupération du libellé du document transmis au parapheur
10103     $metadonnee_dossier['filename'] = $this->getVal('fichier_instruction_name');
10104 softime 11228 $metadonnee_dossier['titre_document'] = $this->getDocumentTitre();
10105 softime 10808
10106     $metadonnee_dossier['url_di'] = sprintf(
10107 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',
10108 softime 11418 $this->f->get_param_base_path_metadata_url_di() !== null ? $this->f->get_param_base_path_metadata_url_di() : PATH_BASE_URL,
10109 softime 15037 $this->getVal('dossier')
10110 softime 10808 );
10111    
10112     $optional_data = null;
10113     // Si il y a des paramètres supplémentaire spécifié dans le signataire alors on les récupère
10114     if ($inst_signataire_arrete->getVal('parametre_parapheur') !== null && $inst_signataire_arrete->getVal('parametre_parapheur') !== '') {
10115     $optional_data = json_decode($inst_signataire_arrete->getVal('parametre_parapheur'), true);
10116     if (json_last_error() !== JSON_ERROR_NONE) {
10117     $this->correct = false;
10118     $this->addToMessage(__("Les paramètres supplémentaires envoyés au parapheur ne sont pas au bon format."));
10119     $this->addToLog(__METHOD__."(): ".
10120 softime 19307 __("Erreur lors du décodage du format json des paramètres supplémentaires envoyé au parapheur.
10121 softime 10808 Tableau : ").var_export($inst_signataire_arrete->getVal('parametre_parapheur'), true)
10122     );
10123     // Termine le traitement
10124     return $this->end_treatment(__METHOD__, false);
10125     }
10126     }
10127    
10128 softime 10573 // Appel de la méthode de l'abstracteur send_for_signature()
10129     // Cette méthode doit retourner un tableau de valeur
10130     try {
10131 softime 10808 $result = $inst_es->send_for_signature($data, $file['file_content'], $metadonnee_dossier, $optional_data);
10132 softime 10573 } catch (electronicsignature_exception $e) {
10133     $this->handle_electronicsignature_exception($e);
10134     return $this->end_treatment(__METHOD__, false);
10135     }
10136    
10137     // Après avoir reçu le résultat du parapheur, il faut mettre à jour les champs
10138     $valF = array();
10139    
10140     // Pour appeler la fonction modifier il faut traiter tous les champs de l'objet
10141     foreach($this->champs as $identifiant => $champ) {
10142     $valF[$champ] = $this->val[$identifiant];
10143     }
10144     // On fait ensuite nos modifications spécifiques
10145     $valF['id_parapheur_signature'] = $result['id_parapheur_signature'];
10146     $valF['statut_signature'] = $result['statut'];
10147     $valF['commentaire_signature'] = isset($result['commentaire_signature']) == true ? $result['commentaire_signature'] : null;
10148     $valF['date_envoi_signature'] = date("Y-m-d", strtotime($result['date_envoi_signature']));
10149     $valF['historique_signature'] = $this->get_updated_historique_signature($result);
10150 softime 15037 $valF['parapheur_lien_page_signature'] = isset($result['signature_page_url']) ? $result['signature_page_url'] : null;
10151 softime 18769 $this->setParameter("maj", 1);
10152 softime 10573 $ret = $this->modifier($valF);
10153    
10154     if ($ret === false) {
10155     $this->correct = false;
10156     $this->addToMessage(__("Une erreur est survenue lors de la mise à jour des champs."));
10157     // Termine le traitement
10158     return $this->end_treatment(__METHOD__, false);
10159     }
10160    
10161 softime 15037 // Notification du signataire
10162     if ($notification_required === true) {
10163     if ($this->notify_signer($signer_name, $signer_mail, $data['om_utilisateur_nom']) === false) {
10164     $msg = __("Une erreur s'est produite lors de la notification du signataire \"%s (%s)\". Annulation de l'envoi pour signature du document%s.");
10165     $this->addToMessage(sprintf($msg, $signer_name, $signer_mail, ''));
10166     $this->addToLog(sprintf($msg, $signer_name, $signer_mail, ' : '.$this->getVal($this->clePrimaire)), DEBUG_MODE);
10167     // Met à jour les valeurs de l'objet courant pour prendre en compte les modifications faites
10168     // precedemment
10169     $this->init_record_data($this->getVal($this->clePrimaire));
10170     $this->annuler_envoi_en_signature();
10171     $this->correct = false;
10172     return $this->end_treatment(__METHOD__, true);
10173     }
10174     }
10175    
10176 softime 10573 // Message
10177     $this->addToMessage(__("Le document a été envoyé pour signature dans le parapheur."));
10178 softime 15037 if ($this->f->is_option_enabled('option_afficher_lien_parapheur') === true
10179     && array_key_exists('signature_page_url', $result) === true) {
10180 softime 10573 $this->addToMessage(sprintf(
10181 softime 11228 '<br> > <a href="%1$s" title="%2$s" target="_blank">%2$s</a>',
10182     $result['signature_page_url'],
10183     __("Signez directement le document")
10184 softime 10573 ));
10185     }
10186 softime 15037 if ($notification_required !== true) {
10187     $this->addToMessage(__("L'envoi de la notification au signataire est effectué par la plateforme."));
10188     }
10189 softime 10573
10190     // Tout s'est bien passé, on termine le traitement
10191     return $this->end_treatment(__METHOD__, true);
10192     }
10193    
10194     /**
10195 softime 15037 * Notifie le signataire d'un document à signer.
10196     * Gère l'affichage des messages à destination de l'utilisateur selon l'état du traitement.
10197     * En cas d'erreur ajoute une ligne dans les logs de l'application.
10198     *
10199     * @param string $signer_name Nom du signataire
10200     * @param string $signer_mail Mail du signataire
10201     * @param string $user_name Nom de l'utilisateur openADS courant
10202     *
10203     * @return boolean true si succés, false si erreur
10204     */
10205     protected function notify_signer($signer_name, $signer_mail, $user_name) {
10206     // message d'erreur
10207     $err_msg_log = sprintf(
10208     __("Échec de la notification du signataire \"%s (%s)\" lors de l'envoi au parapaheur du document de l'instruction : %s"),
10209     $signer_name,
10210     $signer_mail,
10211     $this->getVal($this->clePrimaire)
10212     );
10213     $err_msg = sprintf(
10214     '%s %s (%s)"',
10215     __("Échec de la notification du signataire"),
10216     $signer_name,
10217     $signer_mail
10218     );
10219    
10220     // vérification des informations requises
10221     if (empty($signer_name)) {
10222     $err_detail = __("le nom du signataire est vide");
10223     $this->addToLog(__METHOD__.', '.$err_msg_log.', '.$err_detail, DEBUG_MODE);
10224     $this->addToMessage($err_msg.', '.$err_detail);
10225     return false;
10226     }
10227     if (empty($signer_mail)) {
10228     $err_detail = __("le courriel du signataire est vide");
10229     $this->addToLog(__METHOD__.', '.$err_msg_log.', '.$err_detail, DEBUG_MODE);
10230     $this->addToMessage($err_msg.', '.$err_detail);
10231     return false;
10232     }
10233     if (empty($this->getVal('dossier'))) {
10234     $err_detail = __("l'identifiant du dossier est vide");
10235     $this->addToLog(__METHOD__.', '.$err_msg_log.', '.$err_detail, DEBUG_MODE);
10236     $this->addToMessage($err_msg.', '.$err_detail);
10237     return false;
10238     }
10239    
10240     // ajout de la notification à la liste des notifications de l'instruction
10241     $instruction_id = $this->getVal($this->clePrimaire);
10242     $inst_notif = $this->f->get_inst__om_dbform(array(
10243     "obj" => "instruction_notification",
10244     "idx" => "]",
10245     ));
10246     $notif_val = array(
10247     'instruction_notification' => null,
10248     'instruction' => $instruction_id,
10249     'automatique' => true,
10250     'emetteur' => $user_name,
10251     'date_envoi' => null,
10252     'destinataire' => "$signer_name <$signer_mail>",
10253     'courriel' => $signer_mail,
10254     'date_premier_acces' => null,
10255     'statut' => '',
10256     'commentaire' => ''
10257     );
10258     $add_notif = $inst_notif->ajouter($notif_val);
10259     if ($add_notif === false) {
10260     $err_detail = __("Échec de l'ajout de la notification.");
10261     $this->addToLog(__METHOD__.' '.$err_msg_log.'. '.$err_detail.' Notification : '.var_export($notif_val, true), DEBUG_MODE);
10262     $this->addToMessage($err_msg);
10263     return false;
10264     }
10265     $notification_id = $inst_notif->getVal($inst_notif->clePrimaire);
10266    
10267     // ajout d'une tâche de notification (envoi du mail)
10268     $notification_task = $this->notification_by_task(
10269     $notification_id,
10270     $this->getVal('dossier'),
10271     'mail',
10272     'notification_signataire'
10273     );
10274     if ($notification_task === false) {
10275     $err_detail = sprintf(
10276     __("Échec de l'ajout de la tâche de notification (notification %s)."),
10277     $notification_id);
10278     $this->addToLog(__METHOD__.' '.$err_msg_log.'. '.$err_detail, DEBUG_MODE);
10279     $this->addToMessage($err_msg);
10280     return false;
10281     }
10282    
10283     // Vérification de la réussite de l'envoi du mail
10284     // Fais une requête pour récupérer la liste des notifications de signataire faites par mail
10285     // et associées à l'instruction en cours. Récupère uniquement la dernière qui doit être celle
10286     // qui viens d'être créée.
10287     // Si la tâche d'envoi du mail est en erreur alors on considère que l'envoi du mail a échoué.
10288     $qres = $this->f->get_one_result_from_db_query(
10289     sprintf(
10290     'SELECT
10291     state
10292     FROM
10293     %1$stask
10294     WHERE
10295     type = \'notification_signataire\'
10296     AND category = \'mail\'
10297     AND dossier = \'%2$s\'
10298     ORDER BY
10299     task DESC
10300     LIMIT 1',
10301     DB_PREFIXE,
10302     $this->f->db->escapeSimple($this->getVal('dossier'))
10303     ),
10304     array(
10305     'origin' => __METHOD__
10306     )
10307     );
10308     if ($qres['result'] === 'error') {
10309     $err_detail = sprintf(
10310     __("Échec de l'envoi du mail de notification (notification %s)."),
10311     $notification_id);
10312     $this->addToLog(__METHOD__.' '.$err_msg_log.'. '.$err_detail, DEBUG_MODE);
10313     $this->addToMessage($err_msg);
10314     return false;
10315     }
10316 softime 18436 // TODO gérer les autres cas (gestion d'erreur)
10317 softime 15037
10318     // succès de la planification de la notification
10319     $this->addToMessage(sprintf(
10320     __('Le signataire "%s (%s)" sera notifié prochainement'),
10321     $signer_name,
10322     $signer_mail));
10323     return true;
10324     }
10325    
10326     /**
10327 softime 11876 * Permet de récupérer la bonne date limite en fonction de si l'instruction
10328     * est en incomplet notifié ou non.
10329     * On peut ajouter des jours à cette date grâce au paramètre "delay".
10330     * Cette fonction est utilisée dans un cas spécifique où on veut envoyer
10331     * l'instruction en signature le jour de la date limite.
10332 softime 19307 *
10333 softime 11876 * @param int $delay Le nombre de jour à ajouter à la date limite.
10334     *
10335     * @return string $date_limite la date limite calculé ou false
10336     */
10337     private function compute_date_limite($delay) {
10338     // Instanciation de l'objet dossier
10339     $inst_dossier = $this->f->get_inst__om_dbform(array(
10340     'obj' => 'dossier',
10341     'idx' => $this->getVal('dossier'),
10342     ));
10343    
10344     $date_to_compute = null;
10345     if ($inst_dossier->getVal('incomplet_notifie') === 't') {
10346     $date_to_compute = $inst_dossier->getVal('date_limite_incompletude');
10347     } else {
10348     $date_to_compute = $inst_dossier->getVal('date_limite');
10349     }
10350 softime 14064 if ($date_to_compute != null) {
10351     return date("Y-m-d", strtotime($date_to_compute."+ $delay days"));
10352     }
10353 softime 11876
10354 softime 14064 return null;
10355 softime 11876 }
10356    
10357     /**
10358 softime 10573 * Permet de récupérer la traduction de la valeur de statut_signature
10359     *
10360     * @return string la valeur de statut_signature traduite | false
10361     */
10362     function get_trad_for_statut($value_to_trad){
10363     $statut_signature_tab = array(
10364     'waiting' => __('en préparation'),
10365     'in_progress' => __('en cours de signature'),
10366     'canceled' => __('signature annulée'),
10367 softime 19307 'expired' => __('délai de signature expiré'),
10368 softime 10573 'finished' => __('signé')
10369     );
10370     if (array_key_exists($value_to_trad, $statut_signature_tab) === true) {
10371     return $statut_signature_tab[$value_to_trad];
10372     }
10373    
10374     return false;
10375     }
10376    
10377     /**
10378     * Permet de mettre à jour le tableau json sotcké dans le champ historique_signature
10379     *
10380     * @return string (json) la valeur de historique_signature mis à jour | false
10381     */
10382     function get_updated_historique_signature($historique_signature_values) {
10383 softime 19307
10384 softime 10573 $historique_signature_value_tab = $this->get_historique_signature_decoded();
10385    
10386     if ($historique_signature_value_tab === false) {
10387     $this->addToLog(__METHOD__."(): erreur historique signature", DEBUG_MODE);
10388     return false;
10389     }
10390    
10391     $last_val_historique_signature = array();
10392    
10393     // Si la tableau récupéré n'est pas vide alors
10394     // on récupère la dernière ligne du tableau
10395     if (empty($historique_signature_value_tab) === false) {
10396     $last_val_historique_signature = end($historique_signature_value_tab);
10397     }
10398    
10399     $format_date = '';
10400     $format_date_hour = '';
10401     $date_converted=array();
10402    
10403     $date_to_convert = array(
10404 softime 19307 'date_envoi_signature' => $historique_signature_values['date_envoi_signature'],
10405     'date_limite_instruction' => $this->compute_date_limite(0),
10406 softime 10573 'date_retour_signature' => $historique_signature_values['date_retour_signature']
10407     );
10408    
10409     // Conversion des dates en fonction de leur format
10410     foreach ($date_to_convert as $key => $value) {
10411     $date_converted[$key] = null;
10412     if ($value != null) {
10413     $format_date = 'd/m/Y';
10414     $format_date_hour = 'd/m/Y H:i:s';
10415     $date_converted[$key] = empty(date_parse($value)['hour']) === false ? date($format_date_hour, strtotime($value)) : date($format_date, strtotime($value));
10416     }
10417     }
10418    
10419     // Ce tableau permet de lister les colonnes de historique_signature et de les rendre traduisibles.
10420     // Il faut en effet mettre les gettext avec l'intitulé explicite au moins
10421     // une fois afin qu'il puisse être reconnu par le logiciel de traduction.
10422     $tab_for_columns_trad = array(
10423     __('entry_date'),
10424     __('id_parapheur_signature'),
10425     __('emetteur'),
10426     __('signataire'),
10427     __('date_envoi'),
10428     __('date_limite'),
10429     __('date_retour'),
10430     __('statut_signature'),
10431     __('commentaire_signature')
10432     );
10433    
10434     array_push($historique_signature_value_tab, array(
10435     'entry_date' => date('d/m/Y H:i:s'),
10436     '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'],
10437 softime 19307 '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'],
10438 softime 10573 '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'],
10439     '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'],
10440     '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'],
10441     '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'],
10442     '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']),
10443     'commentaire_signature' => isset($historique_signature_values['commentaire_signature']) === false || $historique_signature_values['commentaire_signature'] == null ? null : $historique_signature_values['commentaire_signature'],
10444     ));
10445 softime 19307
10446 softime 10573 return json_encode($historique_signature_value_tab, JSON_HEX_APOS);
10447     }
10448 softime 19307
10449 softime 11876 /**
10450     * TREATMENT - annuler_envoi_en_signature
10451     *
10452     * Permet d'annuler l'envoi du document de l'instruction au parapheur pour signature
10453     *
10454     * @return boolean true si l'annulation a été effectué avec succès false sinon
10455     */
10456     function annuler_envoi_en_signature() {
10457     $this->begin_treatment(__METHOD__);
10458     $this->correct = true;
10459 softime 10573
10460 softime 11876 //Instanciation de la classe electronicsignature
10461     $inst_es = $this->get_electronicsignature_instance();
10462     if ($inst_es === false) {
10463     $this->correct = false;
10464     return $this->end_treatment(__METHOD__, false);
10465     }
10466 softime 10573
10467 softime 11876 $data = array();
10468     if (! empty($this->getVal('id_parapheur_signature'))) {
10469     $data['id_parapheur_signature'] = $this->getVal('id_parapheur_signature');
10470     } else {
10471     $this->correct = false;
10472     $this->addToMessage(__("Il n'y a pas d'identifiant de parapheur."));
10473     return $this->end_treatment(__METHOD__, false);
10474     }
10475    
10476     // Appel de la méthode de l'abstracteur cancel_send_for_signature()
10477     // Cette méthode doit retourner un tableau de valeur
10478     try {
10479     $result = $inst_es->cancel_send_for_signature($data);
10480     } catch (electronicsignature_exception $e) {
10481     $this->handle_electronicsignature_exception($e);
10482     return $this->end_treatment(__METHOD__, false);
10483     }
10484    
10485     // Après avoir reçu le résultat du parapheur, il faut mettre à jour les champs
10486     $valF = array();
10487    
10488     // Pour appeler la fonction modifier il faut traiter tous les champs de l'objet
10489     foreach($this->champs as $identifiant => $champ) {
10490     $valF[$champ] = $this->val[$identifiant];
10491     }
10492     // On fait ensuite nos modifications spécifiques
10493     $valF['id_parapheur_signature'] = null;
10494     $valF['statut_signature'] = $result['statut'];
10495     $valF['commentaire_signature'] = isset($result['commentaire_signature']) == true ? $result['commentaire_signature'] : null;
10496     $valF['date_envoi_signature'] = null;
10497     $valF['historique_signature'] = $this->get_updated_historique_signature($result);
10498    
10499 softime 18769 $this->setParameter("maj", 1);
10500 softime 11876 $ret = $this->modifier($valF);
10501    
10502     if ($ret === false) {
10503     $this->correct = false;
10504     $this->addToMessage(__("Une erreur est survenue lors de la mise à jour des champs."));
10505     // Termine le traitement
10506     return $this->end_treatment(__METHOD__, false);
10507     }
10508    
10509     // Message
10510     $this->addToMessage(__("L'annulation a été effectuée avec succès."));
10511    
10512     // Tout s'est bien passé, on termine le traitement
10513     return $this->end_treatment(__METHOD__, true);
10514     }
10515    
10516    
10517 softime 10573 /**
10518     * Récupère le contenu du champ historique_signature et le converti en tableau
10519     *
10520     * @return array sinon false en cas d'erreur
10521     */
10522     protected function get_historique_signature_decoded() {
10523 softime 11876 $val = str_replace("'", '"', $this->getVal('historique_signature'));
10524     if ($val === '' || $val == 'false') {
10525 softime 10573 $val = json_encode(array());
10526     }
10527     if($this->isJson($val) === false) {
10528     return false;
10529     }
10530     return json_decode($val, true);
10531     }
10532    
10533 softime 10808 /**
10534     * Récupère les informations à afficher dans le tableau de suivi à l'aide
10535     * d'une requête sql. Stocke ces informations dans un tableau.
10536 softime 12433 * Converti le tableau au format json et renvoi le json obtenu.
10537 softime 10808 *
10538 softime 12433 * Pour identifier quel suivi est affiché (notification des demandeurs, des services ou
10539     * de tiers) ce sont les tâches liées aux notifications qui sont utilisés.
10540     * La clause where de la requête est construite à partir du tableau contenant les types
10541     * de tâches fourni en paramètre.
10542     * Il est également possible d'afficher les notifications n'étant pas lié à des tâches.
10543     *
10544     * Si le suivi concerne la notification des demandeurs via le portail citoyen,
10545     * la date de premier accès ne sera pas affichée.
10546     *
10547     * @param array liste des tâches permettant d'identifier quelles notification afficher
10548     * @param boolean permet d'afficher les notifications non liées à des tâches
10549 softime 10808 * @return json
10550     */
10551 softime 15037 public function get_json_suivi_notification($typeTache, $nonLieTache = false) {
10552 softime 11585 $whereTypeTache = '';
10553 softime 15037 $sqlTaskNull = 'INNER';
10554 softime 12654
10555     // Liste des champs à afficher. Permet également la traduction des noms de colonnes.
10556     $listeChampsTrad = array(
10557     __('emetteur'),
10558     __('date_envoi'),
10559     __('destinataire'),
10560     __('date_premier_acces'),
10561     __('instruction'),
10562     __('annexes'),
10563     __('statut'),
10564     __('commentaire')
10565     );
10566     $listeChamps = array(
10567     'emetteur',
10568     'date_envoi',
10569     'destinataire',
10570     'date_premier_acces',
10571     'instruction',
10572     'annexes',
10573     'statut',
10574     'commentaire'
10575     );
10576    
10577 softime 12124 // Défini si on veux que la requête récupère également les notifications qui n'ont pas
10578     // de tâches associées. C'est le cas pour les notifications de demandeurs lorsque la
10579     // notification du demandeur principal n'a pas pu être envoyée à cause d'un mauvais
10580     // paramétrage
10581     if(is_bool($nonLieTache) && $nonLieTache === true) {
10582 softime 15037 $sqlTaskNull = 'LEFT';
10583 softime 12124 }
10584     // Prépare la clause where pour ne récupérer que les notifications liées à certain type de tâches
10585     // Permet de différencier les notifications des demandeurs de celle des services et de celles des
10586     // tiers consulté
10587 softime 12433 if (is_array($typeTache) && $typeTache != array()) {
10588 softime 11585 if (is_array($typeTache)) {
10589     $whereTypeTache = sprintf(
10590 softime 15835 'AND (task.task IS NULL OR (task.task IS NOT NULL AND task.type IN (%1$s)))',
10591 softime 15037 "'".implode("', '", $typeTache)."'"
10592 softime 11585 );
10593     }
10594 softime 12433 // La date de premier accès n'a pas besoin d'être renseigné pour
10595     // les notifications des demandeurs via le portail citoyen.
10596     // Les notifications des demandeurs sont liés à 3 types de tâches
10597     // notification_recepisse, notification_instruction, notification_decision
10598     // Si le suivi de la notification concerne un de ces types de tâches on
10599     // considère que c'est une notification de demandeurs.
10600     // Dans ce cas on vérifie si cette notification est paramétrée pour passer
10601     // via le portail. Par défaut si rien n'est paramétré on considère que la
10602     // notification est faite via le portail
10603     if ((in_array('notification_recepisse', $typeTache) ||
10604     in_array('notification_instruction', $typeTache) ||
10605     in_array('notification_decision', $typeTache))) {
10606     $dossier = $this->getVal('dossier');
10607     $collectivite_di = $this->get_dossier_instruction_om_collectivite($dossier);
10608     $modeNotification = $this->f->get_param_option_notification($collectivite_di);
10609 softime 14064 if ($modeNotification === PORTAL) {
10610 softime 12654 $listeChamps = array(
10611     'emetteur',
10612     'date_envoi',
10613     'destinataire',
10614     'instruction',
10615     'annexes',
10616     'statut',
10617     'commentaire'
10618     );
10619 softime 12433 }
10620     }
10621 softime 12654 // Il n'y a pas d'annexe pour la notification des communes donc pas besoin
10622     // de les afficher dans le suivi
10623     if (in_array('notification_depot_demat', $typeTache)) {
10624     $listeChamps = array(
10625     'emetteur',
10626     'date_envoi',
10627     'destinataire',
10628     'instruction',
10629     'statut',
10630     'commentaire'
10631     );
10632     }
10633 softime 11585 }
10634 softime 12433
10635 softime 10808 $valSuivi = array();
10636     // Récupération des infos nécessaires à l'affichage du tableau
10637     $sql = sprintf(
10638 softime 11585 'SELECT DISTINCT
10639 softime 10869 instruction_notification.instruction_notification,
10640 softime 12124 -- Affiche la mention automatique avec le nom de l emetteur si la notification a été envoyé automatiquement
10641 softime 19307 CASE WHEN instruction_notification.automatique = TRUE
10642     THEN TRIM(CONCAT(instruction_notification.emetteur, \' \', \'(automatique)\'))
10643 softime 10869 ELSE instruction_notification.emetteur
10644     END as emetteur,
10645 softime 10808 date_envoi,
10646     instruction_notification.destinataire,
10647 softime 10869 instruction_notification.date_premier_acces,
10648 softime 10808 evenement.libelle as instruction,
10649 softime 10869 instruction_notification.statut,
10650     instruction_notification.commentaire,
10651 softime 12433 annexes.instruction_annexe as annexes
10652 softime 10808 FROM
10653     %1$sinstruction_notification
10654     LEFT JOIN %1$sinstruction
10655     ON instruction.instruction = instruction_notification.instruction
10656     LEFT JOIN %1$sevenement
10657     ON instruction.evenement = evenement.evenement
10658 softime 10869 LEFT JOIN %1$sinstruction_notification_document
10659     ON instruction_notification.instruction_notification = instruction_notification_document.instruction_notification
10660     AND instruction_notification_document.annexe = true
10661 softime 12124 -- Récupère les tâches liées au notification pour pouvoir par la suite identifier le type de notification
10662 softime 15037 %4$s JOIN %1$stask
10663 softime 11585 ON instruction_notification.instruction_notification::CHARACTER VARYING = task.object_id
10664 softime 15835 AND task.type LIKE \'notification%%\'
10665 softime 12124 -- Récupération de la liste des annexes sous la forme d une liste
10666 softime 11585 LEFT JOIN (
10667     SELECT
10668     instruction_notification,
10669 softime 12124 -- Récupère la liste des annexes de la notification
10670 softime 12433 -- sous la forme d un json pour récupérer toutes les informatiosn nécessaire
10671     -- à l affichage du lien vers les annexes
10672     CONCAT(
10673     \'[\',
10674     STRING_AGG(
10675     -- Affiche le nom du fichier selon le type de document/pièce
10676     CASE
10677     WHEN instruction_notification_document.document_type = \'instruction\'
10678     THEN CONCAT(
10679     \'{
10680     "obj" : "instruction",
10681     "champs" : "om_fichier_instruction",
10682     "label" : "\', evenement.libelle, \'",
10683     "id" : "\', instruction.instruction,\'"
10684     }\'
10685     )
10686     WHEN instruction_notification_document.document_type = \'consultation\'
10687     THEN CONCAT(
10688 softime 15218 \'{
10689     "obj" : "consultation",
10690     "champs" : "fichier",
10691 softime 19307 "label" : "\', CONCAT_WS( \' - \', \'Avis\', service.libelle, to_char(consultation.date_retour,\'DD/MM/YYYY\')), \'",
10692 softime 15218 "id" : "\', consultation.consultation, \'"
10693 softime 19307 }\'
10694 softime 12433 )
10695     ELSE
10696     CONCAT(
10697     \'{
10698     "obj" : "document_numerise",
10699     "champs" : "uid",
10700     "label" : "\', document_numerise.nom_fichier, \' - \', document_numerise_type.libelle, \'",
10701     "id" : "\', document_numerise.document_numerise,\'"
10702     }\'
10703     )
10704     END,
10705     \', \'),
10706     \']\'
10707 softime 11585 ) AS instruction_annexe
10708     FROM
10709     %1$sinstruction_notification_document
10710     LEFT JOIN %1$sinstruction
10711     ON instruction_notification_document.instruction = instruction.instruction
10712     LEFT JOIN %1$sevenement
10713     ON instruction.evenement = evenement.evenement
10714     LEFT JOIN %1$sconsultation
10715     ON instruction_notification_document.document_id = consultation.consultation
10716     LEFT JOIN %1$sservice
10717     ON consultation.service = service.service
10718 softime 12433 LEFT JOIN %1$sdocument_numerise
10719     ON instruction_notification_document.document_id = document_numerise.document_numerise
10720     LEFT JOIN %1$sdocument_numerise_type
10721     ON document_numerise.document_numerise_type = document_numerise_type.document_numerise_type
10722 softime 11585 WHERE
10723     instruction_notification_document.annexe = \'t\'
10724     GROUP BY
10725     instruction_notification
10726     ) AS annexes
10727     ON
10728     annexes.instruction_notification = instruction_notification.instruction_notification
10729 softime 10808 WHERE
10730 softime 10869 instruction.instruction = %2$s
10731 softime 15835 %3$s
10732 softime 10869 ORDER BY
10733     date_envoi ASC, instruction_notification.destinataire ASC',
10734 softime 10808 DB_PREFIXE,
10735 softime 14542 intval($this->getVal('instruction')),
10736 softime 15037 $whereTypeTache,
10737     $sqlTaskNull
10738 softime 10808 );
10739 softime 14542 $qres = $this->f->get_all_results_from_db_query($sql, array(
10740     "origin" => __METHOD__
10741     )
10742     );
10743 softime 12433 // Préparation du lien de téléchargement des annexes
10744     $htmlList =
10745     '<style>
10746     #content .gridjs-td a.lien_annexe {
10747     text-decoration : underline dotted 1px;
10748     }
10749     #content a.lien_annexe:hover {
10750     text-decoration : underline solid 1px;
10751     color : #46aede;
10752     }
10753     ol {padding-left : 10px;}
10754     </style>
10755     <ol>%1$s</ol>';
10756     $lienTelechargement =
10757     '<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">
10758     Annexe
10759     </a>';
10760 softime 10808 // Stockage des infos de chaque notification dans un tableau
10761 softime 14542 foreach ($qres['result'] as $row) {
10762 softime 10808 $valNotif = array();
10763     foreach($listeChamps as $champ) {
10764     $valNotif[$champ] = $row[$champ];
10765 softime 10815 if (($champ === 'date_envoi'
10766     || $champ === 'date_premier_acces')
10767     && $row[$champ] !== null
10768     && $row[$champ] !== '') {
10769 softime 10814 //
10770     $valNotif[$champ] = date('d/m/Y H:i:s', strtotime($row[$champ]));
10771 softime 12433 } else if ($champ === 'annexes') {
10772     $listeAnnexe = '';
10773     $infoAnnexes = json_decode($row[$champ], true);
10774     if (! empty($infoAnnexes) && json_last_error() === JSON_ERROR_NONE) {
10775     // A partir des infos récupérées prépare le code html du lien vers chacune
10776     // des annexes et ajoute un élément de liste par annexe
10777     foreach($infoAnnexes as $annexe) {
10778     $listeAnnexe .= sprintf(
10779     '<li>%s</li>',
10780     sprintf($lienTelechargement,
10781     $annexe['obj'],
10782     $annexe['champs'],
10783     $annexe['id'],
10784     $annexe['label']
10785     )
10786     );
10787     }
10788     // Construction de la liste des annexes
10789     $valNotif[$champ] = sprintf(
10790     $htmlList,
10791     $listeAnnexe
10792     );
10793     }
10794 softime 10814 }
10795 softime 10808 }
10796     array_push($valSuivi, $valNotif);
10797     }
10798    
10799     // Passage du tableau au format json
10800     return json_encode($valSuivi, JSON_HEX_APOS);
10801     }
10802    
10803 softime 10573 /**
10804     * Traitement des erreurs retournées par l'abstracteur electronicsignature.
10805     *
10806     * @param electronicsignature_exception $exception Exception retournée par l'abstracteur.
10807     *
10808     * @return void
10809     */
10810     public function handle_electronicsignature_exception(electronicsignature_exception $exception) {
10811 softime 18769 $this->correct = false;
10812     $this->addToMessage($exception->getMessage());
10813 softime 10573 }
10814    
10815    
10816     /**
10817     * Retourne une instance du connecteur electronicsignature, et la créer si elle n'existe pas.
10818     *
10819     * @param boolean $with_handle_error Flag pour afficher ou non le message d'erreur à l'utilisateur.
10820     * @return electronicsignature Instance de l'abstracteur.
10821     */
10822     public function get_electronicsignature_instance($with_handle_error = true) {
10823     if(isset($this->electronicsignature_instance)) {
10824     return $this->electronicsignature_instance;
10825     }
10826     // Instanciation du connecteur electronicsignature
10827     try {
10828     require_once "electronicsignature.class.php";
10829     $collectivites = array("collectivite_idx" => $this->get_dossier_instruction_om_collectivite(), "collectivite_multi_idx" => $this->f->get_idx_collectivite_multi());
10830 softime 18876 $extra_params = array(
10831     "inst_framework" => $this->f,
10832     );
10833     $this->electronicsignature_instance = new electronicsignature($collectivites, $extra_params);
10834 softime 10573 } catch (electronicsignature_exception $e) {
10835     if ($with_handle_error === true) {
10836     $this->handle_electronicsignature_exception($e);
10837     }
10838     return false;
10839     }
10840     return $this->electronicsignature_instance;
10841     }
10842    
10843     /**
10844 softime 11418 * TREATMENT - envoyer_au_controle_de_legalite
10845     *
10846     * Ajoute la tâche envoi_CL.
10847     * C'est le traitement de la tâche qui mettra à jour la date d'envoi au contrôle de légalité.
10848     *
10849     * @return [type] [description]
10850     */
10851     function envoyer_au_controle_de_legalite() {
10852     $this->begin_treatment(__METHOD__);
10853     $this->correct = true;
10854    
10855     //
10856 softime 18876 if ($this->can_be_sent_to_cl() === true) {
10857 softime 11418 // Création de la task 'envoi_CL'
10858     $inst_task = $this->f->get_inst__om_dbform(array(
10859     "obj" => "task",
10860     "idx" => 0,
10861     ));
10862     $task_val = array(
10863     'type' => 'envoi_CL',
10864     'object_id' => $this->getVal('instruction'),
10865     'dossier' => $this->getVal('dossier'),
10866     );
10867     // Change l'état de la tâche de notification en fonction de l'état de
10868     // transmission du dossier d'instruction
10869     $inst_di = $this->get_inst_dossier($this->getVal('dossier'));
10870     if ($this->f->is_option_mode_service_consulte_enabled() === false
10871 softime 19307 && ($inst_di->getVal('etat_transmission_platau') == 'non_transmissible'
10872 softime 11418 || $inst_di->getVal('etat_transmission_platau') == 'transmis_mais_non_transmissible')) {
10873     //
10874 softime 18436 $task_val['state'] = task::STATUS_DRAFT;
10875 softime 11418 }
10876     $add_task = $inst_task->add_task(array('val' => $task_val));
10877     if ($add_task === false) {
10878     $this->addToMessage(sprintf('%s %s',
10879     __("Une erreur s'est produite lors de la création tâche."),
10880     __("Veuillez contacter votre administrateur.")
10881     ));
10882     $this->correct = false;
10883     return $this->end_treatment(__METHOD__, false);
10884     }
10885     // Mise à jour du champs 'envoye_cl_platau'
10886     $instr_val = array(
10887     'envoye_cl_platau' => 't',
10888     );
10889     $res = $this->f->db->autoExecute(
10890     DB_PREFIXE.$this->table,
10891     $instr_val,
10892     DB_AUTOQUERY_UPDATE,
10893     $this->getCle($this->getVal($this->clePrimaire))
10894     );
10895 softime 18876 $this->addToLog(__METHOD__."(): db->autoexecute(\"".DB_PREFIXE.'.'.$this->table."\", ".print_r($instr_val, true).", DB_AUTOQUERY_UPDATE, \"".$this->getCle($this->getVal($this->clePrimaire))."\");", VERBOSE_MODE);
10896 softime 11418 if ($this->f->isDatabaseError($res, true) === true) {
10897     $this->addToMessage(sprintf('%s %s',
10898     __("Une erreur s'est produite lors de la mise à jour de l'instruction."),
10899     __("Veuillez contacter votre administrateur.")
10900     ));
10901     $this->correct = false;
10902     return $this->end_treatment(__METHOD__, false);
10903     }
10904     // Message de validation à l'utilisateur
10905     $this->addToMessage(__('Votre demande de transfert au contrôle de légalité à bien été prise en compte.'));
10906     $this->addToMessage(__("La date d'envoi au contrôle de légalité sera mise à jour ultérieurement."));
10907     }
10908     //
10909     return $this->end_treatment(__METHOD__, true);
10910     }
10911    
10912    
10913     /**
10914 softime 8593 * Retourne le lien de retour (VIEW formulaire et VIEW sousformulaire).
10915     *
10916     * @param string $view Appel dans le contexte de la vue 'formulaire' ou de
10917     * la vue 'sousformulaire'.
10918     *
10919     * @return string
10920     */
10921     function get_back_link($view = "formulaire") {
10922     //
10923     $href = parent::get_back_link($view);
10924     //
10925     $crud = $this->get_action_crud();
10926 mbroquet 3730
10927 softime 8593 // Redirection vers le formulaire de modification à la validation du
10928     // formulaire d'ajout si l'événement associé possède une lettre type
10929     if (($crud === 'create'
10930     || ($crud === null
10931     && $this->getParameter('maj') == 0))
10932     && $this->correct == true
10933     && $this->evenement_has_an_edition($this->valF['evenement']) === true) {
10934 softime 7996
10935 softime 8593 // On instancie l'instruction
10936     $inst_instruction = $this->f->get_inst__om_dbform(array(
10937     "obj" => "instruction",
10938     "idx" => $this->valF[$this->clePrimaire],
10939     ));
10940    
10941     // Si l'instruction n'est pas finalisée automatiquement
10942     if ($inst_instruction->getVal('om_final_instruction') !== 't') {
10943     $href = str_replace("&action=3", "&action=1", $href);
10944     //
10945     if (strpos($href, "&retour=tab") !== false) {
10946     $href = str_replace("&retour=tab", "&retour= form", $href);
10947     } else {
10948     $href .= "&retour=form";
10949     }
10950     }
10951     }
10952    
10953     //
10954     return $href;
10955     }
10956    
10957 softime 10573 public function view_json_data() {
10958     $this->checkAccessibility();
10959     $this->f->disableLog();
10960     $view = $this->get_json_data();
10961     printf(json_encode($view));
10962     }
10963    
10964     public function get_json_data() {
10965     $val = array_combine($this->champs, $this->val);
10966     foreach ($val as $key => $value) {
10967     $val[$key] = strip_tags($value);
10968     }
10969     $val['tacite'] = 'f';
10970     $inst_ad = $this->f->get_inst__om_dbform(array(
10971     "obj" => "avis_decision",
10972     "idx" => $val['avis_decision'],
10973     ));
10974     if (preg_match('/[tT]acite/', $inst_ad->getVal('libelle')) === 1) {
10975     $val['tacite'] = 't';
10976     }
10977     return $val;
10978     }
10979    
10980 softime 13528 /**
10981     * Permet de récupérer l'identifiant de l'instruction sur le dossier, ayant
10982     * comme événement lié le suivant définit dans l'événement de l'instruction
10983     * instanciée.
10984     *
10985     * @param string $next_type Correspond aux trois déclenchement automatique
10986     * de création d'instruction paramétré sur un événement.
10987     * @param integer $instruction Identifiant de l'instruction à instancier.
10988     * @return mixed Identifiant de l'instruction recherchée ou false.
10989     */
10990 softime 11418 public function get_related_instructions_next($next_type = 'retour_signature', $instruction = null) {
10991     if (in_array($next_type, array('retour_signature', 'retour_ar', 'suivant_tacite', )) === false) {
10992     return false;
10993     }
10994     $result = array();
10995     $evenements = array();
10996     if ($instruction === null) {
10997     $instruction = $this->getVal($this->clePrimaire);
10998     $evenement = $this->getVal('evenement');
10999     $dossier = $this->getVal('dossier');
11000     } else {
11001     $inst = $this->f->get_inst__om_dbform(array(
11002     "obj" => "instruction",
11003     "idx" => $instruction,
11004     ));
11005     $evenement = $inst->getVal('evenement');
11006     $dossier = $inst->getVal('dossier');
11007     }
11008 softime 13528 // Récupération de l'identifiant de l'événement paramétré comme suivant
11009     // sur l'instruction instanciée
11010 softime 13137 $qres = $this->f->get_one_result_from_db_query(
11011     sprintf(
11012     'SELECT
11013     evenement_%3$s
11014     FROM
11015     %1$sevenement
11016     WHERE
11017     evenement = %2$s',
11018     DB_PREFIXE,
11019     intval($evenement),
11020     $next_type
11021     ),
11022     array(
11023     "origin" => __METHOD__,
11024     "force_return" => true,
11025     )
11026 softime 11418 );
11027 softime 13137 if ($qres["code"] !== "OK") {
11028 softime 11418 return false;
11029     }
11030 softime 13137 $ev_next = $qres["result"];
11031 softime 13528 // Récupération de l'instruction dans le dossier utilisant l'événement
11032     // suivant identifié dans la requête précédente
11033     $qres = $this->f->get_one_result_from_db_query(
11034 softime 13137 sprintf(
11035     'SELECT
11036     MAX(instruction.instruction) as instruction
11037     FROM
11038     %1$sinstruction
11039     WHERE
11040     dossier = \'%3$s\'
11041     AND evenement = %2$s',
11042     DB_PREFIXE,
11043     intval($ev_next),
11044 softime 14064 $this->f->db->escapeSimple($dossier)
11045 softime 13137 ),
11046     array(
11047     "origin" => __METHOD__,
11048     "force_return" => true,
11049     )
11050 softime 11418 );
11051 softime 13137 if ($qres["code"] !== "OK") {
11052 softime 11418 return false;
11053     }
11054 softime 13137 return $qres["result"];
11055 softime 11418 }
11056    
11057 softime 10573 public function get_related_instructions($instruction = null) {
11058     $result = array();
11059     $evenements = array();
11060     if ($instruction === null) {
11061     $instruction = $this->getVal($this->clePrimaire);
11062     $evenement = $this->getVal('evenement');
11063     $dossier = $this->getVal('dossier');
11064     } else {
11065     $inst = $this->f->get_inst__om_dbform(array(
11066     "obj" => "instruction",
11067     "idx" => $instruction,
11068     ));
11069     $evenement = $inst->getVal('evenement');
11070     $dossier = $inst->getVal('dossier');
11071     }
11072     //
11073 softime 13137 $qres = $this->f->get_one_result_from_db_query(
11074     sprintf(
11075     'SELECT
11076     evenement
11077     FROM
11078     %1$sevenement
11079     WHERE
11080     evenement_retour_ar = %2$s
11081     OR evenement_retour_signature = %2$s',
11082     DB_PREFIXE,
11083     intval($evenement)
11084     ),
11085     array(
11086     "origin" => __METHOD__,
11087     "force_return" => true,
11088     )
11089 softime 10573 );
11090 softime 13137 if ($qres["code"] !== "OK") {
11091 softime 10573 return false;
11092     }
11093 softime 13137 $ev_parent = $qres["result"];
11094 softime 10573 //
11095 softime 13137 $qres = $this->f->get_one_result_from_db_query(
11096     sprintf(
11097     'SELECT
11098     MAX(instruction.instruction) as instruction
11099     FROM
11100     %1$sinstruction
11101     WHERE
11102     dossier = \'%3$s\'
11103     AND evenement = %2$s',
11104     DB_PREFIXE,
11105     intval($ev_parent),
11106     $this->f->db->escapeSimple($dossier)
11107     ),
11108     array(
11109     "origin" => __METHOD__,
11110     "force_return" => true,
11111     )
11112 softime 10573 );
11113 softime 13137 if ($qres["code"] !== "OK") {
11114 softime 10573 return false;
11115     }
11116 softime 13137 $result[] = $qres["result"];
11117 softime 10573 //
11118 softime 13137 $qres = $this->f->get_one_result_from_db_query(
11119     sprintf(
11120     'SELECT
11121     evenement_retour_ar
11122     FROM
11123     %1$sevenement
11124     WHERE
11125 softime 14542 evenement = %2$d
11126     AND evenement_retour_ar != %3$d',
11127 softime 13137 DB_PREFIXE,
11128     intval($ev_parent),
11129     intval($evenement)
11130     ),
11131     array(
11132     "origin" => __METHOD__,
11133     "force_return" => true,
11134     )
11135 softime 10573 );
11136 softime 13137 if ($qres["code"] !== "OK") {
11137 softime 10573 return false;
11138     }
11139 softime 13137 $evenements[] = $qres["result"];
11140 softime 10573 //
11141 softime 13137 $qres = $this->f->get_one_result_from_db_query(
11142     sprintf(
11143     'SELECT
11144     evenement_retour_signature
11145     FROM
11146     %1$sevenement
11147     WHERE
11148     evenement = %2$s
11149     AND evenement_retour_signature != %3$s
11150     ',
11151     DB_PREFIXE,
11152     intval($ev_parent),
11153     intval($evenement)
11154     ),
11155     array(
11156     "origin" => __METHOD__,
11157     "force_return" => true,
11158     )
11159 softime 10573 );
11160 softime 13137 if ($qres["code"] !== "OK") {
11161 softime 10573 return false;
11162     }
11163 softime 13137 $evenements[] = $qres["result"];
11164 softime 10573 foreach ($evenements as $value) {
11165     if ($value !== null) {
11166 softime 13137 $qres = $this->f->get_one_result_from_db_query(
11167     sprintf(
11168     'SELECT
11169     MAX(instruction.instruction) as instruction
11170     FROM
11171     %1$sinstruction
11172     WHERE
11173     dossier = \'%3$s\'
11174     AND evenement = %2$s',
11175     DB_PREFIXE,
11176     intval($value),
11177     $this->f->db->escapeSimple($dossier)
11178     ),
11179     array(
11180     "origin" => __METHOD__,
11181     "force_return" => true,
11182     )
11183 softime 10573 );
11184 softime 13137 if ($qres["code"] !== "OK") {
11185 softime 10573 return false;
11186     }
11187 softime 13137 $result[] = $qres["result"];
11188 softime 10573 }
11189     }
11190     return $result;
11191     }
11192    
11193     protected function getDocumentType($champ = null) {
11194     $evenementId = $this->getVal('evenement');
11195     if (! empty($evenementId)) {
11196     $evenement = $this->f->findObjectById('evenement', $evenementId);
11197     if (! empty($evenement)) {
11198     return __("Instruction").':'.$evenement->getVal('libelle');
11199     }
11200     }
11201     return parent::getDocumentType();
11202     }
11203    
11204 softime 10808 /**
11205     * Récupère à l'aide d'une requête sql la liste des demandeurs
11206     * pouvant être notifié. C'est à dire les demandeurs acceptant
11207     * les notifications et pour lesquels une adresse mail existe.
11208     *
11209     * Dans le cas, d'une notification pour le portail citoyen, seul
11210     * le pétitionnaire principal doit être notifier et uniquement si
11211     * il a une adress mail et qu'il accepte les notifications.
11212 softime 19307 *
11213 softime 10808 * @param string identifiant du dossier
11214     * @param boolean true si il faut récupérer la liste des demandeurs notifiable
11215     * pour une notification de categorie portail
11216     * @return array liste des demandeurs pouvant être notifié
11217     */
11218 softime 18436 public function get_demandeurs_notifiable($idDossier = null, $portail = false) {
11219 softime 10808 if ($idDossier === null) {
11220     $idDossier = $this->getVal('dossier');
11221     }
11222     // Ajoute une condition sur le where pour ne récupérer que le pétitionnaire principal
11223     // pour une notification depuis le portail citoyen
11224     $sqlPetitionnairePrincipal = '';
11225 softime 12124 // Gestion des champs nécessaires pour la notification d'un demandeur
11226     $condition_demandeur = "AND demandeur.notification = 't'
11227     AND demandeur.courriel IS NOT NULL";
11228 softime 10808 if ($portail === true) {
11229     $sqlPetitionnairePrincipal = 'AND lien_dossier_demandeur.petitionnaire_principal = true';
11230 softime 12124 $condition_demandeur = "AND (
11231     (notification = 't' AND courriel IS NOT NULL)
11232     OR demande.source_depot = 'portal'
11233     )";
11234 softime 10808 }
11235    
11236     $listeDemandeursNotifiable = array();
11237    
11238     // Requête de récupération des demandeurs
11239 softime 14542 $qres = $this->f->get_all_results_from_db_query(
11240     sprintf(
11241     'SELECT
11242     demandeur.demandeur,
11243     CASE
11244 softime 19307 WHEN demandeur.qualite=\'particulier\'
11245     THEN TRIM(CONCAT(demandeur.particulier_nom, \' \', demandeur.particulier_prenom, \' \', demandeur.courriel))
11246 softime 14542 ELSE
11247 softime 19307 TRIM(CONCAT(demandeur.personne_morale_raison_sociale, \' \', demandeur.personne_morale_denomination, \' \', demandeur.courriel))
11248 softime 14542 END AS destinataire,
11249     demandeur.courriel,
11250     petitionnaire_principal
11251     FROM
11252     %1$sdossier
11253     INNER JOIN %1$slien_dossier_demandeur
11254     ON dossier.dossier = lien_dossier_demandeur.dossier
11255     INNER JOIN %1$sdemandeur
11256     ON lien_dossier_demandeur.demandeur = demandeur.demandeur
11257     -- Récupération de la plus ancienne demande associée au dossier (la demande
11258     -- de création du dossier)
11259     INNER JOIN (
11260     SELECT
11261     demande,
11262     dossier_instruction,
11263     source_depot
11264     FROM
11265     %1$sdemande
11266     WHERE
11267     dossier_instruction = \'%2$s\'
11268     ORDER BY
11269     demande ASC
11270     LIMIT 1
11271     ) as demande
11272     ON dossier.dossier = demande.dossier_instruction
11273     WHERE
11274     dossier.dossier = \'%2$s\'
11275     %3$s
11276     %4$s',
11277     DB_PREFIXE,
11278     $this->f->db->escapeSimple($idDossier),
11279     $condition_demandeur,
11280     $sqlPetitionnairePrincipal
11281     ),
11282     array(
11283     "origin" => __METHOD__
11284     )
11285 softime 10808 );
11286     // Récupération des infos des demandeurs et stockage dans un tableau
11287     // ayant pour clé les id des demandeurs
11288 softime 14542 foreach ($qres['result'] as $row) {
11289 softime 10869 $listeDemandeursNotifiable[$row['demandeur']] = $row;
11290 softime 10808 }
11291    
11292     return $listeDemandeursNotifiable;
11293     }
11294    
11295     /**
11296     * Renvoie la liste des notifications liées à l'instruction
11297     *
11298     * @param integer id de l'instruction dont on cherche les notifications
11299     * @return array liste des instruction_notification liés à l'instruction
11300     */
11301 softime 12124 public function get_instruction_notification($id_instruction, $typeNotification = null, $nonLieTache = false) {
11302 softime 18436 // Compose la clause définissant dans la requête le type de tâche attendus
11303     $clause_type_tache = '';
11304 softime 11585 if ($typeNotification != null) {
11305     if (is_array($typeNotification)) {
11306 softime 18436 $clause_type_tache = sprintf(
11307     'AND task.type IN (\'%1$s\')',
11308     implode("', '", $typeNotification),
11309 softime 11585 );
11310     } else {
11311 softime 18436 $clause_type_tache = sprintf(
11312     'AND task.type = \'%1$s\'',
11313 softime 15037 $typeNotification
11314 softime 11585 );
11315     }
11316     }
11317 softime 18436
11318     // Récupère les notifications liées à des tâches du type voulu et les stocke dans un tableau
11319 softime 14542 $qres = $this->f->get_all_results_from_db_query(
11320     sprintf('
11321     SELECT
11322     instruction_notification.instruction_notification
11323     FROM
11324     %1$sinstruction_notification
11325 softime 18436 INNER JOIN %1$stask
11326 softime 14542 ON instruction_notification.instruction_notification::CHARACTER VARYING = task.object_id
11327 softime 18436 %3$s
11328 softime 14542 WHERE
11329 softime 15037 instruction = %2$s',
11330 softime 14542 DB_PREFIXE,
11331     intval($id_instruction),
11332 softime 18436 $clause_type_tache
11333 softime 14542 ),
11334     array(
11335 softime 18436 "origin" => __METHOD__,
11336     'log_level' => DEBUG_MODE
11337 softime 14542 )
11338 softime 10808 );
11339 softime 18436 $listeInstrNotif = array();
11340 softime 14542 foreach ($qres['result'] as $row) {
11341 softime 10808 $listeInstrNotif[] = $row['instruction_notification'];
11342     }
11343 softime 18436
11344     // Défini si on veux que la requête récupère également les notifications qui n'ont pas
11345     // de tâches associées. C'est le cas pour les notifications de demandeurs lorsque la
11346     // notification du demandeur principal n'a pas pu être envoyée à cause d'un mauvais
11347     // paramétrage
11348     if(is_bool($nonLieTache) && $nonLieTache === true) {
11349     $qres = $this->f->get_all_results_from_db_query(
11350     sprintf('
11351     SELECT
11352     instruction_notification.instruction_notification
11353     FROM
11354     %1$sinstruction_notification
11355     LEFT JOIN %1$stask
11356     ON instruction_notification.instruction_notification::CHARACTER VARYING = task.object_id
11357     AND task.type LIKE \'%%notification%%\'
11358     WHERE
11359     instruction = %2$s
11360     AND task.task IS NULL',
11361     DB_PREFIXE,
11362     intval($id_instruction)
11363     ),
11364     array(
11365     "origin" => __METHOD__
11366     )
11367     );
11368    
11369     foreach ($qres['result'] as $row) {
11370     $listeInstrNotif[] = $row['instruction_notification'];
11371     }
11372     }
11373    
11374 softime 10808 return $listeInstrNotif;
11375     }
11376    
11377     /**
11378     * Crée une clé d'accès unique permettant à un utilisateur
11379     * anonyme de récupérer le document.
11380     *
11381     * @return string clé d'accès du document
11382     */
11383 softime 18436 function getCleAccesDocument() {
11384 softime 10869 // Initialisation d'un tableau
11385     $number_list = array();
11386    
11387     // Génération aléatoire d'un nombre sur 4 caractères, 4 fois
11388 softime 19307 for ($i = 0; $i < 4; $i++) {
11389 softime 10869 $number_list[] = str_pad(mt_rand(0, 9999), 4, 0, STR_PAD_LEFT);
11390     }
11391    
11392     // Transformation en chaîne tout en séparant les nombres par un "-"
11393     $result = implode('-', $number_list);
11394    
11395     // Vérifie si la clé existe déjà et si c'est le cas génére une nouvelle clé
11396     if ($this->getUidDocumentInstructionWithKey($result) != null) {
11397     return $this->getCleAccesDocument();
11398     }
11399    
11400     //
11401     return $result;
11402 softime 10808 }
11403    
11404     /**
11405 softime 10869 * Récupère une clé et renvoie l'uid du document liée à cette
11406     * clé. Si la clé n'existe pas renvoie null.
11407 softime 19307 *
11408 softime 10869 * @param string $cleGen clé dont on cherche l'instruction
11409 softime 19307 * @return integer|null
11410 softime 10869 */
11411     protected function getUidDocumentInstructionWithKey($cleGen) {
11412 softime 14064 $qres = $this->f->get_one_result_from_db_query(
11413     sprintf(
11414     'SELECT
11415     instruction.om_fichier_instruction
11416 softime 19307 FROM
11417 softime 14064 %1$sinstruction_notification_document
11418     LEFT JOIN %1$sinstruction
11419     ON instruction_notification_document.instruction = instruction.instruction
11420 softime 19307 WHERE
11421 softime 14064 instruction_notification_document.cle = \'%2$s\'',
11422     DB_PREFIXE,
11423     $this->f->db->escapeSimple($cleGen)
11424 softime 19307 ),
11425 softime 14064 array(
11426     "origin" => __METHOD__,
11427     )
11428 softime 10869 );
11429 softime 19307
11430 softime 14064 return $qres['result'];
11431 softime 10869 }
11432    
11433     /**
11434     * Récupère une clé, fait une requête pour récupérer l'id de la notification liée a cette clé.
11435     * Récupère l'instance de instruction_notification dont l'id a été récupéré et la renvoie.
11436 softime 19307 *
11437 softime 10869 * @param string $cleGen
11438     * @return instruction_notification
11439     */
11440     protected function getInstanceNotificationWithKey($key) {
11441 softime 14064 $qres = $this->f->get_one_result_from_db_query(
11442     sprintf(
11443     'SELECT
11444     instruction_notification
11445 softime 19307 FROM
11446 softime 14064 %1$sinstruction_notification_document
11447 softime 19307 WHERE
11448 softime 14064 cle = \'%2$s\'',
11449     DB_PREFIXE,
11450     $this->f->db->escapeSimple($key)
11451 softime 19307 ),
11452 softime 14064 array(
11453     "origin" => __METHOD__,
11454     )
11455 softime 10869 );
11456    
11457     // Récupération de l'instance de notification
11458     $instNotif = $this->f->get_inst__om_dbform(array(
11459     "obj" => "instruction_notification",
11460 softime 14064 "idx" => $qres['result'],
11461 softime 10869 ));
11462     return $instNotif;
11463     }
11464    
11465    
11466     /**
11467 softime 10808 * Affiche la page de téléchargement du document de la notification.
11468     *
11469     * @param boolean $content_only Affiche le contenu seulement.
11470     *
11471     * @return void
11472     */
11473 softime 10869 public function view_telecharger_document_anonym() {
11474 softime 10808 // Par défaut on considère qu'on va afficher le formulaire
11475     $idx = 0;
11476     // Flag d'erreur
11477     $error = false;
11478     // Message d'erreur
11479     $message = '';
11480    
11481 softime 10869 // Paramètres GET : récupération de la clé d'accès
11482     $cle_acces_document = $this->f->get_submitted_get_value('key');
11483 softime 10808 $cle_acces_document = $this->f->db->escapeSimple($cle_acces_document);
11484 softime 10869 // Vérification de l'existence de la clé et récupération de l'uid du fichier
11485     $uidFichier = $this->getUidDocumentInstructionWithKey($cle_acces_document);
11486     if ($uidFichier != null) {
11487     // Récupération du document
11488     $file = $this->f->storage->get($uidFichier);
11489 softime 10808
11490 softime 10869 // Headers
11491     header("Cache-Control: no-cache, must-revalidate"); // HTTP/1.1
11492     header("Expires: Sat, 26 Jul 1997 05:00:00 GMT"); // Date dans le passé
11493     header("Content-Type: ".$file['metadata']['mimetype']);
11494     header("Accept-Ranges: bytes");
11495     header("Content-Disposition: inline; filename=\"".$file['metadata']['filename']."\";" );
11496     // Affichage du document
11497     echo $file['file_content'];
11498 softime 10808
11499 softime 10869 // Récupération de la date de premier accès et maj du suivi uniquement
11500     // si la date de 1er accès n'a pas encore été remplis
11501     $inst_notif = $this->getInstanceNotificationWithKey($cle_acces_document);
11502     if ($inst_notif->getVal('date_premier_acces') == null ||
11503     $inst_notif->getVal('date_premier_acces') == '') {
11504     $notif_val = array();
11505     foreach ($inst_notif->champs as $champ) {
11506     $notif_val[$champ] = $inst_notif->getVal($champ);
11507     }
11508     $notif_val['date_premier_acces'] = date("d/m/Y H:i:s");
11509     $notif_val['statut'] = 'vu';
11510     $notif_val['commentaire'] = 'Le document a été vu';
11511     $suivi_notif = $inst_notif->modifier($notif_val);
11512 softime 10808 }
11513    
11514     } else {
11515 softime 10869 // Page vide 404
11516     printf('Ressource inexistante');
11517     header('HTTP/1.0 404 Not Found');
11518 softime 10808 }
11519     }
11520    
11521 softime 11228 /**
11522     * Récupère le titre du document envoyé au parapheur
11523     */
11524 softime 10808 protected function getDocumentTitre($champ = null) {
11525     $title = $this->getTitle();
11526     $dossier = $this->getDossier();
11527     return $dossier.' '.$title;
11528     }
11529    
11530 softime 10869 /**
11531     * Surcharge permettant de ne pas afficher le fil d'Ariane dans
11532     * l'overlay de notification des demandeurs.
11533     */
11534     function getSubFormTitle($ent) {
11535 softime 11876 $actionSansPath = array('411', '420', '430');
11536     if (in_array($this->getParameter('maj'), $actionSansPath)) {
11537 softime 10869 return '';
11538     }
11539     return parent::getSubFormTitle($ent);
11540     }
11541 softime 19307
11542 softime 13137 /**
11543     * Traitement de la notification automatique des tiers consulté.
11544     *
11545     * Récupère la liste des adresses mails des tiers notifiables. Pour chaque adresses
11546     * récupérées ajoute une notification et une tâche de notification par mail.
11547     * La création de la tâche de notification par mail déclenchera l'envoi du mail
11548     * et la mise à jour du suivi.
11549     *
11550     * Les tiers notifiables sont ceux :
11551     * - n’ayant pas un ID PLAT’AU correspondant à l’ID PLAT’AU du service consultant
11552     * - ayant une habilitation dont le type est listé dans les paramètres de
11553     * notification de l’événement,
11554     * - intervenant sur la commune ou le département du dossier
11555     * - ayant au moins une adresse mail valide
11556     *
11557     * @param evenement instance de l'événement associée à l'instruction
11558     * @param dossier instance du dossier de l'instruction
11559     * @return boolean indique si le traitement à réussi
11560     */
11561 softime 18436 public function traitement_notification_automatique_tiers_consulte($evenement, $dossier) {
11562 softime 13137 // Récupération de l'identifiant plat'au du service consultant
11563     $consultationEntrante = $dossier->get_inst_consultation_entrante();
11564     // Récupération de la liste des types d'habilitations autorisées pour
11565     // cette notification
11566     $typesHabilitationsNotifiable = $evenement->get_types_habilitation_notifiable();
11567     // Récupération du département et de la commune du dossier
11568     $commune = $dossier->getVal('commune');
11569     // Le département est récupéré à partir de la commune du dossier donc si la
11570     // commune n'a pas pu être récupéré on ne récupère pas non plus le département.
11571     $idDepartement = null;
11572     if (! empty($commune)) {
11573     $departement = $dossier->get_inst_departement_dossier();
11574     $idDepartement = $departement->getVal($departement->clePrimaire);
11575     }
11576     // Récupération des courriels des tiers notifiables
11577     $tiersANotifier = $this->get_courriels_tiers_notifiable(
11578     $typesHabilitationsNotifiable,
11579     $consultationEntrante->getVal('service_consultant_id'),
11580     $commune,
11581     $idDepartement
11582     );
11583     // Traitement de chacune des listes de diffusion pour extraire les
11584     // courriels, vérifier la validité des courriels et envoyer la
11585     // notification
11586     $notificationSend = false;
11587     if (empty($tiersANotifier)) {
11588     $this->addToLog(
11589     sprintf(
11590 softime 14542 '%s() : %s %s : %s',
11591 softime 13137 __METHOD__,
11592     __("La récupération des tiers à échoué."),
11593     __('Paramétrage'),
11594     var_export(
11595     array(
11596     'types_habilitations_notifiable' => $typesHabilitationsNotifiable,
11597     'service_consultant' => $consultationEntrante->getVal('service_consultant_id'),
11598     'id_commune' => $commune,
11599     'id_departement' => $idDepartement
11600     ),
11601     true
11602     )
11603     ),
11604     DEBUG_MODE
11605     );
11606     return false;
11607     }
11608     foreach($tiersANotifier as $tierANotifier) {
11609     // Découpe la liste de diffusion pour stocker les adresses mails
11610     // des tiers dans un tableau
11611     $courriels =
11612     array_filter(
11613     array_map(
11614     'trim',
11615     preg_split("/\r\n|\n|\r/", $tierANotifier['liste_diffusion'])));
11616 softime 19307
11617 softime 13137 foreach ($courriels as $courriel) {
11618     // Pour chaque adresse mail vérifie si l'adresse est valide
11619     if (! $this->f->checkValidEmailAddress($courriel)) {
11620     continue;
11621     }
11622     $destinataire = array(
11623     'destinataire' => $tierANotifier['libelle'].' : '.$courriel,
11624     'courriel' => $courriel
11625     );
11626     // Si l'adresse est valide ajoute une nouvelle notification
11627     // et une tâche d'envoi de mails
11628     $idNotif = $this->ajouter_notification(
11629     $this->getVal($this->clePrimaire),
11630     $this->f->get_connected_user_login_name(),
11631     $destinataire,
11632     $this->get_dossier_instruction_om_collectivite(),
11633     array(),
11634     true
11635     );
11636     if ($idNotif === false) {
11637     $this->addToLog(
11638     __METHOD__.
11639     __("L'ajout de la notification a échoué."),
11640     DEBUG_MODE
11641     );
11642     return false;
11643     }
11644     // Création de la tache en lui donnant l'id de la notification
11645     $notification_by_task = $this->notification_by_task(
11646     $idNotif,
11647     $dossier->getVal('dossier'),
11648     'mail',
11649     'notification_tiers_consulte'
11650     );
11651     if ($notification_by_task === false) {
11652     $this->addToLog(
11653     __METHOD__.
11654     __("L'ajout de la tâche de notification a échoué."),
11655     DEBUG_MODE
11656     );
11657     $this->addToMessage(
11658     __("Erreur lors de la génération de la notification au(x) pétitionnaire(s).")
11659     );
11660     return false;
11661     }
11662     $notificationSend = true;
11663     }
11664     }
11665     // Si aucune notification n'a été envoyé car il n'y a pas de courriels
11666     // valide, affiche un message dans les logs pour avoir un suivi.
11667     if (! $notificationSend) {
11668     $this->addToLog(
11669     sprintf(
11670     '%s %s : %s %s : %s',
11671     __METHOD__,
11672     __("Il n'y a pas de tiers notifiable pour l'instruction"),
11673     $evenement->getVal('libelle'),
11674     __("du dossier"),
11675     $this->getVal('dossier')
11676     ),
11677     DEBUG_MODE
11678     );
11679     }
11680     return true;
11681     }
11682    
11683     /**
11684     * Récupère, à l'aide d'une requête, la liste de diffusion des tiers
11685     * respectant les conditions suvantes :
11686     * - le tiers consulté dois accepté les notifications
11687     * - la liste de diffusion ne dois pas être vide
11688     * - l'uid du tiers consulté ne dois pas être celui passé en paramètre
11689     * si pas d'uid passé en paramètre alors on ne filtre pas selon l'uid
11690     * du tiers
11691     * - le type d'habilitation des tiers dois appartenir à la liste
11692     * fournie en paramètre
11693     * - le tiers dois être associé à la commune ou au département passé
11694     * en paramètre
11695     *
11696     * @param array $typesHabilitations tableau contenant la liste des types d'habilitation
11697     * pouvant être notifiée
11698     * @param integer $idPlautau uid de l'acteur plat'au du dossier qui ne dois pas être notifié
11699     * @param integer $commune identifiant de la commune du dossier
11700     * @param integer $departement identifiant du département du dossier
11701     *
11702     * @return array listes de diffusion des tiers notifiable
11703     */
11704 softime 18436 public function get_courriels_tiers_notifiable(array $typesHabilitations, $idPlatau, $commune, $departement) {
11705 softime 13137 // Si paramètre non renseigné alors ne renvoie rien
11706     if (empty($typesHabilitations) || empty($commune) || empty($departement)) {
11707     return false;
11708     }
11709     // Si il n'y a pas d'acteur associé au dossier alors on ne filtre pas sur l'uid de l'acteur
11710     $filtreServiceConsulteDI = '';
11711     if (! empty($idPlatau)) {
11712     $filtreServiceConsulteDI = sprintf(
11713 softime 14064 "-- Filtre les tiers ayant une ligne correspondante a l uid platau du service
11714     -- en charge du dossier
11715     AND (tiers_consulte.uid_platau_acteur !~ ('\y' || '%s' || '\y')
11716     OR tiers_consulte.uid_platau_acteur IS NULL)",
11717 softime 13137 $this->f->db->escapeSimple($idPlatau)
11718     );
11719     }
11720     $rst = $this->f->get_all_results_from_db_query(
11721     sprintf(
11722     'SELECT
11723 softime 14064 -- Tiers notifiables lié à la commune du dossier
11724 softime 13137 tiers_consulte.liste_diffusion,
11725     tiers_consulte.libelle
11726     FROM
11727     %1$shabilitation_tiers_consulte
11728     LEFT JOIN %1$stiers_consulte
11729     ON habilitation_tiers_consulte.tiers_consulte = tiers_consulte.tiers_consulte
11730     LEFT JOIN %1$slien_habilitation_tiers_consulte_commune
11731     ON habilitation_tiers_consulte.habilitation_tiers_consulte = lien_habilitation_tiers_consulte_commune.habilitation_tiers_consulte
11732 softime 14064 -- Conservation uniquement des tiers acteur de dossiers
11733     JOIN %1$slien_dossier_tiers
11734     ON tiers_consulte.tiers_consulte = lien_dossier_tiers.tiers
11735     WHERE
11736     tiers_consulte.accepte_notification_email IS TRUE
11737     AND tiers_consulte.liste_diffusion IS NOT NULL
11738     %3$s
11739     AND habilitation_tiers_consulte.type_habilitation_tiers_consulte IN (%2$s)
11740     AND lien_habilitation_tiers_consulte_commune.commune = %4$d
11741     -- Filtre sur les tiers acteur du dossier
11742     AND lien_dossier_tiers.dossier = \'%6$s\'
11743     UNION
11744     SELECT
11745     -- Tiers notifiables lié au département du dossier
11746     tiers_consulte.liste_diffusion,
11747     tiers_consulte.libelle
11748     FROM
11749     %1$shabilitation_tiers_consulte
11750     LEFT JOIN %1$stiers_consulte
11751     ON habilitation_tiers_consulte.tiers_consulte = tiers_consulte.tiers_consulte
11752 softime 13137 LEFT JOIN %1$slien_habilitation_tiers_consulte_departement
11753     ON habilitation_tiers_consulte.habilitation_tiers_consulte = lien_habilitation_tiers_consulte_departement.habilitation_tiers_consulte
11754 softime 14064 -- Conservation uniquement des tiers acteur de dossiers
11755     JOIN %1$slien_dossier_tiers
11756     ON tiers_consulte.tiers_consulte = lien_dossier_tiers.tiers
11757 softime 13137 WHERE
11758     tiers_consulte.accepte_notification_email IS TRUE
11759     AND tiers_consulte.liste_diffusion IS NOT NULL
11760     %3$s
11761     AND habilitation_tiers_consulte.type_habilitation_tiers_consulte IN (%2$s)
11762 softime 14064 AND lien_habilitation_tiers_consulte_departement.departement = %5$d
11763     -- Filtre sur les tiers acteur du dossier
11764     AND lien_dossier_tiers.dossier = \'%6$s\'',
11765 softime 13137 DB_PREFIXE,
11766     implode(', ', $typesHabilitations),
11767     $filtreServiceConsulteDI,
11768     intval($commune),
11769 softime 14064 intval($departement),
11770     $this->f->db->escapeSimple($this->getVal('dossier'))
11771 softime 13137 ),
11772     array(
11773     "origin" => __METHOD__
11774     )
11775     );
11776 softime 14064 // Faire un order by sur un union ne fonctionne pas. A la place
11777     // c'est le tableau des résultats qui est ordonné.
11778     usort($rst['result'], function($a, $b) {
11779     return strcmp($a['libelle'], $b['libelle']);
11780     });
11781 softime 13137 return $rst['result'];
11782     }
11783 softime 17036
11784     /**
11785 softime 17542 * Gestion spécifique de l'affichage des documents dans le tableau des
11786     * documents d'instruction.
11787     * Prend en compte qu'une instruction peut également avoir un document lié
11788     * dans la table storage.
11789     *
11790     * @return void
11791 softime 17036 */
11792 softime 17542 public function view_telecharger_editions() {
11793     // Récupère l'identifiant du document dans l'URL appelant l'action
11794     $idx = $this->f->get_submitted_get_value('idx');
11795     $obj = $this->table;
11796     $champ = 'om_fichier_instruction';
11797     // Cas d'un document historisé (dans la table storage)
11798     if (strpos($idx, 'STORAGE_') !== false) {
11799     $idx = substr($idx, 8);
11800     $obj = 'storage';
11801     $champ = 'uid';
11802 softime 17036 }
11803 softime 17542 // Ouvre le document
11804     $lien = '../app/index.php?module=form&snippet=file&obj='.$obj.'&champ='.$champ.'&id='.$idx;
11805     header("Location: ".$lien);
11806     }
11807 softime 13137 }

Properties

Name Value
svn:keywords "Id"

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26