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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 18876 - (hide annotations)
Tue Oct 8 08:41:06 2024 UTC (3 months, 2 weeks ago) by softime
File size: 520364 byte(s)
merge: fusion de la branche d'intégration 6.8.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 mbroquet 3730
26     //
27     class instruction extends instruction_gen {
28    
29     // Champs contenant les UID des fichiers
30     var $abstract_type = array(
31     "om_fichier_instruction" => "file",
32     );
33 softime 8989
34 mbroquet 3730 var $valEvenement;
35     var $restriction_valid = null;
36     // Tableau contenant une partie des métadonnées arrêtés
37     var $metadonneesArrete;
38    
39 fmichon 3892 /**
40     * Instance de la classe dossier
41     *
42     * @var mixed
43     */
44     var $inst_dossier = null;
45    
46 softime 5169 /**
47     * Instance de la classe instructeur
48     *
49     * @var mixed
50     */
51     var $inst_instructeur = null;
52    
53     /**
54     * Instance de la classe om_utilisateur
55     *
56     * @var mixed
57     */
58     var $inst_om_utilisateur = null;
59    
60 mbroquet 3730 var $metadata = array(
61     "om_fichier_instruction" => array(
62     "dossier" => "getDossier",
63     "dossier_version" => "getDossierVersion",
64     "numDemandeAutor" => "getNumDemandeAutor",
65     "anneemoisDemandeAutor" => "getAnneemoisDemandeAutor",
66     "typeInstruction" => "getTypeInstruction",
67     "statutAutorisation" => "getStatutAutorisation",
68     "typeAutorisation" => "getTypeAutorisation",
69     "dateEvenementDocument" => "getDateEvenementDocument",
70     "groupeInstruction" => 'getGroupeInstruction',
71     "title" => 'getTitle',
72 softime 6272 'concerneERP' => 'get_concerne_erp',
73 softime 10573
74     'date_cloture_metier' => 'getDossierDateDecision',
75     'type' => 'getDocumentType',
76     'dossier_autorisation_type_detaille' => 'getDossierAutorisationTypeDetaille',
77     'dossier_instruction_type' => 'getDossierInstructionTypeLibelle',
78     'region' => 'getDossierRegion',
79     'departement' => 'getDossierDepartement',
80     'commune' => 'getDossierCommune',
81     'annee' => 'getDossierAnnee',
82     'division' => 'getDossierDivision',
83 softime 10808 'collectivite' => 'getDossierServiceOrCollectivite',
84 mbroquet 3730 ),
85     "arrete" => array(
86     "numArrete" => "getNumArrete",
87     "ReglementaireArrete" => "getReglementaireArrete",
88     "NotificationArrete" => "getNotificationArrete",
89     "dateNotificationArrete" => "getDateNotificationArrete",
90     "controleLegalite" => "getControleLegalite",
91     "dateSignature" => "getDateSignature",
92     "nomSignataire" => "getNomSignataire",
93     "qualiteSignataire" => "getQualiteSignataire",
94     "ap_numRue" => "getAp_numRue",
95     "ap_nomDeLaVoie" => "getAp_nomDeLaVoie",
96     "ap_codePostal" => "getAp_codePostal",
97     "ap_ville" => "getAp_ville",
98     "activite" => "getActivite",
99     "dateControleLegalite" => "getDateControleLegalite",
100 softime 10573 )
101 mbroquet 3730 );
102    
103 softime 9245 /**
104     * Flag pour identifier la reprise de l'instruction d'un dossier.
105     * Le statut de l'état passe de "cloture" à "encours".
106     *
107     * @var boolean
108     */
109     var $di_reopened = null;
110    
111 softime 17542 /**
112     * Méthode appelée par le module_manager lors de la récupération des modules de cet objet.
113     * Permet d'ajouer des modules en plus de ceux récupérer par défaut par le module_manager.
114     *
115 softime 18436 * @param bool $only_for_class Ne renvoie que les modules pour la classe de l'objet
116     *
117 softime 17542 * @return array Liste de modules supplémentaires pour cet objet
118     */
119 softime 18436 public function get_modules_append(bool $only_for_class = false) {
120 softime 17542 $modules = array();
121    
122 softime 18436 // si on est sur un dossier d'instruction
123     if ($this->f->contexte_dossier_instruction()) {
124     $idx = $this->f->get_submitted_get_value('idxformulaire');
125 softime 17542
126 softime 18436 $object_id = $this->getVal($this->clePrimaire);
127 softime 17542
128 softime 18436 $evenements_ids = array();
129    
130     // Dans le cas ou on a un identifiant de dossier et que
131     // l'objet courant n'a pas de cle primaire définie
132     // ou qu'on est dans le contexte d'une classe d'objet
133     if (! empty($idx) && (empty($object_id) || $only_for_class === true)) {
134    
135     // Utilise la valeur evenement si elle est déterminé,
136     $evenement = $this->f->get_submitted_post_value('evenement');
137     if (! empty($evenement)) $evenements_ids = array($evenement);
138     if (empty($evenements_ids)){
139     // si on est dans le cadre de l'affichage d'une nouvelle instruction
140     $action = $this->f->get_submitted_get_value('action');
141    
142     if ($action == '0') {
143    
144     // ajoute les modules des évènements possible sur le dossier courant
145     $evenements_data = $this->get_var_sql_forminc__sql_evenement();
146     $evenements_ids = array_column($evenements_data, 'evenement');
147     }
148    
149     // si on est dans le cadre d'un listing
150     else if (is_null($action) || $action === '') {
151    
152     // récupère la liste des évènements d'instructions du dossier d'instruction
153     $sql = sprintf("
154     SELECT
155     evenement
156     FROM
157     ".DB_PREFIXE."instruction
158     WHERE
159     dossier = '%s'
160     ", $this->f->db->escapeSimple($idx));
161     $qres = $this->f->get_all_results_from_db_query(
162     $sql, array('origin' => __METHOD__));
163     if ($qres['code'] !== 'OK') {
164     $err_msg = "Failed to execute SQL: $sql. Detail: ".($qres['message'] ?? '');
165     $this->f->log(__METHOD__, $err_msg, 'ERROR');
166     throw new RuntimeException($err_msg);
167     }
168    
169     // ajoute les modules des évènements des instructions du dossier courant
170     $evenements_ids = array_column($qres['result'], 'evenement');
171     }
172 softime 17542 }
173     }
174 softime 18436 if (!empty($evenements_ids)){
175     $this->f->log(__METHOD__, 'evenements: '.implode(',', $evenements_ids));
176     $modules = $this->f->module_manager->get_modules_for_object_name_and_ids(
177     'evenement', $evenements_ids, $this, false);
178     }
179 softime 17542 }
180     return $modules;
181     }
182    
183 mbroquet 3730 // {{{ Gestion de la confidentialité des données spécifiques
184    
185     /**
186     * Définition des actions disponibles sur la classe.
187     *
188     * @return void
189     */
190     function init_class_actions() {
191    
192     parent::init_class_actions();
193    
194     // ACTION - 000 - ajouter
195     // Modifie la condition d'affichage du bouton ajouter
196 softime 6565 $this->class_actions[0]["condition"] = array("is_addable", "can_user_access_dossier_contexte_ajout");
197 mbroquet 3730
198     // ACTION - 001 - modifier
199     // Modifie la condition et le libellé du bouton modifier
200 softime 6565 $this->class_actions[1]["condition"] = array(
201     "is_editable",
202     "is_finalizable_without_bypass",
203     "can_user_access_dossier_contexte_modification",
204 softime 10573 "is_evenement_modifiable",
205 softime 6565 );
206 softime 18876 $this->class_actions[1]["portlet"]["libelle"] = __("Modifier");
207 mbroquet 3730
208     // ACTION - 002 - supprimer
209     // Modifie la condition et le libellé du bouton supprimer
210 softime 6565 $this->class_actions[2]["condition"] = array(
211     "is_deletable",
212     "is_finalizable_without_bypass",
213 softime 10573 "can_user_access_dossier_contexte_modification",
214     "is_evenement_supprimable",
215 softime 6565 );
216 softime 18876 $this->class_actions[2]["portlet"]["libelle"] = __("Supprimer");
217 mbroquet 3730
218 softime 6565 // ACTION - 003 - consulter
219     //
220     $this->class_actions[3]["condition"] = "can_user_access_dossier_contexte_modification";
221    
222 mbroquet 3730 // ACTION - 100 - finaliser
223     // Finalise l'enregistrement
224     $this->class_actions[100] = array(
225     "identifier" => "finaliser",
226     "portlet" => array(
227     "type" => "action-direct",
228 softime 18876 "libelle" => __("Finaliser le document"),
229 mbroquet 3730 "order" => 110,
230     "class" => "finalise",
231     ),
232     "view" => "formulaire",
233     "method" => "finalize",
234     "button" => "finaliser",
235     "permission_suffix" => "finaliser",
236 softime 6565 "condition" => array(
237     "is_finalizable",
238     "is_finalizable_without_bypass",
239     "has_an_edition",
240     "can_user_access_dossier_contexte_modification",
241     ),
242 mbroquet 3730 );
243    
244     // ACTION - 110 - definaliser
245     // Finalise l'enregistrement
246     $this->class_actions[110] = array(
247     "identifier" => "definaliser",
248     "portlet" => array(
249     "type" => "action-direct",
250 softime 18876 "libelle" => __("Reprendre la redaction du document"),
251 mbroquet 3730 "order" => 110,
252     "class" => "definalise",
253     ),
254     "view" => "formulaire",
255     "method" => "unfinalize",
256     "button" => "definaliser",
257     "permission_suffix" => "definaliser",
258 softime 6565 "condition" => array(
259     "is_unfinalizable",
260     "is_unfinalizable_without_bypass",
261     "can_user_access_dossier_contexte_modification",
262 softime 10573 "is_not_sent_for_signature",
263 softime 15973 "is_not_signed",
264 softime 6565 ),
265 mbroquet 3730 );
266    
267 softime 13137 // ACTION - 115 - Modification d'un document généré par une instruction
268 softime 12847 // Permet à un instructeur de modifier un document généré par une instruction
269     $this->class_actions[115] = array(
270     "identifier" => "modale_selection_document_signe",
271     "portlet" => array(
272     "type" => "action-self",
273 softime 18876 "libelle" => __("Remplacer par le document signé"),
274 softime 12847 "order" => 115,
275     "class" => "selection-document-signé",
276     ),
277     "view" => "view_modale_selection_document_signe",
278     "permission_suffix" => "selection_document_signe",
279     "condition" => array(
280     "is_finalized",
281     "is_not_date_retour_signature_set",
282     ),
283     );
284    
285 mbroquet 3730 // ACTION - 120 - edition
286     // Affiche l'édition
287     $this->class_actions[120] = array(
288     "identifier" => "edition",
289     "portlet" => array(
290     "type" => "action-blank",
291 softime 18876 "libelle" => __("Edition"),
292 mbroquet 3730 "order" => 100,
293     "class" => "pdf-16",
294     ),
295     "view" => "view_edition",
296 softime 6565 "condition" => array("has_an_edition", "can_user_access_dossier_contexte_modification"),
297 mbroquet 3730 "permission_suffix" => "om_fichier_instruction_telecharger",
298     );
299    
300     // ACTION - 125 - modifier_suivi
301     // Suivi des dates
302     $this->class_actions[125] = array(
303     "identifier" => "modifier_suivi",
304     "portlet" => array(
305     "type" => "action-self",
306 softime 18876 "libelle" => __("Suivi des dates"),
307 mbroquet 3730 "order" => 125,
308     "class" => "suivi-dates-16",
309     ),
310     "crud" => "update",
311 softime 6565 "condition" => array("can_monitoring_dates", "can_user_access_dossier_contexte_modification"),
312 mbroquet 3730 "permission_suffix" => "modification_dates",
313     );
314    
315     // ACTION - 130 - bible
316     // Affiche la bible
317     $this->class_actions[130] = array(
318     "identifier" => "bible",
319     "view" => "view_bible",
320     "permission_suffix" => "modifier",
321     );
322    
323     // ACTION - 140 - bible_auto
324     // Active la bible automatique
325     $this->class_actions[140] = array(
326     "identifier" => "bible_auto",
327     "view" => "view_bible_auto",
328     "permission_suffix" => "modifier",
329     );
330    
331     // ACTION - 150 - suivi_bordereaux
332     // Imprimer un bordereau d'envoi
333     $this->class_actions[150] = array(
334     "identifier" => "suivi_bordereaux",
335     "view" => "view_suivi_bordereaux",
336     "permission_suffix" => "consulter",
337     );
338    
339     // ACTION - 160 - suivi_envoi_lettre_rar
340     // Imprimer un bordereau d'envoi
341     $this->class_actions[160] = array(
342     "identifier" => "suivi_envoi_lettre_rar",
343     "view" => "view_suivi_envoi_lettre_rar",
344     "permission_suffix" => "consulter",
345     );
346    
347     // ACTION - 170 - suivi_mise_a_jour_des_dates
348     // Mettre à jour les dates de l'instruction
349     $this->class_actions[170] = array(
350     "identifier" => "suivi_mise_a_jour_des_dates",
351     "view" => "view_suivi_mise_a_jour_des_dates",
352     "permission_suffix" => "consulter",
353     );
354    
355 softime 13528 // ACTION - 175 - edit_by_notification_task
356 softime 13137 // Action à utiliser lors de la mise à jour des instructions par notification
357     $this->class_actions[175] = array(
358 softime 13528 "identifier" => "edit_by_notification_task",
359 softime 13137 "view" => "formulaire",
360     "permission_suffix" => "modifier",
361     "crud" => "update",
362     );
363    
364 softime 14064 // ACTION - 176 - add_by_evenement_retour_after_notification_task
365     // Action à utiliser lors de l'ajout des instructions par événement suivant
366     // suite à une notification par tâche (donc notification dématerialisée)
367     $this->class_actions[176] = array(
368     "identifier" => "add_by_evenement_retour_after_notification_task",
369     "view" => "formulaire",
370     "permission_suffix" => "ajouter",
371     "crud" => "create",
372     );
373    
374 mbroquet 3730 // ACTION - 180 - pdf_lettre_rar
375 softime 8989 // Génère PDF sur bordereaux de lettres AR
376 mbroquet 3730 $this->class_actions[180] = array(
377     "identifier" => "pdf_lettre_rar",
378     "view" => "view_pdf_lettre_rar",
379     "permission_suffix" => "consulter",
380     );
381    
382     // ACTION - 190 - bordereau_envoi_maire
383     // Formulaire pour générer le bordereau d'envoi au maire
384     // Met à jour la date d'envoi à signature du maire
385     $this->class_actions[190] = array(
386     "identifier" => "bordereau_envoi_maire",
387     "view" => "view_bordereau_envoi_maire",
388     "permission_suffix" => "bordereau_envoi_maire",
389     );
390    
391     // ACTION - 200 - generate_bordereau_envoi_maire
392     // Génère PDF bordereau d'envoi au maire
393     $this->class_actions[200] = array(
394     "identifier" => "generate_bordereau_envoi_maire",
395     "view" => "view_generate_bordereau_envoi_maire",
396     "permission_suffix" => "bordereau_envoi_maire",
397     );
398 nmeucci 4108
399     // ACTION - 210 - notifier_commune
400     // Notifie la commune par mail d'un évément d'instruction finalisé
401     $this->class_actions[210] = array(
402     "identifier" => "notifier_commune",
403     "portlet" => array(
404     "type" => "action-direct-with-confirmation",
405 softime 18876 "libelle" => __("Notifier la commune par courriel"),
406 nmeucci 4108 "order" => 210,
407     "class" => "notifier_commune-16",
408     ),
409     "view" => "formulaire",
410     "method" => "notifier_commune",
411     "permission_suffix" => "notifier_commune",
412 softime 6565 "condition" => array("is_notifiable", "can_user_access_dossier_contexte_modification"),
413 nmeucci 4108 );
414 nmeucci 4317
415     // ACTION - 220 - generate_suivi_bordereaux
416     // GénÚre PDF bordereaux
417     $this->class_actions[220] = array(
418     "identifier" => "generate_suivi_bordereaux",
419     "view" => "view_generate_suivi_bordereaux",
420 softime 6565 "permission_suffix" => "consulter",
421     );
422 softime 7521
423     // ACTION - 777 - pdf_temp
424     // Crée un PDF temporaire et affiche son contenu en base64
425     $this->class_actions[777] = array(
426     "identifier" => "pdf_temp",
427     "view" => "view_pdf_temp",
428     "permission_suffix" => "modifier",
429     "condition" => array("can_user_access_dossier_contexte_modification"),
430     );
431 softime 8593
432     // ACTION - 701
433     $this->class_actions[701] = array(
434     "identifier" => "enable-edition-integrale",
435     "portlet" => array(
436     "type" => "action-direct-with-confirmation",
437 softime 18876 "libelle" => __("Rédaction libre"),
438 softime 8593 "order" => 50,
439     "class" => "redac-libre-16",
440     ),
441     "view" => "formulaire",
442     "method" => "enable_edition_integrale",
443     "permission_suffix" => "modifier",
444     "condition" => array(
445     "is_editable",
446     "is_finalizable_without_bypass",
447     "can_user_access_dossier_contexte_modification",
448     "is_edition_integrale_not_enabled",
449     "is_option_redaction_libre_enabled",
450     "has_an_edition",
451     ),
452     );
453     // ACTION - 702
454     $this->class_actions[702] = array(
455     "identifier" => "disable-edition-integrale",
456     "portlet" => array(
457     "type" => "action-direct-with-confirmation",
458 softime 18876 "libelle" => __("Rédaction par compléments"),
459 softime 8593 "order" => 50,
460     "class" => "redac-complement-16",
461     ),
462     "view" => "formulaire",
463     "method" => "disable_edition_integrale",
464     "permission_suffix" => "modifier",
465     "condition" => array(
466     "is_editable",
467     "is_finalizable_without_bypass",
468     "can_user_access_dossier_contexte_modification",
469     "is_edition_integrale_enabled",
470     "is_option_redaction_libre_enabled",
471     "has_an_edition",
472     ),
473     );
474     // ACTION - 300 - evenement_has_an_edition_json
475     //
476     $this->class_actions[300] = array(
477     "identifier" => "evenement_has_an_edition_json",
478     "view" => "view_evenement_has_an_edition_json",
479     "permission_suffix" => "consulter",
480     );
481 softime 10573
482     // ACTION - 301 - evenement_has_a_commentaire
483     //
484     $this->class_actions[301] = array(
485     "identifier" => "evenement_has_a_commentaire_json",
486     "view" => "view_evenement_has_a_commentaire_json",
487     "permission_suffix" => "consulter",
488     );
489    
490     // ACTION - 400 - Envoyer en signature
491     // Cet évenement permet d'envoyer le document au parapheur pour signature
492     $this->class_actions[400] = array(
493     "identifier" => "envoyer_a_signature",
494     "portlet" => array(
495 softime 18876 "libelle" => __("Envoyer à signature"),
496 softime 10573 "type" => "action-direct-with-confirmation",
497     "class" => "envoyer_a_signature-16",
498     ),
499     "view" => "formulaire",
500 softime 10713 "method" => "envoyer_a_signature_sans_relecture",
501 softime 10573 "condition" => array(
502     "can_be_signed",
503     ),
504     "permission_suffix" => "envoyer_a_signature",
505     );
506    
507 softime 10713 // ACTION - 402 - Envoyer en signature avec relecture
508     // Cet évenement permet d'envoyer le document au parapheur pour signature
509     $this->class_actions[402] = array(
510     "identifier" => "envoyer_a_signature_relecture",
511     "portlet" => array(
512     "libelle" => __("Envoyer à signature avec relecture"),
513     "type" => "action-direct-with-confirmation",
514     "class" => "envoyer_a_signature-16",
515     ),
516     "view" => "formulaire",
517     "method" => "envoyer_a_signature_avec_relecture",
518     "condition" => array(
519     "can_be_signed",
520 softime 10808 "is_parapheur_relecture_parameter_enabled"
521 softime 10713 ),
522     "permission_suffix" => "envoyer_a_signature",
523     );
524    
525 softime 11876 // ACTION - 404 - Annuler l'envoi en signature
526     // Cet évenement permet d'annuler l'envoi en signature du document au parapheur
527     $this->class_actions[404] = array(
528     "identifier" => "annuler_envoi_signature",
529     "portlet" => array(
530     "libelle" => __("Annuler l'envoi en signature"),
531     "type" => "action-direct-with-confirmation",
532     "class" => "annuler_envoi_signature-16",
533     ),
534     "view" => "formulaire",
535     "method" => "annuler_envoi_en_signature",
536     "condition" => array(
537 softime 12124 "is_sent_for_signature",
538 softime 11876 "is_parapheur_annulation_parameter_enabled"
539     ),
540     "permission_suffix" => "envoyer_a_signature",
541     );
542    
543 softime 10573 //
544     $this->class_actions[401] = array(
545     "identifier" => "preview_edition",
546     "view" => "formulaire",
547     "permission_suffix" => "tab",
548     );
549    
550 softime 17036 //
551     $this->class_actions[405] = array(
552     "identifier" => "telecharger_editions",
553     "view" => "view_telecharger_editions",
554     "permission_suffix" => "om_fichier_instruction_telecharger",
555     );
556    
557 softime 10808 // ACTION - 410 - Notifier les pétitionnaires (mail ou autre)
558     $this->class_actions[410] = array(
559     "identifier" => "overlay_notification_manuelle",
560     "portlet" => array(
561     "libelle" => __("Notifier les pétitionnaires"),
562     "type" => "action-self",
563     "class" => "notifier_commune-16",
564     ),
565     "condition" => array(
566     "is_notifiable_by_task_manual",
567 softime 10869 "is_not_portail_notification_sans_annexe"
568 softime 10808 ),
569     "view" => "view_overlay_notification_manuelle",
570     "permission_suffix" => "modifier",
571     );
572    
573 softime 11585 // ACTION - 411 - Notifier les pétitionnaires (portail citoyen)
574 softime 10808 $this->class_actions[411] = array(
575     "identifier" => "notification_manuelle_portal",
576     "portlet" => array(
577     "libelle" => __("Notifier les pétitionnaires"),
578     "type" => "action-direct-with-confirmation",
579     "class" => "notifier_commune-16",
580     ),
581     "condition" => array(
582     "is_notifiable_by_task_manual",
583 softime 10869 "is_portail_notification_sans_annexe"
584 softime 10808 ),
585 softime 14542 "method" => "notifier_demandeur_principal_via_portal",
586 softime 10808 "permission_suffix" => "modifier",
587     );
588    
589 softime 17542 // ACTION - 412 - Vérifie le dépassement de la date limite de notification
590     $this->class_actions[412] = array(
591     "identifier" => "is_date_limite_notification_dossier_depasse",
592     "view" => "is_date_limite_notification_dossier_depasse",
593     "permission_suffix" => "modifier",
594     );
595    
596 softime 11585 // ACTION - 420 - Notifier les services consultés (mail)
597     $this->class_actions[420] = array(
598     "identifier" => "overlay_notification_service_consulte",
599     "portlet" => array(
600     "libelle" => __("Notifier les services consultés"),
601     "type" => "action-self",
602     "class" => "notifier_commune-16",
603     ),
604     "condition" => array(
605     "is_service_notifiable"
606     ),
607     "view" => "view_overlay_notification_service_consulte",
608     "permission_suffix" => "tab",
609     );
610    
611     // ACTION - 430 - Notifier les tiers consultés (mail)
612     $this->class_actions[430] = array(
613     "identifier" => "overlay_notification_tiers_consulte",
614     "portlet" => array(
615     "libelle" => __("Notifier les tiers consultés"),
616     "type" => "action-self",
617     "class" => "notifier_commune-16",
618     ),
619     "condition" => array(
620     "is_tiers_notifiable"
621     ),
622     "view" => "view_overlay_notification_tiers_consulte",
623     "permission_suffix" => "tab",
624     );
625    
626 softime 10573 //
627 softime 11418 $this->class_actions[403] = array(
628     "identifier" => "envoyer_au_controle_de_legalite",
629     "portlet" => array(
630     "libelle" => __("Envoyer au contrôle de légalité"),
631     "type" => "action-direct-with-confirmation",
632     "class" => "envoyer_au_controle_de_legalite-16",
633     ),
634     "view" => "formulaire",
635     "method" => "envoyer_au_controle_de_legalite",
636     "condition" => array(
637 softime 18876 "can_be_sent_to_cl"
638 softime 11418 ),
639     "permission_suffix" => "envoyer_au_controle_de_legalite",
640     );
641    
642     //
643 softime 10573 $this->class_actions[998] = array(
644     "identifier" => "json_data",
645     "view" => "view_json_data",
646     "permission_suffix" => "consulter",
647     );
648 mbroquet 3730 }
649    
650 softime 8593 /**
651 softime 8989 * Clause select pour la requête de sélection des données de l'enregistrement.
652     *
653     * @return array
654     */
655     function get_var_sql_forminc__champs() {
656     return array(
657     "instruction",
658     "destinataire",
659     "instruction.evenement",
660 softime 10573 "instruction.commentaire",
661 softime 8989 "date_evenement",
662 softime 18436 "document_type_instruction",
663     "fichier_instruction_name",
664 softime 8989 "instruction.lettretype",
665     "signataire_arrete",
666     "flag_edition_integrale",
667     "om_final_instruction_utilisateur",
668     "date_finalisation_courrier",
669     "date_envoi_signature",
670 softime 15973 "date_retour_signature",
671 softime 8989 "date_envoi_rar",
672    
673     "date_retour_rar",
674 softime 15973 "date_envoi_controle_legalite",
675 softime 8989 "date_retour_controle_legalite",
676    
677     "numero_arrete",
678    
679     "complement_om_html",
680     "'' as bible_auto",
681     "'' as bible",
682     "complement2_om_html",
683     "'' as bible2",
684     "complement3_om_html",
685     "'' as bible3",
686     "complement4_om_html",
687     "'' as bible4",
688    
689     "titre_om_htmletat",
690     "corps_om_htmletatex",
691    
692     "'' as btn_preview",
693     "'' as btn_redaction",
694    
695     "'' as btn_refresh",
696     "'' as live_preview",
697    
698     "dossier",
699     "instruction.action",
700     "instruction.delai",
701     "instruction.etat",
702     "instruction.autorite_competente",
703     "instruction.accord_tacite",
704     "instruction.delai_notification",
705     "instruction.avis_decision",
706     "archive_delai",
707     "archive_accord_tacite",
708     "archive_etat",
709     "archive_avis",
710     "archive_date_complet",
711     "archive_date_rejet",
712     "archive_date_limite",
713     "archive_date_notification_delai",
714     "archive_date_decision",
715     "archive_date_validite",
716     "archive_date_achevement",
717     "archive_date_conformite",
718     "archive_date_chantier",
719     "archive_date_dernier_depot",
720     "date_depot",
721 softime 10573 "date_depot_mairie",
722 softime 8989 "complement5_om_html",
723     "'' as bible5",
724     "complement6_om_html",
725     "'' as bible6",
726     "complement7_om_html",
727     "'' as bible7",
728     "complement8_om_html",
729     "'' as bible8",
730     "complement9_om_html",
731     "'' as bible9",
732     "complement10_om_html",
733     "'' as bible10",
734     "complement11_om_html",
735     "'' as bible11",
736     "complement12_om_html",
737     "complement13_om_html",
738     "complement14_om_html",
739     "complement15_om_html",
740     "archive_incompletude",
741     "archive_incomplet_notifie",
742     "archive_evenement_suivant_tacite",
743     "archive_evenement_suivant_tacite_incompletude",
744     "archive_etat_pendant_incompletude",
745     "archive_date_limite_incompletude",
746     "archive_delai_incompletude",
747     "archive_autorite_competente",
748     "code_barres",
749     "om_fichier_instruction",
750     "om_final_instruction",
751     "om_fichier_instruction_dossier_final",
752     "document_numerise",
753     "duree_validite_parametrage",
754     "duree_validite",
755     "created_by_commune",
756     "archive_date_cloture_instruction",
757     "archive_date_premiere_visite",
758     "archive_date_derniere_visite",
759     "archive_date_contradictoire",
760     "archive_date_retour_contradictoire",
761     "archive_date_ait",
762     "archive_date_transmission_parquet",
763     "archive_dossier_instruction_type",
764     "archive_date_affichage",
765 softime 10573 "pec_metier",
766     "archive_pec_metier",
767     "archive_a_qualifier",
768     "id_parapheur_signature",
769     "statut_signature",
770     "commentaire_signature",
771     "historique_signature",
772 softime 10808 "'' as suivi_notification",
773 softime 11585 "'' as suivi_notification_service",
774     "'' as suivi_notification_tiers",
775 softime 12654 "'' as suivi_notification_commune",
776 softime 10573
777     "'' as preview_edition",
778 softime 11418 "envoye_cl_platau",
779 softime 15037 "'' as log_instruction",
780     "parapheur_lien_page_signature"
781 softime 8989 );
782     }
783    
784     /**
785 softime 8593 * CONDITION - is_edition_integrale_enabled
786     *
787     * Vérifie que la rédaction libre est activée sur l'instruction en cours.
788     *
789     * @return boolean
790     */
791     function is_edition_integrale_enabled() {
792     if ($this->getVal("flag_edition_integrale") == 't') {
793     return true;
794     }
795     return false;
796     }
797 mbroquet 3730
798     /**
799 softime 8593 * CONDITION - is_edition_integrale_not_enabled
800     *
801     * Vérifie que la rédaction libre est désactivée sur l'instruction en cours.
802     *
803     * @return boolean
804     */
805     function is_edition_integrale_not_enabled() {
806     return !$this->is_edition_integrale_enabled();
807     }
808    
809     /**
810     * CONDITION - is_option_redaction_libre_enabled
811     *
812     * Vérifie que l'option de rédaction libre est activée.
813     *
814     * @return boolean
815     */
816     function is_option_redaction_libre_enabled() {
817     $collectivite_di = $this->get_dossier_instruction_om_collectivite();
818     return $this->f->is_option_redaction_libre_enabled($collectivite_di);
819     }
820    
821     /**
822 softime 10713 * CONDITION - is_option_parapheur_relecture_enabled
823     *
824     * Vérifie que l'option de relecture lors de l'envoi en signature est activée.
825     *
826     * @return boolean
827     */
828 softime 10808 function is_parapheur_relecture_parameter_enabled() {
829     //Instanciation de la classe electronicsignature
830     $inst_es = $this->get_electronicsignature_instance();
831     if ($inst_es === false) {
832     return false;
833     }
834    
835     if ($inst_es->get_conf('is_forced_view_files') !== 'true' && $inst_es->get_conf('is_forced_view_files') !== true) {
836     return false;
837     }
838    
839     return true;
840 softime 10713 }
841    
842 softime 11876 /**
843     * CONDITION - is_parapheur_annulation_parameter_enabled
844     *
845     * Vérifie que l'option d'annulation de l'envoi en signature est activée.
846     *
847     * @return boolean
848     */
849     function is_parapheur_annulation_parameter_enabled() {
850     //Instanciation de la classe electronicsignature
851     $inst_es = $this->get_electronicsignature_instance();
852     if ($inst_es === false) {
853     return false;
854     }
855 softime 10713
856 softime 11876 if ($inst_es->get_conf('cancel_send') !== 'true' && $inst_es->get_conf('cancel_send') !== true) {
857     return false;
858     }
859    
860     return true;
861     }
862    
863    
864 softime 10713 /**
865 softime 10573 * CONDITION - is_sent_for_signature
866     *
867     * Vérifie que l'instruction a été envoyé à signature
868     *
869     * @return boolean
870     */
871     function is_sent_for_signature() {
872     // Si un parapheur a été configuré
873     // et que le champ id_parapheur_signature n'est pas vide
874     // que le status est différent de "canceled" ou "expired"
875     // alors l'évènement a été envoyé en signature
876     if ($this->has_connector_electronicsignature() === true
877     && empty($this->getVal("id_parapheur_signature")) === false
878     && ($this->getVal("statut_signature") != "canceled"
879 softime 12124 && $this->getVal("statut_signature") != "expired"
880     && $this->getVal("statut_signature") != "finished")) {
881 softime 10573 //
882     return true;
883     }
884    
885     return false;
886     }
887    
888     /**
889     * CONDITION - is_not_sent_for_signature
890     *
891     * Vérifie que l'instruction n'a pas été envoyé à signature
892     *
893     * @return boolean
894     */
895     function is_not_sent_for_signature() {
896 softime 10968 // Contrôle si l'utilisateur possède un bypass
897     $bypass = $this->f->isAccredited($this->get_absolute_class_name()."_definaliser_bypass");
898     if ($bypass == true) {
899     return true;
900     }
901    
902 softime 10573 return !$this->is_sent_for_signature();
903     }
904    
905    
906     /**
907     * CONDITION - is_signed
908     *
909     * Vérifie que l'instruction a été signé
910     *
911     * @return boolean
912     */
913     function is_signed() {
914     // Si un parapheur a été configuré
915     // et que le champ id_parapheur_signature n'est pas vide
916     // et que le statut est égal à "finished"
917     // alors le document de l'instruciton à été signé
918     if ($this->has_connector_electronicsignature() === true
919     && empty($this->getVal("id_parapheur_signature")) === false
920     && $this->getVal("statut_signature") == "finished") {
921     //
922     return true;
923     }
924    
925     return false;
926     }
927    
928 softime 15973 /**
929     * CONDITION - is_signed
930     *
931     * Vérifie que l'instruction n'a pas été signée
932     *
933     * @return boolean
934     */
935     function is_not_signed() {
936     // Contrôle si l'utilisateur possède un bypass
937     $bypass = $this->f->isAccredited($this->get_absolute_class_name()."_definaliser_apres_signature");
938     if ($bypass == true) {
939     return true;
940     }
941 softime 11876
942 softime 15973 return !$this->is_signed();
943     }
944    
945    
946 softime 12433 /**
947     * is_sent_to_cl
948     *
949     * Vérifie que l'instruction a été envoyé au contrôle de légalité
950     *
951     * @return boolean
952     */
953 softime 11418 function is_sent_to_cl() {
954 softime 12433 // Si la case à cocher de l'instruction envoye_cl_platau est à "t"
955     if ($this->getVal('envoye_cl_platau') === 't') {
956     //
957     return true;
958 softime 11418 }
959     //
960     return false;
961     }
962    
963 softime 10808 /**
964     * CONDITION - is_portail_notification
965     *
966     * Vérifie si la notification est une notification de catégorie portail
967     *
968     * @return boolean
969     */
970 softime 10869 function is_portail_notification_sans_annexe() {
971 softime 10808 $collectiviteDi = $this->get_dossier_instruction_om_collectivite();
972 softime 10869 $ev = $this->get_inst_evenement($this->getVal('evenement'));
973 softime 14064 if ($this->f->get_param_option_notification($collectiviteDi) === PORTAL
974 softime 10869 && $ev->getVal('notification') != 'notification_manuelle_annexe'
975     && $ev->getVal('notification') != 'notification_manuelle_annexe_signature_requise'
976     ) {
977 softime 10808 return true;
978     }
979     return false;
980     }
981 softime 10573
982     /**
983 softime 10808 * CONDITION - is_not_portail_notification
984     *
985     * Vérifie si la notification n'est pas une notification de catégorie portail
986     *
987     * @return boolean
988     */
989 softime 10869 function is_not_portail_notification_sans_annexe() {
990     return (! $this->is_portail_notification_sans_annexe());
991 softime 10808 }
992    
993     /**
994 softime 10573 * CONDITION - can_be_signed
995     *
996     * Vérifie que le document de l'instruction peut être envoyé au parapheur pour signature
997     *
998     * @return boolean
999     */
1000     function can_be_signed() {
1001     // Instanciation de l'objet signataire_arrete
1002     $inst_signataire_arrete = $this->f->get_inst__om_dbform(array(
1003     "obj" => "signataire_arrete",
1004     "idx" => $this->getVal("signataire_arrete"),
1005     ));
1006     // Si un parapheur a été configuré, que le document est finalisé, que le signataire
1007     // possède une adresse email, on vérifie le champ id_parapheur_signature
1008     // S'il est vide l'évènement peut être envoyé en signature
1009     // S'il ne l'est pas, alors on vérifie le champ statut_signature
1010     // Si la valeur de ce champ est égal à "canceled" ou "expired"
1011     // alors l'évènement peut être envoyé en signature
1012     if ($this->has_connector_electronicsignature() === true
1013     && $this->getVal("om_final_instruction") == 't'
1014     && empty($inst_signataire_arrete->getVal('email')) === false) {
1015     //
1016     if (empty($this->getVal("id_parapheur_signature")) === true
1017     || $this->getVal("statut_signature") == "canceled"
1018     || $this->getVal("statut_signature") == "expired") {
1019     //
1020     return true;
1021     }
1022     }
1023    
1024     $this->addToLog(__METHOD__."() has_connector_electronicsignature: ".var_export($this->has_connector_electronicsignature(), true), EXTRA_VERBOSE_MODE);
1025     $this->addToLog(__METHOD__."() om_final_instruction: ".var_export($this->getVal("om_final_instruction"), true), EXTRA_VERBOSE_MODE);
1026     $this->addToLog(__METHOD__."() email: ".var_export($inst_signataire_arrete->getVal('email'), true), EXTRA_VERBOSE_MODE);
1027     $this->addToLog(__METHOD__."() id_parapheur_signature: ".var_export($this->getVal("id_parapheur_signature"), true), EXTRA_VERBOSE_MODE);
1028     $this->addToLog(__METHOD__."() statut_signature: ".var_export($this->getVal("statut_signature"), true), EXTRA_VERBOSE_MODE);
1029    
1030     return false;
1031     }
1032    
1033     /**
1034     * CONDITION - has_connector_electronicsignature
1035     *
1036     * Vérifie qu'un parapheur est paramétré
1037     *
1038     * @return boolean
1039     */
1040     function has_connector_electronicsignature() {
1041     $inst_es = $this->get_electronicsignature_instance(false);
1042     if ($inst_es === false) {
1043     return false;
1044     }
1045     return true;
1046     }
1047    
1048     /**
1049     * CONDITION - can_display_parapheur
1050     *
1051     * Vérifie que le fieldset "Suivi Parapheur" soit affichable
1052     *
1053     * @return boolean
1054     */
1055     function can_display_parapheur() {
1056     $evenement_id = $this->getVal("evenement");
1057     $inst_evenement = $this->get_inst_evenement($evenement_id);
1058     if ($this->has_connector_electronicsignature() === true
1059     && $inst_evenement->getVal('lettretype') !== ''
1060     && $inst_evenement->getVal('lettretype') !== null
1061     && (empty($this->getVal("id_parapheur_signature")) === false
1062     || empty($this->getVal("historique_signature")) === false)) {
1063     //
1064     return true;
1065     }
1066    
1067     return false;
1068     }
1069    
1070     /**
1071 softime 10808 * CONDITION - can_display_notification
1072     *
1073 softime 11585 * Vérifie que le champs "Suivi notification" est affichable
1074 softime 10808 *
1075     * @return boolean
1076     */
1077 softime 11585 function can_display_notification_demandeur() {
1078 softime 18436 // Le suivi des notification est affiché si l'instruction a
1079     // des notifications de demandeurs associées
1080     $idsNotifs = $this->get_instruction_notification(
1081     $this->getVal($this->clePrimaire),
1082     array(
1083     'notification_recepisse',
1084     'notification_instruction',
1085     'notification_decision',
1086     ),
1087     true
1088     );
1089     return isset($idsNotifs) && $idsNotifs !== array();
1090 softime 10808 }
1091    
1092     /**
1093 softime 11585 * CONDITION - can_display_notification
1094     *
1095     * Vérifie que le champs "suivi_notification_service" est affichable
1096     *
1097     * @return boolean
1098     */
1099     function can_display_notification_service() {
1100     // Le suivi des notification est affiché si l'événement est notifiable
1101     // et si des notifications ont été envoyées
1102     $evenement_id = $this->getVal("evenement");
1103     $inst_evenement = $this->get_inst_evenement($evenement_id);
1104     if ($this->get_boolean_from_pgsql_value($inst_evenement->getVal('notification_service')) == true) {
1105     // Des notifications ont été envoyé si il existe au moins une notification
1106     // de type notification_service_consulte liées à l'instruction
1107     $idsNotifs = $this->get_instruction_notification(
1108     $this->getVal($this->clePrimaire),
1109     'notification_service_consulte'
1110     );
1111     if (isset($idsNotifs) && $idsNotifs !== array()) {
1112     return true;
1113     }
1114     }
1115     return false;
1116     }
1117    
1118    
1119     /**
1120     * CONDITION - can_display_notification_tiers
1121     *
1122     * Vérifie que le champs "suivi_notification_tiers" est affichable
1123     *
1124     * @return boolean
1125     */
1126     function can_display_notification_tiers() {
1127 softime 18436 // Le suivi des notification est affiché si l'instruction a
1128     // des notifications de tiers associées
1129     $idsNotifs = $this->get_instruction_notification(
1130     $this->getVal($this->clePrimaire),
1131     'notification_tiers_consulte'
1132     );
1133     return isset($idsNotifs) && $idsNotifs !== array();
1134 softime 11585 }
1135    
1136     /**
1137 softime 12654 * CONDITION - can_display_notification_commune
1138     *
1139     * Vérifie que le champs "suivi_notification_commune" est affichable
1140     *
1141     * @return boolean
1142     */
1143     function can_display_notification_commune() {
1144     // Le suivi des notification si il existe au moins une notification
1145     // de type notification_depot_demat liées à l'instruction
1146     $idsNotifs = $this->get_instruction_notification(
1147     $this->getVal($this->clePrimaire),
1148     array('notification_depot_demat', 'notification_commune')
1149     );
1150     if (isset($idsNotifs) && $idsNotifs !== array()) {
1151     return true;
1152     }
1153     return false;
1154     }
1155    
1156     /**
1157 softime 8593 * TREATMENT - disable_edition_integrale.
1158     *
1159     * Cette methode permet de passer la consultation en "lu"
1160     *
1161     * @return boolean true si maj effectué false sinon
1162     */
1163     function disable_edition_integrale() {
1164     // Cette méthode permet d'exécuter une routine en début des méthodes
1165     // dites de TREATMENT.
1166     $this->begin_treatment(__METHOD__);
1167     $this->correct = true;
1168     $valF = array(
1169     "flag_edition_integrale" => false,
1170     "titre_om_htmletat" => null,
1171     "corps_om_htmletatex" => null,
1172     );
1173     $res = $this->f->db->autoExecute(
1174     DB_PREFIXE.$this->table,
1175     $valF,
1176     DB_AUTOQUERY_UPDATE,
1177     $this->clePrimaire."=".$this->getVal($this->clePrimaire)
1178     );
1179     if ($this->f->isDatabaseError($res, true)) {
1180     // Appel de la methode de recuperation des erreurs
1181     $this->erreur_db($res->getDebugInfo(), $res->getMessage(), '');
1182     $this->correct = false;
1183     // Termine le traitement
1184     return $this->end_treatment(__METHOD__, false);
1185     } else {
1186 softime 18876 $this->addToMessage(__("Rédaction par compléments activé."));
1187 softime 8593 return $this->end_treatment(__METHOD__, true);
1188     }
1189    
1190     // Termine le traitement
1191     return $this->end_treatment(__METHOD__, false);
1192     }
1193    
1194     /**
1195     * TREATMENT - enable_edition_integrale.
1196     *
1197     * Cette methode permet de passer la consultation en "lu"
1198     *
1199     * @return boolean true si maj effectué false sinon
1200     */
1201     function enable_edition_integrale() {
1202     // Cette méthode permet d'exécuter une routine en début des méthodes
1203     // dites de TREATMENT.
1204     $this->begin_treatment(__METHOD__);
1205     $this->correct = true;
1206    
1207     // Récupère la collectivite du dossier d'instruction
1208     $dossier_instruction_om_collectivite = $this->get_dossier_instruction_om_collectivite();
1209     $collectivite = $this->f->getCollectivite($dossier_instruction_om_collectivite);
1210     //
1211     $params = array(
1212     "specific" => array(
1213     "corps" => array(
1214     "mode" => "get",
1215     )
1216     ),
1217     );
1218     $result = $this->compute_pdf_output('lettretype', $this->getVal('lettretype'), $collectivite, null, $params);
1219     $corps = $result['pdf_output'];
1220     //
1221     $params = array(
1222     "specific" => array(
1223     "titre" => array(
1224     "mode" => "get",
1225     )
1226     ),
1227     );
1228     $result = $this->compute_pdf_output('lettretype', $this->getVal('lettretype'), $collectivite, null, $params);
1229     $titre = $result['pdf_output'];
1230     //
1231     $valF = array(
1232     "flag_edition_integrale" => true,
1233     "titre_om_htmletat" => $titre,
1234     "corps_om_htmletatex" => $corps,
1235     );
1236     $res = $this->f->db->autoExecute(
1237     DB_PREFIXE.$this->table,
1238     $valF,
1239     DB_AUTOQUERY_UPDATE,
1240     $this->clePrimaire."=".$this->getVal($this->clePrimaire)
1241     );
1242     if ($this->f->isDatabaseError($res, true)) {
1243     // Appel de la methode de recuperation des erreurs
1244     $this->erreur_db($res->getDebugInfo(), $res->getMessage(), '');
1245     $this->correct = false;
1246     // Termine le traitement
1247     return $this->end_treatment(__METHOD__, false);
1248     } else {
1249 softime 18876 $this->addToMessage(__("Rédaction libre activé."));
1250 softime 8593 return $this->end_treatment(__METHOD__, true);
1251     }
1252    
1253     // Termine le traitement
1254     return $this->end_treatment(__METHOD__, false);
1255     }
1256    
1257     /**
1258 softime 14064 * Cette méthode instancie le dossier à partir de l'identifiant passé
1259     * en paramètre et renvoie l'identifiant du dossier d'autorisation (DA)
1260     * associé au dossier.
1261     * Si l'identifiant du dossier n'est pas fourni alors cette méthode
1262     * renverra NULL
1263     *
1264     * @param string identifiant du dossier
1265     * @return null|string null ou identifiant du DA
1266 mbroquet 3730 */
1267     function getNumDemandeAutorFromDossier($id) {
1268     if (!isset($id)) {
1269     return NULL;
1270     }
1271 softime 14064
1272     $dossier = $this->f->get_inst__om_dbform(array(
1273     'obj' => 'dossier',
1274     'idx' => $id,
1275     ));
1276    
1277     return $dossier->getVal('dossier_autorisation');
1278 mbroquet 3730 }
1279    
1280 softime 18436
1281     /**
1282     * Cette méthode permet de récupérer le libelle du type de document
1283     * en instanciant l'objet document_type.
1284     *
1285     * Un évènement peux avoir ou non un type de document, et si c'est le cas,
1286     * on le récupère pour l'afficher.
1287     *
1288     * @return string|NULL Retourne le libelle du type de document ou vide
1289     */
1290     function get_type_document_linked_with_instruction(){
1291     //
1292     $document_type = $this->f->get_inst__om_dbform(array(
1293     'obj' => 'document_type',
1294     'idx' => $this->getVal("document_type_instruction"),
1295     ));
1296     if ($document_type->exists() === true) {
1297     return $document_type->getVal("libelle");
1298     }
1299     return NULL;
1300     }
1301    
1302 softime 14064
1303 mbroquet 3730 function setType(&$form, $maj) {
1304 softime 17542 $data = array('form' => &$form, 'maj' => &$maj);
1305     $this->f->module_manager->run_hooks('setType_pre', $this, $data);
1306    
1307 softime 8593 // Récupération du mode de l'action
1308     $crud = $this->get_action_crud($maj);
1309     // Récupère la collectivité du dossier d'instruction
1310     $collectivite_di = $this->get_dossier_instruction_om_collectivite();
1311 mbroquet 3730
1312 softime 8593 // Cache tous les champs
1313     foreach ($this->champs as $value) {
1314     $form->setType($value, 'hidden');
1315     }
1316 softime 6565
1317 softime 10573 // Les champs historique_signature et statut_signature ne sont pas saisissable dans tous les cas
1318 softime 11228 if ($this->can_display_parapheur() === true && $maj == 3) {
1319 softime 10573 $form->setType('statut_signature', 'selectstatic');
1320     $form->setType('historique_signature', 'jsontotab');
1321     if ($this->getVal('commentaire_signature') == null) {
1322     $form->setType('commentaire_signature', 'hidden');
1323     } else {
1324     $form->setType('commentaire_signature', 'hiddenstatic');
1325     }
1326     }
1327    
1328 softime 11585 // Le champ de suivi des notifications des demandeurs n'est pas affichable dans tous les cas
1329 softime 12654 if ($maj == 3 && $this->can_display_notification_demandeur() === true) {
1330 softime 10808 $form->setType('suivi_notification', 'jsontotab');
1331     }
1332 softime 11585 // Le champ de suivi des notifications des services n'est pas affichable dans tous les cas
1333 softime 12654 if ($maj == 3 && $this->can_display_notification_service() === true) {
1334 softime 11585 $form->setType('suivi_notification_service', 'jsontotab');
1335     }
1336     // Le champ de suivi des notifications des tiers n'est pas affichable dans tous les cas
1337 softime 12654 if ($maj == 3 && $this->can_display_notification_tiers() === true) {
1338 softime 11585 $form->setType('suivi_notification_tiers', 'jsontotab');
1339     }
1340 softime 12654 // Le champ de suivi des notifications des communes n'est pas affichable dans tous les cas
1341     if ($maj == 3 && $this->can_display_notification_commune() === true) {
1342     $form->setType('suivi_notification_commune', 'jsontotab');
1343     }
1344 softime 10808
1345 softime 8593 // MODE AJOUTER
1346     if ($this->getParameter('maj') == 0) {
1347 softime 10573 $form->setType('commentaire', 'textareahidden');
1348     // Si l'option est active passage du champ date en lecture seule
1349     if ($this->f->is_option_date_evenement_instruction_lecture_seule($collectivite_di) === true) {
1350     $form->setType("date_evenement", "hiddenstaticdate");
1351     } else {
1352     $form->setType("date_evenement", "date");
1353     }
1354 softime 8989 if ($this->is_in_context_of_foreign_key("evenement", $this->getParameter("retourformulaire"))) {
1355 softime 8593 $form->setType("evenement", "selecthiddenstatic");
1356     } else {
1357     $form->setType("evenement", "select");
1358     }
1359 softime 8989 if ($this->is_in_context_of_foreign_key("signataire_arrete", $this->getParameter("retourformulaire"))) {
1360 softime 8593 $form->setType("signataire_arrete", "selecthiddenstatic");
1361     } else {
1362     $form->setType("signataire_arrete", "select");
1363     }
1364     if ($this->is_option_redaction_libre_enabled() === true) {
1365     $form->setType("flag_edition_integrale", "select");
1366     }
1367 mbroquet 3730 }
1368    
1369 softime 8593 // MODE MODIFIER
1370     if ($this->getParameter('maj') == 1) {
1371 softime 10573 // Si l'option est active passage du champ date en lecture seule
1372     if ($this->f->is_option_date_evenement_instruction_lecture_seule($collectivite_di) === true) {
1373     $form->setType("date_evenement", "hiddenstaticdate");
1374     } else {
1375     $form->setType("date_evenement", "date");
1376     }
1377 softime 8593 $form->setType("evenement", "selecthiddenstatic");
1378     if ($this->has_an_edition() === true) {
1379 softime 18436 $form->setType('document_type_instruction', 'selecthiddenstatic');
1380 softime 8593 $form->setType('lettretype', 'hiddenstatic');
1381 softime 8989 if ($this->is_in_context_of_foreign_key("signataire_arrete", $this->getParameter("retourformulaire"))) {
1382 softime 8593 $form->setType("signataire_arrete", "selecthiddenstatic");
1383     } else {
1384     $form->setType("signataire_arrete", "select");
1385     }
1386     if ($this->getVal("flag_edition_integrale") == "t") {
1387     $form->setType("titre_om_htmletat", "htmlEtat");
1388     $form->setType("corps_om_htmletatex", "htmlEtatEx");
1389     } else {
1390     $form->setType("complement_om_html", "html");
1391     $form->setType("complement2_om_html", "html");
1392     $form->setType("complement3_om_html", "html");
1393     $form->setType("complement4_om_html", "html");
1394     $form->setType('bible_auto', 'httpclick');
1395     $form->setType('bible', 'httpclick');
1396     $form->setType('bible2', 'httpclick');
1397     $form->setType('bible3', 'httpclick');
1398     $form->setType('bible4', 'httpclick');
1399     }
1400     if ($this->f->is_option_preview_pdf_enabled($collectivite_di) === true) {
1401     //
1402     $form->setType('btn_refresh', 'httpclickbutton');
1403     $form->setType('btn_preview', 'httpclickbutton');
1404     $form->setType('btn_redaction', 'httpclickbutton');
1405 softime 11876 // /!\ le type du champs est utilisé dans un selecteur dans le jscript.js
1406     // pour identifiant le champ de prévisualisation et régler sa taille à
1407     // l'affichage du champ. En cas de modification, le selecteur doit également
1408     // être mis à jour
1409 softime 11418 $form->setType('live_preview', 'previsualiser_pdf');
1410 softime 7521 }
1411 softime 8593
1412 mbroquet 3730 // necessaire pour calcul de date en modification
1413     //$form->setType('delai', 'hiddenstatic');
1414     // les administrateurs technique et fonctionnel peuvent
1415     // modifier tous les champs de date
1416     // si l'instruction a déjà été finalisée au moins une fois
1417 softime 7996 if (($this->f->isAccredited(array($this->get_absolute_class_name(), $this->get_absolute_class_name()."modification_dates"), "OR")
1418 softime 6565 || $this->f->isAccredited(array('instruction', 'instruction_modification_dates'), "OR"))
1419 mbroquet 3730 && $this->getVal("date_finalisation_courrier") != '') {
1420 softime 8593 //
1421 mbroquet 3730 $form->setType('date_envoi_signature', 'date');
1422     $form->setType('date_retour_signature', 'date');
1423 softime 10573 if ($this->is_sent_for_signature() === true
1424     && $this->is_signed() === true) {
1425     //
1426     $form->setType("date_envoi_signature", "datereadonly");
1427     $form->setType("date_retour_signature", "datereadonly");
1428     }
1429 mbroquet 3730 $form->setType('date_envoi_rar', 'date');
1430     $form->setType('date_retour_rar', 'date');
1431     $form->setType('date_envoi_controle_legalite', 'date');
1432 softime 11418 if ($this->is_sent_to_cl() === true) {
1433 softime 12124 $form->setType("date_envoi_controle_legalite", "datedisabled");
1434 softime 11418 }
1435 mbroquet 3730 $form->setType('date_retour_controle_legalite', 'date');
1436     $form->setType('date_finalisation_courrier', 'date');
1437     }
1438     }
1439     }
1440    
1441 softime 10808 // MODE CONSULTER + SUPPRIMER + SUIVI DES DATES 125 + NOTIFICATION MANUELLE
1442 softime 8593 if ($this->getParameter('maj') == 3
1443     || $this->getParameter('maj') == 2
1444 softime 10808 || $this->getParameter('maj') == 125
1445     || $this->getParameter('maj') == 410) {
1446 softime 8593 //
1447     $form->setType("date_evenement", "datestatic");
1448     $form->setType("evenement", "selecthiddenstatic");
1449     if ($this->has_an_edition() === true) {
1450 softime 18436 $form->setType("document_type_instruction", "selecthiddenstatic");
1451 softime 8593 $form->setType('lettretype', 'hiddenstatic');
1452     $form->setType("signataire_arrete", "selecthiddenstatic");
1453     if ($this->getVal("om_final_instruction") == 't') {
1454     $form->setType('om_final_instruction_utilisateur', 'textareastatic');
1455     } else {
1456     $form->setType('om_final_instruction_utilisateur', 'hidden');
1457     }
1458     }
1459 softime 10573 if ($this->evenement_has_a_commentaire($this->getVal('evenement')) === true ) {
1460     $form->setType('commentaire', 'textareastatic');
1461     }
1462 mbroquet 3730 }
1463    
1464 softime 10808 // MODE CONSULTER + SUPPRIMER + NOTIFICATION MANUELLE
1465     if ($this->getParameter('maj') == 3
1466     || $this->getParameter('maj') == 2
1467     || $this->getParameter('maj') == 410) {
1468 softime 10573 // Si il n'y a pas de lettre type (edition) associé à l'événement
1469     // les dates de suivi ne sont pas affichée
1470 softime 8593 if ($this->has_an_edition() === true) {
1471 softime 10573 $form->setType('date_envoi_signature', 'datestatic');
1472     $form->setType('date_retour_signature', 'datestatic');
1473     $form->setType('date_envoi_rar', 'datestatic');
1474     $form->setType('date_retour_rar', 'datestatic');
1475     $form->setType('date_envoi_controle_legalite', 'datestatic');
1476     $form->setType('date_retour_controle_legalite', 'datestatic');
1477     $form->setType('date_finalisation_courrier', 'datestatic');
1478 softime 8593 if ($this->getVal("flag_edition_integrale") == "t") {
1479     $form->setType("titre_om_htmletat", "htmlstatic");
1480     $form->setType("corps_om_htmletatex", "htmlstatic");
1481     } else {
1482     $form->setType("complement_om_html", "htmlstatic");
1483     $form->setType("complement2_om_html", "htmlstatic");
1484     $form->setType("complement3_om_html", "htmlstatic");
1485     $form->setType("complement4_om_html", "htmlstatic");
1486     }
1487 mbroquet 3730 }
1488     }
1489 softime 8593
1490     // MODE SUIVI DES DATES 125
1491     if ($this->getParameter('maj') == 125) {
1492     $form->setType("date_evenement", "hiddenstaticdate");
1493     $form->setType('om_final_instruction_utilisateur', 'hiddenstatic');
1494     $form->setType('date_envoi_signature', 'date');
1495     $form->setType('date_retour_signature', 'date');
1496 softime 10573 if ($this->is_sent_for_signature() === true
1497     || $this->is_signed() === true) {
1498     //
1499     $form->setType("date_envoi_signature", "datereadonly");
1500     $form->setType("date_retour_signature", "datereadonly");
1501     }
1502 softime 8593 $form->setType('date_envoi_rar', 'date');
1503     $form->setType('date_retour_rar', 'date');
1504     $form->setType('date_envoi_controle_legalite', 'date');
1505 softime 11418 if ($this->is_sent_to_cl() === true) {
1506 softime 12124 $form->setType("date_envoi_controle_legalite", "datedisabled");
1507 softime 11418 }
1508 softime 8593 $form->setType('date_retour_controle_legalite', 'date');
1509     $form->setType('date_finalisation_courrier', 'date');
1510     }
1511 softime 10573
1512     if ($maj == 401) {
1513     foreach ($this->champs as $champ) {
1514     $form->setType($champ, 'hidden');
1515     }
1516 softime 11418 $form->setType('preview_edition', 'previsualiser');
1517 softime 10573 }
1518 softime 12124
1519     // Si l'instruction a été envoyé au contrôle de légalité et que la
1520     // tâche envoi_cl lié n'a pas encore été traité il faut indiquer à
1521     // l'utilisateur que l'envoi au cl est en cours de traitement.
1522 softime 18436 if ($this->is_sent_to_cl() === true
1523 softime 12124 && $maj == 3) {
1524 softime 18436 $form->setType("date_envoi_controle_legalite", "datestatic");
1525     if (empty($this->getVal('date_envoi_controle_legalite'))) {
1526     $form->setType("date_envoi_controle_legalite", "hiddenstatic");
1527     }
1528 softime 12124 }
1529 softime 18436 $data = array('form' => &$form, 'maj' => &$maj, 'collectivite_di' => $collectivite_di);
1530 softime 17542 $this->f->module_manager->run_hooks('setType_post', $this, $data);
1531 mbroquet 3730 }
1532    
1533 softime 8593 function setOnchange(&$form,$maj){
1534 softime 17542 $this->f->log(__METHOD__, 'BEGIN');
1535     $data = array('form' => &$form, 'maj' => &$maj);
1536     $this->f->module_manager->run_hooks('setOnchange_pre', $this, $data);
1537    
1538 softime 8593 parent::setOnchange($form,$maj);
1539    
1540     // MODE AJOUTER
1541     if ($this->getParameter('maj') == 0) {
1542 softime 10573 $form->setOnchange(
1543     "evenement",
1544     "manage_instruction_evenement_lettretype(this.value, '".addslashes($this->getParameter('idxformulaire'))."');
1545     manage_instruction_evenement_commentaire(this.value, '".addslashes($this->getParameter('idxformulaire'))."');"
1546     );
1547 softime 8593 }
1548 softime 17542
1549     $data = array('form' => &$form, 'maj' => &$maj);
1550     $this->f->module_manager->run_hooks('setOnchange_post', $this, $data);
1551     $this->f->log(__METHOD__, 'END');
1552 softime 8593 }
1553    
1554     function evenement_has_an_edition($evenement_id) {
1555     $evenement = $this->get_inst_evenement($evenement_id);
1556     $lettretype = $evenement->getVal('lettretype');
1557     if ($lettretype !== '' && $lettretype !== null) {
1558     return true;
1559     }
1560     return false;
1561     }
1562    
1563     function view_evenement_has_an_edition_json() {
1564     $json_return = array(
1565     "lettretype" => $this->evenement_has_an_edition($this->f->get_submitted_get_value('evenement_id')),
1566     "option_redaction_libre_enabled" => $this->is_option_redaction_libre_enabled(),
1567     );
1568     echo json_encode($json_return);
1569     }
1570    
1571 softime 10573 function evenement_has_a_commentaire($evenement_id) {
1572     $evenement = $this->get_inst_evenement($evenement_id);
1573     return $this->get_boolean_from_pgsql_value($evenement->getVal('commentaire'));
1574     }
1575    
1576     function view_evenement_has_a_commentaire_json() {
1577     $json_return = array(
1578     "commentaire" => $this->evenement_has_a_commentaire($this->f->get_submitted_get_value('evenement_id'))
1579     );
1580     echo json_encode($json_return);
1581     }
1582    
1583 softime 11418
1584 softime 8989 /**
1585 softime 18876 * CONDITION - can_be_sent_to_cl
1586 softime 8989 *
1587 softime 11418 * Vérifie que le contrôle de légalité est disponible
1588     *
1589     * @return boolean
1590     */
1591 softime 18876 function can_be_sent_to_cl() {
1592 softime 18436 $inst_evenement = $this->get_inst_evenement($this->getVal('evenement'));
1593    
1594     // Si événement est paramétré pour envoyer le contrôle de légalité
1595 softime 11418 // par Plat'AU
1596 softime 18436 if ($inst_evenement->getVal('envoi_cl_platau') === 't') {
1597 softime 11418 $inst_di = $this->get_inst_dossier($this->getVal('dossier'));
1598 softime 18436
1599     // S'il n'y a pas déjà eu un envoi au CL (flag envoye_cl_platau)
1600     // Que le type de dossier d'autorisation est transmissible à Plat'AU
1601     // Que l'état de transmission du dossier n'est pas en 'jamais_transmissible'
1602     if ($this->getVal('envoye_cl_platau') === 'f'
1603 softime 11418 && $this->f->is_type_dossier_platau($inst_di->getVal('dossier_autorisation')) === true
1604     && $inst_di->getVal('etat_transmission_platau') !== 'jamais_transmissible') {
1605 softime 18436
1606     // Si l'instruction n'a pas d'édition liée alors elle peut être envoyé au CL
1607     if ($this->has_an_edition() === false) {
1608     return true;
1609     }
1610    
1611     // Si l'instruction a une édition et que la date de retour signature est renseignée
1612     // et que la date d'envoi au contrôle légalité n'est pas renseignée alors on peut
1613     // envoyer l'instruction au CL
1614     if ($this->has_an_edition() === true
1615     && empty($this->getVal('date_retour_signature')) === false
1616     && empty($this->getVal('date_envoi_controle_legalite')) === true) {
1617    
1618     return true;
1619     }
1620 softime 11418 }
1621     }
1622     //
1623     return false;
1624     }
1625    
1626     /**
1627     *
1628 softime 8989 * @return string
1629     */
1630     function get_var_sql_forminc__sql_signataire_arrete() {
1631 softime 11585 return sprintf(
1632     "SELECT
1633     signataire_arrete.signataire_arrete,
1634     CONCAT_WS(
1635     ' - ',
1636     CONCAT_WS(' ', signataire_arrete.prenom, signataire_arrete.nom),
1637     signataire_habilitation.libelle,
1638     signataire_arrete.description
1639     )
1640     FROM
1641     %1\$ssignataire_arrete
1642     LEFT JOIN %1\$ssignataire_habilitation
1643     ON signataire_arrete.signataire_habilitation = signataire_habilitation.signataire_habilitation
1644     WHERE
1645     ((signataire_arrete.om_validite_debut IS NULL
1646     AND (signataire_arrete.om_validite_fin IS NULL
1647     OR signataire_arrete.om_validite_fin > CURRENT_DATE))
1648     OR (signataire_arrete.om_validite_debut <= CURRENT_DATE
1649     AND (signataire_arrete.om_validite_fin IS NULL
1650     OR signataire_arrete.om_validite_fin > CURRENT_DATE)))
1651     ORDER BY
1652     signataire_arrete.prenom,
1653     signataire_arrete.nom",
1654     DB_PREFIXE
1655     );
1656 softime 8989 }
1657    
1658     /**
1659     *
1660     * @return string
1661     */
1662     function get_var_sql_forminc__sql_signataire_arrete_by_id() {
1663 softime 11585 return sprintf(
1664     "SELECT
1665     signataire_arrete.signataire_arrete,
1666     CONCAT_WS(
1667     ' - ',
1668     CONCAT_WS(' ', signataire_arrete.prenom, signataire_arrete.nom),
1669     signataire_habilitation.libelle,
1670     signataire_arrete.description
1671     )
1672     FROM
1673     %1\$ssignataire_arrete
1674     LEFT JOIN %1\$ssignataire_habilitation
1675     ON signataire_arrete.signataire_habilitation = signataire_habilitation.signataire_habilitation
1676     WHERE
1677     signataire_arrete.signataire_arrete = <idx>",
1678     DB_PREFIXE
1679     );
1680 softime 8989 }
1681    
1682     /**
1683     *
1684     * @return string
1685     */
1686     function get_var_sql_forminc__sql_signataire_arrete_by_di() {
1687 softime 11585 return sprintf(
1688     "SELECT
1689     signataire_arrete.signataire_arrete,
1690     CONCAT_WS(
1691     ' - ',
1692     CONCAT_WS(' ', signataire_arrete.prenom, signataire_arrete.nom),
1693     signataire_habilitation.libelle,
1694     signataire_arrete.description
1695     )
1696     FROM
1697     %1\$ssignataire_arrete
1698     LEFT JOIN %1\$som_collectivite
1699     ON signataire_arrete.om_collectivite = om_collectivite.om_collectivite
1700     LEFT JOIN %1\$ssignataire_habilitation
1701     ON signataire_arrete.signataire_habilitation = signataire_habilitation.signataire_habilitation
1702     WHERE
1703     ((signataire_arrete.om_validite_debut IS NULL
1704     AND (signataire_arrete.om_validite_fin IS NULL
1705     OR signataire_arrete.om_validite_fin > CURRENT_DATE))
1706     OR (signataire_arrete.om_validite_debut <= CURRENT_DATE
1707     AND (signataire_arrete.om_validite_fin IS NULL
1708     OR signataire_arrete.om_validite_fin > CURRENT_DATE)))
1709     AND (om_collectivite.niveau = '2'
1710     OR signataire_arrete.om_collectivite = <collectivite_di>)
1711     ORDER BY
1712     signataire_arrete.prenom, signataire_arrete.nom",
1713     DB_PREFIXE
1714     );
1715 softime 8989 }
1716    
1717     /**
1718     *
1719     * @return string
1720     */
1721     function get_var_sql_forminc__sql_signataire_arrete_defaut() {
1722 softime 11585 return sprintf(
1723     "SELECT
1724     signataire_arrete.signataire_arrete,
1725     CONCAT_WS(
1726     ' - ',
1727     CONCAT_WS(' ', signataire_arrete.prenom, signataire_arrete.nom),
1728     signataire_habilitation.libelle,
1729     signataire_arrete.description
1730     )
1731     FROM
1732     %1\$ssignataire_arrete
1733     LEFT JOIN %1\$ssignataire_habilitation
1734     ON signataire_arrete.signataire_habilitation = signataire_habilitation.signataire_habilitation
1735     WHERE
1736     ((signataire_arrete.om_validite_debut IS NULL
1737     AND (signataire_arrete.om_validite_fin IS NULL
1738     OR signataire_arrete.om_validite_fin > CURRENT_DATE))
1739     OR (signataire_arrete.om_validite_debut <= CURRENT_DATE
1740     AND (signataire_arrete.om_validite_fin IS NULL
1741     OR signataire_arrete.om_validite_fin > CURRENT_DATE)))
1742     AND signataire_arrete.defaut IS TRUE
1743     ORDER BY
1744     signataire_arrete.prenom, signataire_arrete.nom",
1745     DB_PREFIXE
1746     );
1747 softime 8989 }
1748    
1749     /**
1750     *
1751     * @return string
1752     */
1753     function get_var_sql_forminc__sql_signataire_arrete_defaut_by_di() {
1754 softime 11585 return sprintf(
1755     "SELECT
1756     signataire_arrete.signataire_arrete,
1757     CONCAT_WS(
1758     ' - ',
1759     CONCAT_WS(' ', signataire_arrete.prenom, signataire_arrete.nom),
1760     signataire_habilitation.libelle,
1761     signataire_arrete.description
1762     )
1763     FROM
1764     %1\$ssignataire_arrete
1765     LEFT JOIN %1\$ssignataire_habilitation
1766     ON signataire_arrete.signataire_habilitation = signataire_habilitation.signataire_habilitation
1767     LEFT JOIN %1\$som_collectivite
1768     ON signataire_arrete.om_collectivite = om_collectivite.om_collectivite
1769     WHERE
1770     ((signataire_arrete.om_validite_debut IS NULL
1771     AND (signataire_arrete.om_validite_fin IS NULL
1772     OR signataire_arrete.om_validite_fin > CURRENT_DATE))
1773     OR (signataire_arrete.om_validite_debut <= CURRENT_DATE
1774     AND (signataire_arrete.om_validite_fin IS NULL
1775     OR signataire_arrete.om_validite_fin > CURRENT_DATE)))
1776     AND signataire_arrete.defaut IS TRUE
1777     AND (om_collectivite.niveau = '2'
1778     OR signataire_arrete.om_collectivite = <collectivite_di>)
1779     ORDER BY
1780     signataire_arrete.prenom,
1781     signataire_arrete.nom",
1782     DB_PREFIXE
1783     );
1784 softime 8989 }
1785    
1786     /**
1787 softime 14542 * Renvoie sous la forme d'un tableau la liste des événements pouvant être ajoutés au dossier
1788     * dont l'identifiant a été passé en paramètre dans l'url.
1789     *
1790     * @return array
1791     */
1792     function get_var_sql_forminc__sql_evenement() {
1793     // Récupération du numéro de dossier
1794 softime 17542 $dossier = $this->getParameter("idxformulaire") ?? $_GET['idxformulaire'];
1795     $this->f->log(__METHOD__, 'dossier: '.var_export($dossier, true));
1796 softime 14542 // Si changement de décision par instructeur commune
1797     $filter = '';
1798     if ($this->f->isUserInstructeur() === true
1799 softime 17542 // TODO faire autrement car ça instancier le dossier et donc charge ses modules !
1800 softime 14542 && $this->getDivisionFromDossier($dossier) != $_SESSION["division"]
1801     && $this->isInstrCanChangeDecision($dossier) === true) {
1802     $filter = "AND evenement.type IN ('arrete', 'changement_decision')";
1803     }
1804     // Récupération du libellé, de l'identifiant des évènement et d'un booléen permettant
1805     // de déterminer si il s'agit d'évènements suggérés.
1806     $qres = $this->f->get_all_results_from_db_query(
1807     sprintf(
1808     'SELECT
1809     DISTINCT(evenement.evenement),
1810     evenement.libelle,
1811     -- Si l evenement est suggérés alors il sera lié à la table des événements suggérés du dossier
1812     CASE WHEN evenement_suggere_dossier.evenement IS NULL
1813     THEN FALSE
1814     ELSE TRUE
1815     END AS is_suggested
1816     FROM
1817     -- Jointures permettant de récupérer la liste des évènements compatibles avec le dossier
1818     -- selon le type de dossier et l état du dossier.
1819     %1$sevenement
1820     JOIN %1$slien_dossier_instruction_type_evenement
1821     ON evenement.evenement = lien_dossier_instruction_type_evenement.evenement
1822     JOIN %1$stransition
1823     ON evenement.evenement = transition.evenement
1824     JOIN %1$sdossier
1825     ON lien_dossier_instruction_type_evenement.dossier_instruction_type = dossier.dossier_instruction_type
1826     AND transition.etat = dossier.etat
1827     -- Jointures avec une sous requêtes servant à récupérer la liste des évènements suggérés du dossier.
1828     LEFT JOIN (
1829     SELECT
1830     lien_sig_contrainte_evenement.evenement,
1831     dossier.dossier
1832     FROM
1833     %1$slien_sig_contrainte_evenement
1834     JOIN %1$ssig_contrainte
1835     ON lien_sig_contrainte_evenement.sig_contrainte = sig_contrainte.sig_contrainte
1836     JOIN %1$slien_sig_contrainte_dossier_instruction_type
1837     ON sig_contrainte.sig_contrainte = lien_sig_contrainte_dossier_instruction_type.sig_contrainte
1838     JOIN %1$slien_sig_contrainte_om_collectivite
1839     ON sig_contrainte.sig_contrainte = lien_sig_contrainte_om_collectivite.sig_contrainte
1840     JOIN %1$scontrainte
1841     ON sig_contrainte.libelle = contrainte.libelle
1842     JOIN %1$sdossier_contrainte
1843     ON contrainte.contrainte = dossier_contrainte.contrainte
1844     JOIN %1$sdossier
1845     ON dossier_contrainte.dossier = dossier.dossier
1846     AND lien_sig_contrainte_dossier_instruction_type.dossier_instruction_type = dossier.dossier_instruction_type
1847     JOIN %1$som_collectivite
1848     ON lien_sig_contrainte_om_collectivite.om_collectivite = om_collectivite.om_collectivite
1849     AND (dossier.om_collectivite = om_collectivite.om_collectivite
1850     OR om_collectivite.niveau = \'2\')
1851     ) AS evenement_suggere_dossier
1852     ON evenement.evenement = evenement_suggere_dossier.evenement
1853     AND dossier.dossier = evenement_suggere_dossier.dossier
1854     WHERE
1855     dossier.dossier = \'%2$s\'
1856     %3$s
1857     ORDER BY
1858     is_suggested DESC,
1859     evenement.libelle',
1860     DB_PREFIXE,
1861     $this->f->db->escapeSimple($dossier),
1862     $filter
1863     ),
1864     array(
1865     "origin" => __METHOD__
1866     )
1867     );
1868     return $qres['result'];
1869     }
1870    
1871     /**
1872     * Récupère un tableau contenant des évènements de la forme :
1873     * $events = array(
1874     * 1 => array(
1875     * 'libelle' => 'evenement_libelle',
1876     * 'evenement' => 'identifiant_evenement',
1877     * 'is_suggested' => true/false -> booleen indiquant si c'est un événement suggéré
1878     * ))
1879     * Et le transforme pour pouvoir l'utiliser pour le remplissage d'un select de formulaire.
1880     *
1881     * Le format de sorti est le suivant :
1882     * $select = array(
1883     * 0 => array( -> liste des id des événements
1884     * '0' => '',
1885     * '1' => array(
1886     * '0' => array(), -> liste des id des événements suggérés
1887     * '1' => array(), -> liste des libelles des événements suggérés
1888     * ),
1889     * ...,
1890     * n => 'id_evenement_n'
1891     * ),
1892     * 1 => array(
1893     * '0' => '__('choisir')." ".__('evenement')',
1894     * '1' => '💡 Suggestions',
1895     * ...,
1896     * 'n' => 'libelle_evenement_n',
1897     * )
1898     * )
1899     *
1900     * @param array tableau des événements
1901     * @return array
1902     */
1903     protected function convert_events_array_to_select_format($events) {
1904     // Remplissage du tableau du select en incluant le groupe des instructions suggérées.
1905     $contenu = array(
1906     0 => array("",),
1907     1 => array(__('choisir')." ".__('evenement'),)
1908     );
1909    
1910     if (! empty($events)) {
1911     // S'il y a des évènements suggérés extraction de ces événements et mise en place du groupe
1912     $suggested_event_group = array_filter($events, function($a) {
1913     return $a['is_suggested'] === 't';
1914     });
1915     if (! empty($suggested_event_group)) {
1916     // Prépare les données qui permettront d'afficher le groupe des événements
1917     // suggérés.
1918     $values = array();
1919     $labels = array();
1920     foreach ($suggested_event_group as $index => $suggested_event) {
1921     $values[] = $suggested_event['evenement'];
1922     $labels[] = $suggested_event['libelle'];
1923     // Supprime les évènements suggérés de la liste des évènements
1924     unset($events[$index]);
1925     }
1926     // Remplissage du select pour le groupe
1927     $contenu[0][] = array($values, $labels);
1928     $contenu[1][] = __('💡 Suggestions');
1929     }
1930    
1931     // Remplissage du select
1932     foreach ($events as $event) {
1933     $contenu[0][] = $event['evenement'];
1934     $contenu[1][] = $event['libelle'];
1935     }
1936     }
1937     return $contenu;
1938     }
1939    
1940     /**
1941 softime 8989 * SETTER_FORM - setSelect.
1942     *
1943     * @return void
1944     */
1945     function setSelect(&$form, $maj, &$dnu1 = null, $dnu2 = null) {
1946     //parent::setSelect($form, $maj);
1947 mbroquet 3730 /**
1948     * On ne surcharge pas la méthode parent car une requête sur la table
1949     * dossier est mauvaise pour les performances, car la requête qui
1950     * concerne evenement est plus complexe que celle générée et car les
1951     * champs action, avis_decision et etat ne sont pas utilisés comme des
1952     * select
1953     */
1954     //// action
1955 softime 8989 //$this->init_select($form, $this->f->db, $maj, null, "action",
1956 mbroquet 3730 // $sql_action, $sql_action_by_id, false);
1957    
1958     //// avis_decision
1959 softime 8989 //$this->init_select($form, $this->f->db, $maj, null, "avis_decision",
1960 mbroquet 3730 // $sql_avis_decision, $sql_avis_decision_by_id, false);
1961    
1962     //// dossier
1963 softime 8989 //$this->init_select($form, $this->f->db, $maj, null, "dossier",
1964 mbroquet 3730 // $sql_dossier, $sql_dossier_by_id, false);
1965    
1966     //// etat
1967 softime 8989 //$this->init_select($form, $this->f->db, $maj, null, "etat",
1968 mbroquet 3730 // $sql_etat, $sql_etat_by_id, false);
1969    
1970     //// evenement
1971 softime 8989 //$this->init_select($form, $this->f->db, $maj, null, "evenement",
1972 mbroquet 3730 // $sql_evenement, $sql_evenement_by_id, false);
1973    
1974     // signataire_arrete
1975     // si contexte DI
1976     if ($this->getParameter("retourformulaire") == "dossier"
1977 softime 12847 || $this->f->contexte_dossier_instruction()) {
1978 mbroquet 3730 // on recupère les signataires de la multicollectivité et de celle du DI
1979 softime 7996 $di = $this->f->get_inst__om_dbform(array(
1980     "obj" => "dossier_instruction",
1981     "idx" => $this->getParameter('idxformulaire'),
1982     ));
1983 softime 8989 $sql_signataire_arrete_by_di = str_replace(
1984     '<collectivite_di>',
1985     $di->getVal("om_collectivite"),
1986     $this->get_var_sql_forminc__sql("signataire_arrete_by_di")
1987     );
1988     $this->init_select(
1989     $form,
1990     $this->f->db,
1991     $maj,
1992     null,
1993     "signataire_arrete",
1994     $sql_signataire_arrete_by_di,
1995     $this->get_var_sql_forminc__sql("signataire_arrete_by_id"),
1996     true
1997     );
1998 mbroquet 3730 } else {
1999 softime 8989 $this->init_select(
2000     $form,
2001     $this->f->db,
2002     $maj,
2003     null,
2004     "signataire_arrete",
2005     $this->get_var_sql_forminc__sql("signataire_arrete"),
2006     $this->get_var_sql_forminc__sql("signataire_arrete_by_id"),
2007     true
2008     );
2009 mbroquet 3730 }
2010    
2011     /**
2012     * Gestion du filtre sur les événements de workflow disponibles
2013     * On récupère ici en fonction de l'état du dossier d'instruction en
2014     * cours et du type du dossier d'instruction en cours la liste
2015     * événements disponibles.
2016     */
2017     if ($maj == 0) {
2018 softime 14542 $evenements = $this->get_var_sql_forminc__sql_evenement();
2019     $form->setSelect("evenement", $this->convert_events_array_to_select_format($evenements));
2020 mbroquet 3730 } else {
2021 softime 14064 // Instanciation de l'événement pour récupérer son libellé
2022     $evenement = $this->f->get_inst__om_dbform(array(
2023     "obj" => "evenement",
2024     "idx" => $this->getVal("evenement"),
2025     ));
2026    
2027 mbroquet 3730 $contenu = array(
2028     0 => array($this->getVal("evenement"),),
2029 softime 14064 1 => array($evenement->getVal('libelle'),)
2030 mbroquet 3730 );
2031     $form->setSelect("evenement", $contenu);
2032     }
2033    
2034     /**
2035     * Gesion des liens vers la bible
2036     */
2037     // lien bible_auto
2038 softime 18876 $contenu = array(__("automatique"));
2039 mbroquet 3730 $form->setSelect("bible_auto",$contenu);
2040     // lien bible1
2041 softime 18876 $contenu = array(__("bible"));
2042 mbroquet 3730 $form->setSelect("bible",$contenu);
2043     // lien bible2
2044 softime 18876 $contenu = array(__("bible"));
2045 mbroquet 3730 $form->setSelect("bible2",$contenu);
2046     // lien bible3
2047 softime 18876 $contenu = array(__("bible"));
2048 mbroquet 3730 $form->setSelect("bible3",$contenu);
2049     // lien bible4
2050 softime 18876 $contenu = array(__("bible"));
2051 mbroquet 3730 $form->setSelect("bible4",$contenu);
2052 softime 7521
2053     if ($maj == 1) {
2054     $base64 = $this->init_pdf_temp();
2055     $form->setSelect('live_preview', array('base64'=>$base64));
2056 softime 18876 $form->setSelect("btn_refresh", array(__('Prévisualiser')));
2057     $form->setSelect("btn_preview", array(__('Prévisualiser >>')));
2058     $form->setSelect("btn_redaction", array(__('<< Rédiger')));
2059 softime 7521 }
2060 softime 8593
2061     // Selection du type de rédaction à l'ajout
2062     $content = array(
2063     0 => array('f', 't', ),
2064 softime 18876 1 => array(__('Rédaction par compléments'), __('Rédaction libre'), ),
2065 softime 8593 );
2066     $form->setSelect('flag_edition_integrale', $content);
2067 softime 10573
2068     $contenu = array();
2069     foreach(array('waiting', 'in_progress', 'canceled', 'expired', 'finished') as $value) {
2070     $contenu[0][] = $value;
2071     $contenu[1][] = $this->get_trad_for_statut($value);
2072     }
2073     $form->setSelect('statut_signature', $contenu);
2074    
2075    
2076     if ($maj == 401) {
2077 softime 17036 $idx = $this->getParameter("idx");
2078     $dossier = $this->getParameter("idxformulaire");
2079     if ( strpos($idx, 'STORAGE_') !== FALSE) {
2080     $idx = substr($idx, 8);
2081     $model = 'storage';
2082     $champ = 'uid';
2083     $object = $this->f->get_inst__om_dbform(array(
2084     "obj" => $model,
2085     "idx" => $idx,
2086     ));
2087    
2088     $file = $this->f->storage->get($object->getVal($champ));
2089     $label = $file['metadata']['filename'];
2090     $href =sprintf(
2091     '../app/index.php?module=form&snippet=file&obj=storage&champ=uid&id=%1$s',
2092     $idx
2093     );
2094     $this->addToLog(__METHOD__."(): file['metadata']['filename'] = ".$file['metadata']['filename']." ", DEBUG_MODE);
2095     $this->val['preview_edition'] = '';
2096     }else{
2097 softime 18436 $label = $this->getVal("fichier_instruction_name");
2098 softime 17036 $href =sprintf(
2099     '../app/index.php?module=form&snippet=file&obj=instruction&champ=om_fichier_instruction&id=%1$s',
2100     $this->getVal($this->clePrimaire)
2101     );
2102     $file = $this->f->storage->get($this->getVal('om_fichier_instruction'));
2103     }
2104    
2105 softime 11418 $form->setSelect('preview_edition', array(
2106     'base64' => base64_encode($file['file_content']),
2107     'mimetype' => $file['metadata']['mimetype'],
2108 softime 17036 'label' => $label,
2109     'href' => $href
2110 softime 11418 ));
2111 softime 10573 }
2112 softime 18436 // document_type_instruction
2113     $this->init_select(
2114     $form,
2115     $this->f->db,
2116     $maj,
2117     null,
2118     "document_type_instruction",
2119     $this->get_var_sql_forminc__sql("document_type_instruction"),
2120     $this->get_var_sql_forminc__sql("document_type_instruction_by_id"),
2121     true
2122     );
2123 mbroquet 3730 }
2124    
2125 softime 8989 function cleSecondaire($id, &$dnu1 = null, $val = array(), $dnu2 = null) {
2126 mbroquet 3730 //
2127 softime 11228 // Vérifie uniquementla cle secondaire : demande
2128     $this->rechercheTable($this->f->db, "demande", "instruction_recepisse", $id);
2129 mbroquet 3730
2130     $id = $this->getVal($this->clePrimaire);
2131    
2132     //Requête de vérification que cet événement d'instruction n'est pas lié
2133     //à la création d'un dossier d'instruction
2134 softime 14064 $qres = $this->f->get_one_result_from_db_query(
2135     sprintf(
2136     'SELECT
2137     demande_type.dossier_instruction_type
2138     FROM
2139     %1$sdemande_type
2140     LEFT JOIN %1$sdemande
2141     ON demande.demande_type = demande_type.demande_type
2142     WHERE
2143     demande.instruction_recepisse = \'%2$d\'',
2144     DB_PREFIXE,
2145     intval($id)
2146     ),
2147     array(
2148     "origin" => __METHOD__,
2149     )
2150     );
2151 mbroquet 3730
2152     // Aucune clé secondaire n'a été trouvée ou c'est un événement sans
2153     //création de dossier d'instruction, l'événement d'instruction peut être
2154     //supprimé
2155 softime 14064 if ( $this->correct !== false || $qres['result'] == null || $qres['result'] == ""){
2156 mbroquet 3730 // Requête de vérification que cet événement d'instruction est lié
2157     // à une demande
2158 softime 14064 $qres = $this->f->get_one_result_from_db_query(
2159     sprintf(
2160     'SELECT
2161     demande
2162     FROM
2163     %1$sdemande
2164     WHERE
2165     instruction_recepisse = \'%2$d\'',
2166     DB_PREFIXE,
2167     intval($id)
2168     ),
2169     array(
2170     "origin" => __METHOD__,
2171     )
2172     );
2173 mbroquet 3730
2174     //Si c'est un événement d'instruction lié à une demande
2175 softime 14064 if ($qres['result'] != null || $qres['result'] != ""){
2176 softime 7996 $demande = $this->f->get_inst__om_dbform(array(
2177     "obj" => "demande",
2178 softime 14064 "idx" => $qres['result'],
2179 softime 7996 ));
2180 mbroquet 3730
2181 softime 14064 //On met à jour la demande en supprimant la liaison vers
2182 mbroquet 3730 //l'événement d'instruction
2183     $demande->setParameter("maj", 1);
2184     $valF = array();
2185     foreach($demande->champs as $identifiant => $champ) {
2186     $valF[$champ] = $demande->val[$identifiant];
2187     }
2188     $valF['date_demande']=$demande->dateDBToForm($valF['date_demande']);
2189     $valF['instruction_recepisse']=NULL;
2190 softime 8989 $ret = $demande->modifier($valF);
2191 mbroquet 3730 }
2192    
2193     /**
2194     * Vérification que l'élément supprimé est le dernier pour pouvoir
2195     * remodifier les données de manière itérative.
2196     */
2197 softime 14064 $qres = $this->f->get_one_result_from_db_query(
2198     sprintf(
2199     'SELECT
2200     max(instruction)
2201     FROM
2202     %1$sinstruction
2203     WHERE
2204     dossier = \'%2$s\'',
2205     DB_PREFIXE,
2206     $this->f->db->escapeSimple($this->getParameter("idxformulaire"))
2207     ),
2208     array(
2209     "origin" => __METHOD__,
2210     )
2211     );
2212    
2213 mbroquet 3730 // Si on se trouve effectivement sur le dernier evenement d'instruction
2214 softime 14064 // alors on valide la suppression sinon on l'annule
2215     $this->correct = false;
2216     $message = __("Seul le dernier evenement d'instruction peut etre supprime.");
2217     if ($qres['result'] == $id) {
2218 mbroquet 3730 // Alors on valide la suppression
2219     $this->correct = true;
2220 softime 14064 $message = __('Destruction_chronologique');
2221 mbroquet 3730 }
2222 softime 14064 $this->addToMessage($message);
2223 mbroquet 3730 }
2224     }
2225    
2226     /**
2227     * Vérification de la possibilité ou non de modifier des dates de suivi
2228     * @param string $champ champ date à vérifier
2229     */
2230     function updateDate($champ) {
2231    
2232     //Si le retourformulaire est "dossier_instruction"
2233     if ($this->getParameter("retourformulaire") == "dossier"
2234 softime 12847 || $this->f->contexte_dossier_instruction()) {
2235 mbroquet 3730
2236     // Vérification de la possibilité de modifier les dates si déjà éditées
2237 softime 18876 if($this->valF[$champ] != "" && !$this->f->user_is_admin) {
2238 mbroquet 3730 // si l'utilisateur n'est pas un admin
2239 softime 18876 if($this->getVal($champ) != "" && $this->getVal($champ) != $this->valF[$champ]) {
2240 softime 15650
2241     // si le champ concerné est 'date_envoi_signature'
2242     // et que le statut du parapheur est 'expired'
2243     // alors on autorise le changement de la date
2244     // pour tous les autres cas, on ne peut modifier la date
2245     if ($champ !== 'date_envoi_signature' || $this->getVal('statut_signature') !== 'expired') {
2246     $this->correct = false;
2247 softime 18876 $this->addToMessage(__("Les dates de suivis ne peuvent etre modifiees"));
2248 softime 15650 }
2249 mbroquet 3730 }
2250     }
2251     }
2252    
2253     //
2254     return true;
2255     }
2256    
2257 softime 8989 /**
2258     * SETTER_FORM - setValsousformulaire (setVal).
2259     *
2260     * @return void
2261     */
2262     function setValsousformulaire(&$form, $maj, $validation, $idxformulaire, $retourformulaire, $typeformulaire, &$dnu1 = null, $dnu2 = null) {
2263 softime 17542 $data = array('form' => &$form, 'maj' => &$maj, 'validation' => &$validation, 'idxformulaire' => &$idxformulaire, 'retourformulaire' => &$retourformulaire, 'typeformulaire' => &$typeformulaire);
2264     $this->f->module_manager->run_hooks('setValsousformulaire_pre', $this, $data);
2265    
2266 softime 8989 // parent::setValsousformulaire($form, $maj, $validation, $idxformulaire, $retourformulaire, $typeformulaire);
2267 mbroquet 3730 //
2268 softime 8989 $this->retourformulaire = $retourformulaire;
2269     //
2270 mbroquet 3730 if ($maj == 0) {
2271 softime 8989 $form->setVal("destinataire", $this->getParameter("idxformulaire"));
2272     $form->setVal("dossier", $this->getParameter("idxformulaire"));
2273 mbroquet 3730 }
2274 softime 12124
2275     // Si l'instruction a été envoyé au contrôle de légalité et que la
2276     // tâche envoi_cl lié n'a pas encore été traité il faut indiquer à
2277     // l'utilisateur que l'envoi au cl est en cours de traitement.
2278 softime 18436 if ($this->is_sent_to_cl() === true
2279 softime 12124 && empty($this->getVal('date_envoi_controle_legalite'))
2280     && $maj == 3) {
2281     $form->setVal("date_envoi_controle_legalite", __("En cours de traitement."));
2282     }
2283 mbroquet 3730 //
2284     $this->set_form_default_values($form, $maj, $validation);
2285 softime 17542
2286     $data = array('form' => &$form, 'maj' => &$maj, 'validation' => &$validation, 'idxformulaire' => &$idxformulaire, 'retourformulaire' => &$retourformulaire, 'typeformulaire' => &$typeformulaire);
2287     $this->f->module_manager->run_hooks('setValsousformulaire_post', $this, $data);
2288 mbroquet 3730 }
2289    
2290     /**
2291 softime 8989 * SETTER_FORM - set_form_default_values (setVal).
2292     *
2293     * @return void
2294 mbroquet 3730 */
2295     function set_form_default_values(&$form, $maj, $validation) {
2296 softime 17542 $data = array('form' => &$form, 'maj' => &$maj, 'validation' => &$validation);
2297     $this->f->module_manager->run_hooks('set_form_default_values_pre', $this, $data);
2298    
2299 mbroquet 3730 if ($maj == 0) {
2300     // si contexte DI
2301     if ($this->getParameter("retourformulaire") == "dossier"
2302 softime 12847 || $this->f->contexte_dossier_instruction()) {
2303 mbroquet 3730 // on recupère les signataires de la multicollectivité et de celle du DI
2304 softime 7996 $di = $this->f->get_inst__om_dbform(array(
2305     "obj" => "dossier_instruction",
2306 softime 8989 "idx" => $this->getParameter("idxformulaire"),
2307 softime 7996 ));
2308 softime 8989 $sql = str_replace(
2309     "<collectivite_di>",
2310     $di->getVal("om_collectivite"),
2311     $this->get_var_sql_forminc__sql("signataire_arrete_defaut_by_di")
2312     );
2313 mbroquet 3730 } else {
2314 softime 8989 $sql = $this->get_var_sql_forminc__sql("signataire_arrete_defaut");
2315 mbroquet 3730 }
2316 softime 14542
2317     $qres = $this->f->get_all_results_from_db_query($sql, array(
2318     "origin" => __METHOD__));
2319     $row = array_shift($qres['result']);
2320 softime 8989 if (isset($row["signataire_arrete"])
2321     && is_numeric($row["signataire_arrete"])) {
2322     //
2323     $form->setVal("signataire_arrete", $row["signataire_arrete"]);
2324 mbroquet 3730 }
2325 softime 8989 // Date du jour
2326     $form->setVal("date_evenement", date("Y-m-d"));
2327 mbroquet 3730 }
2328 softime 8989 //
2329 mbroquet 3730 if ($maj == 0 || $maj == 1 || $maj == 125) {
2330 softime 8989 $form->setVal("bible_auto", "bible_auto()");
2331     $form->setVal("bible", "bible(1)");
2332     $form->setVal("bible2", "bible(2)");
2333     $form->setVal("bible3", "bible(3)");
2334     $form->setVal("bible4", "bible(4)");
2335 mbroquet 3730 }
2336 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 !
2337 softime 7521 $collectivite_di = $this->get_dossier_instruction_om_collectivite();
2338 softime 8989 if ($maj == 1
2339     && $this->f->is_option_preview_pdf_enabled($collectivite_di) === true
2340 softime 7521 && $this->has_an_edition() === true) {
2341 softime 8989 //
2342     $form->setVal("live_preview", $this->getVal($this->clePrimaire));
2343     $form->setVal("btn_refresh", "reload_pdf_viewer()");
2344     $form->setVal("btn_preview", "show_instr_preview()");
2345     $form->setVal("btn_redaction", "show_instr_redaction()");
2346 softime 7521 }
2347 softime 10808
2348 softime 12654 // Gestion de l'affichage des suivis de notification des demandeurs, des services, des tiers et
2349     // des communes
2350     if ($maj == 3) {
2351     if ($this->can_display_notification_demandeur()) {
2352     $typeNotification = array(
2353     'notification_recepisse',
2354     'notification_instruction',
2355     'notification_decision',
2356     );
2357     $form->setVal("suivi_notification", $this->get_json_suivi_notification($typeNotification, true));
2358     }
2359     if ($this->can_display_notification_service()) {
2360     $form->setVal("suivi_notification_service", $this->get_json_suivi_notification(array('notification_service_consulte')));
2361     }
2362     if ($this->can_display_notification_tiers()) {
2363     $form->setVal("suivi_notification_tiers", $this->get_json_suivi_notification(array('notification_tiers_consulte')));
2364     }
2365     if ($this->can_display_notification_commune()) {
2366     $form->setVal("suivi_notification_commune", $this->get_json_suivi_notification(array('notification_depot_demat', 'notification_commune')));
2367     }
2368 softime 15835 if ($this->getVal('flag_edition_integrale') == 't') {
2369     $message = __("Aucun contenu à afficher.");
2370     if (empty($this->getVal('titre_om_htmletat'))) {
2371     $form->setVal("titre_om_htmletat", $message);
2372     }
2373     if (empty($this->getVal('corps_om_htmletatex'))) {
2374     $form->setVal("corps_om_htmletatex", $message);
2375     }
2376     }
2377 softime 10808 }
2378 softime 17542 $data = array('form' => &$form, 'maj' => &$maj, 'validation' => &$validation);
2379     $this->f->module_manager->run_hooks('set_form_default_values_post', $this, $data);
2380 mbroquet 3730 }
2381    
2382     function setLayout(&$form, $maj){
2383 softime 17542 $data = array('form' => &$form, 'maj' => &$maj);
2384     $this->f->module_manager->run_hooks('setLayout_pre', $this, $data);
2385    
2386 softime 8593 $form->setBloc('evenement','D',"","sousform-instruction-action-".$maj);
2387 mbroquet 3730
2388 softime 8593 $form->setFieldset('evenement','D',_('Evenement'));
2389     $form->setFieldset('om_final_instruction_utilisateur','F','');
2390    
2391     $form->setBloc('om_final_instruction_utilisateur','F');
2392 softime 15835 // Idem que pour le layout de la synthèse des DI, on est obligé de "casser" le setBloc en utilisant que la fin
2393     // afin de bypasser le fait de ne pas avoir le form-content et le portlet dans le meme container
2394     $form->setBloc('om_final_instruction_utilisateur','F');
2395     $form->setBloc('parapheur_lien_page_signature','D');
2396 mbroquet 3730
2397 softime 8593 $form->setBloc('date_finalisation_courrier','D',"","");
2398 mbroquet 3730
2399 softime 15973 $form->setFieldset('date_finalisation_courrier','D',_('Dates'),"instruction--suivi-dates");
2400     $form->setBloc('date_finalisation_courrier','D');
2401     $form->setBloc('date_envoi_rar','F');
2402 mbroquet 3730
2403 softime 15973 $form->setBloc('date_retour_rar','D');
2404 softime 8593 $form->setBloc('date_retour_controle_legalite','F');
2405     $form->setFieldset('date_retour_controle_legalite','F','');
2406    
2407     $form->setBloc('date_retour_controle_legalite','F');
2408 mbroquet 3730
2409 softime 10573 $form->setBloc('statut_signature','D');
2410     $form->setFieldset('statut_signature','D','Suivi Parapheur');
2411     $form->setBloc('commentaire_signature','F');
2412     $form->setBloc('historique_signature','D');
2413     $form->setFieldset('historique_signature', 'DF', __("Historique"), "collapsible, startClosed");
2414     $form->setBloc('historique_signature','F');
2415     $form->setFieldset('historique_signature','F');
2416    
2417 softime 10808 $form->setFieldset('suivi_notification', 'D', __("Suivi notification"), "collapsible");
2418     $form->setFieldset('suivi_notification','F');
2419 softime 11585 $form->setFieldset('suivi_notification_service', 'D', __("Suivi notification service"), "collapsible");
2420     $form->setFieldset('suivi_notification_service','F');
2421     $form->setFieldset('suivi_notification_tiers', 'D', __("Suivi notification tiers"), "collapsible");
2422     $form->setFieldset('suivi_notification_tiers','F');
2423 softime 12654 $form->setFieldset('suivi_notification_commune', 'D', __("Suivi notification commune"), "collapsible");
2424     $form->setFieldset('suivi_notification_commune','F');
2425 softime 10808
2426 softime 8593 if ($maj == 1) {
2427     // Récupère la collectivité du dossier d'instruction
2428     $collectivite_di = $this->get_dossier_instruction_om_collectivite();
2429 mbroquet 3730
2430 softime 8593 //
2431     if ($this->f->is_option_preview_pdf_enabled($collectivite_di) === true
2432     && $this->has_an_edition() === true) {
2433 softime 7521 //
2434 softime 8593 $form->setBloc('complement_om_html','D',"","container_instr_edition");
2435     $form->setBloc('complement_om_html','D',"","hidelabel box_instr_edition redaction_instr_edition");
2436     $form->setBloc('complement_om_html','D',"","box_instr_edition_main");
2437     $form->setFieldset('complement_om_html','D',_('Complement'));
2438     $form->setFieldset('bible','F','');
2439     $form->setFieldset('complement2_om_html','D',_('Complement 2'));
2440     $form->setFieldset('bible2','F','');
2441     $form->setFieldset('complement3_om_html','D',_('Complement 3'));
2442     $form->setFieldset('bible3','F','');
2443     $form->setFieldset('complement4_om_html','D',_('Complement 4'));
2444     $form->setFieldset('bible4','F','');
2445     $form->setFieldset('titre_om_htmletat','DF',_('Titre'), 'startClosed');
2446     $form->setFieldset('corps_om_htmletatex','DF',_('Corps'));
2447     $form->setBloc('corps_om_htmletatex','F');
2448     $form->setBloc('btn_preview','DF',"","box_instr_edition_btn");
2449     $form->setBloc('btn_preview','F');
2450     $form->setBloc('btn_redaction','D', '',"hidelabel box_instr_edition preview_instr_edition");
2451     $form->setBloc('btn_redaction','DF',"","box_instr_edition_btn");
2452     $form->setFieldset('btn_refresh','D',_('Prévisualisation'), "box_instr_edition_main");
2453     $form->setFieldset('live_preview','F');
2454     $form->setBloc('live_preview','F');
2455     $form->setBloc('live_preview','F');
2456 softime 7521 } else {
2457 softime 8593 $form->setBloc('complement_om_html','D',"","hidelabel");
2458 softime 7521 $form->setFieldset('complement_om_html','D',_('Complement'));
2459     $form->setFieldset('bible','F','');
2460     $form->setFieldset('complement2_om_html','D',_('Complement 2'));
2461     $form->setFieldset('bible2','F','');
2462     $form->setFieldset('complement3_om_html','D',_('Complement 3'));
2463     $form->setFieldset('bible3','F','');
2464     $form->setFieldset('complement4_om_html','D',_('Complement 4'));
2465     $form->setFieldset('bible4','F','');
2466 softime 8593 $form->setFieldset('titre_om_htmletat','DF',_('Titre'), 'startClosed');
2467     $form->setFieldset('corps_om_htmletatex','DF',_('Corps'));
2468     $form->setBloc('corps_om_htmletatex','F');
2469 softime 7521 }
2470 softime 8593 } else {
2471     $form->setBloc('complement_om_html','D',"","hidelabel");
2472     $form->setFieldset('complement_om_html','D',_('Complement'));
2473     $form->setFieldset('bible','F','');
2474     $form->setFieldset('complement2_om_html','D',_('Complement 2'));
2475     $form->setFieldset('bible2','F','');
2476     $form->setFieldset('complement3_om_html','D',_('Complement 3'));
2477     $form->setFieldset('bible3','F','');
2478     $form->setFieldset('complement4_om_html','D',_('Complement 4'));
2479     $form->setFieldset('bible4','F','');
2480     $form->setFieldset('titre_om_htmletat','DF',_('Titre'), 'startClosed');
2481     $form->setFieldset('corps_om_htmletatex','DF',_('Corps'));
2482     $form->setBloc('corps_om_htmletatex','F');
2483 mbroquet 3730 }
2484 softime 17542 $data = array('form' => &$form, 'maj' => &$maj);
2485     $this->f->module_manager->run_hooks('setLayout_post', $this, $data);
2486 mbroquet 3730 }
2487    
2488     function setLib(&$form, $maj) {
2489 softime 17542 $data = array('form' => &$form, 'maj' => &$maj);
2490     $this->f->module_manager->run_hooks('setLib_pre', $this, $data);
2491 mbroquet 3730 //
2492     parent::setLib($form, $maj);
2493     //
2494     $form->setLib('bible_auto', "");
2495     $form->setLib('bible', "");
2496     $form->setLib('bible2', "");
2497     $form->setLib('bible3', "");
2498     $form->setLib('bible4', "");
2499 softime 7521 $form->setLib('btn_refresh', "");
2500 softime 8593 $form->setLib('btn_preview', "");
2501     $form->setLib('btn_redaction', "");
2502 softime 7521 $form->setLib('live_preview', "");
2503 softime 18876 $form->setLib('om_final_instruction_utilisateur', __("finalise par"));
2504 softime 8989 $form->setLib('date_envoi_rar', __("date_envoi_ar"));
2505     $form->setLib('date_retour_rar', __("date_notification"));
2506 softime 10573 $form->setLib('statut_signature', __("statut"));
2507     $form->setLib('commentaire_signature', __("commentaire"));
2508     $form->setLib('historique_signature', '');
2509 softime 10808 $form->setLib('suivi_notification', '');
2510 softime 11585 $form->setLib('suivi_notification_service', '');
2511     $form->setLib('suivi_notification_tiers', '');
2512 softime 12654 $form->setLib('suivi_notification_commune', '');
2513 softime 10573 $form->setLib('preview_edition', "");
2514 softime 18436 $form->setLib('document_type_instruction', __("Type de document"));
2515 softime 8593
2516     // Ajout d'une infobulle d'aide lorsque le formulaire est en mode
2517     // ajout et que l'option de rédaction libre est activée sur la
2518     // collectivité du dossier
2519     if ($maj === '0' && $this->is_option_redaction_libre_enabled() === true) {
2520     //
2521     $help_text_template = '%s <span class="info-16" title="%s"></span>';
2522 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.");
2523     $form->setLib('flag_edition_integrale', sprintf($help_text_template, __("Type de rédaction"), $help_text));
2524 softime 8593 }
2525     else {
2526 softime 18876 $form->setLib('flag_edition_integrale', __("Type de rédaction"));
2527 softime 8593 }
2528    
2529     // Ajout d'une infobulle d'aide lorsque le formulaire est en mode
2530     // modification et que l'option de prévisualisation de l'édition est
2531     // activée sur la collectivité du dossier
2532     if ($maj === '1'
2533     && $this->f->is_option_preview_pdf_enabled($this->get_dossier_instruction_om_collectivite()) === true) {
2534     //
2535     $help_text_template = '%s <span class="info-16" title="%s"></span>';
2536 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.");
2537     $form->setLib('date_evenement', sprintf($help_text_template, __('date_evenement'), $help_text));
2538     $form->setLib('signataire_arrete', sprintf($help_text_template, __('signataire_arrete'), $help_text));
2539 softime 8593 }
2540 softime 17542 $data = array('form' => &$form, 'maj' => &$maj);
2541     $this->f->module_manager->run_hooks('setLib_post', $this, $data);
2542 mbroquet 3730 }
2543    
2544 softime 8989 /**
2545 softime 15835 * Surcharge om_dbform::set_form_specificity()
2546     *
2547     * Traitements spécifiques lié à l'affichage des formulaires.
2548     * Les traitements gérés ici sont les suivants :
2549     * - Affichage d'un message d'erreur si la lettretype de l'évènement n'a pas
2550     * pu être récupérée.
2551     * - Affichage d'un message d'information à l'attention de l'utilisateur si
2552     * la notification est activée mais qu'elle n'est pas possible à cause du
2553     * paramètrage.
2554     *
2555     * @param formulaire $form Instance formulaire.
2556     * @param string $maj
2557     *
2558     * @return void
2559     */
2560     function set_form_specificity(&$form, $maj) {
2561     parent::set_form_specificity($form, $maj);
2562    
2563     // En consultation, vérifie si une lettretype est associée à l'instruction et a pu être récupérée.
2564     // Si ce n'est pas le cas affiche un message d'erreur.
2565     if ((! empty($maj) && $maj == 3)) {
2566     if (! empty($this->getVal('lettretype'))) {
2567    
2568     $om_edition = $this->f->get_inst__om_edition();
2569     $dossier_instruction_om_collectivite = $this->get_dossier_instruction_om_collectivite();
2570     $collectivite = $this->f->getCollectivite($dossier_instruction_om_collectivite);
2571     $edition = $om_edition->get_edition_from_collectivite('om_lettretype', $this->getVal("lettretype"), $collectivite['om_collectivite_idx']);
2572    
2573     if (empty($edition)) {
2574     $this->display_error_message(__("Erreur de paramétrage, le modèle de document n'a pas pu être récupéré. Contactez votre administrateur."));
2575     }
2576     }
2577     }
2578    
2579     $this->display_notification_info($maj);
2580     }
2581    
2582     /**
2583     * En consultation, pour les dossiers qui n'ont pas été transmis par le portail
2584     * citoyen, si la notification des demandeurs est activée sur l'évenement
2585     * d'instruction et que le paramétrage du demandeur principal n'est pas
2586     * correct alors un message a destination de l'instructeur est affiché.
2587     *
2588     * @param string $maj
2589     *
2590     * @return void
2591     */
2592     public function display_notification_info($maj) {
2593     if ((! empty($maj) && $maj == 3)) {
2594     // Si le dossier n'a pas été déposé sur le portail citoyen (ou si
2595     // la requête permettant de savoir le type de demande à échouée) et si
2596     // la notification se fait par mail vérifie si il y a des erreurs de
2597     // paramétrage et si c'est le cas on affiche un message d'information
2598     if ($this->dossier_depose_sur_portail() == null || ! $this->dossier_depose_sur_portail()) {
2599     $erreurParam = $this->get_info_notification_fail();
2600     // Récupération de l'évenement d'instruction
2601     $instEV = $this->get_inst_evenement();
2602     if (! empty($instEV->getVal('notification')) && $erreurParam != array()) {
2603     $class = 'text-info ui-state-highlight ui-state-info';
2604     $message = __("La notification n'est pas possible.");
2605     $this->f->display_panel_information(
2606     $class,
2607     $message,
2608     $erreurParam,
2609     __('Les données suivantes doivent être modifiées'),
2610     'erreur_param_notif'
2611     );
2612     }
2613     }
2614     }
2615     }
2616    
2617     /**
2618     * Méthode permettant d'afficher des messages d'erreur sur les formulaires.
2619     */
2620     public function display_error_message($msg) {
2621     $this->correct = false;
2622     $this->msg = $msg;
2623     }
2624    
2625     /**
2626 softime 8989 * TRIGGER - triggerajouter.
2627 softime 17036 * Réalise différents traitements avant d'ajouter l'instruction en base.
2628 softime 8989 *
2629 softime 17036 * Les traitements réalisés sont les suivant :
2630     * - TODO : documenter les traietements existant
2631     * - Intégre les bibles pré-chargé aux compléments de l'instruction.
2632     * Ce traitement n'est déclenché que si l'on est pas en rédaction libre, et que l'évènement a une lettretype.
2633     *
2634 softime 8989 * @return boolean
2635     */
2636     function triggerajouter($id, &$dnu1 = null, $val = array(), $dnu2 = null) {
2637     $this->addToLog(__METHOD__."(): start", EXTRA_VERBOSE_MODE);
2638 softime 18436 $parent_res = parent::triggerajouter($id, $dnu1, $val);
2639     if ($parent_res === false) return $parent_res;
2640    
2641     $data = array('val' => &$val, 'id' => $id, 'parent_res' => &$parent_res);
2642     $this->f->module_manager->run_hooks('triggerajouter_override_pre', $this, $data);
2643 mbroquet 3730 /**
2644     * Le code suivant permet de récupérer des valeurs des tables evenement
2645     * et dossier pour les stocker dans l'instruction :
2646     * DEPUIS L'EVENEMENT
2647     * - action
2648     * - delai
2649     * - accord_tacite
2650     * - etat
2651     * - avis_decision
2652     * - delai_notification
2653     * - lettretype
2654     * - autorite_competente
2655 softime 10573 * - pec_metier
2656 softime 6565 * - complement_om_html
2657     * - complement2_om_html
2658     * - complement3_om_html
2659     * - complement4_om_html
2660     * - complement5_om_html
2661 mbroquet 3730 * DEPUIS LE DOSSIER D'INSTRUCTION
2662     * - archive_delai
2663     * - archive_accord_tacite
2664     * - archive_etat
2665     * - archive_avis
2666     * - date_complet
2667     * - date_rejet
2668     * - date_limite
2669     * - date_notification_delai
2670     * - date_decision
2671     * - date_validite
2672     * - date_achevement
2673     * - date_chantier
2674     * - date_conformite
2675     * - avis_decision
2676     */
2677     // Récupération de tous les paramètres de l'événement sélectionné
2678 softime 18436 $evenement = $this->f->get_inst__om_dbform(array(
2679     "obj" => "evenement",
2680     "idx" => intval($this->valF['evenement']),
2681     ));
2682     if ($evenement->exists() === true) {
2683 mbroquet 3730 // Récupération de l'identifiant de l'action
2684     // si une action est paramétrée dans l'événement
2685     $this->valF['action'] = NULL;
2686 softime 18436 if (!empty($evenement->getVal('action'))) {
2687     $this->valF['action']=$evenement->getVal('action');
2688 mbroquet 3730 }
2689     // Récupération de la valeur du délai
2690 softime 18436 $this->valF['delai'] = $evenement->getVal('delai');
2691 mbroquet 3730 // Récupération de l'identifiant de l'état
2692     // si un état est paramétré dans l'événement
2693     $this->valF['etat']=NULL;
2694 softime 18436 if (!empty($evenement->getVal('etat'))) {
2695     $this->valF['etat']=$evenement->getVal('etat');
2696 mbroquet 3730 }
2697     // Récupération de la valeur d'accord tacite
2698 softime 18436 $this->valF['accord_tacite']=$evenement->getVal('accord_tacite');
2699 mbroquet 3730 // Récupération de la valeur du délai de notification
2700 softime 18436 $this->valF['delai_notification']=$evenement->getVal('delai_notification');
2701 mbroquet 3730 // Récupération de l'identifiant de l'avis
2702     // si un avis est paramétré dans l'événement
2703     $this->valF['avis_decision'] = NULL;
2704 softime 18436 if(!empty($evenement->getVal('avis_decision'))) {
2705     $this->valF['avis_decision']=$evenement->getVal('avis_decision');
2706 mbroquet 3730 }
2707     // Récupération de la valeur de l'autorité compétente
2708     // si l'autorité compétente est paramétré dans l'événement
2709     $this->valF['autorite_competente'] = NULL;
2710 softime 18436 if(!empty($evenement->getVal('autorite_competente'))) {
2711     $this->valF['autorite_competente']=$evenement->getVal('autorite_competente');
2712 mbroquet 3730 }
2713     // Récupération de la valeur de la lettre type
2714 softime 18436 $this->valF['lettretype']=$evenement->getVal('lettretype');
2715    
2716     // Récupération de la valeur du document_type
2717     if(!empty($evenement->getVal('document_type'))){
2718     $this->valF['document_type_instruction']= $evenement->getVal('document_type');
2719     }
2720 softime 10573 // Récupération de la valeur de la prise en compte métier
2721     // si la prise en compte métier est paramétrée dans l'événement
2722     $this->valF['pec_metier'] = NULL;
2723 softime 18436 if(!empty($evenement->getVal('pec_metier'))) {
2724     $this->valF['pec_metier'] = $evenement->getVal('pec_metier');
2725 softime 10573 }
2726 mbroquet 3730 }
2727     // Récupération de toutes les valeurs du dossier d'instruction en cours
2728 softime 14542 // TODO : remplacer cette requête par l'instanciation de l'objet
2729     $qres = $this->f->get_all_results_from_db_query(
2730     sprintf(
2731     'SELECT
2732     *
2733     FROM
2734     %1$sdossier
2735     WHERE
2736     dossier = \'%2$s\'',
2737     DB_PREFIXE,
2738     $this->f->db->escapeSimple($this->valF['dossier'])
2739     ),
2740     array(
2741     "origin" => __METHOD__,
2742     )
2743     );
2744     $row = array_shift($qres['result']);
2745 mbroquet 3730 $this->updateArchiveData($row);
2746 softime 17542
2747 mbroquet 3730 // Récupération de la duree de validite du dossier d'autorisation
2748 softime 14064 $qres = $this->f->get_one_result_from_db_query(
2749     sprintf(
2750     'SELECT
2751     duree_validite_parametrage
2752     FROM
2753     %1$sdossier_autorisation_type_detaille
2754     LEFT JOIN %1$sdossier_autorisation
2755     ON dossier_autorisation.dossier_autorisation_type_detaille = dossier_autorisation_type_detaille.dossier_autorisation_type_detaille
2756     LEFT JOIN %1$sdossier
2757     ON dossier.dossier_autorisation = dossier_autorisation.dossier_autorisation
2758     WHERE
2759     dossier.dossier = \'%2$s\'',
2760     DB_PREFIXE,
2761     $this->f->db->escapeSimple($this->valF['dossier'])
2762     ),
2763     array(
2764     "origin" => __METHOD__,
2765     )
2766     );
2767    
2768     if ($qres['result'] != '') {
2769     $this->valF['duree_validite_parametrage'] = $qres['result'];
2770 mbroquet 3730 }
2771    
2772     // Identifiant du type de courrier
2773     $idTypeCourrier = '11';
2774     $idCourrier = str_pad($this->valF["instruction"], 10, "0", STR_PAD_LEFT);
2775     // Code barres
2776     $this->valF["code_barres"] = $idTypeCourrier . $idCourrier;
2777 softime 17036
2778     // Set dans la propriété valF les valeurs des compléments pour qu'ils soient enregistrés
2779     // à l'ajout de l'instruction.
2780     // Le traitement n'est réalisé que si il y a une lettretype et qu'on est pas en rédaction libre
2781     if (! empty($this->valF['lettretype'])) {
2782     $this->set_precharge_complement($this->valF['evenement'], $this->valF['dossier']);
2783     }
2784 softime 17542
2785     $res = true;
2786     $data = array('val' => &$val, 'id' => $id, 'result' => &$res);
2787 softime 18436 $this->f->module_manager->run_hooks('triggerajouter_override_post', $this, $data);
2788 softime 17542 return $res;
2789 mbroquet 3730 }
2790 softime 17036
2791     /**
2792     * Récupère pour chaque champ complementX_om_html le complément correspondant
2793     * et set l'entrée correspondante de valF avec.
2794     *
2795     * Problème potentiel : Le nombre de complément se base sur le champs complement ayant
2796     * l'indice le plus grand visible dans get_var_sql_forminc__champs().
2797     * Dans cette fonction on fait donc 15 itérations. Changer le nombre de complément
2798     * aura donc un impact sur cette méthode.
2799     *
2800     * @param string dossier : identifiant du dossier de l'instruction
2801     * @param int evenement : identifiant de l'évènement d'instruction
2802     *
2803     * @return void
2804     */
2805     public function set_precharge_complement($evenement, $dossier) {
2806     // Récupération des bibles et chargement dans les compléments
2807     for ($i = 1; $i <= 15; $i++) {
2808     // Constitution de l'id du champs.
2809     // Pour l'indice 1, l'id est complement_om_html, l'indice n'est pas visible dans ce cas.
2810     $field = "complement".($i === 1 ? '' : $i)."_om_html";
2811     // Récupération des compléments correspondant en fonction de l'évènement
2812     // et du dossier puis insertion dans la champs voulu
2813     $this->valF[$field] = $this->getBible($evenement, $dossier, $i, 'precharge');
2814     }
2815     }
2816    
2817    
2818 mbroquet 3730
2819 softime 12124 /**
2820     * Test si une restriction est valide.
2821     *
2822     * @return boolean
2823     */
2824 mbroquet 3730 function restrictionIsValid($restriction){
2825     if($this->restriction_valid != null) {
2826     return $this->restriction_valid;
2827     }
2828     if(empty($restriction)) {
2829     $this->restriction_valid = true;
2830     return $this->restriction_valid;
2831     }
2832 nmeucci 3873 // Liste des opérateurs possibles sans espace
2833     $operateurs = array(">=", "<=", "+", "-", "&&", "||", "==", "!=");
2834     // Liste identique mais avec le marqueur §
2835     $mark = "§";
2836     $operateurs_marked = array();
2837     foreach ($operateurs as $operateur) {
2838     $operateurs_marked[] = $mark.$operateur.$mark;
2839     }
2840 mbroquet 3730
2841     // Supprime tous les espaces de la chaîne de caractère
2842 nmeucci 3873 $restriction = preg_replace('/\s+/', '', $restriction);
2843 mbroquet 3730
2844 nmeucci 3873 // Met un marqueur avant et après les opérateurs
2845     // puis transforme la chaine en un tableau
2846     $restriction = str_replace($operateurs, $operateurs_marked,
2847 mbroquet 3730 $restriction);
2848    
2849 nmeucci 3873 // Pour chaque opérateur logique
2850     foreach (array('&&', '||') as $operator) {
2851    
2852     // S'il est absent on ne fait aucun traitement
2853     if (strpos($restriction, $mark.$operator.$mark) === false) {
2854     continue;
2855     }
2856     // Sinon on vérifie les deux conditions avec le OU/ET logique
2857     $restrictions = explode($mark.$operator.$mark, $restriction);
2858     $restrictions[0] = explode($mark, $restrictions[0]);
2859     $restrictions[1] = explode($mark, $restrictions[1]);
2860     $res_bool = false;
2861     if ($operator == '&&') {
2862     if ($this->is_restriction_satisfied($restrictions[0], $operateurs)
2863     && $this->is_restriction_satisfied($restrictions[1], $operateurs)) {
2864     $res_bool = true;
2865     }
2866     }
2867     if ($operator == '||') {
2868     if ($this->is_restriction_satisfied($restrictions[0], $operateurs)
2869     || $this->is_restriction_satisfied($restrictions[1], $operateurs)) {
2870     $res_bool = true;
2871     }
2872     }
2873     return $res_bool;
2874     }
2875     $tabRestriction = explode($mark, $restriction);
2876     return $this->is_restriction_satisfied($tabRestriction, $operateurs);
2877    
2878     }
2879    
2880     function is_restriction_satisfied($restriction, $operateurs) {
2881 mbroquet 3730 // Tableau comprenant les résultat
2882     $res = array();
2883     // Compteur pour les résultat
2884     // commence à 1 car le 0 doit rester inchangé tout au long du traitement
2885     $j = 1;
2886     // Comparateur du calcul
2887     $comparateur = '';
2888     // Booléen retourné
2889     $res_bool = true;
2890    
2891     // S'il y a un comparateur
2892 nmeucci 3873 if (in_array(">=", $restriction)
2893     || in_array("<=", $restriction)
2894     || in_array("==", $restriction)
2895     || in_array("!=", $restriction)) {
2896 mbroquet 3730
2897     // Si le tableau n'est pas vide
2898 nmeucci 3873 if (count($restriction) > 0) {
2899 mbroquet 3730
2900     // Boucle dans le tableau pour récupérer seulement les valeurs
2901 nmeucci 3873 foreach ($restriction as $key => $value) {
2902 mbroquet 3730 //
2903     if (!in_array($value, $operateurs)) {
2904     if ($this->getRestrictionValue($value) != false) {
2905     $res[] = $this->getRestrictionValue($value);
2906     } else {
2907     // Message d'erreur
2908 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>");
2909 mbroquet 3730 $this->addToMessage($error_message);
2910     // Arrête le traitement
2911     return false;
2912     }
2913     }
2914     }
2915    
2916     // Boucle dans le tableau
2917     // commence à 1 car le 0 doit rester inchangé tout au long du
2918     // traitement
2919 nmeucci 3873 for ($i = 1; $i<count($restriction); $i++) {
2920 mbroquet 3730
2921     // Récupère le comparateur
2922 nmeucci 3873 if ($restriction[$i] === ">="
2923     || $restriction[$i] === "<="
2924     || $restriction[$i] === "=="
2925     || $restriction[$i] === "!=") {
2926     $comparateur = $restriction[$i];
2927 mbroquet 3730 }
2928    
2929     // Si l'opérateur qui suit est un "+"
2930 nmeucci 3873 if ($restriction[$i] === "+") {
2931 mbroquet 3730 $dateDep = $res[$j];
2932     unset($res[$j]);$j++;
2933     $duree = $res[$j];
2934     unset($res[$j]);
2935     $res[$j] = $this->f->mois_date($dateDep, $duree, "+");
2936     }
2937    
2938     // Si l'opérateur qui suit est un "-"
2939 nmeucci 3873 if ($restriction[$i] === "-") {
2940 mbroquet 3730 $dateDep = $res[$j];
2941     unset($res[$j]);$j++;
2942     $duree = $res[$j];
2943     unset($res[$j]);
2944     $res[$j] = $this->f->mois_date($dateDep, $duree, "-");
2945     }
2946     }
2947    
2948     }
2949    
2950     // Si les tableau des résultats n'est pas vide
2951     if (count($res) > 0) {
2952     //
2953     $res_bool = false;
2954     // Effectue le test
2955     if ($comparateur === ">=") {
2956     //
2957     if (strtotime($res[0]) >= strtotime($res[$j])) {
2958     $res_bool = true;
2959     }
2960     }
2961     if ($comparateur === "<=") {
2962 nmeucci 3873 //
2963 mbroquet 3730 if (strtotime($res[0]) <= strtotime($res[$j])) {
2964     $res_bool = true;
2965     }
2966     }
2967 nmeucci 3873 if ($comparateur === "==") {
2968     //
2969     if (strtotime($res[0]) == strtotime($res[$j])) {
2970     $res_bool = true;
2971     }
2972     }
2973     if ($comparateur === "!=") {
2974     //
2975     if (strtotime($res[0]) != strtotime($res[$j])) {
2976     $res_bool = true;
2977     }
2978     }
2979 mbroquet 3730 }
2980     // Sinon une erreur s'affiche
2981     } else {
2982    
2983     // Message d'erreur
2984 softime 18876 $error_message = __("Mauvais parametrage de la restriction.")." ".
2985     __("Contactez votre administrateur");
2986 mbroquet 3730 $this->addToMessage($error_message);
2987     // Arrête le traitement
2988     return false;
2989     }
2990    
2991     return $res_bool;
2992    
2993     }
2994    
2995     /**
2996     * Permet de définir si l'événement passé en paramètre est un événement retour.
2997     * @param integer $evenement événement à tester
2998     *
2999     * @return boolean retourne true si événement retour sinon false
3000     */
3001     function is_evenement_retour($evenement) {
3002     if(empty($evenement) || !is_numeric($evenement)) {
3003     return "";
3004     }
3005 softime 14064
3006     $evenement = $this->f->get_inst__om_dbform(array(
3007     "obj" => "evenement",
3008     "idx" => $evenement,
3009     ));
3010    
3011     return $evenement->getVal('retour') == 't';
3012 mbroquet 3730 }
3013    
3014     /**
3015     * Retourne le champ restriction de l'événement passé en paramètre.
3016     *
3017     * @param integer $evenement id de l'événement sur lequel récupérer la restriction
3018     *
3019     * @return string contenu du champ restriction
3020     */
3021     function get_restriction($evenement) {
3022     if(empty($evenement) || !is_numeric($evenement)) {
3023     return "";
3024     }
3025     //Récupère la restriction
3026 softime 14064 $evenement = $this->f->get_inst__om_dbform(array(
3027     "obj" => "evenement",
3028     "idx" => $evenement,
3029     ));
3030    
3031     return $evenement->getVal('restriction');
3032 mbroquet 3730 }
3033    
3034     /**
3035     * Récupère la valeur du champ dans la restriction
3036     * @param string $restrictionValue Nom du champ
3037     * @return mixed Valeur du champ
3038     */
3039     function getRestrictionValue($restrictionValue){
3040    
3041     // Initialisation de la valeur de retour
3042     $return = false;
3043    
3044     // Récupére les valeurs du dossier
3045     $value_dossier = $this->get_dossier_actual();
3046    
3047     //
3048     if (is_numeric($restrictionValue)) {
3049     $return = $restrictionValue;
3050     }elseif (isset($value_dossier[$restrictionValue])) {
3051     $return = $value_dossier[$restrictionValue];
3052     }elseif (isset($this->valF[$restrictionValue])) {
3053     $return = $this->valF[$restrictionValue];
3054     }
3055    
3056     // Retourne la valeur du champ
3057     return $return;
3058     }
3059    
3060 softime 6565
3061 mbroquet 3730 /**
3062 softime 17542 * Calcul une regle à partir des données de l'url et affiche son
3063     * résultat au format json
3064     */
3065 softime 18436 public function is_date_limite_notification_dossier_depasse($contexte_notification_manuelle = False) {
3066 softime 17542 // Récupération de la date limite
3067     $dossier = $this->f->get_inst__om_dbform(array(
3068     'obj' => 'dossier',
3069     'idx' => $this->getVal('dossier')
3070     ));
3071     $date_limite = $dossier->getVal('incomplet_notifie') !== 't' ?
3072     $dossier->getVal('date_limite') :
3073     $dossier->getVal('date_limite_incompletude');
3074     // Ajout d'un jour à la date limite (reglementaire lors de la notification
3075     // par demat)
3076     $date_limite = $this->f->mois_date($date_limite, "1", "+", "jour");
3077     // Compare la date limite à j+1 et la date du jour
3078     // La date du jour est récupérée via la fonction date pour pouvoir comparer
3079     // des timestamps de début de journée
3080 softime 18436 if ($contexte_notification_manuelle === True) return strtotime($date_limite) < strtotime(date("Y-m-d")) ? True : False;
3081 softime 17542 echo strtotime($date_limite) < strtotime(date("Y-m-d")) ? 'True' : 'False';
3082     }
3083    
3084     /**
3085 softime 18876 * Vérifie si le type d'événement en cours fait partie des types autorisés en paramètres.
3086     *
3087     * @param object $ev Instance de l'événement associé à l'instruction
3088     * @param array $params Types d'événements autorisés
3089     * @return boolean
3090     */
3091     public function is_type_evenement_autorise($ev, $params = array()) {
3092     $type_evenement = $ev->getVal('type');
3093     if (isset($params["types_evenements_autorises"])
3094     && ! empty($params["types_evenements_autorises"])
3095     && in_array($type_evenement, $params["types_evenements_autorises"], true) === true) {
3096     return true;
3097     }
3098     return false;
3099     }
3100    
3101     /**
3102     * Vérifie si la date limite de notification au demandeur est dépassée.
3103     *
3104     * @param boolean $add_one_day Active ou non l'ajout d'un jour à la DLN
3105     * @return boolean
3106     */
3107     public function is_date_limite_notification_premier_mois_depasee($add_one_day = false) {
3108     $dln = $this->getVal('archive_date_notification_delai');
3109     if ($dln === ''
3110     || $dln === null) {
3111     //
3112     $dossier = $this->f->get_inst__om_dbform(array(
3113     'obj' => 'dossier',
3114     'idx' => $this->getVal('dossier')
3115     ));
3116     $dln = $dossier->getVal('date_notification_delai');
3117     }
3118     if ($dln === ''
3119     || $dln === null) {
3120     //
3121     return false;
3122     }
3123     // Ajout d'un jour à la date limite de notification
3124     if ($add_one_day === true) {
3125     $dln = $this->f->mois_date($dln, "1", "+", "jour");
3126     }
3127     // Compare la date limite de notification et la date du jour
3128     return strtotime($dln) <= strtotime(date("Y-m-d"));
3129     }
3130    
3131     /**
3132 softime 6565 * Calcul des règle d'action selon leur type.
3133     *
3134     * Types de règle :
3135     * - date
3136     * - numeric
3137     * - text
3138     * - bool
3139     * - specific
3140     * - technical_data
3141 mbroquet 3730 *
3142 softime 6565 * @param string $rule Règle d'action.
3143     * @param string $rule_name Nom de la règle.
3144     * @param string $type Type de la règle.
3145     *
3146 mbroquet 3730 * @return mixed Résultat de la règle
3147     */
3148 softime 6565 public function regle($rule, $rule_name, $type = null) {
3149 mbroquet 3730
3150     // Supprime tous les espaces de la chaîne de caractère
3151     $rule = str_replace(' ', '', $rule);
3152 softime 17542 // On force les minuscules
3153     $rule = strtolower($rule);
3154 mbroquet 3730 // Coupe la chaîne au niveau de l'opérateur
3155     $operands = explode ("+", $rule);
3156     // Nombre d'opérande
3157     $nb_operands = count($operands);
3158    
3159     // Règle à null
3160     if ($rule == "null") {
3161     return null;
3162     }
3163    
3164     // Tableau des champs de type date
3165     $rule_type_date = array(
3166     "regle_date_limite",
3167     "regle_date_notification_delai",
3168     "regle_date_complet",
3169     "regle_date_validite",
3170     "regle_date_decision",
3171     "regle_date_chantier",
3172     "regle_date_achevement",
3173     "regle_date_conformite",
3174     "regle_date_rejet",
3175     "regle_date_dernier_depot",
3176     "regle_date_limite_incompletude",
3177 softime 6565 "regle_date_cloture_instruction",
3178     "regle_date_premiere_visite",
3179     "regle_date_derniere_visite",
3180     "regle_date_contradictoire",
3181     "regle_date_retour_contradictoire",
3182     "regle_date_ait",
3183     "regle_date_transmission_parquet",
3184 softime 8989 "regle_date_affichage",
3185 softime 17542 "duree_validite",
3186     "duree_validite_parametrage",
3187 mbroquet 3730 );
3188     // Tableau des champs de type numérique
3189     $rule_type_numeric = array(
3190 softime 17542 );
3191     // Tableau des champs de type text
3192     $rule_type_time_delai = array(
3193 mbroquet 3730 "regle_delai",
3194     "regle_delai_incompletude",
3195     );
3196 softime 6565 // Tableau des champs de type text
3197     $rule_type_text = array(
3198     );
3199     // Tableau des champs de type booléen
3200     $rule_type_bool = array(
3201 softime 10573 "regle_a_qualifier",
3202     "regle_incompletude",
3203     "regle_incomplet_notifie",
3204     "regle_evenement_suivant_tacite_incompletude",
3205 softime 6565 );
3206     // Tableau des champs spécifiques
3207     $rule_type_specific = array(
3208     "regle_autorite_competente",
3209     "regle_etat",
3210     "regle_accord_tacite",
3211     "regle_avis",
3212 softime 10573 "regle_pec_metier",
3213     "regle_etat_pendant_incompletude",
3214 softime 6565 );
3215     // Tableau des champs de données techniques
3216     $rule_type_technical_data = array(
3217     'regle_donnees_techniques1',
3218     'regle_donnees_techniques2',
3219     'regle_donnees_techniques3',
3220     'regle_donnees_techniques4',
3221     'regle_donnees_techniques5',
3222     );
3223 softime 8593 // Tableau des champs simple
3224     $rule_type_simple = array(
3225     "regle_dossier_instruction_type",
3226     );
3227 mbroquet 3730
3228     // Définit le type du champ
3229     if (in_array($rule_name, $rule_type_date) == true) {
3230     $type = "date";
3231     }
3232     if (in_array($rule_name, $rule_type_numeric) == true) {
3233     $type = "numeric";
3234     }
3235 softime 6565 if (in_array($rule_name, $rule_type_text) === true) {
3236     $type = "text";
3237     }
3238     if (in_array($rule_name, $rule_type_bool) === true) {
3239     $type = "bool";
3240     }
3241     if (in_array($rule_name, $rule_type_specific) === true) {
3242     $type = "specific";
3243     }
3244     if (in_array($rule_name, $rule_type_technical_data) === true) {
3245 softime 17542 $type = 'technical_text';
3246 softime 6565 }
3247 softime 8593 if (in_array($rule_name, $rule_type_simple) === true) {
3248     $type = 'simple';
3249     }
3250 softime 17542 if (in_array($rule_name, $rule_type_time_delai) === true) {
3251     $type = "time_delai";
3252     }
3253 mbroquet 3730
3254 softime 6565 // Si c'est un type spécifique ou booléen alors il n'a qu'un opérande
3255     // Récupère directement la valeur de l'opérande
3256 softime 10573 if ($type === 'specific') {
3257 softime 6565 //
3258     return $this->get_value_for_rule($rule);
3259     }
3260    
3261 mbroquet 3730 // Initialisation des variables
3262     $total_numeric = 0;
3263 softime 6565 $res_text = '';
3264 softime 18436 $final_date = null;
3265 mbroquet 3730
3266     // Pour chaque opérande
3267     foreach ($operands as $key => $operand) {
3268     // Si c'est une règle de type date
3269     if ($type == 'date') {
3270 softime 17542 if (is_numeric($operand) === false){
3271     $rule_value = $this->get_value_for_rule($operand);
3272     if (
3273     $rule_value !== null
3274     && (
3275     strpos($operand, 'mois') !== false
3276     || strpos($operand, 'jour') !== false
3277     )
3278     ){
3279     $rule_value = $operand;
3280     }
3281     if ($rule_value !== null){
3282     // Vérifie si l'opérande est une date
3283     if ($this->f->check_date($rule_value) == true) {
3284     // Affecte la date
3285     $final_date = $rule_value;
3286     }else{
3287     // Gère les opérandes
3288     preg_match_all('/(\d+) *([a-zA-Z]*)/', $rule_value, $matches, PREG_OFFSET_CAPTURE);
3289    
3290     // Ajoute l'opérande au total
3291     foreach ($matches[1] as $matche_key => $matche_value) {
3292     $timelength = $matches[1][$matche_key][0];
3293     $timetype = 'mois';
3294     if ( $matches[2][$matche_key][0] != ''){
3295     $timetype = $matches[2][$matche_key][0];
3296     }
3297     // Ajout au calcul de la date
3298     $final_date = $this->f->mois_date(
3299     $final_date,
3300     $timelength,
3301     "+",
3302     $timetype
3303     );
3304     }
3305     }
3306     }
3307 mbroquet 3730 }
3308     // Les autres opérandes doivent être que des numériques
3309     if (is_numeric($operand) == true) {
3310     // Ajoute l'opérande au total
3311 softime 17542 // Ajout au calcul de la date
3312     $final_date = $this->f->mois_date($final_date,
3313     $operand, "+");
3314 mbroquet 3730 }
3315     }
3316    
3317     // Si c'est une règle de type numérique
3318     if ($type == 'numeric') {
3319     // Les opérandes doivent être que des numériques
3320     if (is_numeric($operand) == true) {
3321     // Ajoute l'opérande au total
3322     $total_numeric += $operand;
3323     }
3324 softime 6565 if (is_numeric($operand) === false
3325     && $this->get_value_for_rule($operand) !== null
3326     && is_numeric($this->get_value_for_rule($operand)) == true) {
3327 mbroquet 3730 // Ajoute l'opérande au total
3328 softime 6565 $total_numeric += $this->get_value_for_rule($operand);
3329 mbroquet 3730 }
3330     }
3331 softime 6565
3332     // Si c'est une règle de type text
3333 softime 17542 if ($type === 'text' || $type === 'technical_text') {
3334 softime 6565 // Concatène toutes les chaînes de caractère
3335     $res_text .= $this->get_value_for_rule($operand);
3336     }
3337 softime 17542
3338     // Si c'est une règle de type time_delai
3339     if ($type === 'time_delai') {
3340     $rule_value = $this->get_value_for_rule($operand);
3341     if ( strlen($res_text) != 0) {
3342     $res_text .= "+";
3343     }
3344     if ($rule_value != null && $rule_value != ''){
3345     // Supprime tous les espaces de la chaîne de caractère
3346     // Concatène toutes les chaînes de caractère
3347     $res_text .= $rule_value;
3348     } else {
3349     $res_text .= $operand;
3350     }
3351     }
3352    
3353 mbroquet 3730 }
3354    
3355     // Résultat pour une règle de type date
3356     if ($type == 'date') {
3357 softime 17542 // Retourne la date
3358     return $final_date;
3359 mbroquet 3730 }
3360    
3361     // Résultat pour une règle de type numérique
3362     if ($type == 'numeric') {
3363     // Retourne le calcul
3364     return $total_numeric;
3365     }
3366 softime 6565
3367     // Résultat pour une règle de type text
3368 softime 17542 if (in_array($type, array('text', 'technical_text')) === true) {
3369 softime 6565 // Retourne la chaîne de caractère
3370     return $res_text;
3371     }
3372 softime 17542
3373     // Résultat pour une règle de type text
3374     if (in_array($type, array('time_delai')) === true) {
3375     // Traitement de la valeur à afficher
3376     $res_text = str_replace(' ', '', $res_text);
3377     $res_text = preg_replace('/(\d+)/', '$1 ', $res_text);
3378     $res_text = preg_replace('/(\+)/', ' $1 ', $res_text);
3379     $res_text = trim(preg_replace('/\s\s+/', ' ', strtolower($res_text)));
3380     return $res_text;
3381     }
3382    
3383 softime 10573 if ($type === 'simple' || $type === 'bool') {
3384 softime 8593 // Retourne la valeur du champs rule
3385     return $rule;
3386     }
3387 softime 6565 }
3388    
3389    
3390     /**
3391     * Récupère la valeur du champs dans l'instruction ou dans les données
3392     * techniques.
3393     * Spécifique au calcul des règles.
3394     *
3395     * @param string $field Champ
3396     *
3397     * @return mixed Valeur du champ
3398     */
3399     private function get_value_for_rule($field) {
3400     // Si le champ n'existe pas dans la table instruction
3401     if (array_key_exists($field, $this->valF) === false) {
3402     // Récupère l'instance de la classe donnees_techniques
3403     $inst_donnees_techniques = $this->get_inst_donnees_techniques();
3404     // Retourne la valeur de la donnée technique
3405     return $inst_donnees_techniques->getVal($field);
3406     }
3407    
3408     //
3409     return $this->valF[$field];
3410     }
3411    
3412    
3413     /**
3414 softime 18436 * Cette méthode permet de générer le nom de fichier lors de la génération du PDF
3415     * (Édition et finalisation) en fonction de l'existence ou non du type de document.
3416     *
3417     * 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é
3418     * sinon on utilise l'id de la lettretype en lien avec l'évènement.
3419     *
3420     * @return string : le nom du fichier générer
3421     */
3422     function determinate_name_doc_pdf(){
3423     $id_DI = $this->getVal("dossier");
3424     $date = date('Ymd');
3425     $data = "";
3426    
3427     // Récupération de l'id de la lettre type associée à l'instruction
3428     $data = $this->getVal("lettretype");
3429    
3430     // Récupération de l'id de l'instruction
3431     $id_instr = $this->getVal("instruction");
3432    
3433     // Si il existe un type de document associé à l'instruction, on le prend à la place de l'id de la lettretype
3434     if(!empty($this->get_type_document_linked_with_instruction())){
3435     $data = strtolower(str_replace(" ", "-", $this->get_type_document_linked_with_instruction()));
3436     }
3437    
3438     // On retourne le nom du fichier généré
3439     return $this->f->normalize_string(
3440     sprintf(
3441     "%s_%s_%s_%s",
3442     $id_DI,
3443     $id_instr,
3444     $date,
3445     $data
3446     )
3447     );
3448     }
3449    
3450    
3451     /**
3452 softime 6565 * [get_inst_donnees_techniques description]
3453     *
3454     * @param [type] $donnees_techniques [description]
3455     *
3456     * @return [type] [description]
3457     */
3458     function get_inst_donnees_techniques($donnees_techniques = null) {
3459     //
3460 softime 18876 if (isset($this->inst_donnees_techniques) === false ||
3461 softime 6565 $this->inst_donnees_techniques === null) {
3462     //
3463     if (is_null($donnees_techniques)) {
3464     $donnees_techniques = $this->getDonneesTechniques();
3465     }
3466     //
3467 softime 7996 $this->inst_donnees_techniques = $this->f->get_inst__om_dbform(array(
3468     "obj" => "donnees_techniques",
3469     "idx" => $donnees_techniques,
3470     ));
3471 softime 6565 }
3472     //
3473     return $this->inst_donnees_techniques;
3474     }
3475    
3476    
3477     /**
3478     * Retourne l'identifiant des données techniques liées du dossier
3479     * @return string L'identifiant des données techniques liées du dossier
3480     */
3481     function getDonneesTechniques() {
3482 softime 14064
3483     $qres = $this->f->get_one_result_from_db_query(
3484     sprintf(
3485     'SELECT
3486     donnees_techniques
3487     FROM
3488     %1$sdonnees_techniques
3489     WHERE
3490     dossier_instruction = \'%2$s\'',
3491     DB_PREFIXE,
3492     $this->f->db->escapeSimple($this->valF["dossier"])
3493     ),
3494     array(
3495     "origin" => __METHOD__,
3496     )
3497     );
3498 mbroquet 3730
3499 softime 14064 return $qres['result'];
3500 mbroquet 3730 }
3501    
3502 fmichon 4708 /**
3503     * TRIGGER - triggerajouterapres.
3504     *
3505     * - Mise à jour des informations liées au workflow sur le dossier
3506     * - Interface avec le référentiel ERP [105][111]
3507     * - Mise à jour du DA
3508     * - Historisation de la vie du DI
3509     *
3510     * @return boolean
3511     */
3512 softime 8989 function triggerajouterapres($id, &$dnu1 = null, $val = array(), $dnu2 = null) {
3513     $this->addToLog(__METHOD__."(): start", EXTRA_VERBOSE_MODE);
3514 fmichon 4708
3515 softime 18436 $parent_res = parent::triggerajouterapres($id, $dnu1, $val);
3516     if ($parent_res === false) return $parent_res;
3517    
3518     $data = array('val' => &$val, 'id' => $id, 'parent_res' => &$parent_res);
3519     $this->f->module_manager->run_hooks('triggerajouterapres_override_pre', $this, $data);
3520    
3521 fmichon 4708 // On a besoin de l'instance du dossier lié à l'événement d'instruction
3522     $inst_di = $this->get_inst_dossier($this->valF['dossier']);
3523     // Instance de la classe evenement
3524     $inst_evenement = $this->get_inst_evenement($this->valF['evenement']);
3525 softime 9245 // Instance de l'état courant du dossier d'instruction
3526     $inst_current_etat = $this->f->get_inst__om_dbform(array(
3527     "obj" => "etat",
3528     "idx" => $inst_di->get_id_etat(),
3529     ));
3530 fmichon 4708
3531 mbroquet 3730 /**
3532     * Mise à jour des valeurs du dossier en fonction des valeurs calculées
3533     * par l'action
3534     */
3535 fmichon 4708 // état de complétude actuel du dossier
3536     $incompletude = ($inst_di->getVal('incompletude') == 't' ? true : false);
3537 softime 10573 // L'événement suivant tacite paramétré est destiné à la gestion de l'incomplétude
3538     $ev_suiv_tacite_incompletude = false;
3539 mbroquet 3730 // Initialisation
3540 softime 9245 $valF = array();
3541     $valF_dt = array();
3542 fmichon 4708 //
3543 mbroquet 3730 // Récupération des paramètres de l'action
3544 softime 14542 // TODO : remplacer cette requête par l'instanciation de l'action
3545     $qres = $this->f->get_all_results_from_db_query(
3546     sprintf(
3547     'SELECT
3548     *
3549     FROM
3550     %1$saction
3551     WHERE
3552     action = \'%2$s\'',
3553     DB_PREFIXE,
3554     $this->f->db->escapeSimple($this->valF['action'])
3555     ),
3556     array(
3557     "origin" => __METHOD__
3558     )
3559     );
3560     foreach ($qres['result'] as $row) {
3561 mbroquet 3730
3562     // pour chacune des regles, on applique la regle
3563 softime 6565 if ($row['regle_delai'] != '') {
3564 mbroquet 3730 $valF['delai'] = $this->regle($row['regle_delai'], 'regle_delai');
3565     }
3566 softime 6565 if ($row['regle_accord_tacite'] != '') {
3567 mbroquet 3730 $valF['accord_tacite'] = $this->regle($row['regle_accord_tacite'], 'regle_accord_tacite');
3568     }
3569 softime 6565 if ($row['regle_avis'] != '') {
3570 mbroquet 3730 $valF['avis_decision'] = $this->regle($row['regle_avis'], 'regle_avis');
3571     }
3572 softime 6565 if ($row['regle_date_limite'] != '') {
3573     $valF['date_limite'] = $this->regle($row['regle_date_limite'], 'regle_date_limite');
3574 mbroquet 3730 }
3575 softime 6565 if ($row['regle_date_complet'] != '') {
3576     $valF['date_complet'] = $this->regle($row['regle_date_complet'], 'regle_date_complet');
3577 mbroquet 3730 }
3578 softime 6565 if ($row['regle_date_dernier_depot'] != '') {
3579     $valF['date_dernier_depot'] = $this->regle($row['regle_date_dernier_depot'], 'regle_date_dernier_depot');
3580 mbroquet 3730 }
3581 softime 6565 if ($row['regle_date_notification_delai'] != '') {
3582     $valF['date_notification_delai'] = $this->regle($row['regle_date_notification_delai'], 'regle_date_notification_delai');
3583 mbroquet 3730 }
3584 softime 6565 if ($row['regle_date_decision'] != '') {
3585     $valF['date_decision'] = $this->regle($row['regle_date_decision'], 'regle_date_decision');
3586 mbroquet 3730 }
3587 softime 6565 if ($row['regle_date_rejet'] != '') {
3588     $valF['date_rejet'] = $this->regle($row['regle_date_rejet'], 'regle_date_rejet');
3589 mbroquet 3730 }
3590 softime 6565 if ($row['regle_date_validite'] != '') {
3591     $valF['date_validite'] = $this->regle($row['regle_date_validite'], 'regle_date_validite');
3592 mbroquet 3730 }
3593 softime 6565 if ($row['regle_date_chantier'] != '') {
3594     $valF['date_chantier'] = $this->regle($row['regle_date_chantier'], 'regle_date_chantier');
3595 mbroquet 3730 }
3596 softime 6565 if ($row['regle_date_achevement'] != '') {
3597     $valF['date_achevement'] = $this->regle($row['regle_date_achevement'], 'regle_date_achevement');
3598 mbroquet 3730 }
3599 softime 6565 if ($row['regle_date_conformite'] != '') {
3600     $valF['date_conformite'] = $this->regle($row['regle_date_conformite'], 'regle_date_conformite');
3601 mbroquet 3730 }
3602 softime 6565 if ($row['regle_date_limite_incompletude'] != '') {
3603     $valF['date_limite_incompletude'] = $this->regle($row['regle_date_limite_incompletude'], 'regle_date_limite_incompletude');
3604 mbroquet 3730 }
3605 softime 6565 if ($row['regle_delai_incompletude'] != '') {
3606     $valF['delai_incompletude'] = $this->regle($row['regle_delai_incompletude'], 'regle_delai_incompletude');
3607 mbroquet 3730 }
3608 softime 6565 if ($row['regle_autorite_competente'] != '') {
3609     $valF['autorite_competente'] = $this->regle($row['regle_autorite_competente'], 'regle_autorite_competente');
3610 mbroquet 3730 }
3611 softime 6565 if ($row['regle_etat'] != '') {
3612 softime 10573 $valF['etat'] = $this->regle($row['regle_etat'], 'regle_etat');
3613 mbroquet 3730 }
3614 softime 6565 if ($row['regle_date_cloture_instruction'] !== '') {
3615     $valF['date_cloture_instruction'] = $this->regle($row['regle_date_cloture_instruction'], 'regle_date_cloture_instruction');
3616     }
3617     if ($row['regle_date_premiere_visite'] !== '') {
3618     $valF['date_premiere_visite'] = $this->regle($row['regle_date_premiere_visite'], 'regle_date_premiere_visite');
3619     }
3620     if ($row['regle_date_derniere_visite'] !== '') {
3621     $valF['date_derniere_visite'] = $this->regle($row['regle_date_derniere_visite'], 'regle_date_derniere_visite');
3622     }
3623     if ($row['regle_date_contradictoire'] !== '') {
3624     $valF['date_contradictoire'] = $this->regle($row['regle_date_contradictoire'], 'regle_date_contradictoire');
3625     }
3626     if ($row['regle_date_retour_contradictoire'] !== '') {
3627     $valF['date_retour_contradictoire'] = $this->regle($row['regle_date_retour_contradictoire'], 'regle_date_retour_contradictoire');
3628     }
3629     if ($row['regle_date_ait'] !== '') {
3630     $valF['date_ait'] = $this->regle($row['regle_date_ait'], 'regle_date_ait');
3631     }
3632     if ($row['regle_donnees_techniques1'] !== '') {
3633     $valF_dt[$row['cible_regle_donnees_techniques1']] = $this->regle($row['regle_donnees_techniques1'], 'regle_donnees_techniques1');
3634     }
3635     if ($row['regle_donnees_techniques2'] !== '') {
3636     $valF_dt[$row['cible_regle_donnees_techniques2']] = $this->regle($row['regle_donnees_techniques2'], 'regle_donnees_techniques2');
3637     }
3638     if ($row['regle_donnees_techniques3'] !== '') {
3639     $valF_dt[$row['cible_regle_donnees_techniques3']] = $this->regle($row['regle_donnees_techniques3'], 'regle_donnees_techniques3');
3640     }
3641     if ($row['regle_donnees_techniques4'] !== '') {
3642     $valF_dt[$row['cible_regle_donnees_techniques4']] = $this->regle($row['regle_donnees_techniques4'], 'regle_donnees_techniques4');
3643     }
3644     if ($row['regle_donnees_techniques5'] !== '') {
3645     $valF_dt[$row['cible_regle_donnees_techniques5']] = $this->regle($row['regle_donnees_techniques5'], 'regle_donnees_techniques5');
3646     }
3647     if ($row['regle_date_transmission_parquet'] !== '') {
3648     $valF['date_transmission_parquet'] = $this->regle($row['regle_date_transmission_parquet'], 'regle_date_transmission_parquet');
3649     }
3650 softime 8593 if ($row['regle_dossier_instruction_type'] !== '') {
3651     $valF['dossier_instruction_type'] = $this->regle($row['regle_dossier_instruction_type'], 'regle_dossier_instruction_type');
3652     }
3653 softime 8989 // La date d'affichage est modifiée seulement si le champ n'est pas
3654     // renseigné
3655     if ($row['regle_date_affichage'] !== ''
3656     && ($inst_di->getVal('date_affichage') === ''
3657     || $inst_di->getVal('date_affichage') === null)) {
3658     //
3659     $valF['date_affichage'] = $this->regle($row['regle_date_affichage'], 'regle_date_affichage');
3660     }
3661 softime 10573 //
3662     if ($row['regle_pec_metier'] != '') {
3663     $valF['pec_metier'] = $this->regle($row['regle_pec_metier'], 'regle_pec_metier');
3664     }
3665     if ($row['regle_a_qualifier'] != '') {
3666     $valF['a_qualifier'] = $this->regle($row['regle_a_qualifier'], 'regle_a_qualifier');
3667     }
3668     //
3669     if ($row['regle_incompletude'] != '') {
3670     $valF['incompletude'] = $this->regle($row['regle_incompletude'], 'regle_incompletude');
3671     }
3672     if ($row['regle_incomplet_notifie'] != '') {
3673     $valF['incomplet_notifie'] = $this->regle($row['regle_incomplet_notifie'], 'regle_incomplet_notifie');
3674     }
3675     if ($row['regle_etat_pendant_incompletude'] != '') {
3676     $valF['etat_pendant_incompletude'] = $this->regle($row['regle_etat_pendant_incompletude'], 'regle_etat_pendant_incompletude');
3677     }
3678     if ($row['regle_evenement_suivant_tacite_incompletude'] != '') {
3679     $resti = $this->regle($row['regle_evenement_suivant_tacite_incompletude'], 'regle_evenement_suivant_tacite_incompletude');
3680     if (strtolower($resti) === 't' || strtolower($resti) === 'true') {
3681     $ev_suiv_tacite_incompletude = true;
3682     }
3683     }
3684 mbroquet 3730 }
3685 softime 6063
3686     // Si l'événement a un événement suivant tacite
3687     if($inst_evenement->getVal('evenement_suivant_tacite') != '') {
3688 softime 10573 // En fonction de l'action de l'événement, l'événement suivant tacite ne sera
3689     // pas associé de le même façon au dossier d'instruction
3690     if ($ev_suiv_tacite_incompletude === false) {
3691 softime 6063 $valF['evenement_suivant_tacite'] = $inst_evenement->getVal('evenement_suivant_tacite');
3692 softime 10573 }
3693     if ($ev_suiv_tacite_incompletude === true) {
3694 softime 6063 $valF['evenement_suivant_tacite_incompletude'] = $inst_evenement->getVal('evenement_suivant_tacite');
3695 nhaye 5254 }
3696 mbroquet 3730 }
3697 softime 6565 // Si des valeurs de données techniques ont été calculées alors on met à jour l'enregistrement
3698 softime 9245 if (count($valF_dt) > 0) {
3699 softime 6565 $dt_id = $this->getDonneesTechniques();
3700     // On met à jour le dossier
3701     $cle = " donnees_techniques='".$dt_id."'";
3702 softime 12847 $res1 = $this->f->db->autoexecute(DB_PREFIXE.'donnees_techniques', $valF_dt, DB_AUTOQUERY_UPDATE, $cle);
3703     $this->addToLog(
3704     __METHOD__."(): db->autoexecute(\"".DB_PREFIXE."donnees_techniques\", ".print_r($valF_dt, true).", DB_AUTOQUERY_UPDATE, \"".$cle."\");",
3705     VERBOSE_MODE
3706     );
3707     $this->f->isDatabaseError($res1);
3708 softime 6565 // Affichage d'informations à l'utilisateur
3709 softime 18876 $this->addToMessage(__('enregistrement')." ".$this->valF['dossier']." ".__('table')." dossier [".$this->f->db->affectedRows()." ".__('enregistrement')." ".__('mis_a_jour')."]");
3710 softime 6565 }
3711 mbroquet 3730 // Si des valeurs ont été calculées alors on met à jour l'enregistrement
3712 softime 9245 if (count($valF) > 0) {
3713 softime 10573 //
3714     $inst_dossier = $this->f->get_inst__om_dbform(array(
3715     "obj" => "dossier",
3716     "idx" => $this->valF['dossier'],
3717     ));
3718     $valF['instruction'] = $id;
3719 softime 10968 $valF['crud'] = 'create';
3720 softime 10573 $update_by_instruction = $inst_dossier->update_by_instruction($valF);
3721     if ($update_by_instruction === false) {
3722     $this->cleanMessage();
3723     $this->addToMessage(sprintf('%s %s', __("Une erreur s'est produite lors de la mise à jour du dossier d'instruction."), __("Veuillez contacter votre administrateur.")));
3724     return false;
3725 mbroquet 3730 }
3726     // Affichage d'informations à l'utilisateur
3727 softime 18876 $this->addToMessage(__('enregistrement')." ".$this->valF['dossier']." ".__('table')." dossier [".$this->f->db->affectedRows()." ".__('enregistrement')." ".__('mis_a_jour')."]");
3728 mbroquet 3730 }
3729    
3730     /**
3731 fmichon 4708 * Interface avec le référentiel ERP.
3732     *
3733     * (WS->ERP)[105] Arrêté d'un dossier PC effectué -> PC qui concerne un ERP
3734     * (WS->ERP)[111] Décision de conformité effectuée -> PC qui concerne un ERP
3735     * Déclencheur :
3736     * - L'option ERP est activée
3737     * - Le dossier est marqué comme "connecté au référentiel ERP"
3738     * - Le dossier est de type PC
3739     * - Le formulaire d'ajout d'un événement d'instruction est validé
3740     * avec un événement pour lequel les services ERP doivent être
3741     * informé
3742 mbroquet 3730 */
3743 fmichon 4708 //
3744 softime 7521 if ($this->f->is_option_referentiel_erp_enabled() === true
3745 fmichon 4708 && $inst_di->is_connected_to_referentiel_erp() === true
3746     && $this->f->getDATCode($this->valF['dossier']) == $this->f->getParameter('erp__dossier__nature__pc')
3747     && in_array($inst_evenement->getVal($inst_evenement->clePrimaire), explode(";", $this->f->getParameter('erp__evenements__decision__pc')))) {
3748 mbroquet 3730 //
3749 fmichon 4708 $infos = array(
3750     "dossier_instruction" => $this->valF['dossier'],
3751     "decision" => $inst_evenement->getVal("libelle"),
3752     );
3753 mbroquet 3730 //
3754 fmichon 4708 $ret = $this->f->send_message_to_referentiel_erp(105, $infos);
3755     if ($ret !== true) {
3756     $this->cleanMessage();
3757 softime 18876 $this->addToMessage(__("Une erreur s'est produite lors de la notification (105) du référentiel ERP. Contactez votre administrateur."));
3758 fmichon 4708 return false;
3759 mbroquet 3730 }
3760 softime 18876 $this->addToMessage(__("Notification (105) du référentiel ERP OK."));
3761 fmichon 4708 }
3762 mbroquet 3730
3763 softime 8989 // Si le mode en rédaction intégrale est activé
3764     if (isset($this->valF['flag_edition_integrale']) === true
3765     && $this->valF['flag_edition_integrale'] === true) {
3766     $redactionIntegraleValF = array();
3767    
3768     // Récupère la collectivite du dossier d'instruction
3769     $dossier_instruction_om_collectivite = $this->get_dossier_instruction_om_collectivite();
3770     $collectivite = $this->f->getCollectivite($dossier_instruction_om_collectivite);
3771     // Récupère le corps de la lettre type
3772     $params = array(
3773     "specific" => array(
3774     "corps" => array(
3775     "mode" => "get",
3776     )
3777     ),
3778     );
3779     $result = $this->compute_pdf_output('lettretype', $this->valF['lettretype'], $collectivite, $id, $params);
3780     $redactionIntegraleValF['corps_om_htmletatex'] = $result['pdf_output'];
3781     // Récupère le titre de la lettre type
3782     $params = array(
3783     "specific" => array(
3784     "titre" => array(
3785     "mode" => "get",
3786     )
3787     ),
3788     );
3789     $result = $this->compute_pdf_output('lettretype', $this->valF['lettretype'], $collectivite, $id, $params);
3790     $redactionIntegraleValF['titre_om_htmletat'] = $result['pdf_output'];
3791    
3792     // mise à jour en base de données
3793     $res = $this->f->db->autoExecute(
3794     DB_PREFIXE.$this->table,
3795     $redactionIntegraleValF,
3796     DB_AUTOQUERY_UPDATE,
3797     $this->clePrimaire."=".$id
3798     );
3799     $this->addToLog(__METHOD__."(): db->autoexecute(\"".DB_PREFIXE.'.'.$this->table."\", ".print_r($redactionIntegraleValF, true).", DB_AUTOQUERY_UPDATE, \"".$this->clePrimaire."=".$id."\");", VERBOSE_MODE);
3800     if ($this->f->isDatabaseError($res, true) === true) {
3801     return false;
3802     }
3803     }
3804    
3805 fmichon 4708 /**
3806 softime 7996 * Finalisation automatique de l'instruction si le paramétrage de l'événement l'autorise
3807     */
3808     // Si la finalisation automatique de l'événement est activée
3809     // ET si l'instruction n'a pas déjà été finalisée
3810     // ET s'il existe une lettre type associée
3811     if ($inst_evenement->getVal('finaliser_automatiquement') === 't'
3812     && $inst_evenement->getVal('om_final_instruction') !== 't'
3813     && $inst_evenement->getVal('lettretype') !== ''
3814     && $inst_evenement->getVal('lettretype') !== null) {
3815    
3816     // On instancie l'instruction
3817     $inst_instruction = $this->f->get_inst__om_dbform(array(
3818     "obj" => "instruction",
3819     "idx" => $this->valF[$this->clePrimaire],
3820     ));
3821    
3822     // On finalise l'instruction dans le contexte de finalisation : action 100
3823     $inst_instruction->setParameter('maj', 100);
3824     $finalize = $inst_instruction->finalize($inst_instruction->valF);
3825    
3826     // Une erreur de finalisation renvoie 'false' : ajout dans les logs
3827     // et dans le message d'erreur
3828     if ($finalize === false) {
3829     $this->f->addToLog(__METHOD__."() : ERROR - Impossible de finaliser l'instruction.", DEBUG_MODE);
3830 softime 18876 $this->addToMessage(__("Erreur lors de la finalisation de l'instruction. Contactez votre administrateur."));
3831 softime 7996 return false;
3832     }
3833     }
3834    
3835     /**
3836 softime 7521 * Finalisation automatique des instructions tacites ou retours.
3837     */
3838 softime 7685 // Si l'option de finalisation automatique des instructions tacites ou
3839     // retours est activée et l'événement d'instruction a une lettre type
3840     // associée
3841     $collectivite_di = $this->get_dossier_instruction_om_collectivite($val['dossier']);
3842     if ($this->f->is_option_finalisation_auto_enabled($collectivite_di) === true
3843     && $inst_evenement->getVal('lettretype') !== ''
3844 softime 7521 && $inst_evenement->getVal('lettretype') !== null) {
3845    
3846     // Rècupère l'identifiant de l'événement
3847     $evenement_id = $inst_evenement->getVal($inst_evenement->clePrimaire);
3848    
3849     // Si l'événement d'instruction est identifié comme un événement
3850     // retour
3851     // OU l'événement d'instruction est l'événement suivant tacite du
3852     // dossier d'instruction (incomplétude prise en compte)
3853 softime 7996 // ET l'événement d'instruction n'a pas déjà été finalisé
3854     if (($inst_evenement->getVal("retour") === 't'
3855 softime 7521 || ($inst_di->getVal('evenement_suivant_tacite_incompletude') === $evenement_id
3856 softime 7996 || $inst_di->getVal('evenement_suivant_tacite') === $evenement_id))
3857     && ($inst_evenement->getVal('om_final_instruction') !== 't')) {
3858 softime 7521
3859     // Finalise l'instruction
3860 softime 7996 $inst_instruction = $this->f->get_inst__om_dbform(array(
3861     "obj" => "instruction",
3862     "idx" => $this->valF[$this->clePrimaire],
3863     ));
3864 softime 7521 $inst_instruction->setParameter('maj', 100);
3865     $finalize = $inst_instruction->finalize($inst_instruction->valF);
3866     if ($finalize === false) {
3867     //
3868     return false;
3869     }
3870     }
3871     }
3872    
3873     /**
3874 softime 9245 * Mise à jour de la version de clôture *version_clos* du dossier si et
3875     * seulement si l'instruction met à jour l'état du dossier.
3876     */
3877     if (isset($valF['etat']) === true
3878     && $valF['etat'] !== null
3879     && $valF['etat'] !== '') {
3880     // Instanciation de l'état appliqué sur le dossier par l'instruction
3881     $inst_etat = $this->f->get_inst__om_dbform(array(
3882     "obj" => "etat",
3883     "idx" => $valF['etat'],
3884     ));
3885     //
3886     $update_version_clos = null;
3887     // En cas d'instruction qui clôture le dossier
3888     if ($inst_etat->getVal('statut') === 'cloture') {
3889     $update_version_clos = $inst_di->update_version_clos('up');
3890     }
3891     // En cas d'instruction qui rouvre le dossier
3892     if ($inst_current_etat->getVal('statut') === 'cloture'
3893     && $inst_etat->getVal('statut') !== 'cloture') {
3894     //
3895     $update_version_clos = $inst_di->update_version_clos('down');
3896     //
3897     $params = array(
3898     'di_reopened' => true,
3899     );
3900     }
3901     //
3902     if ($update_version_clos === false) {
3903     $this->f->addToLog(sprintf(
3904     "%s() : ERREUR - %s %s",
3905     __METHOD__,
3906     sprintf(
3907     __("Impossible de mettre à jour la version de clôture du dossier d'instruction %s."),
3908     $inst_di->getVal($inst_di->clePrimaire)
3909     ),
3910     sprintf(
3911     __("L'instruction tente d'appliquer l'état %s."),
3912     $inst_etat->getVal($inst_etat->clePrimaire)
3913     )
3914     ));
3915     $this->addToMessage(sprintf(
3916     "%s %s",
3917     __("Erreur lors de la mise à jour de la version de clôture du dossier d'instruction."),
3918     __("Veuillez contacter votre administrateur.")
3919     ));
3920     return false;
3921     }
3922     }
3923    
3924     /**
3925 softime 10808 * Notification automatique
3926     */
3927     // Notification automatique à l'ajout de l'instruction si la notification
3928     // automatique est choisie et qu'il n'y a pas de lettretype associée à l'événement
3929     if ($inst_evenement->getVal('notification') === 'notification_automatique' &&
3930 softime 18876 ($inst_evenement->getVal('lettretype') === null || $inst_evenement->getVal('lettretype') === '')) {
3931    
3932 softime 13137 // Message à afficher dans les logs pour indiquer quelle notification a échouée
3933 softime 13528 $msgLog = sprintf(
3934     '%s %s : %d',
3935     __('Erreur lors de la notification automatique du(des) pétitionnaire(s).'),
3936     __('Instruction notifiée'),
3937     $id
3938     );
3939 softime 13137
3940 softime 10808 // Récupération de la liste des demandeurs à notifier et de la catégorie
3941     $categorie = $this->f->get_param_option_notification($collectivite_di);
3942 softime 14064 $isPortal = $categorie === PORTAL;
3943 softime 10869 $demandeursANotifie = $this->get_demandeurs_notifiable(
3944     $this->valF['dossier'],
3945     $isPortal
3946     );
3947 softime 10808
3948 softime 18876 //
3949     $msg_notif = '';
3950    
3951 softime 10808 // Création d'une notification et d'une tâche pour chaque demandeur à notifier
3952 softime 12124 $demandeurPrincipalNotifie = false;
3953 softime 10808 foreach ($demandeursANotifie as $demandeur) {
3954 softime 12124 // Identifie si le demandeur principal a été notifié ou pas
3955     // et récupère ses informations
3956     if ($demandeur['petitionnaire_principal'] == 't') {
3957     $demandeurPrincipalNotifie = true;
3958     // Si le demandeur principal est notifiable mais qu'il y a des erreurs dans
3959     // son paramétrage, on effectue pas le traitement et on passe à l'itération
3960     // suivante. On le considère également comme non notifié pour gérer l'envoie
3961     // des messages d'erreurs
3962     // Si la demande a été déposée via le portail alors le paramétrage n'a pas
3963     // d'impact sur la notification
3964     $erreursParam = $this->get_info_notification_fail($val['dossier']);
3965     if (! $this->dossier_depose_sur_portail($val['dossier']) && $erreursParam != array()) {
3966     $demandeurPrincipalNotifie = false;
3967     continue;
3968     }
3969     }
3970 softime 18876 // Récupération du contenu de l'option option_bloquer_notif_auto_dln
3971     $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;
3972     // On vérifie l'existence du paramètre 'option_bloquer_notif_auto_dln',
3973     // On vérifie si la date limite est dépassée ou si le type d'événement est erroné
3974     if (! empty($option_bloquer_notif_auto_dln_types_evenements)
3975     && $this->is_type_evenement_autorise($inst_evenement, array('types_evenements_autorises'=> $option_bloquer_notif_auto_dln_types_evenements)) === true
3976     && $this->is_date_limite_notification_premier_mois_depasee() === true) {
3977     // Ajout de la notif et récupération de son id
3978     $idNotif = $this->ajouter_notification(
3979     $this->valF[$this->clePrimaire],
3980     $this->f->get_connected_user_login_name(),
3981     $demandeur,
3982     $collectivite_di,
3983     array(),
3984     true,
3985     'Echec',
3986     __('La date limite de notification au demandeur est dépassée')
3987 softime 13528 );
3988 softime 18876 if ($idNotif === false) {
3989     // Termine le traitement
3990     $this->addToLog(
3991     sprintf('%s() : %s', __METHOD__, $msgLog),
3992     DEBUG_MODE
3993     );
3994     return $this->end_treatment(__METHOD__, false);
3995     }
3996     $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."));
3997 softime 10808 }
3998 softime 18876 else {
3999     // Ajout de la notif et récupération de son id
4000     $idNotif = $this->ajouter_notification(
4001     $this->valF[$this->clePrimaire],
4002     $this->f->get_connected_user_login_name(),
4003     $demandeur,
4004     $collectivite_di,
4005     array(),
4006     true
4007 softime 13528 );
4008 softime 18876 if ($idNotif === false) {
4009     $this->addToLog(
4010     sprintf('%s() : %s', __METHOD__, $msgLog),
4011     DEBUG_MODE
4012     );
4013     return false;
4014     }
4015     // Création de la tache en lui donnant l'id de la notification
4016     $notification_by_task = $this->notification_by_task(
4017     $idNotif,
4018     $this->valF['dossier'],
4019     $categorie
4020 softime 10808 );
4021 softime 18876 if ($notification_by_task === false) {
4022     $this->addToLog(
4023     sprintf('%s() : %s', __METHOD__, $msgLog),
4024     DEBUG_MODE
4025     );
4026     $this->addToMessage(
4027     __("Erreur lors de la génération de la notification au(x) pétitionnaire(s).")
4028     );
4029     return false;
4030     }
4031     $msg_notif .= sprintf('%s<br/>%s', __("La notification a été générée."), __("Le suivi de la notification est disponible depuis l'instruction."));
4032 softime 10808 }
4033     }
4034 softime 12847 // Pour la notification par mail ou la notification via portal si le dossier a
4035     // été déposés via portal, si le demandeur principal n'est pas notifiable,
4036     // on créé une nouvelle notification en erreur avec en commentaire la raison pour
4037     // laquelle le demandeur principal n'a pas pu être notifié
4038     $depotPortal = $this->dossier_depose_sur_portail();
4039     if (! $demandeurPrincipalNotifie && ($isPortal === false || $depotPortal === true)) {
4040 softime 13137 // Précision dans les logs que le pétitionnaire principal n'est pas notifiable.
4041     // ' ' permet de mettre un espace entre les 2 msg de log.
4042 softime 13528 $msgLog .= sprintf(' %s', __('Le pétitionnaire principale n\'est pas notifiable.'));
4043 softime 12124 // Analyse pour savoir pourquoi le demandeur principal n'est pas notifiable
4044     $erreursParam = $this->get_info_notification_fail($val['dossier']);
4045     $demandeurPrincipal = $this->get_info_petitionnaire_principal_dossier($val['dossier']);
4046     // Ajout de la notif et récupération de son id
4047     $idNotif = $this->ajouter_notification(
4048     $this->valF[$this->clePrimaire],
4049     $this->f->get_connected_user_login_name(),
4050     $demandeurPrincipal,
4051     $collectivite_di,
4052 softime 12433 array(),
4053 softime 12124 true,
4054     'Echec',
4055     implode(' ', $erreursParam)
4056     );
4057     if ($idNotif === false) {
4058 softime 13528 $this->addToLog(
4059     sprintf('%s() : %s', __METHOD__, $msgLog),
4060     DEBUG_MODE
4061     );
4062 softime 12124 $this->addToMessage(
4063     __('Erreur : la création de la notification a échouée.').
4064     __("Veuillez contacter votre administrateur.")
4065     );
4066     return false;
4067     }
4068     // Prépare un message d'alerte à destination de l'instructeur pour l'informer
4069     // de l'échec de la notification
4070     $dossier_message = $this->get_inst_dossier_message(0);
4071     $dossier_message_val = array(
4072     'dossier' => $val['dossier'],
4073 softime 18876 'type' => __('erreur expedition'),
4074 softime 12124 'emetteur' => $this->f->get_connected_user_login_name().' (automatique)',
4075     'login' => $_SESSION['login'],
4076     'date_emission' => date('Y-m-d H:i:s'),
4077 softime 18876 'contenu' => __('Échec lors de la notification de l\'instruction ').
4078 softime 12124 $inst_evenement->getVal('libelle').
4079     '.<br>'.
4080     implode("\n", $erreursParam).
4081     '<br>'.
4082 softime 18876 __('Veuillez corriger ces informations avant de renvoyer la notification.')
4083 softime 12124 );
4084     $add = $dossier_message->add_notification_message($dossier_message_val, true);
4085     // Si une erreur se produit pendant l'ajout
4086     if ($add !== true) {
4087     $this->addToLog(__METHOD__."(): Le message d'alerte concernant l'echec de l'envoi de la notification n'a pas pu être envoyé.", DEBUG_MODE);
4088     return false;
4089     }
4090     }
4091 softime 18876 $this->addToMessage($msg_notif);
4092 softime 10808 }
4093    
4094 softime 12654 // Notification automatique en cas de dépôt de dossier dématérialisé
4095     // Vérifie si l'option de notification est active et si il s'agit bien d'une
4096     // instruction de récépissé
4097     if (
4098     $this->f->is_option_notification_depot_demat_enabled($collectivite_di)
4099     && $this->is_instruction_recepisse()
4100     ) {
4101 softime 13137 // Message à afficher dans les logs pour indiquer quelle notification a échouée
4102 softime 13528 $msgLog = sprintf(
4103     __('Erreur lors de la notification de dépôt du dossier dématérialisé : %s.'),
4104     $val['dossier']
4105     );
4106 softime 12654 // Récupère l'instance de la demande
4107     $demande = $inst_di->get_inst_demande();
4108 softime 13137 // Vérifie que le dossier a été déposé via platau ou portal
4109 softime 12654 if (
4110 softime 13137 ($demande->getVal('source_depot') == PLATAU ||
4111     $demande->getVal('source_depot') == PORTAL)
4112 softime 12654 ) {
4113 softime 13137 // Récupère la liste des mails fournis en paramètre. Si aucun adresse n'a été récupéré
4114     // l'envoi de la notification n'est pas effectué et un message d'erreur est affiché.
4115     $listeEmails = $this->f->get_param_courriel_de_notification_commune($collectivite_di);
4116     if (empty($listeEmails)) {
4117     $this->addToLog(
4118 softime 13528 sprintf(
4119     '%s(): %s %s',
4120     __METHOD__,
4121     $msgLog,
4122     __('Aucun courriel paramétré.')
4123     ),
4124 softime 13137 DEBUG_MODE
4125 softime 12654 );
4126 softime 13137 } else {
4127     foreach ($listeEmails as $email) {
4128     // Ajout de la notif et récupération de son id
4129     $destinataire = array(
4130     'destinataire' => $email,
4131     'courriel' => $email
4132 softime 12654 );
4133 softime 13137 $idNotif = $this->ajouter_notification(
4134     $this->valF[$this->clePrimaire],
4135     $this->f->get_connected_user_login_name(),
4136     $destinataire,
4137     $collectivite_di,
4138     array(),
4139     true
4140     );
4141     if ($idNotif === false) {
4142 softime 13528 $this->addToLog(
4143     sprintf('%s(): %s', __METHOD__, $msgLog),
4144     DEBUG_MODE
4145     );
4146 softime 13137 return false;
4147     }
4148     // Création de la tache en lui donnant l'id de la notification
4149     $notification_by_task = $this->notification_by_task(
4150     $idNotif,
4151     $this->valF['dossier'],
4152     'mail',
4153     'notification_depot_demat'
4154     );
4155     if ($notification_by_task === false) {
4156     $this->addToMessage(
4157     __("Erreur lors de la génération de la notification de dépot de dossier par voie dématérialisée.")
4158     );
4159 softime 13528 $this->addToLog(
4160     sprintf('%s(): %s', __METHOD__, $msgLog),
4161     DEBUG_MODE
4162     );
4163 softime 13137 return false;
4164     }
4165 softime 12654 }
4166     }
4167     }
4168     }
4169    
4170 softime 10808 /**
4171 softime 7996 * Mise à jour de la date de dernière modification du dossier
4172     */
4173     $inst_di->update_last_modification_date();
4174    
4175     /**
4176 softime 8640 * Mise à jour des données du DA.
4177     */
4178     $inst_da = $inst_di->get_inst_dossier_autorisation();
4179 softime 9245 $params['di_id'] = $this->valF['dossier'];
4180 softime 8640 if ($inst_da->majDossierAutorisation($params) === false) {
4181 softime 18876 $this->addToMessage(__("Erreur lors de la mise a jour des donnees du dossier d'autorisation. Contactez votre administrateur."));
4182 softime 8640 $this->correct = false;
4183     return false;
4184     }
4185    
4186     /**
4187 fmichon 4708 * Historisation de la vie du DI.
4188     */
4189 softime 17542
4190     $res = $this->add_log_to_dossier($id, array_merge($val, $this->valF));
4191    
4192     $data = array('val' => &$val, 'id' => $id, 'result' => &$res);
4193 softime 18436 $this->f->module_manager->run_hooks('triggerajouterapres_override_post', $this, $data);
4194 softime 17542 return $res;
4195 nmeucci 3876 }
4196 mbroquet 3730
4197 softime 12124 /**
4198     * Cette méthode vérifie si toutes les conditions de l'envoi de la notification
4199     * sont remplies.
4200     * Les conditions vérifiées sont les suivantes :
4201 softime 14064 * - L'option de notification *option_notification* doit être définie
4202 softime 12124 * - Le petitionnaire principal doit accepter les notifications
4203     * - Le pétitionnaire principal doit avoir une adresse mail renseignée
4204     * - Le pétitionnaire principal doit avoir une adresse mail correcte
4205     * Pour chaque vérification effectué un message d'erreur est ajouté si la
4206     * condition n'est pas remplie.
4207     * Renvoie le message d'erreur en sortie.
4208     *
4209     * @param string identifiant du dossier sur lequel les notifications ont échouée
4210     * @return string
4211     */
4212 softime 18436 public function get_info_notification_fail($dossier = null) {
4213 softime 12124 // Utilise l'identifiant du dossier passé en paramètre et si aucun dossier n'a été récupéré
4214     // utilise celui associé à l'instruction
4215     if ($dossier == null) {
4216     $dossier = $this->getVal('dossier');
4217     }
4218     // Tableau contenant la liste des messages d'erreur
4219     $errorMessage = array();
4220 softime 14064 // Récupère l'option de notification
4221     $collectivite_di = $this->get_dossier_instruction_om_collectivite($dossier);
4222     $option_notification = $this->f->get_param_option_notification($collectivite_di);
4223     if ($option_notification !== PORTAL && $option_notification !== 'mail') {
4224     $errorMessage[] = __("L'option de notification option_notification doit obligatoirement être définie.");
4225     }
4226 softime 12124 // Récupère les informations du demandeurs principal
4227     $infoPetitionnaire = $this->get_info_petitionnaire_principal_dossier($dossier);
4228     // Vérifie si le pétitionnaire principal à bien la case "accepte les notification" cochée
4229     if (isset($infoPetitionnaire['notification']) && $infoPetitionnaire['notification'] != 't') {
4230     $errorMessage[] = __('Le pétitionnaire principal n\'accepte pas les notifications.');
4231     }
4232     // Vérifie si l'adresse mail du pétitionnaire principale est renseignée
4233     if (isset($infoPetitionnaire['courriel']) && ! empty($infoPetitionnaire['courriel'])) {
4234     // Vérifie si le format de l'adresse mail est pas correct et, si ce n'est pas le cas, informe l'utilisateur
4235     // qu'il doit le corriger avant de pouvoir ajouter l'nstruction
4236     if (! $this->f->checkValidEmailAddress($infoPetitionnaire['courriel'])) {
4237     $errorMessage[] = __('Le courriel du pétitionnaire principal n\'est pas correct : ').
4238     $infoPetitionnaire['courriel'].
4239     '.';
4240     }
4241     } else {
4242     // Si le courriel du pétitionnaire principal
4243     $errorMessage[] = __('Le courriel du pétitionnaire principal n\'est pas renseigné.');
4244     }
4245 softime 11585
4246 softime 12124 return $errorMessage;
4247     }
4248    
4249     /**
4250     * Méthode servant à vérifier si un dossier a été déposé sur
4251     * le portail citoyen ou pas.
4252     * La verification se fait via une requête sql dans laquelle
4253     * on va chercher un dossier ayant pour id l'identifiant de
4254     * dossier associé à l'instruction et pour lequel la demande
4255     * associée la plus ancienne est une demande de création de
4256     * dossier via portail
4257     *
4258     * @param string identifiant du dossier. Si non renseigné c'est le dossier
4259     * associé à l'instruction qui est utilisé
4260     * @return boolean|void true : dossier déposé via portail, false : dossier
4261     * non déposé via portail et null : erreur de base de données.
4262     */
4263     protected function dossier_depose_sur_portail($dossier = null) {
4264     if (empty($dossier)) {
4265     $dossier = $this->getVal('dossier');
4266     }
4267 softime 13137 $qres = $this->f->get_one_result_from_db_query(
4268     sprintf(
4269     'SELECT
4270     dossier
4271     FROM
4272     %1$sdossier
4273     -- Récuperation de la première demande associée au dossier
4274     LEFT JOIN (
4275     SELECT
4276     demande,
4277     dossier_instruction,
4278     source_depot
4279     FROM
4280     %1$sdemande
4281     WHERE
4282     dossier_instruction = \'%2$s\'
4283     ORDER BY
4284     demande ASC
4285     LIMIT 1
4286 softime 14064 ) AS demande
4287     ON dossier.dossier = demande.dossier_instruction
4288 softime 13137 WHERE
4289     dossier.dossier = \'%2$s\'
4290     AND demande.source_depot = \'portal\'',
4291     DB_PREFIXE,
4292     $this->f->db->escapeSimple($dossier)
4293     ),
4294     array(
4295     "origin" => __METHOD__,
4296     "force_return" => true,
4297     )
4298 softime 12124 );
4299 softime 13137 if ($qres["code"] !== "OK") {
4300 softime 12124 $this->addToMessage(__('Erreur : La vérification du mode de dépôt du dossier à échoué'));
4301     return;
4302     }
4303     // Si on a un résultat c'est que le dossier a été déposé via le portail
4304 softime 13137 return ! empty($qres["result"]);
4305 softime 12124 }
4306    
4307 softime 11585 public function is_service_notifiable() {
4308     $evenement = $this->get_inst_evenement($this->getVal('evenement'));
4309    
4310     // Si l'instruction a une édition non finalisé quel que soit
4311     // le type de notification, il n'est pas notifiable
4312     if ($this->has_an_edition() === true) {
4313     if ($this->is_unfinalizable_without_bypass() === false) {
4314     return false;
4315     }
4316     }
4317     // Vérifie si la notification des tiers est active pour l'évènement
4318     return $this->get_boolean_from_pgsql_value($evenement->getVal('notification_service'));
4319     }
4320    
4321     public function is_tiers_notifiable() {
4322     $evenement = $this->get_inst_evenement($this->getVal('evenement'));
4323    
4324     // Si l'instruction a une édition non finalisé quel que soit
4325     // le type de notification, il n'est pas notifiable
4326     if ($this->has_an_edition() === true) {
4327     if ($this->is_unfinalizable_without_bypass() === false) {
4328     return false;
4329     }
4330     }
4331     // Vérifie si la notification des tiers est active pour l'évènement
4332 softime 13137 return ! empty($evenement->getVal('notification_tiers'));
4333 softime 11585 }
4334    
4335 softime 12124 /**
4336     * Méthode permettant de savoir si une instruction peut
4337     * être notifiée manuellement selon les différents types
4338     * de notification.
4339     *
4340     * Si l'instruction a une édition non finalisée alors elle n'est pas
4341     * manuellement notifiable.
4342     * Si l'instruction est associé à un événement de notification pour
4343     * lequel un retour signature est recquis, elle n'est notifiable que
4344     * si la date de retour de signature est remplie.
4345     * Par défaut si le type de notification n'est pas connu alors l'instruction
4346     * n'est pas notifiable.
4347     * Pour tous les autres cas l'instruction est manuellement notifiable.
4348     *
4349     * @return boolean true : notifiable | false : non notifiable
4350     */
4351 softime 10808 public function is_notifiable_by_task_manual() {
4352     $ev = $this->get_inst_evenement($this->getVal('evenement'));
4353    
4354     // Si l'instruction a une édition non finalisé quel que soit
4355     // le type de notification, il n'est pas notifiable
4356     if ($this->has_an_edition() === true) {
4357     if ($this->is_unfinalizable_without_bypass() === false) {
4358     return false;
4359     }
4360     }
4361    
4362     // Gestion des différents cas selon la valeur du champs notification
4363 softime 12124 if ($ev->getVal('notification') == 'notification_manuelle' ||
4364     $ev->getVal('notification') == 'notification_manuelle_annexe' ||
4365     $ev->getVal('notification') == 'notification_automatique'
4366     ) {
4367     return true;
4368     } elseif (($ev->getVal('notification') == 'notification_auto_signature_requise' ||
4369     $ev->getVal('notification') == 'notification_manuelle_signature_requise' ||
4370     $ev->getVal('notification') == 'notification_manuelle_annexe_signature_requise') &&
4371     $this->getVal('date_retour_signature') != null &&
4372     $this->getVal('date_retour_signature') != ''
4373     ) {
4374     return true ;
4375 softime 10808 }
4376 softime 12124 return false;
4377 softime 10808 }
4378    
4379 softime 8989 /**
4380 softime 14542 * Crée une instance de notification et une tache notification_instruction de catégorie portal
4381     * pour le demandeur principal.
4382 softime 10808 *
4383     * @return boolean true si le traitement à réussi
4384     */
4385 softime 14542 protected function notifier_demandeur_principal_via_portal() {
4386 softime 10808 $this->begin_treatment(__METHOD__);
4387     $message = '';
4388     // Récupération des informations concernant le demandeur
4389     $dossier = $this->getVal('dossier');
4390 softime 10968 $collectivite_di = $this->get_dossier_instruction_om_collectivite($dossier);
4391 softime 10808 $demandeur = $this->get_demandeurs_notifiable(
4392     $dossier,
4393     true
4394     );
4395     if ($demandeur !== array()) {
4396 softime 10869 $destinataire = array_values($demandeur);
4397 softime 10808 // Ajout de la notif et récupération de son id
4398     $idNotification = $this->ajouter_notification(
4399     $this->getVal($this->clePrimaire),
4400     $this->f->get_connected_user_login_name(),
4401 softime 10968 $destinataire[0],
4402     $collectivite_di,
4403 softime 12433 array(),
4404 softime 10968 true
4405 softime 10808 );
4406     if ($idNotification === false) {
4407     return $this->end_treatment(__METHOD__, false);
4408     }
4409     // Création de la tâche en lui donnant l'id de la notification
4410 softime 14542 $notification_by_task = $this->notification_by_task($idNotification, $dossier, PORTAL);
4411 softime 10808 if ($notification_by_task === false) {
4412     $this->addToMessage(
4413     __("Erreur lors de la génération de la notification au(x) pétitionnaire(s).")
4414     );
4415     return $this->end_treatment(__METHOD__, false);
4416     }
4417     $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.")));
4418     return $this->end_treatment(__METHOD__, true);
4419     }
4420     $this->addToMessage( __("Le demandeur principal n'est pas notifiable."));
4421 softime 12124 return $this->end_treatment(__METHOD__, false);
4422 softime 10808 }
4423    
4424     public function notification_by_task($object_id, $dossier, $category = null, $type = null) {
4425     // Si le type n'est pas correctement spécifié, alors il est calculé
4426 softime 11585 if ($type !== 'notification_recepisse'
4427     && $type !== 'notification_instruction'
4428     && $type !== 'notification_decision'
4429     && $type !== 'notification_service_consulte'
4430 softime 12654 && $type !== 'notification_tiers_consulte'
4431     && $type !== 'notification_depot_demat'
4432 softime 15037 && $type !== 'notification_commune'
4433     && $type !== 'notification_signataire') {
4434 softime 10808 //
4435     $type = 'notification_instruction';
4436     // Vérifie si l'instruction est un récépissé
4437 softime 12654 if ($this->is_instruction_recepisse()) {
4438     $type = 'notification_recepisse';
4439    
4440 softime 10808 }
4441     // Vérifie si l'instruction est une décision
4442     if ($type !== 'notification_recepisse') {
4443     $avis_decision = $this->getVal('avis_decision') !== null ? $this->getVal('avis_decision') : $this->valF['avis_decision'];
4444     if ($avis_decision !== null && $avis_decision !== '') {
4445     $type = 'notification_decision';
4446     }
4447     }
4448     }
4449 softime 14064 // Préparation des valeurs de la tâche
4450 softime 10808 $task_val = array(
4451     'type' => $type,
4452     'object_id' => $object_id,
4453     'dossier' => $dossier,
4454     'category' => $category,
4455     );
4456 softime 14064 // Préparation de la tache de notification
4457     $inst_task = $this->f->get_inst__om_dbform(array(
4458     "obj" => "task",
4459     "idx" => 0,
4460     ));
4461 softime 10808
4462     $add_task = $inst_task->add_task(array('val' => $task_val));
4463     if ($add_task === false) {
4464 softime 13528 $this->addToLog(
4465     sprintf(
4466     '%s(): %s %s : %s',
4467     __METHOD__,
4468     __('Echec de l\'ajout de la tâche de notification.'),
4469     __('Paramétrage de la tâche'),
4470     var_export($task_val, true)
4471     ),
4472     DEBUG_MODE
4473     );
4474 softime 10808 return false;
4475     }
4476    
4477     return true;
4478     }
4479    
4480 softime 10968 /**
4481 softime 12654 * Cette méthode permet de savoir si l'instruction est une instruction
4482     * de recepisse (instruction lié à l'ajout du dossier).
4483     *
4484     * Pour cela, on récupère la liste des actions qui ont menées à la création
4485     * de l'instruction. Si une de ces actions est lié à un objet "demande" on
4486     * en deduis que c'est l'ajout d'une demande qui a déclenché la création de
4487     * l'instruction et donc qu'il s'agit d'un recepisse.
4488     *
4489     * @return boolean
4490     */
4491     protected function is_instruction_recepisse() {
4492     // Récupère la liste des actions qui ont mené à la création de
4493     // l'instruction
4494     $trace = debug_backtrace();
4495     // Parcours la liste des actions et si une de ces actions est lié
4496     // à la classe demande on cosidère que l'instruction est un recepisse
4497     foreach ($trace as $key => $value) {
4498     if (isset($trace[$key]['class']) === true
4499     && empty($trace[$key]['class']) === false) {
4500     if (strtolower($trace[$key]['class']) === 'demande') {
4501     return true;
4502     }
4503     }
4504     }
4505     return false;
4506     }
4507    
4508     /**
4509 softime 10968 * A partir des informations passée en argument ajoute un nouvel élément
4510     * dans la table instruction_notification.
4511     * Avant l'ajout vérifie en utilisant l'id de la collectivité passée en
4512     * paramètre si le paramétrage attendus est ok.
4513     * Ajoute également un nouvel élement dans instruction_notification_document
4514     * si l'instruction possède une lettretype.
4515     * Si un identifiant d'une instruction annexe est donnée ajoute un deuxième
4516     * élement dans la table instruction_notification_document qui correspondra
4517     * à l'annexe de la notification.
4518     *
4519     * @param integer identifiant de l'instruction notifiée
4520     * @param string information concernant l'emetteur
4521     * @param array tableau contenant 2 entrées
4522     * - destinatire : nom, prenom ou raison sociale, dénomination et courriel
4523     * - courriel : adresse mail de la personne à notifier
4524     * @param integer identifiant de la collectivité permettant de récupèrer les
4525     * paramètres à valider
4526     * @param boolean indique si la notification est automatique ou manuelle
4527     * @param integer identifiant d'une instruction dont l'édition sera annexé
4528     * à la notification
4529     *
4530     * @return integer|boolean identifiant de la notification créée si le traitement
4531     * a réussie, false sinon.
4532     */
4533 softime 10869 protected function ajouter_notification(
4534     $idInstruction,
4535     $emetteur,
4536     $destinataire,
4537 softime 10968 $collectiviteId,
4538 softime 12433 $annexes = array(),
4539 softime 10968 $demandeAuto = false,
4540 softime 12124 $statut = 'en cours d\'envoi',
4541 softime 12433 $commentaire = 'Notification en cours de traitement'
4542 softime 10869 ) {
4543 softime 10968 // Vérification que les paramètres nécessaires à l'envoi de la notification existe avant
4544     // de créer la notification
4545     if (! $this->is_parametrage_notification_correct($collectiviteId)) {
4546 softime 13137 $msgErreur = __("Erreur de paramétrage. L'url d'accès au(x) document(s) notifié(s) n'est pas paramétrée.");
4547     $this->addToMessage($msgErreur);
4548 softime 13528 $this->addToLog(
4549     sprintf('%s() : %s', __METHOD__, $msgErreur),
4550     DEBUG_MODE
4551     );
4552 softime 10968 return false;
4553     }
4554 softime 10808 // Préparation de la notification
4555     $inst_notif = $this->f->get_inst__om_dbform(array(
4556     "obj" => "instruction_notification",
4557     "idx" => "]",
4558     ));
4559     $notif_val = array(
4560     'instruction_notification' => null,
4561     'instruction' => $idInstruction,
4562     'automatique' => $demandeAuto,
4563     'emetteur' => $emetteur,
4564     'date_envoi' => null,
4565 softime 10869 'destinataire' => $destinataire['destinataire'],
4566     'courriel' => $destinataire['courriel'],
4567 softime 10808 'date_premier_acces' => null,
4568 softime 12124 'statut' => $statut,
4569     'commentaire' => $commentaire
4570 softime 10808 );
4571    
4572     // Création de la notification
4573     $add_notif = $inst_notif->ajouter($notif_val);
4574     if ($add_notif === false) {
4575 softime 10968 $this->addToMessage(__("Erreur lors de la génération de la notification au(x) pétitionnaire(s)."));
4576 softime 13528 $this->addToLog(
4577     sprintf(
4578     '%s() : %s %s : %s',
4579     __METHOD__,
4580     __("Echec de l'ajout de la notification en base de données."),
4581     __('Paramétrage de la notification'),
4582     var_export($notif_val, true)
4583     ),
4584     DEBUG_MODE
4585     );
4586 softime 10808 return false;
4587     }
4588    
4589 softime 10869 // Si il y a une lettretype finalisé stockage de la clé d'accès au documents
4590     if ($this->evenement_has_an_edition($this->getVal('evenement')) === true) {
4591 softime 12433 $add_notif_doc = $this->ajouter_notification_document(
4592     $inst_notif->getVal($inst_notif->clePrimaire),
4593 softime 10869 $this->getVal($this->clePrimaire),
4594 softime 12433 'instruction'
4595 softime 10808 );
4596     if ($add_notif_doc === false) {
4597 softime 10968 $this->addToMessage(__("Erreur lors de la génération de la notification du document."));
4598 softime 10808 return false;
4599     }
4600 softime 10869 }
4601     // Si une annexe a été choisie stockage de la clé d'accès à l'annexe
4602 softime 12433 if (! empty($annexes) && is_array($annexes)) {
4603     $add_notif_annexe = $this->ajouter_notification_document_multiple(
4604 softime 10869 $inst_notif->getVal($inst_notif->clePrimaire),
4605 softime 12433 $annexes
4606 softime 10869 );
4607     if ($add_notif_annexe === false) {
4608 softime 10968 $this->addToMessage(__("Erreur lors de la génération de la notification de l'annexe."));
4609 softime 10869 return false;
4610     }
4611     }
4612 softime 10808
4613     // Renvoie l'id de la nouvelle instance de instruction_notification
4614     return $inst_notif->getVal($inst_notif->clePrimaire);
4615     }
4616    
4617     /**
4618 softime 11585 * Pour chaque élément du tableau passé en paramètre ajoute une nouvelle
4619     * instance dans la table instruction_notification_document lié a la
4620     * notification dont l'id est passé en paramètre.
4621     *
4622     * @param array tableau contenant les informations nécessaires pour créer les annexes
4623     *
4624     * @return integer|boolean identifiant de la notification créée si le traitement
4625     * a réussie, false sinon.
4626     */
4627     protected function ajouter_notification_document_multiple($idNotification, $listeDocument) {
4628 softime 12433 foreach ($listeDocument as $paramDoc) {
4629     if (! $this->ajouter_notification_document($idNotification, $paramDoc['id'], $paramDoc['tableDocument'], $paramDoc['isAnnexe'])) {
4630 softime 11585 $this->addToMessage(__("Erreur lors de la génération des documents à notifier."));
4631     return false;
4632     }
4633     }
4634     return true;
4635     }
4636    
4637     /**
4638     * Ajoute un élément dans la table instruction_notification_document en utilisant
4639     * les éléments fourni en paramètre
4640     *
4641     * @param integer $idNotification : id de la notification à laquelle on associe le document
4642     * @param integer $idDocument : id de l'objet auquel est rattaché le document
4643     * @param string $tableDocument : nom de la table a laquelle est rattaché le document
4644     * @param boolean $isAnnexe : indique si le document est une annexe ou pas
4645     *
4646     * @return boolean indique si le traitement a réussi
4647     */
4648     protected function ajouter_notification_document($idNotification, $idDocument, $tableDocument, $isAnnexe = false) {
4649     $inst_notif_doc = $this->f->get_inst__om_dbform(array(
4650     "obj" => "instruction_notification_document",
4651     "idx" => "]",
4652     ));
4653     // l'attribut instruction doit obligatoirement être renseigné
4654     // pour éviter toutes confusion avec d'autres instruction l'id
4655     // 0 est donné au document n'appartenant pas aux instructions
4656     $notif_doc_val = array(
4657     'instruction_notification_document' => null,
4658     'instruction_notification' => $idNotification,
4659     'instruction' => $tableDocument == 'instruction' ? $idDocument : 0,
4660     'document_type' => $tableDocument,
4661     'document_id' => $idDocument,
4662     'cle' => $this->getCleAccesDocument(),
4663     'annexe' => $isAnnexe
4664     );
4665    
4666     $add_notif_doc = $inst_notif_doc->ajouter($notif_doc_val);
4667     if ($add_notif_doc === false) {
4668 softime 13528 $this->addToLog(
4669     sprintf(
4670     '%s() : %s %s : %s',
4671     __METHOD__,
4672     __('Echec de l\'ajout du paramétrage du document notifié en base de données.'),
4673     __('Paramétrage du document'),
4674     var_export($notif_doc_val, true)
4675     ),
4676     DEBUG_MODE
4677     );
4678 softime 11585 return false;
4679     }
4680     return true;
4681     }
4682 softime 18436
4683 softime 11585 /**
4684 softime 18436 * Récupère via une requête la liste des identifiants des éléments de la table
4685     * parametrage_annexe liés à une instruction.
4686     * Boucle sur cette liste pour instancier le parametrage_annexe correspondant
4687     * et lui appliquer le traitement de suppression.
4688     *
4689     * @param integer identifiant d'une instruction
4690     * @return boolean état du traitement. True : OK, False : Echec
4691     */
4692     function supprimer_parametrage_annexe($id_instruction) {
4693     // Récupère la liste des parametrage_annexe associés à l'instruction
4694     $qres = $this->f->get_all_results_from_db_query(sprintf(
4695     'SELECT parametrage_annexe
4696     FROM %sparametrage_annexe
4697     WHERE parametrage_annexe.instruction = %d',
4698     DB_PREFIXE,
4699     intval($id_instruction)),
4700     array('origin' => __METHOD__));
4701     // Instancie puis supprime chacun des éléments de la liste
4702     foreach ($qres['result'] as $res) {
4703     $parametrage_annexe = $this->f->get_inst__om_dbform(array(
4704     'obj' => 'parametrage_annexe',
4705     'idx' => $res['parametrage_annexe']
4706     ));
4707     foreach ($parametrage_annexe->champs as $champ) {
4708     $val[$champ] = $parametrage_annexe->getVal($champ);
4709     }
4710     $suppression = $parametrage_annexe->supprimer($val);
4711     // En cas d'échec arrête le traitement et renvoie false
4712     if ($suppression === false) {
4713     return false;
4714     }
4715     }
4716     return true;
4717     }
4718    
4719     /**
4720 softime 10968 * Vérifie si le paramétrage de la notification des demandeurs est correct.
4721     *
4722     * @param integer identifiant de la collectivité
4723     * @return boolean
4724     */
4725     protected function is_parametrage_notification_correct($collectiviteId) {
4726     $categorie = $this->f->get_param_option_notification($collectiviteId);
4727     $urlAccesNotif = $this->f->get_parametre_notification_url_acces($collectiviteId);
4728 softime 14064 if ($categorie === 'mail' && $urlAccesNotif === null) {
4729 softime 10968 return false;
4730     }
4731     return true;
4732     }
4733    
4734     /**
4735 softime 8989 * TRIGGER - triggermodifierapres.
4736     *
4737     * @return boolean
4738     */
4739     function triggermodifierapres($id, &$dnu1 = null, $val = array(), $dnu2 = null) {
4740     $this->addToLog(__METHOD__."(): start", EXTRA_VERBOSE_MODE);
4741 softime 17542 $data = array('val' => &$val, 'id' => $id);
4742     $this->f->module_manager->run_hooks('triggermodifierapres_pre', $this, $data);
4743 softime 10808 $collectivite_di = $this->get_dossier_instruction_om_collectivite($val['dossier']);
4744     $message = '';
4745 softime 18769 $res = true;
4746 softime 13137 // Définit si le dossier d'instruction doit être mis à jour
4747     $update_dossier = true;
4748     // Les actions de mise à jour des dates ne doivent pas appliquer
4749     // l'action de l'événement et donc ne pas mettre à jour le dossier
4750     if ($this->getParameter("maj") == 125
4751     || $this->getParameter("maj") == 170
4752     || $this->getParameter("maj") == 175) {
4753     $update_dossier = false;
4754     }
4755    
4756     // Traitement en cas de mise à jour du dossier
4757     if ($update_dossier === true) {
4758     /**
4759     * L'objectif ici est d'effectuer les recalculs de date dans le dossier
4760     * si la date de l'evenement est modifiee
4761     */
4762     // Initialisation
4763     $valF = array();
4764     $valF_dt = array();
4765     // Initialisation du type d'événement
4766     $type_evmt = "";
4767     // Récupération de l'action correspondante à l'événement
4768 softime 14064 $evenement = $this->f->get_inst__om_dbform(array(
4769     "obj" => "evenement",
4770     "idx" => $this->valF['evenement']
4771     ));
4772 softime 13137
4773     // Récupération des paramètres de l'action
4774 softime 14542 // TODO : remplacer cette requête par l'instanciation de l'action
4775     $qres = $this->f->get_all_results_from_db_query(
4776     sprintf(
4777     'SELECT
4778     *
4779     FROM
4780     %1$saction
4781     WHERE
4782     action = \'%2$s\'',
4783     DB_PREFIXE,
4784     $this->f->db->escapeSimple($evenement->getVal('action'))
4785     ),
4786     array(
4787     "origin" => __METHOD__
4788     )
4789 softime 14064 );
4790 softime 14542 foreach ($qres['result'] as $row) {
4791 softime 13137 // application des regles sur le courrier + delai
4792     if(preg_match("/date_evenement/",$row['regle_date_limite'])){
4793     $valF['date_limite']= $this->regle($row['regle_date_limite'], 'regle_date_limite');
4794     }
4795     if(preg_match("/date_evenement/",$row['regle_date_complet'])){
4796     $valF['date_complet']= $this->regle($row['regle_date_complet'], 'regle_date_complet');
4797     }
4798     if(preg_match("/date_evenement/",$row['regle_date_dernier_depot'])){
4799     $valF['date_dernier_depot']= $this->regle($row['regle_date_dernier_depot'], 'regle_date_dernier_depot');
4800     }
4801     if(preg_match("/date_evenement/",$row['regle_date_notification_delai'])){
4802     $valF['date_notification_delai']= $this->regle($row['regle_date_notification_delai'], 'regle_date_notification_delai');
4803     }
4804     if(preg_match("/date_evenement/",$row['regle_date_decision'])){
4805     $valF['date_decision']= $this->regle($row['regle_date_decision'], 'regle_date_decision');
4806     }
4807     if(preg_match("/date_evenement/",$row['regle_date_rejet'])){
4808     $valF['date_rejet']= $this->regle($row['regle_date_rejet'], 'regle_date_rejet');
4809     }
4810     if(preg_match("/date_evenement/",$row['regle_date_validite'])){
4811     $valF['date_validite']= $this->regle($row['regle_date_validite'], 'regle_date_validite');
4812     }
4813     if(preg_match("/date_evenement/",$row['regle_date_chantier'])){
4814     $valF['date_chantier']= $this->regle($row['regle_date_chantier'], 'regle_date_chantier');
4815     }
4816     if(preg_match("/date_evenement/",$row['regle_date_achevement'])){
4817     $valF['date_achevement']= $this->regle($row['regle_date_achevement'], 'regle_date_achevement');
4818     }
4819     if(preg_match("/date_evenement/",$row['regle_date_conformite'])){
4820     $valF['date_conformite']= $this->regle($row['regle_date_conformite'], 'regle_date_conformite');
4821     }
4822     if(preg_match("/date_evenement/",$row['regle_date_cloture_instruction'])){
4823     $valF['date_cloture_instruction']= $this->regle($row['regle_date_cloture_instruction'], 'regle_date_cloture_instruction');
4824     }
4825     if(preg_match("/date_evenement/",$row['regle_date_premiere_visite'])){
4826     $valF['date_premiere_visite']= $this->regle($row['regle_date_premiere_visite'], 'regle_date_premiere_visite');
4827     }
4828     if(preg_match("/date_evenement/",$row['regle_date_derniere_visite'])){
4829     $valF['date_derniere_visite']= $this->regle($row['regle_date_derniere_visite'], 'regle_date_derniere_visite');
4830     }
4831     if(preg_match("/date_evenement/",$row['regle_date_contradictoire'])){
4832     $valF['date_contradictoire']= $this->regle($row['regle_date_contradictoire'], 'regle_date_contradictoire');
4833     }
4834     if(preg_match("/date_evenement/",$row['regle_date_retour_contradictoire'])){
4835     $valF['date_retour_contradictoire']= $this->regle($row['regle_date_retour_contradictoire'], 'regle_date_retour_contradictoire');
4836     }
4837     if(preg_match("/date_evenement/",$row['regle_date_ait'])){
4838     $valF['date_ait']= $this->regle($row['regle_date_ait'], 'regle_date_ait');
4839     }
4840     if(preg_match("/date_evenement/",$row['regle_date_transmission_parquet'])){
4841     $valF['date_transmission_parquet']= $this->regle($row['regle_date_transmission_parquet'], 'regle_date_transmission_parquet');
4842     }
4843     if ($row['regle_donnees_techniques1'] !== '') {
4844     $valF_dt[$row['cible_regle_donnees_techniques1']] = $this->regle($row['regle_donnees_techniques1'], 'regle_donnees_techniques1');
4845     }
4846     if ($row['regle_donnees_techniques2'] !== '') {
4847     $valF_dt[$row['cible_regle_donnees_techniques2']] = $this->regle($row['regle_donnees_techniques2'], 'regle_donnees_techniques2');
4848     }
4849     if ($row['regle_donnees_techniques3'] !== '') {
4850     $valF_dt[$row['cible_regle_donnees_techniques3']] = $this->regle($row['regle_donnees_techniques3'], 'regle_donnees_techniques3');
4851     }
4852     if ($row['regle_donnees_techniques4'] !== '') {
4853     $valF_dt[$row['cible_regle_donnees_techniques4']] = $this->regle($row['regle_donnees_techniques4'], 'regle_donnees_techniques4');
4854     }
4855     if ($row['regle_donnees_techniques5'] !== '') {
4856     $valF_dt[$row['cible_regle_donnees_techniques5']] = $this->regle($row['regle_donnees_techniques5'], 'regle_donnees_techniques5');
4857     }
4858     if ($row['regle_dossier_instruction_type'] !== '') {
4859     $valF['dossier_instruction_type'] = $this->regle($row['regle_dossier_instruction_type'], 'regle_dossier_instruction_type');
4860     }
4861 mbroquet 3730 }
4862 softime 13137 // Si des valeurs de données techniques ont été calculées alors on met à jour l'enregistrement
4863     if (count($valF_dt) > 0) {
4864     $dt_id = $this->getDonneesTechniques();
4865     // On met à jour le dossier
4866     $cle = " donnees_techniques='".$dt_id."'";
4867     $res1 = $this->f->db->autoExecute(DB_PREFIXE.'donnees_techniques', $valF_dt, DB_AUTOQUERY_UPDATE, $cle);
4868     $this->addToLog(
4869     __METHOD__."(): db->autoexecute(\"".DB_PREFIXE."donnees_techniques\", ".print_r($valF_dt, true).", DB_AUTOQUERY_UPDATE, \"".$cle."\");",
4870     VERBOSE_MODE
4871     );
4872     $this->f->isDatabaseError($res1);
4873     // Affichage d'informations à l'utilisateur
4874 softime 18876 $this->addToMessage(__('enregistrement')." ".$this->valF['dossier']." ".__('table')." dossier [".$this->f->db->affectedRows()." ".__('enregistrement')." ".__('mis_a_jour')."]");
4875 mbroquet 3730 }
4876 softime 13137 // Si des valeurs ont été calculées alors on met à jour l'enregistrement
4877     if (count($valF) > 0) {
4878     $inst_dossier = $this->f->get_inst__om_dbform(array(
4879     "obj" => "dossier",
4880     "idx" => $this->valF['dossier'],
4881     ));
4882     $valF['instruction'] = $id;
4883     $valF['crud'] = 'update';
4884     $update_by_instruction = $inst_dossier->update_by_instruction($valF);
4885     if ($update_by_instruction === false) {
4886     $this->cleanMessage();
4887     $this->addToMessage(sprintf('%s %s', __("Une erreur s'est produite lors de la mise à jour du dossier d'instruction."), __("Veuillez contacter votre administrateur.")));
4888     return false;
4889     }
4890     // Affichage d'informations à l'utilisateur
4891 softime 18876 $this->addToMessage(__('enregistrement')." ".$this->valF['dossier']." ".__('table')." dossier [".$this->f->db->affectedRows()." ".__('enregistrement')." ".__('mis_a_jour')."]");
4892 mbroquet 3730 }
4893     }
4894    
4895 softime 14064 // Par défaut les instructions à ajouter suite à la saisie d'une date
4896     // de retour signature ou de notification, utilisent l'action 0
4897     // Si la création d'événement d'instruction suivant est déclenchée par
4898     // une notification suite au traitement d'une tâche (démat') alors l'ajout
4899     // de la nouvelle instruction se fait avec l'action 176
4900     // Cela permet de ne pas contrôler la restriction lors de l'ajout de la
4901     // nouvelle instruction, depuis la méthode verifier()
4902     $code_action_add = 0;
4903     if ($this->getParameter("maj") == 175) {
4904     $code_action_add = 176;
4905     }
4906 mbroquet 3730 $restriction = $this->get_restriction($val['evenement']);
4907     $this->restriction_valid = $this->restrictionIsValid($restriction);
4908    
4909     if($restriction == "" || $this->restriction_valid ){
4910     // Récupération de tous les paramètres de l'événement sélectionné
4911 softime 14542 // TODO : remplacer cette requête par l'instanciation de l'evenement
4912     $qres = $this->f->get_all_results_from_db_query(
4913     sprintf(
4914     'SELECT
4915     *
4916     FROM
4917     %1$sevenement
4918     WHERE
4919     evenement = %2$d',
4920     DB_PREFIXE,
4921     intval($this->valF['evenement'])
4922     ),
4923     array(
4924     "origin" => __METHOD__
4925     )
4926     );
4927 nmeucci 3965 $current_id = $this->getVal($this->clePrimaire);
4928 softime 14542 foreach ($qres['result'] as $row) {
4929 softime 18436 // Si la date de retour signature est éditée
4930     if (
4931 softime 18876 $this->getVal('date_retour_signature') == "" &&
4932 softime 18436 $this->valF['date_retour_signature'] != ""
4933     ){
4934     // On Lance le hook
4935     $data = array('val' => $this->valF);
4936     $data['dossier'] = $this->valF['dossier'];
4937     $this->f->module_manager->run_hooks('update_date_retour_signature_pre', $this, $data);
4938    
4939     // On vérifie si il existe un événement automatique
4940     if (
4941     $row['evenement_retour_signature'] != ""
4942     ) {
4943     $new_instruction = $this->f->get_inst__om_dbform(array(
4944     "obj" => "instruction",
4945     "idx" => "]",
4946     ));
4947     // Création d'un tableau avec la liste des champs de l'instruction
4948     foreach($new_instruction->champs as $champ) {
4949     $valNewInstr[$champ] = "";
4950     }
4951     // Définition des valeurs de la nouvelle instruction
4952     $valNewInstr["evenement"] = $row['evenement_retour_signature'];
4953     $valNewInstr["destinataire"] = $this->valF['destinataire'];
4954     $valNewInstr["dossier"] = $this->valF['dossier'];
4955     $valNewInstr["date_evenement"] = $this->f->formatDate($this->valF['date_retour_signature']);
4956     $valNewInstr["date_envoi_signature"] = $this->f->formatDate($this->valF['date_envoi_signature']);
4957     $valNewInstr["date_retour_signature"] = $this->f->formatDate($this->valF['date_retour_signature']);
4958     $valNewInstr["date_envoi_rar"] = $this->f->formatDate($this->valF['date_envoi_rar']);
4959     $valNewInstr["date_retour_rar"] = $this->f->formatDate($this->valF['date_retour_rar']);
4960     $valNewInstr["date_envoi_controle_legalite"] = $this->f->formatDate($this->valF['date_envoi_controle_legalite']);
4961     $valNewInstr["date_retour_controle_legalite"] = $this->f->formatDate($this->valF['date_retour_controle_legalite']);
4962     $new_instruction->setParameter("maj", $code_action_add);
4963     $new_instruction->class_actions[$code_action_add]["identifier"] =
4964     sprintf(
4965     __("Ajout suite au retour signature de l'instruction %s"),
4966     $current_id
4967     );
4968     $retour = $new_instruction->ajouter($valNewInstr);
4969    
4970     //Si une erreur s'est produite et qu'il s'agit d'un problème
4971     //de restriction
4972     if ($retour == false && !$new_instruction->restriction_valid){
4973     $error_message = $this->get_restriction_error_message($restriction);
4974     $this->f->displayMessage("error", $error_message);
4975     $this->addToLog(__METHOD__."(): evenement retour ".
4976     "instruction ".$this->valF[$this->clePrimaire]." : ".
4977     $new_instruction->msg);
4978     }
4979     //Si une erreur s'est produite après le test de la restriction
4980     elseif ($retour == false && $new_instruction->restriction_valid){
4981     $this->correct = false ;
4982     $this->msg .= $new_instruction->msg;
4983     return false;
4984     }
4985 mbroquet 3730 }
4986 softime 18436
4987     $this->f->module_manager->run_hooks('update_date_retour_signature_post', $this, $data);
4988 mbroquet 3730 }
4989 softime 18436
4990     // Si la date de retour AR est éditée
4991     if (
4992 softime 18876 $this->getVal('date_retour_rar') == "" &&
4993 softime 18436 $this->valF['date_retour_rar'] != ""
4994     ){
4995     // On Lance le hook Notification/Date retour Accusée Reception
4996     $data = array('val' => $this->valF);
4997     $data['dossier'] = $this->valF['dossier'];
4998     $this->f->module_manager->run_hooks('update_date_retour_rar_pre', $this, $data);
4999    
5000     // On vérifie si il existe un événement automatique
5001     if ( $row['evenement_retour_ar'] != "" ) {
5002 softime 7996 $new_instruction = $this->f->get_inst__om_dbform(array(
5003     "obj" => "instruction",
5004     "idx" => "]",
5005     ));
5006 mbroquet 3730 // Création d'un tableau avec la liste des champs de l'instruction
5007     foreach($new_instruction->champs as $champ) {
5008     $valNewInstr[$champ] = "";
5009     }
5010     // Définition des valeurs de la nouvelle instruction
5011     $valNewInstr["evenement"] = $row['evenement_retour_ar'];
5012     $valNewInstr["destinataire"] = $this->valF['destinataire'];
5013     $valNewInstr["dossier"] = $this->valF['dossier'];
5014     $valNewInstr["date_evenement"] = $this->f->formatDate($this->valF['date_retour_rar']);
5015     $valNewInstr["date_envoi_signature"] = $this->f->formatDate($this->valF['date_envoi_signature']);
5016     $valNewInstr["date_retour_signature"] = $this->f->formatDate($this->valF['date_retour_signature']);
5017     $valNewInstr["date_envoi_rar"] = $this->f->formatDate($this->valF['date_envoi_rar']);
5018     $valNewInstr["date_retour_rar"] = $this->f->formatDate($this->valF['date_retour_rar']);
5019     $valNewInstr["date_envoi_controle_legalite"] = $this->f->formatDate($this->valF['date_envoi_controle_legalite']);
5020     $valNewInstr["date_retour_controle_legalite"] = $this->f->formatDate($this->valF['date_retour_controle_legalite']);
5021 softime 14064 $new_instruction->setParameter("maj", $code_action_add);
5022     $new_instruction->class_actions[$code_action_add]["identifier"] =
5023 softime 13137 sprintf(__("Ajout suite à la notification de l'instruction %s"), $current_id);
5024 softime 8989 $retour = $new_instruction->ajouter($valNewInstr);
5025 mbroquet 3730
5026     //Si une erreur s'est produite et qu'il s'agit d'un problème
5027     //de restriction
5028     if ($retour == false && !$new_instruction->restriction_valid) {
5029     $error_message = $this->get_restriction_error_message($restriction);
5030     $this->f->displayMessage("error", $error_message);
5031     $this->addToLog(
5032 softime 8989 __METHOD__."(): evenement retour instruction ".
5033 mbroquet 3730 $this->valF[$this->clePrimaire]." : ".
5034     $new_instruction->msg
5035     );
5036     }
5037     //Si une erreur s'est produite après le test de la restriction
5038     elseif ($retour == false && $new_instruction->restriction_valid){
5039     $this->correct = false ;
5040     $this->msg .= $new_instruction->msg;
5041     return false;
5042     }
5043     }
5044 softime 18436 $this->f->module_manager->run_hooks('update_date_retour_rar_post', $this, $data);
5045 mbroquet 3730 }
5046 softime 18436
5047     // Si la date_envoi_signature est éditée
5048     if (
5049 softime 18876 $this->getVal('date_envoi_signature') == "" &&
5050 softime 18436 $this->valF['date_envoi_signature'] != ""
5051     ){
5052     // On Lance le hook
5053     $data = array('val' => $this->valF);
5054     $data['dossier'] = $this->valF['dossier'];
5055     $this->f->module_manager->run_hooks('update_date_envoi_signature', $this, $data);
5056     }
5057     // Si la date de envoi AR est éditée
5058     if (
5059 softime 18876 $this->getVal('date_envoi_rar') == "" &&
5060 softime 18436 $this->valF['date_envoi_rar'] != ""
5061     ){
5062     // On Lance le hook
5063     $data = array('val' => $this->valF);
5064     $data['dossier'] = $this->valF['dossier'];
5065     $this->f->module_manager->run_hooks('update_date_envoi_rar', $this, $data);
5066     }
5067     // Si la date de envoi controle legalite est éditée
5068     if (
5069 softime 18876 $this->getVal('date_envoi_controle_legalite') == "" &&
5070 softime 18436 $this->valF['date_envoi_controle_legalite'] != ""
5071     ){
5072     // On Lance le hook
5073     $data = array('val' => $this->valF);
5074     $data['dossier'] = $this->valF['dossier'];
5075     $this->f->module_manager->run_hooks('update_date_envoi_controle_legalite', $this, $data);
5076     }
5077     // Si la date de retour controle legalite est éditée
5078     if (
5079 softime 18876 $this->getVal('date_retour_controle_legalite') == "" &&
5080 softime 18436 $this->valF['date_retour_controle_legalite'] != ""
5081     ){
5082     // On Lance le hook
5083     $data = array('val' => $this->valF);
5084     $data['dossier'] = $this->valF['dossier'];
5085     $this->f->module_manager->run_hooks('update_date_retour_controle_legalite', $this, $data);
5086     }
5087 mbroquet 3730 }
5088     }
5089    
5090 softime 13137 // Traitement en cas de mise à jour du dossier
5091     if ($update_dossier === true) {
5092     /**
5093     * Mise à jour de la date de dernière modification du dossier
5094     * d'instruction
5095     */
5096     $inst_di = $this->get_inst_dossier($this->getVal('dossier'));
5097     $inst_di->update_last_modification_date();
5098 softime 8640
5099 softime 13137 // Mise à jour des données du dossier d'autorisation
5100     $da = $this->f->get_inst__om_dbform(array(
5101     "obj" => "dossier_autorisation",
5102     "idx" => $this->getNumDemandeAutorFromDossier($this->valF['dossier']),
5103     ));
5104     $params = array(
5105     'di_id' => $this->getVal('dossier'),
5106     );
5107     if($da->majDossierAutorisation($params) === false) {
5108 softime 18876 $this->addToMessage(__("Erreur lors de la mise a jour des donnees du dossier d'autorisation. Contactez votre administrateur."));
5109 softime 13137 $this->correct = false;
5110     return false;
5111     }
5112 mbroquet 3730 }
5113 softime 7996
5114 softime 10573 // mise à jour des métadonnées issues des dates de suivi
5115     $dateRetourSignatureModified = ($this->valF['date_retour_signature'] != $this->getVal('date_retour_signature'));
5116     $dateRetourRARModified = ($this->valF['date_retour_rar'] != $this->getVal('date_retour_rar'));
5117     if ($dateRetourSignatureModified || $dateRetourRARModified) {
5118    
5119     // Calculs des nouvelles métadonnées
5120     $metadata = $this->getMetadata("om_fichier_instruction");
5121    
5122     // On vérifie si l'instruction à finaliser a un événement de type arrete
5123 softime 14064 // TODO : A voir pour remplacer par une instanciation de l'événement.
5124     // Voir également si l'événement ne dois pas être instancié en début de
5125     // méthode pour pouvoir être réutilisé.
5126     $qres = $this->f->get_one_result_from_db_query(
5127     sprintf(
5128     'SELECT
5129     type
5130     FROM
5131     %1$sevenement
5132     WHERE
5133     evenement = \'%2$d\'',
5134     DB_PREFIXE,
5135     intval($this->getVal("evenement"))
5136     ),
5137     array(
5138     "origin" => __METHOD__,
5139     "force_return" => true,
5140     )
5141     );
5142    
5143     if ($qres["code"] !== "OK") {
5144 softime 10573 $this->correct = false;
5145     $this->addToMessage(__("Erreur de traitement de fichier."));
5146 softime 14064 $this->addToLog(__METHOD__."() erreur BDD: ".var_export($qres['message'], true), DEBUG_MODE);
5147 softime 10573 return false;
5148     }
5149    
5150     // Si l'événement est de type arrete, on ajoute les métadonnées spécifiques
5151 softime 14064 if ($qres['result'] == 'arrete'){
5152 softime 10573 $metadata = array_merge($metadata, $this->getMetadata("arrete"));
5153     }
5154    
5155     // Filtre pour conserver uniquement les métadonnées liées aux dates
5156     $metadataToKeep = array(
5157     "statutAutorisation",
5158     "dateEvenementDocument",
5159     'date_cloture_metier',
5160     "NotificationArrete",
5161     "dateNotificationArrete",
5162     "controleLegalite",
5163     "dateSignature",
5164     "nomSignataire",
5165     "qualiteSignataire",
5166     "dateControleLegalite",
5167     );
5168     $metadata = array_filter(
5169     $metadata,
5170     function($key) use ($metadataToKeep) { return in_array($key, $metadataToKeep); },
5171     ARRAY_FILTER_USE_KEY
5172     );
5173    
5174     // Mise à jour des métadonnées du document en GED
5175     $docUid = $this->getVal("om_fichier_instruction");
5176     $operationOrUID = $this->f->storage->update_metadata($docUid, $metadata);
5177     if ($operationOrUID == 'OP_FAILURE') {
5178     $this->correct = false;
5179     $this->addToMessage(__("Erreur de traitement de fichier."));
5180     $this->addToLog(__METHOD__."() failed to update metadata: ".var_export($operationOrUID, true), DEBUG_MODE);
5181     return false;
5182     }
5183    
5184     // mise à jour de l'UID du document en BDD
5185     else {
5186     $valF = array('om_fichier_instruction' => $operationOrUID);
5187     $res = $this->f->db->autoExecute(DB_PREFIXE.$this->table, $valF, DB_AUTOQUERY_UPDATE, $this->getCle($id));
5188     $this->addToLog(__METHOD__.'() : db->autoExecute("'.DB_PREFIXE.$this->table.'", '.print_r($valF, true).', DB_AUTOQUERY_UPDATE, "'.$this->getCle($id).'")', VERBOSE_MODE);
5189     if ($this->f->isDatabaseError($res, true) === true) {
5190     $this->correct = false;
5191     $this->addToMessage(__("Erreur de traitement de fichier."));
5192     $this->addToLog(__METHOD__."() erreur BDD: ".var_export($res->getMessage(), true), DEBUG_MODE);
5193     return false;
5194     }
5195     $this->addToMessage(__("La mise a jour du document s'est effectuee avec succes."));
5196     }
5197     }
5198    
5199 softime 13137 // Déclenchement des notifications automatique après finalisation et
5200     // retour de signature
5201 softime 10808 if ($dateRetourSignatureModified === true
5202     && $this->valF['date_retour_signature'] !== ''
5203     && $this->valF['date_retour_signature'] !== null) {
5204 softime 13137
5205     // Message à afficher dans les logs pour indiquer quelle notification a échouée
5206 softime 13528 $msgLog = sprintf(
5207     '%s %s : %d',
5208     __('Erreur lors de la notification automatique du(des) pétitionnaire(s) après retour signature.'),
5209     __('Instruction notifiée'),
5210     $id
5211     );
5212 softime 13137
5213     // Récupération de l'instance de l'événement pour accéder au paramètrage
5214     // des notifications
5215 softime 10808 $ev = $this->get_inst_evenement($this->valF['evenement']);
5216 softime 13137 // Si la notification automatique des tiers consulté est active
5217     // déclenche le traitement de notification.
5218     // Ce traitement va envoyer des courriels de notification à tous les tiers concernés
5219     $typeNotifTiers = $ev->getVal('notification_tiers');
5220     $inst_di = $this->get_inst_dossier($this->getVal('dossier'));
5221     if ($typeNotifTiers === 'notification_automatique') {
5222     if ($this->traitement_notification_automatique_tiers_consulte($ev, $inst_di) === false) {
5223     $this->addToMessage(__('Le traitement de la notification automatique de tiers à échoué.'));
5224     $this->correct = false;
5225     }
5226     }
5227    
5228 softime 10808 if ($ev->getVal('notification') === 'notification_auto_signature_requise') {
5229     // Récupération de la liste des demandeurs à notifier et de la catégorie
5230     $categorie = $this->f->get_param_option_notification($collectivite_di);
5231 softime 14064 $isPortal = $categorie === PORTAL;
5232 softime 10869 $demandeursANotifie = $this->get_demandeurs_notifiable(
5233     $this->valF['dossier'],
5234     $isPortal
5235     );
5236 softime 10808
5237 softime 18876 //
5238     $msg_notif = '';
5239    
5240 softime 10808 // Création d'une notification et d'une tâche pour chaque demandeur à notifier
5241 softime 12124 $demandeurPrincipalNotifie = false;
5242 softime 10808 foreach ($demandeursANotifie as $demandeur) {
5243 softime 12124 // Identifie si le demandeur principal a été notifié ou pas
5244     // et récupère ses informations
5245     if ($demandeur['petitionnaire_principal'] == 't') {
5246     $demandeurPrincipalNotifie = true;
5247     // Si le demandeur principal est notifiable mais qu'il y a des erreurs dans
5248     // son paramétrage, on effectue pas le traitement et on passe à l'itération
5249     // suivante. On le considère également comme non notifié pour gérer l'envoie
5250     // des messages d'erreurs
5251     // Si la demande a été déposée via le portail alors le paramétrage n'a pas
5252     // d'impact sur la notification
5253     $erreursParam = $this->get_info_notification_fail();
5254     if (! $this->dossier_depose_sur_portail() && $erreursParam != array()) {
5255     $demandeurPrincipalNotifie = false;
5256     continue;
5257     }
5258     }
5259 softime 18876 // Récupération du contenu de l'option option_bloquer_notif_auto_dln
5260     $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;
5261     // On vérifie l'existence du paramètre 'option_bloquer_notif_auto_dln',
5262     // On vérifie si la date limite est dépassée ou si le type d'événement est erroné
5263     if (! empty($option_bloquer_notif_auto_dln_types_evenements)
5264     && $this->is_type_evenement_autorise($ev, array('types_evenements_autorises'=> $option_bloquer_notif_auto_dln_types_evenements)) === true
5265     && $this->is_date_limite_notification_premier_mois_depasee() === true) {
5266     // Ajout de la notif et récupération de son id
5267     $idNotif = $this->ajouter_notification(
5268     $this->valF[$this->clePrimaire],
5269     $this->f->get_connected_user_login_name(),
5270     $demandeur,
5271     $collectivite_di,
5272     array(),
5273     true,
5274     'Echec',
5275     __('La date limite de notification au demandeur est dépassée')
5276     );
5277     if ($idNotif === false) {
5278     // Termine le traitement
5279     $this->addToLog(
5280     sprintf('%s() : %s', __METHOD__, $msgLog),
5281     DEBUG_MODE
5282     );
5283     return $this->end_treatment(__METHOD__, false);
5284     }
5285     $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."));
5286 softime 10808 }
5287 softime 18876 else {
5288     // Ajout de la notif et récupération de son id
5289     $idNotif = $this->ajouter_notification(
5290     $this->valF[$this->clePrimaire],
5291     $this->f->get_connected_user_login_name(),
5292     $demandeur,
5293     $collectivite_di,
5294     array(),
5295     true
5296 softime 13528 );
5297 softime 18876 if ($idNotif === false) {
5298     $this->addToLog(
5299     sprintf('%s() : %s',__METHOD__, $msgLog),
5300     DEBUG_MODE
5301     );
5302     return false;
5303     }
5304     // Création de la tache en lui donnant l'id de la notification
5305     $notification_by_task = $this->notification_by_task(
5306     $idNotif,
5307     $this->valF['dossier'],
5308     $categorie
5309 softime 10808 );
5310 softime 18876 if ($notification_by_task === false) {
5311     $this->addToLog(
5312     sprintf('%s() : %s',__METHOD__, $msgLog),
5313     DEBUG_MODE
5314     );
5315     $this->addToMessage(
5316     __("Erreur lors de la génération de la notification au(x) pétitionnaire(s).")
5317     );
5318     return false;
5319     }
5320     $msg_notif .= sprintf('%s<br/>%s', __("La notification a été générée."), __("Le suivi de la notification est disponible depuis l'instruction."));
5321 softime 10808 }
5322     }
5323 softime 18876
5324 softime 12847 // Pour la notification par mail ou la notification via portal si le dossier a
5325     // été déposés via portal, si le demandeur principal n'est pas notifiable,
5326     // on créé une nouvelle notification en erreur avec en commentaire la raison pour
5327     // laquelle le demandeur principal n'a pas pu être notifié
5328     $depotPortal = $this->dossier_depose_sur_portail();
5329     if (! $demandeurPrincipalNotifie && ($isPortal === false || $depotPortal === true)) {
5330 softime 13137 // Précise dans les logs que le pétitionnaire principal n'a pas été notifié
5331 softime 13528 $msgLog .= sprintf(' %s', __('Le pétitionnaire principale n\'est pas notifiable.'));
5332 softime 12124 // Analyse pour savoir pourquoi le demandeur principal n'est pas notifiable
5333     $erreursParam = $this->get_info_notification_fail();
5334     $demandeurPrincipal = $this->get_info_petitionnaire_principal_dossier($this->getVal('dossier'));
5335     // Ajout de la notif et récupération de son id
5336     $idNotif = $this->ajouter_notification(
5337     $this->valF[$this->clePrimaire],
5338     $this->f->get_connected_user_login_name(),
5339     $demandeurPrincipal,
5340     $collectivite_di,
5341 softime 12433 array(),
5342 softime 12124 true,
5343     'Echec',
5344     implode(' ', $erreursParam)
5345     );
5346     if ($idNotif === false) {
5347 softime 13528 $this->addToLog(
5348     sprintf('%s() : %s', __METHOD__, $msgLog),
5349     DEBUG_MODE
5350     );
5351 softime 12124 $this->addToMessage(
5352     __('Erreur : la création de la notification a échouée.').
5353     __("Veuillez contacter votre administrateur.")
5354     );
5355     return false;
5356     }
5357     // Prépare un message d'alerte à destination de l'instructeur pour l'informer
5358     // de l'échec de la notification
5359     $dossier_message = $this->get_inst_dossier_message(0);
5360     $dossier_message_val = array(
5361     'dossier' => $this->getVal('dossier'),
5362 softime 18876 'type' => __('erreur expedition'),
5363 softime 12124 'emetteur' => $this->f->get_connected_user_login_name(),
5364     'login' => $_SESSION['login'],
5365     'date_emission' => date('Y-m-d H:i:s'),
5366 softime 18876 'contenu' => __('Échec lors de la notification de l\'instruction ').
5367 softime 12124 $ev->getVal('libelle').
5368     '.<br>'.
5369     implode("\n", $erreursParam).
5370     '<br>'.
5371 softime 18876 __('Veuillez corriger ces informations avant de renvoyer la notification.')
5372 softime 12124 );
5373     $add = $dossier_message->add_notification_message($dossier_message_val, true);
5374     // Si une erreur se produit pendant l'ajout
5375     if ($add !== true) {
5376 softime 13528 $this->addToLog(
5377     sprintf(
5378     '%s() : %s',
5379     __METHOD__,
5380     __("Le message d'alerte concernant l'echec de l'envoi de la notification n'a pas pu être envoyé.")
5381     ),
5382     DEBUG_MODE
5383     );
5384 softime 12124 return false;
5385     }
5386     }
5387 softime 18876 $this->addToMessage($msg_notif);
5388 softime 10808 }
5389     }
5390 softime 18769 // Assigner les champs 'valF' à 'val' lorsque la modification a réussi
5391     if ($res !== false) {
5392     foreach($this->champs as $index => $champ) {
5393     // if (get_class($this) == 'instruction') {
5394     $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');
5395     // }
5396     $this->val[$index] = $this->valF[$champ] ?? null;
5397     }
5398     }
5399 softime 17542 $res = $this->add_log_to_dossier($id, $val);
5400     $data = array('val' => &$val, 'id' => $id, 'result' => &$res);
5401     $this->f->module_manager->run_hooks('triggermodifierapres_post', $this, $data);
5402     return $res;
5403 fmichon 4708 }
5404 mbroquet 3730
5405 softime 8989 /**
5406     * TRIGGER - triggersupprimer.
5407     *
5408     * @return boolean
5409     */
5410     function triggersupprimer($id, &$dnu1 = null, $val = array(), $dnu2 = null) {
5411     $this->addToLog(__METHOD__."(): start", EXTRA_VERBOSE_MODE);
5412 softime 17542 $data = array('val' => &$val, 'id' => $id);
5413     $this->f->module_manager->run_hooks('triggersupprimer_pre', $this, $data);
5414 mbroquet 3730 /**
5415     * L'objectif ici est de repositionner les valeurs récupérées en
5416     * archive dans le dossier d'instruction avant de supprimer l'événement
5417 softime 10573 * d'instruction si les valeurs du dossier sont différentes
5418 mbroquet 3730 */
5419 softime 10573 $valF = array();
5420     $inst_di = $this->get_inst_dossier($this->getVal('dossier'));
5421     foreach ($inst_di->champs as $key => $champ) {
5422     // Si le champ du DI à une archive dans l'instruction
5423     if (isset($val[sprintf('archive_%s', $champ)]) === true) {
5424     // Si la valeur entre le champ du DI et son archive dans instruction
5425     // est différente
5426     if ($inst_di->getVal($champ) !== $val[sprintf('archive_%s', $champ)]) {
5427     $val[sprintf('archive_%s', $champ)] === '' ? $valF[$champ] = null : $valF[$champ] = $val[sprintf('archive_%s', $champ)];
5428 softime 15037 // Gestion du cas particulier 'accord_tacite' pour renvoyer la valeur ' ' (3 espaces vides) au lieu de null
5429     // Car les valeurs possibles du champ accord_tacite sont : 'Oui', 'Non' ou ' '
5430     if ($champ === "accord_tacite" && $valF[$champ] === null) {
5431     $valF[$champ] = ' ';
5432     }
5433 softime 10573 }
5434     }
5435 softime 5024 }
5436 softime 10573 // Spécificité du champ avis_decision dont le champ archive est nommé
5437     // différemment
5438     if ($inst_di->getVal('avis_decision') !== $val['archive_avis']) {
5439     $val['archive_avis'] === '' ? $valF['avis_decision'] = null : $valF['avis_decision'] = $val['archive_avis'];
5440 softime 5024 }
5441 softime 10573 // Spécificité de la date d'affichage dont la valeur n'ai jamais modifiée
5442     // par l'archive
5443     unset($valF['date_affichage']);
5444 softime 6565
5445 softime 9245 /**
5446     * Mise à jour de la version de clôture *version_clos* du dossier si et
5447     * seulement si l'instruction met à jour l'état du dossier.
5448     */
5449 softime 10573 if (isset($valF['etat']) === true
5450     && $valF['etat'] !== null
5451 softime 9245 && $valF['etat'] !== '') {
5452 softime 10573 // Récupère l'état actuel du dossier d'instruction
5453     $inst_current_etat = $this->f->get_inst__om_dbform(array(
5454     "obj" => "etat",
5455     "idx" => $inst_di->get_id_etat(),
5456     ));
5457 softime 9245 // Instanciation de l'état archivé appliqué sur le dossier
5458     $inst_etat = $this->f->get_inst__om_dbform(array(
5459     "obj" => "etat",
5460     "idx" => $valF['etat'],
5461     ));
5462     //
5463     $update_version_clos = null;
5464     // En cas de clôture du dossier par l'état archivé
5465     if ($inst_etat->getVal('statut') === 'cloture') {
5466     $update_version_clos = $inst_di->update_version_clos('up');
5467     }
5468     // En cas de réouverture du dossier par l'état archivé
5469     if ($inst_current_etat->getVal('statut') === 'cloture'
5470     && $inst_etat->getVal('statut') !== 'cloture') {
5471     //
5472     $update_version_clos = $inst_di->update_version_clos('down');
5473     //
5474     $this->set_att_di_reopened(true);
5475     }
5476     //
5477     if ($update_version_clos === false) {
5478     $this->f->addToLog(sprintf(
5479     "%s() : ERREUR - %s %s",
5480     __METHOD__,
5481     sprintf(
5482     __("Impossible de mettre à jour la version de clôture du dossier d'instruction %s."),
5483     $inst_di->getVal($inst_di->clePrimaire)
5484     ),
5485     sprintf(
5486     __("L'instruction tente d'appliquer l'état %s."),
5487     $inst_etat->getVal($inst_etat->clePrimaire)
5488     )
5489     ));
5490     $this->addToMessage(sprintf(
5491     "%s %s",
5492     __("Erreur lors de la mise à jour de la version de clôture du dossier d'instruction."),
5493     __("Veuillez contacter votre administrateur.")
5494     ));
5495     return false;
5496     }
5497     }
5498 softime 10808 // On supprime toutes les notications liées à l'instruction
5499 softime 12654 $notifASupprimer = $this->get_instruction_notification(
5500     $this->getVal($this->clePrimaire),
5501     array(
5502     'notification_recepisse',
5503     'notification_instruction',
5504     'notification_decision',
5505     'notification_service_consulte',
5506     'notification_tiers_consulte',
5507 softime 13137 'notification_depot_demat',
5508 softime 15037 'notification_commune',
5509     'notification_signataire'
5510 softime 12654 ),
5511     true
5512     );
5513    
5514 softime 10808 foreach ($notifASupprimer as $idNotif) {
5515     $inst_notif = $this->f->get_inst__om_dbform(array(
5516     "obj" => "instruction_notification",
5517     "idx" => $idNotif,
5518     ));
5519     $val_notif = array();
5520     foreach ($inst_notif->champs as $champ) {
5521     $val_notif[$champ] = $inst_notif->getVal($champ);
5522     }
5523     // La suppression des notifications entrainera la suppression des tâches qui y sont
5524     // liées
5525     $supprNotif = $inst_notif->supprimer($val_notif);
5526     if ($supprNotif == false) {
5527     $this->addToMessage(sprintf(
5528     "%s %s",
5529     __("Erreur lors de la suppression des notifications de l'instruction."),
5530     __("Veuillez contacter votre administrateur.")
5531     ));
5532     return false;
5533     }
5534     }
5535 softime 9245
5536 softime 18436 // Suppression du paramétrage de l'annexe lié à l'évènement
5537     if ($this->supprimer_parametrage_annexe($this->getVal($this->clePrimaire)) === false) {
5538     $this->addToLog(sprintf(
5539     "%s %s",
5540     __("Erreur lors de la suppression du paramétrage des annexes de l'instruction."),
5541     __("Veuillez contacter votre administrateur.")
5542     ), DEBUG_MODE);
5543     return false;
5544     }
5545    
5546 softime 10573 // On met à jour le dossier
5547     $valF['instruction'] = $id;
5548 softime 10968 $valF['crud'] = 'delete';
5549 softime 10573 $update_by_instruction = $inst_di->update_by_instruction($valF);
5550     if ($update_by_instruction === false) {
5551     $this->cleanMessage();
5552     $this->addToMessage(sprintf('%s %s', __("Une erreur s'est produite lors de la mise à jour du dossier d'instruction."), __("Veuillez contacter votre administrateur.")));
5553     return false;
5554     }
5555    
5556 softime 5024 // Affichage d'informations à l'utilisateur
5557 softime 18876 $this->addToMessage(__("Suppression de l'instruction")." [".$this->f->db->affectedRows()." ".__('enregistrement')." ".__('mis_a_jour')."]");
5558 softime 5024
5559     // Mise à jour de la demande si un récépissé d'instruction correspond à l'instruction à supprimer
5560 softime 17542
5561     $res = true;
5562     $data = array('val' => &$val, 'id' => $id, 'result' => &$res);
5563     $this->f->module_manager->run_hooks('triggersupprimer_post', $this, $data);
5564     return $res;
5565 mbroquet 3730 }
5566    
5567 softime 8989 /**
5568     * TRIGGER - triggersupprimerapres.
5569     *
5570     * @return boolean
5571     */
5572     function triggersupprimerapres($id, &$dnu1 = null, $val = array(), $dnu2 = null) {
5573     $this->addToLog(__METHOD__."(): start", EXTRA_VERBOSE_MODE);
5574 softime 17542 $data = array('val' => &$val, 'id' => $id);
5575     $this->f->module_manager->run_hooks('triggersupprimerapres_pre', $this, $data);
5576 softime 8640 /**
5577     * Mise à jour de la date de dernière modification du dossier
5578     * d'instruction
5579     */
5580     $inst_di = $this->get_inst_dossier($this->getVal('dossier'));
5581     $inst_di->update_last_modification_date();
5582    
5583     /**
5584     * Mise à jour des données du dossier d'autorisation
5585     */
5586 softime 7996 $da = $this->f->get_inst__om_dbform(array(
5587     "obj" => "dossier_autorisation",
5588     "idx" => $this->getNumDemandeAutorFromDossier($val["dossier"]),
5589     ));
5590 softime 8640 $params = array(
5591     'di_id' => $this->getVal('dossier'),
5592 softime 9245 'di_reopened' => $this->get_att_di_reopened(),
5593 softime 8640 );
5594     if($da->majDossierAutorisation($params) === false) {
5595 softime 18876 $this->addToMessage(__("Erreur lors de la mise a jour des donnees du dossier d'autorisation. Contactez votre administrateur."));
5596 mbroquet 3730 $this->correct = false;
5597     return false;
5598     }
5599 softime 7996
5600 softime 10573 /**
5601     * Gestion des tâches pour la dématérialisation
5602     */
5603     $inst_task_empty = $this->f->get_inst__om_dbform(array(
5604     "obj" => "task",
5605     "idx" => 0,
5606     ));
5607     foreach ($inst_di->task_types as $task_type) {
5608     $task_exists = $inst_task_empty->task_exists($task_type, $id);
5609     if ($task_exists !== false) {
5610     $inst_task = $this->f->get_inst__om_dbform(array(
5611     "obj" => "task",
5612     "idx" => $task_exists,
5613     ));
5614 softime 18436 if ($inst_task->getVal('state') === task::STATUS_NEW || $inst_task->getVal('state') === task::STATUS_DRAFT) {
5615 softime 10573 $task_val = array(
5616 softime 18436 'state' => task::STATUS_CANCELED,
5617 softime 10573 );
5618     $update_task = $inst_task->update_task(array('val' => $task_val));
5619     if ($update_task === false) {
5620     $this->addToMessage(sprintf('%s %s',
5621     sprintf(__("Une erreur s'est produite lors de la modification de la tâche %."), $inst_task->getVal($inst_task->clePrimaire)),
5622     __("Veuillez contacter votre administrateur.")
5623     ));
5624     $this->correct = false;
5625     return false;
5626     }
5627     }
5628     }
5629     }
5630    
5631 softime 7996 //
5632 softime 8640 $val['evenement'] = $this->getVal('evenement');
5633 softime 17542 $res = $this->add_log_to_dossier($id, $val);
5634     $data = array('val' => &$val, 'id' => $id, 'result' => &$res);
5635     $this->f->module_manager->run_hooks('triggersupprimerapres_post', $this, $data);
5636     return $res;
5637 mbroquet 3730 }
5638    
5639     /**
5640 softime 9245 * Permet de mettre la valeur passée en paramètre dans l'attribut de classe
5641     * "di_reopened".
5642     *
5643     * @param boolean $val
5644     */
5645     function set_att_di_reopened($val) {
5646     $this->di_reopened = $val;
5647     }
5648    
5649     /**
5650     * Permet de récupérer la valeur de l'attribut de classe "di_reopened".
5651     *
5652     * @return boolean
5653     */
5654     function get_att_di_reopened() {
5655     return $this->di_reopened;
5656     }
5657    
5658     /**
5659 mbroquet 3730 * Permet de composer un message d'erreur sur restriction non valide en
5660     * fonction du contexte.
5661     *
5662     * @param string $restriction formule de la restriction
5663     *
5664     * @return string message d'erreur
5665     */
5666     function get_restriction_error_message($restriction) {
5667     // Affichage du message si la restriction s'applique
5668     // Contexte du suivi des dates (message simple)
5669 softime 18876 $message_restrict = __("Probleme de dates :");
5670 mbroquet 3730 // Split restriction
5671     $champs_restrict = preg_split(
5672     '/(\W+)/',
5673     $restriction,
5674     null,
5675     PREG_SPLIT_NO_EMPTY|PREG_SPLIT_DELIM_CAPTURE
5676     );
5677     $formated_restrict = "";
5678     // Ajout des chaînes à traduire
5679     foreach ($champs_restrict as $value) {
5680 softime 18876 $formated_restrict .= __($value)." ";
5681 mbroquet 3730 }
5682     $formated_restrict = substr($formated_restrict, 0, -1);
5683     // Message d'erreur dans le contexte du suivi des dates
5684     if($this->getParameter("maj") == 170) {
5685 softime 18876 $message_restrict .= " ".__("contactez l'instructeur du dossier");
5686 mbroquet 3730 $message_restrict .= "<br/>(".$formated_restrict.")";
5687     } else {
5688     // Affichage du message si la restriction s'applique
5689     // Contexte instruction
5690     $message_restrict .= "<br/>".$formated_restrict;
5691     }
5692    
5693     return $message_restrict;
5694     }
5695    
5696     /**
5697 softime 12124 * Surcharge de la méthode verifier() de la classe om_dbform pour y ajouter
5698     * les vérifications suivantes :
5699     * - Si l'instruction à un événement associé et que cet événement à des restrictions :
5700     * 1. vérifie si la restriction est valide, si ce n'est pas le cas récupère et affiche
5701     * le message d'erreur associé à la restriction
5702     * 2. vérifie si les restrictions sont respectées. Si ce n'est pas le cas bloque l'ajout
5703     * et / ou la modification et affiche un message d'erreur
5704     * -
5705     * -
5706     * -
5707     * -
5708     * -
5709     * -
5710     *
5711     * @param array val : tableau contenant les valeurs issues du formulaire.
5712     * @param - dnu1 : Paramètre déprécié et non utilisé.
5713     * @param - dnu2 : Paramètre déprécié et non utilisé.
5714     *
5715 softime 8989 * @return void
5716 mbroquet 3730 */
5717 softime 8989 function verifier($val = array(), &$dnu1 = null, $dnu2 = null) {
5718     parent::verifier($val);
5719     //
5720 mbroquet 3730 if ( isset($val['evenement']) && is_numeric($val['evenement'])){
5721     $restriction = $this->get_restriction($val['evenement']);
5722    
5723     //Test qu'une restriction est présente
5724     if ($restriction != "" ){
5725    
5726 softime 14064 // Vérifie le contexte de la modification et test si la restriction est valide.
5727     // Si l'instruction est modifiée par une tache le dossier n'est pas impacté.
5728     // Il n'est donc pas nécessaire de vérifier les restrictions.
5729 mbroquet 3730 $this->restriction_valid = $this->restrictionIsValid($restriction);
5730 softime 14064 if ($this->getParameter("maj") != 176
5731     && !$this->restriction_valid) {
5732 mbroquet 3730
5733     // Affichage du message si la restriction s'applique
5734     $this->addToMessage(
5735     $this->get_restriction_error_message($restriction)
5736     );
5737     $this->correct=false;
5738     return false;
5739     }
5740    
5741     // Liste des opérateurs possible
5742 nmeucci 3873 $operateurs = array(">=", "<=", "+", "-", "&&", "||", "==", "!=");
5743 mbroquet 3730 // Supprime tous les espaces de la chaîne de caractère
5744     $restriction = str_replace(' ', '', $restriction);
5745    
5746     // Met des espace avant et après les opérateurs puis transforme la
5747     // chaine en un tableau
5748     $tabRestriction = str_replace($operateurs, " ", $restriction);
5749     // Tableau des champ
5750     $tabRestriction = explode(" ", $tabRestriction);
5751     // Supprime les numériques du tableau
5752     foreach ($tabRestriction as $key => $value) {
5753     if (is_numeric($value)) {
5754     unset($tabRestriction[$key]);
5755     }
5756     }
5757    
5758     // Vérifie les champs utilisés pour la restriction
5759     $check_field_exist = $this->f->check_field_exist($tabRestriction, 'instruction');
5760     if ($check_field_exist !== true) {
5761    
5762     // Liste des champs en erreur
5763     $string_error_fields = implode(", ", $check_field_exist);
5764    
5765     // Message d'erreur
5766 softime 18876 $error_message = __("Le champ %s n'est pas utilisable pour le champ %s");
5767 mbroquet 3730 if (count($check_field_exist) > 1) {
5768 softime 18876 $error_message = __("Les champs %s ne sont pas utilisable pour le champ %s");
5769 mbroquet 3730 }
5770    
5771     // Affiche l'erreur
5772     $this->correct=false;
5773 softime 18876 $this->addToMessage(sprintf($error_message, $string_error_fields, __("restriction")));
5774     $this->addToMessage(__("Veuillez contacter votre administrateur."));
5775 mbroquet 3730 }
5776     }
5777    
5778     }
5779     if(!$this->updateDate("date_envoi_signature")) {
5780     return false;
5781     }
5782     if(!$this->updateDate("date_retour_signature")) {
5783     return false;
5784     }
5785     if(!$this->updateDate("date_envoi_rar")) {
5786     return false;
5787     }
5788     if(!$this->updateDate("date_retour_rar")) {
5789     return false;
5790     }
5791     if(!$this->updateDate("date_envoi_controle_legalite")) {
5792     return false;
5793     }
5794     if(!$this->updateDate("date_retour_controle_legalite")) {
5795     return false;
5796     }
5797    
5798     }
5799 softime 12124
5800     /**
5801     * Récupère et stocket dans un tableau toutes les infos du pétitionnaire
5802     * principal du dossier auquel appartiens l'instruction.
5803     * Renvoie un tableau contenant les informations du pétitionnaire principal.
5804     *
5805     * Si l'identifiant de l'instruction n'a pas pu etre récupéré renvoie false
5806     * et affiche un message dans les logs.
5807     * En cas d'erreur de base de donnée renvoie false et affiche un message d'erreur.
5808     *
5809     * @param string identifiant du dossier
5810     * @return array|boolean
5811     */
5812 softime 18436 public function get_info_petitionnaire_principal_dossier($dossier = null) {
5813 softime 12124 // Si l'identifiant de l'instruction n'a pas été fournit on récupère celui de
5814     // l'objet courant
5815     if (empty($dossier)) {
5816     $dossier = $this->getVal('dossier');
5817     // Si la récupération de l'identifiant de l'instruction a échoué la méthode renvoie
5818     // false et on affiche un message d'erreur dans les logs
5819     if (empty($dossier)) {
5820     $this->addToLog(__METHOD__.' : L\'identifiant du dossier n\'a pas pu être récupéré');
5821     return false;
5822     }
5823     }
5824    
5825     // Requête sql servant à récupérer toutes les informations relatives au demandeurs
5826     // principal
5827 softime 13137 $qres = $this->f->get_all_results_from_db_query(
5828     sprintf(
5829     'SELECT
5830     -- Récupère toutes les informations du demandeur principal
5831     demandeur.*,
5832     CASE
5833     WHEN demandeur.qualite=\'particulier\'
5834     THEN TRIM(CONCAT(demandeur.particulier_nom, \' \', demandeur.particulier_prenom, \' \', demandeur.courriel))
5835     ELSE
5836     TRIM(CONCAT(demandeur.personne_morale_raison_sociale, \' \', demandeur.personne_morale_denomination, \' \', demandeur.courriel))
5837     END AS destinataire
5838     FROM
5839     %1$sdossier
5840     LEFT JOIN %1$slien_dossier_demandeur
5841     ON lien_dossier_demandeur.dossier = dossier.dossier
5842     LEFT JOIN %1$sdemandeur
5843     ON demandeur.demandeur = lien_dossier_demandeur.demandeur
5844     WHERE
5845     dossier.dossier = \'%2$s\'
5846     AND lien_dossier_demandeur.petitionnaire_principal IS TRUE',
5847     DB_PREFIXE,
5848     $this->f->db->escapeSimple($dossier)
5849     ),
5850     array(
5851     "origin" => __METHOD__,
5852     )
5853 softime 12124 );
5854 softime 13137 if (is_array($qres["result"]) === true
5855     && array_key_exists(0, $qres["result"]) === true) {
5856     //
5857     return $qres["result"][0];
5858 softime 12124 }
5859 softime 13137 return null;
5860 softime 12124 }
5861    
5862    
5863 mbroquet 3730
5864     /**
5865     * Finalisation des documents.
5866     * @param string $champ champ du fichier à finaliser
5867     * @param booleen $status permet de définir si on finalise ou définalise
5868     * @param string $sousform permet de savoir si se trouve dans un sousformulaire (passé au javascript)
5869     */
5870     function manage_finalizing($mode = null, $val = array()) {
5871 softime 5024 //
5872     $this->begin_treatment(__METHOD__);
5873 mbroquet 3730
5874 softime 5024 //
5875     $id_inst = $this->getVal($this->clePrimaire);
5876 mbroquet 3730
5877 softime 5024 //
5878 softime 18876 $admin_msg_error = __("Veuillez contacter votre administrateur.");
5879     $file_msg_error = __("Erreur de traitement de fichier.")
5880 softime 5024 ." ".$admin_msg_error;
5881 softime 18876 $bdd_msg_error = __("Erreur de base de données.")
5882 softime 5024 ." ".$admin_msg_error;
5883 softime 5169 $log_msg_error = "Finalisation non enregistrée - id instruction = %s - uid fichier = %s";
5884 mbroquet 3730
5885     // Si on finalise le document
5886     if ($mode == "finalize"){
5887 softime 5024 //
5888 softime 18876 $etat = __('finalisation');
5889 mbroquet 3730
5890     // Récupère la collectivite du dossier d'instruction
5891     $dossier_instruction_om_collectivite = $this->get_dossier_instruction_om_collectivite();
5892    
5893     //
5894     $collectivite = $this->f->getCollectivite($dossier_instruction_om_collectivite);
5895 softime 8593
5896     //
5897     $params = array(
5898     "specific" => array(),
5899     );
5900     // Si la rédaction libre est activée sur l'instruction
5901     if ($this->getVal("flag_edition_integrale") == 't') {
5902     $params["specific"]["corps"] = array(
5903     "mode" => "set",
5904     "value" => $this->getVal("corps_om_htmletatex"),
5905     );
5906     $params["specific"]["titre"] = array(
5907     "mode" => "set",
5908     "value" => $this->getVal("titre_om_htmletat"),
5909     );
5910     }
5911 mbroquet 3730 // Génération du PDF
5912 softime 8593 $result = $this->compute_pdf_output('lettretype', $this->getVal('lettretype'), $collectivite, null, $params);
5913 mbroquet 3730 $pdf_output = $result['pdf_output'];
5914 softime 10573
5915 mbroquet 3730 //Métadonnées du document
5916     $metadata = array(
5917 softime 18436 'filename' => $this->determinate_name_doc_pdf().'.pdf',
5918 mbroquet 3730 'mimetype' => 'application/pdf',
5919     'size' => strlen($pdf_output)
5920     );
5921    
5922     // Récupération des métadonnées calculées après validation
5923     $spe_metadata = $this->getMetadata("om_fichier_instruction");
5924    
5925     //On vérifie si l'instruction à finaliser a un événement de type arrete
5926 softime 14064 // TODO : A voir pour remplacer par une instanciation de l'événement.
5927     // Voir également si l'événement ne dois pas être instancié en début de
5928     // méthode pour pouvoir être réutilisé.
5929     $qres = $this->f->get_one_result_from_db_query(
5930     sprintf(
5931     'SELECT
5932     type
5933     FROM
5934     %1$sevenement
5935     WHERE
5936     evenement = \'%2$d\'',
5937     DB_PREFIXE,
5938     intval($this->getVal("evenement"))
5939     ),
5940     array(
5941     "origin" => __METHOD__,
5942     "force_return" => true,
5943     )
5944     );
5945    
5946     if ($qres["code"] !== "OK") {
5947 softime 5024 $this->correct = false;
5948     $this->addToMessage($bdd_msg_error);
5949     return $this->end_treatment(__METHOD__, false);
5950 mbroquet 3730 }
5951    
5952     //Initialisation de la variable
5953     $arrete_metadata = array();
5954     // Si l'événement est de type arrete, on ajoute les métadonnées spécifiques
5955 softime 14064 if ($qres['result'] === 'arrete'){
5956 mbroquet 3730 $arrete_metadata = $this->getMetadata("arrete");
5957     }
5958    
5959     $metadata = array_merge($metadata, $spe_metadata, $arrete_metadata);
5960    
5961 softime 18436 // Mise à jour du nom du fichier en bdd suite à la finalisation de l'instruction
5962     $res = $this->f->db->autoExecute(
5963     DB_PREFIXE.$this->table,
5964     ['fichier_instruction_name' => $metadata['filename']],
5965     DB_AUTOQUERY_UPDATE,
5966     "instruction='".$this->getVal("instruction")."'"
5967     );
5968 softime 10573
5969 softime 5024 // Si le document a déjà été finalisé on le met à jour
5970     // en conservant son UID
5971 mbroquet 3730 if ($this->getVal("om_fichier_instruction") != ''){
5972     $uid = $this->f->storage->update(
5973 softime 18436 $this->getVal("om_fichier_instruction"), $pdf_output, $metadata
5974     );
5975 mbroquet 3730 }
5976 softime 5024 // Sinon on crée un nouveau document et dont on récupère l'UID
5977 mbroquet 3730 else {
5978 softime 10573 $uid = $this->f->storage->create($pdf_output, $metadata, "from_content", $this->table.".om_fichier_instruction");
5979 mbroquet 3730 }
5980     }
5981    
5982 softime 5024 // Si on définalise le document
5983 mbroquet 3730 if ($mode == "unfinalize") {
5984 softime 5024 //
5985 softime 18876 $etat = __('définalisation');
5986 mbroquet 3730 // Récupération de l'uid du document finalisé
5987     $uid = $this->getVal("om_fichier_instruction");
5988     }
5989 softime 5024
5990     // Si on définalise l'UID doit être défini
5991     // Si on finalise la création/modification du fichier doit avoir réussi
5992 mbroquet 3730 if ($uid == '' || $uid == 'OP_FAILURE' ) {
5993 softime 5024 $this->correct = false;
5994     $this->addToMessage($file_msg_error);
5995 softime 8989 $this->addToLog(sprintf($log_msg_error, $id_inst, $uid), DEBUG_MODE);
5996 softime 5024 return $this->end_treatment(__METHOD__, false);
5997 mbroquet 3730 }
5998    
5999     //
6000     foreach ($this->champs as $key => $champ) {
6001     //
6002     $val[$champ] = $this->val[$key];
6003     }
6004    
6005     //
6006 softime 6565 $val['date_evenement'] = $this->dateDBToForm($val['date_evenement']);
6007     $val['archive_date_complet'] = $this->dateDBToForm($val['archive_date_complet']);
6008     $val['archive_date_rejet'] = $this->dateDBToForm($val['archive_date_rejet']);
6009     $val['archive_date_limite'] = $this->dateDBToForm($val['archive_date_limite']);
6010     $val['archive_date_notification_delai'] = $this->dateDBToForm($val['archive_date_notification_delai']);
6011     $val['archive_date_decision'] = $this->dateDBToForm($val['archive_date_decision']);
6012     $val['archive_date_validite'] = $this->dateDBToForm($val['archive_date_validite']);
6013     $val['archive_date_achevement'] = $this->dateDBToForm($val['archive_date_achevement']);
6014     $val['archive_date_chantier'] = $this->dateDBToForm($val['archive_date_chantier']);
6015     $val['archive_date_conformite'] = $this->dateDBToForm($val['archive_date_conformite']);
6016     $val['archive_date_dernier_depot'] = $this->dateDBToForm($val['archive_date_dernier_depot']);
6017     $val['archive_date_limite_incompletude'] = $this->dateDBToForm($val['archive_date_limite_incompletude']);
6018     $val['date_finalisation_courrier'] = $this->dateDBToForm($val['date_finalisation_courrier']);
6019     $val['date_envoi_signature'] = $this->dateDBToForm($val['date_envoi_signature']);
6020     $val['date_retour_signature'] = $this->dateDBToForm($val['date_retour_signature']);
6021     $val['date_envoi_rar'] = $this->dateDBToForm($val['date_envoi_rar']);
6022     $val['date_retour_rar'] = $this->dateDBToForm($val['date_retour_rar']);
6023     $val['date_envoi_controle_legalite'] = $this->dateDBToForm($val['date_envoi_controle_legalite']);
6024     $val['date_retour_controle_legalite'] = $this->dateDBToForm($val['date_retour_controle_legalite']);
6025     $val['archive_date_cloture_instruction'] = $this->dateDBToForm($val['archive_date_cloture_instruction']);
6026     $val['archive_date_premiere_visite'] = $this->dateDBToForm($val['archive_date_premiere_visite']);
6027     $val['archive_date_derniere_visite'] = $this->dateDBToForm($val['archive_date_derniere_visite']);
6028     $val['archive_date_contradictoire'] = $this->dateDBToForm($val['archive_date_contradictoire']);
6029     $val['archive_date_retour_contradictoire'] = $this->dateDBToForm($val['archive_date_retour_contradictoire']);
6030     $val['archive_date_ait'] = $this->dateDBToForm($val['archive_date_ait']);
6031     $val['archive_date_transmission_parquet'] = $this->dateDBToForm($val['archive_date_transmission_parquet']);
6032 softime 8989 $val['archive_date_affichage'] = $this->dateDBToForm($val['archive_date_affichage']);
6033 mbroquet 3730 $this->setvalF($val);
6034    
6035     // Verification de la validite des donnees
6036 softime 8989 $this->verifier($this->val);
6037 mbroquet 3730 // Si les verifications precedentes sont correctes, on procede a
6038     // la modification, sinon on ne fait rien et on retourne une erreur
6039 softime 5024 if ($this->correct === true) {
6040 mbroquet 3730 //
6041     $valF = array(
6042     "om_fichier_instruction" => $uid,
6043     "date_finalisation_courrier" => date('Y-m-d')
6044     );
6045     //
6046     if($mode=="finalize") {
6047     // état finalisé vrai
6048 softime 5024 $valF["om_final_instruction"] = true;
6049 mbroquet 3730 // ajout log utilisateur
6050     $login = $_SESSION['login'];
6051     $nom = "";
6052     $this->f->getUserInfos();
6053     if (isset($this->f->om_utilisateur["nom"])
6054     && !empty($this->f->om_utilisateur["nom"])) {
6055     $nom = $this->f->om_utilisateur["nom"];
6056     }
6057     $valF["om_final_instruction_utilisateur"] = $_SESSION['login'];
6058     if ($nom != "") {
6059     $valF["om_final_instruction_utilisateur"] .= " (".$nom.")";
6060     }
6061     } else {
6062     // état finalisé faux
6063 softime 5024 $valF["om_final_instruction"] = false;
6064 mbroquet 3730 // suppression log utilisateur
6065     $valF["om_final_instruction_utilisateur"] = '';
6066     }
6067    
6068     // Execution de la requête de modification des donnees de l'attribut
6069     // valF de l'objet dans l'attribut table de l'objet
6070 softime 8989 $res = $this->f->db->autoExecute(DB_PREFIXE.$this->table, $valF,
6071 softime 5024 DB_AUTOQUERY_UPDATE, $this->getCle($id_inst));
6072     $this->addToLog(__METHOD__."() : db->autoExecute(\"".DB_PREFIXE.$this->table."\", ".print_r($valF, true).", DB_AUTOQUERY_UPDATE, \"".$this->getCle($id_inst)."\")", VERBOSE_MODE);
6073     //
6074     if ($this->f->isDatabaseError($res, true) === true) {
6075     $this->correct = false;
6076     $this->addToMessage($bdd_msg_error);
6077     return $this->end_treatment(__METHOD__, false);
6078     }
6079 mbroquet 3730
6080 softime 5024 //
6081 softime 18876 $this->addToMessage(sprintf(__("La %s du document s'est effectuee avec succes."), $etat));
6082 softime 5024 //
6083     if ($this->add_log_to_dossier($id_inst, $val) === false) {
6084     return $this->end_treatment(__METHOD__, false);
6085     }
6086     //
6087     return $this->end_treatment(__METHOD__, true);
6088 mbroquet 3730 }
6089 softime 5024 // L'appel de verifier() a déjà positionné correct à false
6090     // et défini un message d'erreur.
6091 softime 8989 $this->addToLog(sprintf($log_msg_error, $id_inst, $uid), DEBUG_MODE);
6092 softime 5024 return $this->end_treatment(__METHOD__, false);
6093 mbroquet 3730 }
6094    
6095     /**
6096     * Récupération du numéro de dossier d'instruction à ajouter aux métadonnées
6097     * @return string numéro de dossier d'instruction
6098     */
6099 softime 10573 protected function getDossier($champ = null) {
6100 mbroquet 3730 if(empty($this->specificMetadata)) {
6101     $this->getSpecificMetadata();
6102     }
6103     return $this->specificMetadata->dossier;
6104     }
6105     /**
6106     * Récupération la version du dossier d'instruction à ajouter aux métadonnées
6107     * @return int Version
6108     */
6109     protected function getDossierVersion() {
6110     if(empty($this->specificMetadata)) {
6111     $this->getSpecificMetadata();
6112     }
6113     return $this->specificMetadata->version;
6114     }
6115     /**
6116     * Récupération du numéro de dossier d'autorisation à ajouter aux métadonnées
6117     * @return string numéro de dossier d'autorisation
6118     */
6119     protected function getNumDemandeAutor() {
6120     if(empty($this->specificMetadata)) {
6121     $this->getSpecificMetadata();
6122     }
6123     return $this->specificMetadata->dossier_autorisation;
6124     }
6125     /**
6126     * Récupération de la date de demande initiale du dossier à ajouter aux métadonnées
6127     * @return date de la demande initiale
6128     */
6129     protected function getAnneemoisDemandeAutor() {
6130     if(empty($this->specificMetadata)) {
6131     $this->getSpecificMetadata();
6132     }
6133     return $this->specificMetadata->date_demande_initiale;
6134     }
6135     /**
6136     * Récupération du type de dossier d'instruction à ajouter aux métadonnées
6137     * @return string type du dossier d'instruction
6138     */
6139     protected function getTypeInstruction() {
6140     if(empty($this->specificMetadata)) {
6141     $this->getSpecificMetadata();
6142     }
6143     return $this->specificMetadata->dossier_instruction_type;
6144     }
6145     /**
6146     * Récupération du statut du dossier d'autorisation à ajouter aux métadonnées
6147     * @return string avis
6148     */
6149     protected function getStatutAutorisation() {
6150     if(empty($this->specificMetadata)) {
6151     $this->getSpecificMetadata();
6152     }
6153     return $this->specificMetadata->statut;
6154     }
6155     /**
6156     * Récupération du type de dossier d'autorisation à ajouter aux métadonnées
6157     * @return string type du dossier d'autorisation
6158     */
6159     protected function getTypeAutorisation() {
6160     if(empty($this->specificMetadata)) {
6161     $this->getSpecificMetadata();
6162     }
6163     return $this->specificMetadata->dossier_autorisation_type;
6164     }
6165     /**
6166     * Récupération de la date d'ajout de document à ajouter aux métadonnées
6167     * @return date de l'évènement
6168     */
6169     protected function getDateEvenementDocument() {
6170     return date("Y-m-d");
6171     }
6172     /**
6173     * Récupération du groupe d'instruction à ajouter aux métadonnées
6174     * @return string Groupe d'instruction
6175     */
6176     protected function getGroupeInstruction() {
6177     if(empty($this->specificMetadata)) {
6178     $this->getSpecificMetadata();
6179     }
6180     return $this->specificMetadata->groupe_instruction;
6181     }
6182     /**
6183     * Récupération du libellé du type du document à ajouter aux métadonnées
6184     * @return string Groupe d'instruction
6185     */
6186     protected function getTitle() {
6187    
6188     // Récupère le champ événement
6189 softime 18876 if (isset($this->valF["evenement"]) && $this->valF["evenement"] != "") {
6190 mbroquet 3730 $evenement = $this->valF["evenement"];
6191     } else {
6192     $evenement = $this->getVal("evenement");
6193     }
6194    
6195     // Requête sql
6196 softime 14064 $evenement = $this->f->get_inst__om_dbform(array(
6197     "obj" => "evenement",
6198     "idx" => $evenement
6199     ));
6200    
6201 mbroquet 3730 // Retourne le libelle de l'événement
6202 softime 14064 return $evenement->getVal('libelle');
6203 mbroquet 3730 }
6204    
6205 softime 6272
6206 mbroquet 3730 /**
6207 softime 6272 * Récupération du champ ERP du dossier d'instruction.
6208     *
6209     * @return boolean
6210     */
6211     public function get_concerne_erp() {
6212     //
6213     if(empty($this->specificMetadata)) {
6214     $this->getSpecificMetadata();
6215     }
6216     //
6217     return $this->specificMetadata->erp;
6218     }
6219    
6220    
6221     /**
6222 mbroquet 3730 * Cette méthode permet de stocker en attribut toutes les métadonnées
6223     * nécessaire à l'ajout d'un document.
6224     */
6225     public function getSpecificMetadata() {
6226 softime 18876 if (isset($this->valF["dossier"]) && $this->valF["dossier"] != "") {
6227 mbroquet 3730 $dossier = $this->valF["dossier"];
6228     } else {
6229     $dossier = $this->getVal("dossier");
6230     }
6231     //Requête pour récupérer les informations essentiels sur le dossier d'instruction
6232 softime 14542 $qres = $this->f->get_all_results_from_db_query(
6233     sprintf(
6234     'SELECT
6235     dossier.dossier AS dossier,
6236     dossier_autorisation.dossier_autorisation AS dossier_autorisation,
6237     to_char(dossier.date_demande, \'YYYY/MM\') AS date_demande_initiale,
6238     dossier_instruction_type.code AS dossier_instruction_type,
6239     etat_dossier_autorisation.libelle AS statut,
6240     dossier_autorisation_type.code AS dossier_autorisation_type,
6241     groupe.code AS groupe_instruction,
6242     CASE WHEN dossier.erp IS TRUE
6243     THEN \'true\'
6244     ELSE \'false\'
6245     END AS erp
6246     FROM
6247     %1$sdossier
6248     LEFT JOIN %1$sdossier_instruction_type
6249 mbroquet 3730 ON dossier.dossier_instruction_type = dossier_instruction_type.dossier_instruction_type
6250 softime 14542 LEFT JOIN %1$sdossier_autorisation
6251 mbroquet 3730 ON dossier.dossier_autorisation = dossier_autorisation.dossier_autorisation
6252 softime 14542 LEFT JOIN %1$setat_dossier_autorisation
6253 mbroquet 3730 ON dossier_autorisation.etat_dossier_autorisation = etat_dossier_autorisation.etat_dossier_autorisation
6254 softime 14542 LEFT JOIN %1$sdossier_autorisation_type_detaille
6255 mbroquet 3730 ON dossier_autorisation.dossier_autorisation_type_detaille = dossier_autorisation_type_detaille.dossier_autorisation_type_detaille
6256 softime 14542 LEFT JOIN %1$sdossier_autorisation_type
6257 mbroquet 3730 ON dossier_autorisation_type_detaille.dossier_autorisation_type = dossier_autorisation_type.dossier_autorisation_type
6258 softime 14542 LEFT JOIN %1$sgroupe
6259 mbroquet 3730 ON dossier_autorisation_type.groupe = groupe.groupe
6260 softime 14542 WHERE
6261     dossier.dossier = \'%2$s\'',
6262     DB_PREFIXE,
6263     $this->f->db->escapeSimple($dossier)
6264     ),
6265     array(
6266     "origin" => __METHOD__,
6267     )
6268     );
6269     $row = array_shift($qres['result']);
6270 mbroquet 3730
6271     //Si il y a un résultat
6272 softime 14542 if (! empty($row)) {
6273 mbroquet 3730
6274 fmichon 3892 // Instrance de la classe dossier
6275     $inst_dossier = $this->get_inst_dossier($dossier);
6276 softime 14542 // TODO : améliorer ce code
6277     //
6278     // Avant l e résultat été récupéré dans un objet à partir de la requête mais en modifiant pour
6279     // utiliser la méthode get_all_results_from_db_query() c'est maintenant un tableau
6280     // qu'on obtiens. Pour garder le même fonctionnement on transforme le tableau des
6281     // valeurs issues de la requête en objet.
6282     $metadata = (object)$row;
6283 fmichon 3892 // Insère l'attribut version à l'objet
6284 softime 14542 $metadata->version = $inst_dossier->get_di_numero_suffixe();
6285 fmichon 3892
6286 mbroquet 3730 //Alors on créé l'objet dossier_instruction
6287 softime 14542 $this->specificMetadata = $metadata;
6288 mbroquet 3730
6289     }
6290     }
6291    
6292     /**
6293     * Retourne le statut du dossier d'instruction
6294     * @param string $idx Identifiant du dossier d'instruction
6295     * @return string Le statut du dossier d'instruction
6296     */
6297     function getStatutAutorisationDossier($idx){
6298    
6299     $statut = '';
6300    
6301     //Si l'identifiant du dossier d'instruction fourni est correct
6302     if ( $idx != '' ){
6303    
6304     //On récupère le statut de l'état du dossier à partir de l'identifiant du
6305     //dossier
6306 softime 14064 $qres = $this->f->get_one_result_from_db_query(
6307     sprintf(
6308     'SELECT
6309     etat.statut
6310     FROM
6311     %1$sdossier
6312     LEFT JOIN
6313     %1$setat
6314     ON
6315     dossier.etat = etat.etat
6316     WHERE
6317     dossier = \'%2$s\'',
6318     DB_PREFIXE,
6319     $this->f->db->escapeSimple($idx)
6320     ),
6321     array(
6322     "origin" => __METHOD__,
6323     )
6324     );
6325 mbroquet 3730 }
6326 softime 14064
6327     return $qres['result'];
6328 mbroquet 3730 }
6329    
6330     /**
6331     * Récupère les données du dossier
6332     * @return array
6333     */
6334     function get_dossier_actual() {
6335    
6336     // Initialisation de la valeur de retour
6337     $return = array();
6338    
6339     // Récupération de toutes les valeurs du dossier d'instruction en cours
6340 softime 14542 // TODO : remplacer cette requête par une instanciation de l'objet
6341     $qres = $this->f->get_all_results_from_db_query(
6342     sprintf(
6343     'SELECT
6344     *
6345     FROM
6346     %1$sdossier
6347     WHERE
6348     dossier = \'%2$s\'',
6349     DB_PREFIXE,
6350     $this->f->db->escapeSimple($this->valF['dossier'])
6351     ),
6352     array(
6353     'origin' => __METHOD__
6354     )
6355     );
6356 mbroquet 3730
6357 softime 14542 foreach ($qres['result'] as $row) {
6358 mbroquet 3730
6359     // Récupération de la valeur actuelle du délai, de l'accord tacite,
6360     // de l'état et de l'avis du dossier d'instruction
6361 softime 6565 $return['archive_delai'] = $row['delai'];
6362     $return['archive_accord_tacite'] = $row['accord_tacite'];
6363     $return['archive_etat'] = $row['etat'];
6364     $return['archive_avis'] = $row['avis_decision'];
6365     // Récupération de la valeur actuelle des dates du dossier
6366 mbroquet 3730 // d'instruction
6367 softime 6565 $return['archive_date_complet'] = $row['date_complet'];
6368     $return['archive_date_dernier_depot'] = $row['date_dernier_depot'];
6369     $return['archive_date_rejet'] = $row['date_rejet'];
6370     $return['archive_date_limite'] = $row['date_limite'];
6371     $return['archive_date_notification_delai'] = $row['date_notification_delai'];
6372     $return['archive_date_decision'] = $row['date_decision'];
6373     $return['archive_date_validite'] = $row['date_validite'];
6374     $return['archive_date_achevement'] = $row['date_achevement'];
6375     $return['archive_date_chantier'] = $row['date_chantier'];
6376     $return['archive_date_conformite'] = $row['date_conformite'];
6377     $return['archive_incompletude'] = $row['incompletude'];
6378     $return['archive_incomplet_notifie'] = $row['incomplet_notifie'];
6379     $return['archive_evenement_suivant_tacite'] = $row['evenement_suivant_tacite'];
6380     $return['archive_evenement_suivant_tacite_incompletude'] = $row['evenement_suivant_tacite_incompletude'];
6381     $return['archive_etat_pendant_incompletude'] = $row['etat_pendant_incompletude'];
6382     $return['archive_date_limite_incompletude'] = $row['date_limite_incompletude'];
6383     $return['archive_delai_incompletude'] = $row['delai_incompletude'];
6384     $return['archive_autorite_competente'] = $row['autorite_competente'];
6385 softime 8593 $return['archive_dossier_instruction_type'] = $row['dossier_instruction_type'];
6386 softime 6565 $return['duree_validite'] = $row['duree_validite'];
6387     $return['date_depot'] = $row['date_depot'];
6388 softime 10573 $return['date_depot_mairie'] = $row['date_depot_mairie'];
6389 softime 6565 $return['archive_date_cloture_instruction'] = $row['date_cloture_instruction'];
6390     $return['archive_date_premiere_visite'] = $row['date_premiere_visite'];
6391     $return['archive_date_derniere_visite'] = $row['date_derniere_visite'];
6392     $return['archive_date_contradictoire'] = $row['date_contradictoire'];
6393     $return['archive_date_retour_contradictoire'] = $row['date_retour_contradictoire'];
6394     $return['archive_date_ait'] = $row['date_ait'];
6395     $return['archive_date_transmission_parquet'] = $row['date_transmission_parquet'];
6396 softime 8989 $return['archive_date_affichage'] = $row['date_affichage'];
6397 softime 10573 $return['archive_pec_metier'] = $row['pec_metier'];
6398     $return['archive_a_qualifier'] = $row['a_qualifier'];
6399 mbroquet 3730 }
6400    
6401     // Retour de la fonction
6402     return $return;
6403    
6404     }
6405    
6406     /**
6407     * Permet de vérifier qu'un événement est verrouillable
6408     * @param integer $idx Identifiant de l'instruction
6409     * @return boolean
6410     */
6411     function checkEvenementNonVerrouillable($idx) {
6412     // Si la condition n'est pas vide
6413     if ($idx != "") {
6414    
6415     // Requête SQL
6416 softime 14064 $qres = $this->f->get_one_result_from_db_query(
6417     sprintf(
6418     'SELECT
6419     evenement.non_verrouillable
6420     FROM
6421     %1$sevenement
6422     LEFT JOIN %1$sinstruction
6423     ON instruction.evenement = evenement.evenement
6424     WHERE
6425     instruction.instruction = \'%2$s\'',
6426     DB_PREFIXE,
6427     intval($idx)
6428     ),
6429     array(
6430     "origin" => __METHOD__,
6431     )
6432     );
6433 mbroquet 3730 }
6434    
6435 softime 14064 // Si on a un résultat et que ce résultat indique que l'événement n'est
6436     // pas vérrouillable renvoie true, sinon renvoie false
6437     return isset($qres) && isset($qres['result']) && $qres['result'] == 't';
6438 mbroquet 3730 }
6439    
6440     /**
6441     * Mise à jour des champs archive_*
6442     * @param mixed $row La ligne de données
6443     */
6444     public function updateArchiveData($row){
6445    
6446     // Récupération de la valeur actuelle du délai, de l'accord tacite,
6447     // de l'état et de l'avis du dossier d'instruction
6448     $this->valF['archive_delai']=$row['delai'];
6449     $this->valF['archive_accord_tacite']=$row['accord_tacite'];
6450     $this->valF['archive_etat']=$row['etat'];
6451     $this->valF['archive_avis']=$row['avis_decision'];
6452     // Récupération de la valeur actuelle des 9 dates du dossier
6453     // d'instruction
6454     if ($row['date_complet'] != '') {
6455     $this->valF['archive_date_complet']=$row['date_complet'];
6456     }
6457     if ($row['date_dernier_depot'] != '') {
6458     $this->valF['archive_date_dernier_depot']=$row['date_dernier_depot'];
6459     }
6460 softime 6565 if ($row['date_rejet'] != '') {
6461 mbroquet 3730 $this->valF['archive_date_rejet']= $row['date_rejet'];
6462     }
6463 softime 6565 if ($row['date_limite'] != '') {
6464 mbroquet 3730 $this->valF['archive_date_limite']= $row['date_limite'];
6465     }
6466 softime 6565 if ($row['date_notification_delai'] != '') {
6467 mbroquet 3730 $this->valF['archive_date_notification_delai']= $row['date_notification_delai'];
6468     }
6469 softime 6565 if ($row['date_decision'] != '') {
6470 mbroquet 3730 $this->valF['archive_date_decision']= $row['date_decision'];
6471     }
6472 softime 6565 if ($row['date_validite'] != '') {
6473 mbroquet 3730 $this->valF['archive_date_validite']= $row['date_validite'];
6474     }
6475 softime 6565 if ($row['date_achevement'] != '') {
6476 mbroquet 3730 $this->valF['archive_date_achevement']= $row['date_achevement'];
6477     }
6478 softime 6565 if ($row['date_chantier'] != '') {
6479 mbroquet 3730 $this->valF['archive_date_chantier']= $row['date_chantier'];
6480     }
6481 softime 6565 if ($row['date_conformite'] != '') {
6482 mbroquet 3730 $this->valF['archive_date_conformite']= $row['date_conformite'];
6483     }
6484 softime 6565 if ($row['incompletude'] != '') {
6485 mbroquet 3730 $this->valF['archive_incompletude']= $row['incompletude'];
6486     }
6487 softime 6565 if ($row['incomplet_notifie'] != '') {
6488 mbroquet 3730 $this->valF['archive_incomplet_notifie']= $row['incomplet_notifie'];
6489     }
6490 softime 6565 if ($row['evenement_suivant_tacite'] != '') {
6491 mbroquet 3730 $this->valF['archive_evenement_suivant_tacite']= $row['evenement_suivant_tacite'];
6492     }
6493 softime 6565 if ($row['evenement_suivant_tacite_incompletude'] != '') {
6494 mbroquet 3730 $this->valF['archive_evenement_suivant_tacite_incompletude']= $row['evenement_suivant_tacite_incompletude'];
6495     }
6496 softime 6565 if ($row['etat_pendant_incompletude'] != '') {
6497 mbroquet 3730 $this->valF['archive_etat_pendant_incompletude']= $row['etat_pendant_incompletude'];
6498     }
6499 softime 6565 if ($row['date_limite_incompletude'] != '') {
6500 mbroquet 3730 $this->valF['archive_date_limite_incompletude']= $row['date_limite_incompletude'];
6501     }
6502 softime 6565 if ($row['delai_incompletude'] != '') {
6503 mbroquet 3730 $this->valF['archive_delai_incompletude']= $row['delai_incompletude'];
6504     }
6505 softime 6565 if ($row['autorite_competente'] != '') {
6506 mbroquet 3730 $this->valF['archive_autorite_competente']= $row['autorite_competente'];
6507     }
6508 softime 6565 if ($row['duree_validite'] != '') {
6509 mbroquet 3730 $this->valF['duree_validite']= $row['duree_validite'];
6510     }
6511 softime 6565 if ($row['date_depot'] != '') {
6512 nmeucci 3873 $this->valF['date_depot']= $row['date_depot'];
6513     }
6514 softime 10573 if ($row['date_depot_mairie'] != '') {
6515     $this->valF['date_depot_mairie']= $row['date_depot_mairie'];
6516     }
6517 softime 6565 // Dates concernant les dossiers contentieux
6518     if ($row['date_cloture_instruction'] != '') {
6519     $this->valF['archive_date_cloture_instruction']= $row['date_cloture_instruction'];
6520     }
6521     if ($row['date_premiere_visite'] != '') {
6522     $this->valF['archive_date_premiere_visite']= $row['date_premiere_visite'];
6523     }
6524     if ($row['date_derniere_visite'] != '') {
6525     $this->valF['archive_date_derniere_visite']= $row['date_derniere_visite'];
6526     }
6527     if ($row['date_contradictoire'] != '') {
6528     $this->valF['archive_date_contradictoire']= $row['date_contradictoire'];
6529     }
6530     if ($row['date_retour_contradictoire'] != '') {
6531     $this->valF['archive_date_retour_contradictoire']= $row['date_retour_contradictoire'];
6532     }
6533     if ($row['date_ait'] != '') {
6534     $this->valF['archive_date_ait']= $row['date_ait'];
6535     }
6536     if ($row['date_transmission_parquet'] != '') {
6537     $this->valF['archive_date_transmission_parquet']= $row['date_transmission_parquet'];
6538     }
6539 softime 8989 //
6540 softime 8593 if ($row['dossier_instruction_type'] != '') {
6541     $this->valF['archive_dossier_instruction_type']= $row['dossier_instruction_type'];
6542     }
6543 softime 8989 if ($row['date_affichage'] != '') {
6544     $this->valF['archive_date_affichage']= $row['date_affichage'];
6545     }
6546 softime 10573 if (isset($row['pec_metier']) === true && $row['pec_metier'] != '') {
6547     $this->valF['archive_pec_metier']= $row['pec_metier'];
6548     }
6549     if (isset($row['a_qualifier']) === true && $row['a_qualifier'] != '') {
6550     $this->valF['archive_a_qualifier']= $row['a_qualifier'];
6551     }
6552 mbroquet 3730 }
6553    
6554     // {{{
6555     // Méthodes de récupération des métadonnées arrêté
6556     /**
6557     * @return string Retourne le numéro d'arrêté
6558     */
6559     function getNumArrete() {
6560     return $this->getVal("numero_arrete");
6561     }
6562     /**
6563     * @return chaîne vide
6564     */
6565     function getReglementaireArrete() {
6566     return 'true';
6567     }
6568     /**
6569     * @return boolean de notification au pétitionnaire
6570     */
6571     function getNotificationArrete() {
6572     return 'true';
6573     }
6574     /**
6575     * @return date de notification au pétitionnaire
6576     */
6577     function getDateNotificationArrete() {
6578     if (empty($this->metadonneesArrete)) {
6579     $this->getArreteMetadata();
6580     }
6581     return $this->metadonneesArrete["datenotification"];
6582     }
6583     /**
6584     * @return boolean check si le document est passé au contrôle de légalité
6585     */
6586     function getControleLegalite() {
6587     return 'true';
6588     }
6589     /**
6590     * @return date de signature de l'arrêté
6591     */
6592     function getDateSignature() {
6593     if (empty($this->metadonneesArrete)) {
6594     $this->getArreteMetadata();
6595     }
6596     return $this->metadonneesArrete["datesignaturearrete"];
6597     }
6598     /**
6599     * @return string nom du signataire
6600     */
6601     function getNomSignataire() {
6602     if (empty($this->metadonneesArrete)) {
6603     $this->getArreteMetadata();
6604     }
6605     return $this->metadonneesArrete["nomsignataire"];
6606     }
6607     /**
6608     * @return string qualité du signataire
6609     */
6610     function getQualiteSignataire() {
6611     if (empty($this->metadonneesArrete)) {
6612     $this->getArreteMetadata();
6613     }
6614     return $this->metadonneesArrete["qualitesignataire"];
6615     }
6616     /**
6617     * @return string numéro du terrain
6618     */
6619     function getAp_numRue() {
6620     if (empty($this->metadonneesArrete)) {
6621     $this->getArreteMetadata();
6622     }
6623     return $this->metadonneesArrete["ap_numrue"];
6624     }
6625     /**
6626     * @return string nom de la rue du terrain
6627     */
6628     function getAp_nomDeLaVoie() {
6629     if (empty($this->metadonneesArrete)) {
6630     $this->getArreteMetadata();
6631     }
6632     return $this->metadonneesArrete["ap_nomdelavoie"];
6633     }
6634     /**
6635     * @return string code postal du terrain
6636     */
6637     function getAp_codePostal() {
6638     if (empty($this->metadonneesArrete)) {
6639     $this->getArreteMetadata();
6640     }
6641     return $this->metadonneesArrete["ap_codepostal"];
6642     }
6643     /**
6644     * @return string ville du terrain
6645     */
6646     function getAp_ville() {
6647     if (empty($this->metadonneesArrete)) {
6648     $this->getArreteMetadata();
6649     }
6650     return $this->metadonneesArrete["ap_ville"];
6651     }
6652     /**
6653     * @return string activité
6654     */
6655     function getActivite() {
6656     return "Droit du sol";
6657     }
6658     /**
6659     * @return string date du retour de controle légalité
6660     */
6661     function getDateControleLegalite() {
6662     if (empty($this->metadonneesArrete)) {
6663     $this->getArreteMetadata();
6664     }
6665     return $this->metadonneesArrete["datecontrolelegalite"];
6666     }
6667    
6668     // Fin des méthodes de récupération des métadonnées
6669     // }}}
6670    
6671     /**
6672     * Méthode de récupération des métadonnées arrêtés dans la base de données,
6673     * les données sont stockés dans l'attribut $this->metadonneesArrete
6674     */
6675     function getArreteMetadata() {
6676    
6677 softime 14542 //Récupération de la dernière instruction dont l'événement est de type 'arrete'
6678     $this->metadonneesArrete = array("nomsignataire"=>"", "qualitesignataire"=>"",
6679     "decisionarrete"=>"", "datenotification"=>"", "datesignaturearrete"=>"",
6680     "datecontrolelegalite"=>"", "ap_numrue"=>"", "ap_nomdelavoie"=>"",
6681     "ap_codepostal"=>"", "ap_ville"=>"");
6682 mbroquet 3730
6683 softime 14542 $qres = $this->f->get_all_results_from_db_query(
6684     sprintf(
6685     'SELECT
6686     signataire_arrete.prenom || \' \' ||signataire_arrete.nom as nomsignataire,
6687     signataire_arrete.qualite as qualitesignataire,
6688     instruction.etat as decisionarrete,
6689     instruction.date_retour_rar as datenotification,
6690     instruction.date_retour_signature as datesignaturearrete,
6691     instruction.date_retour_controle_legalite as datecontrolelegalite,
6692     dossier.terrain_adresse_voie_numero as ap_numrue,
6693     dossier.terrain_adresse_voie as ap_nomdelavoie,
6694     dossier.terrain_adresse_code_postal as ap_codepostal,
6695     dossier.terrain_adresse_localite as ap_ville
6696     FROM
6697     %1$sinstruction
6698     LEFT JOIN %1$ssignataire_arrete
6699     ON instruction.signataire_arrete = signataire_arrete.signataire_arrete
6700     LEFT JOIN %1$sdossier
6701     ON instruction.dossier = dossier.dossier
6702     LEFT JOIN %1$sdonnees_techniques
6703     ON donnees_techniques.dossier_instruction = dossier.dossier
6704     WHERE
6705     instruction.instruction = %2$d',
6706     DB_PREFIXE,
6707     intval($this->getVal('instruction'))
6708     ),
6709     array(
6710     'origin' => __METHOD__
6711     )
6712     );
6713     $this->metadonneesArrete = array_shift($qres['result']);
6714 mbroquet 3730 }
6715    
6716     /**
6717     * CONDITION - has_an_edition.
6718     *
6719     * Condition pour afficher le bouton de visualisation de l'édition.
6720     *
6721     * @return boolean
6722     */
6723     function has_an_edition() {
6724     // Récupère la valeur du champ lettretype
6725     $lettretype = $this->getVal("lettretype");
6726     // Si le champ est vide
6727 softime 7521 if ($lettretype !== '' && $lettretype !== null) {
6728 mbroquet 3730 //
6729 softime 7521 return true;
6730 mbroquet 3730 }
6731    
6732     //
6733 softime 7521 return false;
6734 mbroquet 3730 }
6735    
6736     /**
6737 softime 10573 * CONDITION - is_modifiable.
6738     *
6739     * Controle si l'évenement est modifiable.
6740     *
6741     * @return boolean
6742     */
6743     function is_evenement_modifiable() {
6744     $evenement = $this->get_inst_evenement($this->getVal('evenement'));
6745     return ! $this->get_boolean_from_pgsql_value($evenement->getVal('non_modifiable'));
6746     }
6747    
6748     /**
6749 mbroquet 3730 * CONDITION - is_editable.
6750     *
6751     * Condition pour la modification.
6752     *
6753     * @return boolean
6754     */
6755     function is_editable() {
6756 softime 10573
6757     // XXX
6758     // 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é)
6759     // Si cette tâche identifiée est DONE alors la suppression/modification de cette intruction est impossible
6760    
6761 mbroquet 3730 // Contrôle si l'utilisateur possède un bypass
6762 softime 7996 $bypass = $this->f->isAccredited($this->get_absolute_class_name()."_modifier_bypass");
6763 mbroquet 3730 //
6764     if ($bypass == true) {
6765     //
6766     return true;
6767     }
6768 softime 6565
6769 mbroquet 3730 // Si l'utilisateur est un instructeur, que le dossier est cloturé et
6770     // que l'événement n'est pas identifié comme non verrouillable
6771     if ($this->f->isUserInstructeur()
6772     && $this->getStatutAutorisationDossier($this->getParameter("idxformulaire")) == "cloture"
6773     && $this->checkEvenementNonVerrouillable($this->getVal("instruction")) === false) {
6774     //
6775     return false;
6776     }
6777    
6778 softime 6565 // Si l'utilisateur est un intructeur qui correspond à la division du
6779     // dossier
6780     if ($this->is_instructeur_from_division_dossier() === true) {
6781     //
6782     return true;
6783     }
6784    
6785     // Si l'utilisateur est instructeur de la commune du dossier et que
6786     // l'instruction est créée par un instructeur de la commune
6787 softime 18876 if ($this->is_instructeur_from_collectivite_dossier() === true &&
6788 softime 6565 $this->getVal('created_by_commune') === 't') {
6789     return true;
6790     }
6791    
6792 mbroquet 3730 //
6793 softime 6565 return false;
6794 mbroquet 3730 }
6795    
6796     /**
6797 softime 10573 * Vérifie si l'événement est supprimable ou pas.
6798     *
6799     * @return boolean
6800     */
6801     function is_evenement_supprimable() {
6802     // Controle si l'évenement est supprimable
6803     $evenement = $this->get_inst_evenement($this->getVal('evenement'));
6804     return ! $this->get_boolean_from_pgsql_value($evenement->getVal('non_supprimable'));
6805     }
6806    
6807     /**
6808 mbroquet 3730 * CONDITION - is_deletable.
6809     *
6810 softime 6864 * Condition pour la suppression.
6811 mbroquet 3730 *
6812     * @return boolean
6813     */
6814     function is_deletable() {
6815 softime 10573
6816     // XXX
6817     // 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é)
6818     // Si cette tâche identifiée est DONE alors la suppression/modification de cette intruction est impossible
6819    
6820 softime 6864 // Contrôle si l'utilisateur possède un bypass intégral
6821 softime 7996 $bypass = $this->f->isAccredited($this->get_absolute_class_name()."_supprimer_bypass");
6822 mbroquet 3730 //
6823     if ($bypass == true) {
6824    
6825     //
6826     return true;
6827     }
6828    
6829     // Si l'utilisateur est un intructeur qui ne correspond pas à la
6830 softime 6864 // division du dossier et si l'utilisateur n'a pas la permission bypass
6831     // de la division
6832     if ($this->is_instructeur_from_division_dossier() === false
6833 softime 7996 && $this->f->isAccredited($this->get_absolute_class_name()."_supprimer_bypass_division") === false) {
6834 mbroquet 3730
6835     //
6836     return false;
6837     }
6838 softime 5024
6839     // l'événement est-il le dernier ?
6840     $dernier_evenement = false;
6841     // instanciation dossier
6842 softime 7996 $dossier = $this->f->get_inst__om_dbform(array(
6843     "obj" => "dossier",
6844     "idx" => $this->getVal('dossier'),
6845     ));
6846 softime 5024 // récupération dernier événement
6847     $id_dernier_evenement = $dossier->get_dernier_evenement();
6848     if ($id_dernier_evenement == $this->getVal($this->clePrimaire)) {
6849     $dernier_evenement = true;
6850     }
6851 mbroquet 3730
6852 softime 5024 // Si dossier cloturé ou si pas dernier événement
6853     // ou de type retour ou si une date est renseignée
6854     // ET utilisateur non administrateur
6855     if ($this->getStatutAutorisationDossier($this->getVal('dossier')) == 'cloture'
6856     || $dernier_evenement == false
6857     || $this->is_evenement_retour($this->getVal("evenement")) == true
6858     || $this->getVal('date_envoi_signature') != ''
6859     || $this->getVal('date_retour_signature') != ''
6860     || $this->getVal('date_envoi_rar') != ''
6861     || $this->getVal('date_retour_rar') != ''
6862     || $this->getVal('date_envoi_controle_legalite') != ''
6863     || $this->getVal('date_retour_controle_legalite') != '') {
6864     // pas le droit de supprimer
6865     return false;;
6866     }
6867    
6868 mbroquet 3730 //
6869     return true;
6870     }
6871 softime 6565
6872    
6873 mbroquet 3730 /**
6874 softime 6565 * Vérifie que l'utilisateur est instructeur et qu'il est de la division du
6875     * dossier.
6876     *
6877     * @return, boolean true/false
6878     */
6879     function is_instructeur_from_collectivite_dossier() {
6880 softime 18876 if ($this->f->isUserInstructeur() === true &&
6881 softime 6565 $this->f->om_utilisateur["om_collectivite"] == $this->get_dossier_instruction_om_collectivite()) {
6882     return true;
6883     }
6884     return false;
6885     }
6886    
6887     /**
6888 mbroquet 3730 * CONDITION - is_addable.
6889     *
6890     * Condition pour afficher les boutons modifier et supprimer.
6891     *
6892     * @return boolean
6893     */
6894     function is_addable() {
6895     // Contrôle si l'utilisateur possède un bypass
6896 softime 7996 $bypass = $this->f->isAccredited($this->get_absolute_class_name()."_ajouter_bypass");
6897 mbroquet 3730 //
6898     if ($bypass == true) {
6899    
6900     //
6901     return true;
6902     }
6903 softime 6565 // Si l'utilisateur est un intructeur qui correspond à la
6904     // division du dossier ou qu'il peut changer la décision
6905 softime 18876 if ($this->is_instructeur_from_division_dossier() === true ||
6906 softime 6565 $this->isInstrCanChangeDecision($this->getParameter('idxformulaire')) === true) {
6907 mbroquet 3730 //
6908 softime 6565 return true;
6909 mbroquet 3730 }
6910    
6911     //
6912 softime 6565 return false;
6913 mbroquet 3730 }
6914    
6915     /**
6916     * CONDITION - is_finalizable.
6917     *
6918     * Condition pour afficher le bouton.
6919     *
6920     * @return boolean
6921     */
6922     function is_finalizable() {
6923     // Contrôle si l'utilisateur possède un bypass
6924 softime 7996 $bypass = $this->f->isAccredited($this->get_absolute_class_name()."_finaliser_bypass");
6925 mbroquet 3730 //
6926     if ($bypass == true) {
6927     //
6928     return true;
6929     }
6930 softime 6565
6931 mbroquet 3730 // Si l'utilisateur est un instructeur, que le dossier est cloturé et
6932     // que l'événement n'est pas identifié comme non verrouillable
6933     if ($this->f->isUserInstructeur()
6934     && $this->getStatutAutorisationDossier($this->getParameter("idxformulaire")) == "cloture"
6935     && $this->checkEvenementNonVerrouillable($this->getVal("instruction")) === false) {
6936     //
6937     return false;
6938     }
6939 softime 6565
6940     // Si l'utilisateur est un intructeur qui correspond à la division du
6941     // dossier
6942     if ($this->is_instructeur_from_division_dossier() === true) {
6943     //
6944     return true;
6945     }
6946 mbroquet 3730
6947 softime 6565 // Si l'utilisateur est instructeur de la commune du dossier et que
6948     // l'instruction est créée par un instructeur de la commune
6949 softime 18876 if ($this->is_instructeur_from_collectivite_dossier() === true &&
6950 softime 6565 $this->getVal('created_by_commune') === 't') {
6951     return true;
6952     }
6953    
6954 mbroquet 3730 //
6955 softime 6565 return false;
6956 mbroquet 3730 }
6957    
6958     /**
6959     * CONDITION - is_finalize_without_bypass.
6960     *
6961     * Condition pour afficher le bouton sans le bypass.
6962     *
6963     * @return boolean [description]
6964     */
6965     function is_finalizable_without_bypass() {
6966     // Récupère la valeur du champ finalisé
6967     $om_final_instruction = $this->getVal('om_final_instruction');
6968    
6969     // Si le rapport n'est pas finalisé
6970     if (empty($om_final_instruction)
6971     || $om_final_instruction == 'f') {
6972     //
6973     return true;
6974     }
6975    
6976     //
6977     return false;
6978     }
6979    
6980     /**
6981     * CONDITION - is_unfinalizable.
6982     *
6983     * Condition pour afficher le bouton.
6984     *
6985     * @return boolean
6986     */
6987     function is_unfinalizable(){
6988     // Contrôle si l'utilisateur possède un bypass
6989 softime 7996 $bypass = $this->f->isAccredited($this->get_absolute_class_name()."_definaliser_bypass");
6990 mbroquet 3730 //
6991     if ($bypass == true) {
6992     //
6993     return true;
6994     }
6995 softime 6565
6996     // Si l'utilisateur est un instructeur, que le dossier est cloturé et
6997     // que l'événement n'est pas identifié comme non verrouillable
6998 mbroquet 3730 if ($this->f->isUserInstructeur()
6999 softime 6565 && $this->getStatutAutorisationDossier($this->getParameter("idxformulaire")) == "cloture"
7000     && $this->checkEvenementNonVerrouillable($this->getVal("instruction")) === false) {
7001 mbroquet 3730 //
7002     return false;
7003     }
7004    
7005 softime 6565 // Si l'utilisateur est un intructeur qui correspond à la division du
7006     // dossier
7007     if ($this->is_instructeur_from_division_dossier() === true) {
7008     //
7009     return true;
7010 mbroquet 3730 }
7011    
7012 softime 6565 // Si l'utilisateur est instructeur de la commune du dossier et que
7013     // l'instruction est créée par un instructeur de la commune
7014 softime 18876 if ($this->is_instructeur_from_collectivite_dossier() === true &&
7015 softime 6565 $this->getVal('created_by_commune') === 't') {
7016     return true;
7017 mbroquet 3730 }
7018    
7019     //
7020 softime 6565 return false;
7021 mbroquet 3730 }
7022    
7023     /**
7024     * CONDITION - is_unfinalizable_without_bypass.
7025     *
7026     * Condition pour afficher le bouton sans le bypass.
7027     *
7028     * @return boolean
7029     */
7030     function is_unfinalizable_without_bypass() {
7031     // Récupère la valeur du champ finalisé
7032     $om_final_instruction = $this->getVal('om_final_instruction');
7033    
7034     // Si l'instruction est finalisée
7035     if ($om_final_instruction == 't') {
7036     //
7037     return true;
7038     }
7039    
7040     //
7041     return false;
7042     }
7043    
7044 softime 5169
7045 mbroquet 3730 /**
7046 softime 6565 * Permet de définir si un instructeur commune peut editer une instruction
7047     *
7048     * @return boolean true si il peut
7049     */
7050     function isInstrCanChangeDecision($idx) {
7051    
7052 softime 18876 if ($this->f->isAccredited(array("instruction", "instruction_changer_decision"), "OR") !== true ||
7053 softime 6565 $this->f->isUserInstructeur() !== true) {
7054     return false;
7055     }
7056    
7057    
7058    
7059     // Sinon on vérifie l'éligibilité du dossier au changement de décision
7060 softime 11876 // /!\ Requête lié à celles du widget indiquant les dossiers éligible au changement
7061     // de décision :
7062     // * dossier_instruction.class.php : view_widget_dossiers_evenement_retour_finalise()
7063     // * dossier_instruction.inc.php : si le paramètre filtre_decision = true
7064     $sql = sprintf(
7065     'SELECT
7066 softime 6565 dossier.dossier
7067     FROM
7068 softime 11876 %1$sdossier
7069     JOIN %1$setat
7070     ON dossier.etat = etat.etat AND etat.statut = \'encours\'
7071     JOIN %1$slien_dossier_demandeur
7072     ON dossier.dossier = lien_dossier_demandeur.dossier AND lien_dossier_demandeur.petitionnaire_principal IS TRUE
7073     JOIN %1$sdossier_instruction_type
7074     ON dossier.dossier_instruction_type=dossier_instruction_type.dossier_instruction_type
7075     JOIN %1$sinstruction
7076     -- Recherche de la dernière instruction qui ne soit pas liée à un événement retour
7077     ON instruction.instruction = (
7078     SELECT instruction
7079     FROM %1$sinstruction
7080     JOIN %1$sevenement ON instruction.evenement=evenement.evenement
7081     AND evenement.retour IS FALSE
7082     WHERE instruction.dossier = dossier.dossier
7083     ORDER BY date_evenement DESC, instruction DESC
7084     LIMIT 1
7085     )
7086     -- On ne garde que les dossiers pour lesquels la dernière instruction est finalisée
7087     -- ou alors pour laquelle l instruction a été ajouté par la commune et est
7088     -- non signée, non notifié, etc.
7089     AND (instruction.om_final_instruction IS TRUE
7090     OR instruction.created_by_commune IS TRUE)
7091     AND instruction.date_retour_signature IS NULL
7092     AND instruction.date_envoi_rar IS NULL
7093     AND instruction.date_retour_rar IS NULL
7094     AND instruction.date_envoi_controle_legalite IS NULL
7095     AND instruction.date_retour_controle_legalite IS NULL
7096     -- On vérifie que l instruction soit un arrêté ou un changement de décision
7097     JOIN %1$sevenement
7098     ON instruction.evenement=evenement.evenement
7099     AND (evenement.type = \'arrete\'
7100     OR evenement.type = \'changement_decision\')
7101     -- Recherche les informations du pétitionnaire principal pour l affichage
7102     JOIN %1$sdemandeur
7103     ON lien_dossier_demandeur.demandeur = demandeur.demandeur
7104     -- Recherche la collectivité rattachée à l instructeur
7105     JOIN %1$sinstructeur
7106     ON dossier.instructeur=instructeur.instructeur
7107     JOIN %1$sdivision
7108     ON instructeur.division=division.division
7109     JOIN %1$sdirection
7110     ON division.direction=direction.direction
7111     JOIN %1$som_collectivite
7112     ON direction.om_collectivite=om_collectivite.om_collectivite
7113 softime 6565 WHERE
7114 softime 11876 -- Vérification que la décision a été prise par l agglo
7115     om_collectivite.niveau = \'2\'
7116     AND dossier.dossier = \'%2$s\'
7117     ',
7118     DB_PREFIXE,
7119 softime 14064 $this->f->db->escapeSimple($idx)
7120 softime 11876 );
7121 softime 6565
7122    
7123     // Si collectivité de l'utilisateur niveau mono alors filtre sur celle-ci
7124     if ($this->f->isCollectiviteMono($_SESSION['collectivite']) === true) {
7125 softime 11876 $sql .= sprintf(
7126 softime 14064 ' AND dossier.om_collectivite = %1$d',
7127     intval($_SESSION['collectivite'])
7128 softime 11876 );
7129 softime 6565 }
7130 softime 14064 $qres = $this->f->get_one_result_from_db_query(
7131     $sql,
7132     array(
7133     "origin" => __METHOD__,
7134     )
7135     );
7136    
7137     return $qres['result'] !== null;
7138 softime 6565 }
7139    
7140    
7141     /**
7142 softime 5169 * CONDITION - can_monitoring_dates.
7143     *
7144     * Condition pour afficher le bouton de suivi des dates.
7145     *
7146     * @return boolean
7147     */
7148     public function can_monitoring_dates() {
7149     // Récupère la valeur du champ finalisé
7150     $om_final_instruction = $this->getVal('om_final_instruction');
7151    
7152     // Si l'instruction n'est pas finalisée
7153     if ($om_final_instruction !== 't') {
7154     //
7155     return false;
7156     }
7157    
7158     // Contrôle si l'utilisateur possède un bypass
7159 softime 7996 $bypass = $this->f->isAccredited($this->get_absolute_class_name()."_modification_dates_bypass");
7160 softime 5169 if ($bypass === true) {
7161     return true;
7162     }
7163    
7164 softime 8989 // Permission de modifier le suivi des dates sur un dossier cloturé pour
7165     // un utilisateur lié à un instructeur
7166     $perm_moni_dates_d_closed = $this->f->isAccredited($this->get_absolute_class_name()."_modification_dates_cloture");
7167    
7168     // On vérifie en premier lieu que le DI n'est pas clôturé et que
7169     // l'utilisateur ne possède pas la permission de modifier le suivi des
7170     // dates sur un dossier clôturé
7171 softime 5169 $inst_dossier = $this->get_inst_dossier();
7172 softime 8989 if ($inst_dossier->getStatut() === 'cloture'
7173     && $perm_moni_dates_d_closed === false) {
7174 softime 5169 //
7175     return false;
7176     }
7177     // On récupère ses infos
7178     $coll_di = $inst_dossier->getVal('om_collectivite');
7179     $div_di = $this->getDivisionFromDossier();
7180     // et celles de son éventuel instructeur
7181     $instr_di = $inst_dossier->getVal('instructeur');
7182    
7183 softime 6565 // Il faut disposer d'une entrée instructeur
7184     if ($this->f->isUserInstructeur() === false) {
7185     return false;
7186     }
7187    
7188 softime 5169 // Par défaut on prétend que l'instructeur n'est pas multi
7189     $instr_di_coll_multi = false;
7190     // Si un instructeur est affecté au dossier
7191     if ($instr_di !== '' && $instr_di !== null) {
7192     // Vérifie si l'instructeur est de la collectivité de niveau 2
7193 softime 5295 $instr_di_coll = $this->get_instructeur_om_collectivite($instr_di);
7194 softime 5169 if ($this->f->isCollectiviteMono($instr_di_coll) === false) {
7195     //
7196     $instr_di_coll_multi = true;
7197     }
7198     }
7199    
7200 softime 6565 // Il faut qu'il instruise le dossier ou soit de la même division
7201     if ($this->f->om_utilisateur['instructeur'] === $instr_di
7202     || $this->f->om_utilisateur['division'] === $div_di) {
7203 softime 5169 //
7204     return true;
7205     }
7206    
7207 softime 6565 // On donne également le droit s'il est de la même collectivité que
7208     // le dossier ET si l'instruction est déléguée à la communauté
7209     if ($this->f->isCollectiviteMono($this->f->om_utilisateur['om_collectivite']) === true
7210     && $this->f->om_utilisateur['om_collectivite'] === $coll_di
7211     && $instr_di_coll_multi === true) {
7212 softime 5169 //
7213     return true;
7214     }
7215    
7216 softime 6565 // Si l'instructeur ne rentre pas dans les deux cas précédents
7217 softime 5169 return false;
7218     }
7219    
7220    
7221     /**
7222 softime 12847 * CONDITION - is_finalized.
7223     *
7224     * Condition pour vérifier si une instruction est finalisée.
7225     *
7226     * @return boolean
7227     */
7228     public function is_finalized() {
7229    
7230     return $this->getVal('om_final_instruction') === "t";
7231     }
7232    
7233     /**
7234     * CONDITION - is_not_date_retour_signature_set.
7235     *
7236     * Condition pour vérifier si une date de retour signature n'est pas définie.
7237     *
7238     * @return boolean
7239     */
7240     public function is_not_date_retour_signature_set() {
7241    
7242     return $this->getVal('date_retour_signature') == null;
7243    
7244     }
7245    
7246    
7247     /**
7248 mbroquet 3730 * TREATMENT - finalize.
7249     *
7250     * Permet de finaliser un enregistrement.
7251     *
7252     * @param array $val valeurs soumises par le formulaire
7253     *
7254     * @return boolean
7255     */
7256     function finalize($val = array()) {
7257     // Cette méthode permet d'exécuter une routine en début des méthodes
7258     // dites de TREATMENT.
7259     $this->begin_treatment(__METHOD__);
7260 softime 10808 $message = '';
7261 softime 11585 $ev = $this->get_inst_evenement($this->getVal('evenement'));
7262 mbroquet 3730
7263 softime 18436 $this->f->log(__METHOD__, 'BEGIN');
7264     $collectivite_di = null;
7265     $data = array('val' => &$val);
7266     $data['ev'] = $ev;
7267     $data['collectivite_di'] = $collectivite_di;
7268     $this->f->module_manager->run_hooks('finalize_pre', $this, $data);
7269    
7270 softime 11585 // Controle du signataire
7271     if (! $this->controle_signataire($ev)) {
7272     $this->addToMessage(__("Le document ne peut pas être finalisé car aucun signataire n'a été sélectionné."));
7273     // Termine le traitement
7274     return $this->end_treatment(__METHOD__, false);
7275     }
7276    
7277 mbroquet 3730 // Traitement de la finalisation
7278     $ret = $this->manage_finalizing("finalize", $val);
7279    
7280     // Si le traitement retourne une erreur
7281     if ($ret !== true) {
7282    
7283     // Termine le traitement
7284 softime 5024 return $this->end_treatment(__METHOD__, false);
7285 mbroquet 3730 }
7286    
7287 softime 10808 // Envoi des notifications aux demandeurs si la notification est automatique
7288     // et que la signature n'est pas requise
7289     if ($ev->getVal('notification') === 'notification_automatique') {
7290 softime 13137 // Préparation du message de log en cas d'erreur de notification
7291 softime 13528 $msgLog = sprintf(
7292     '%s %s : %d',
7293     __('Erreur lors de la notification automatique du(des) pétitionnaire(s) suite à la finalisation de l\'instruction.'),
7294     __('Instruction notifiée'),
7295     $this->getVal($this->clePrimaire)
7296     );
7297 softime 10808 // Récupération de la catégorie et envoie des notifications au(x) demandeur(s)
7298     $collectivite_di = $this->get_dossier_instruction_om_collectivite($this->getVal('dossier'));
7299     // Récupération de la liste des demandeurs à notifier et de la catégorie
7300     $categorie = $this->f->get_param_option_notification($collectivite_di);
7301 softime 14064 $isPortal = $categorie === PORTAL;
7302 softime 10869 $demandeursANotifie = $this->get_demandeurs_notifiable(
7303     $this->getVal('dossier'),
7304     $isPortal
7305     );
7306 softime 10808
7307     // Création d'une notification et d'une tâche pour chaque demandeur à notifier
7308 softime 12124 $demandeurPrincipalNotifie = false;
7309 softime 10813 if (count($demandeursANotifie) > 0) {
7310     foreach ($demandeursANotifie as $demandeur) {
7311 softime 12124 // Identifie si le demandeur principal a été notifié ou pas
7312     // et récupère ses informations
7313     if ($demandeur['petitionnaire_principal'] == 't') {
7314     $demandeurPrincipalNotifie = true;
7315     // Si le demandeur principal est notifiable mais qu'il y a des erreurs dans
7316     // son paramétrage, on effectue pas le traitement et on passe à l'itération
7317     // suivante. On le considère également comme non notifié pour gérer l'envoie
7318     // des messages d'erreurs
7319     // Si la demande a été déposée via le portail alors le paramétrage n'a pas
7320     // d'impact sur la notification
7321     $erreursParam = $this->get_info_notification_fail();
7322     if (! $this->dossier_depose_sur_portail() && $erreursParam != array()) {
7323     $demandeurPrincipalNotifie = false;
7324     continue;
7325     }
7326     }
7327 softime 18876 //
7328     $msg_notif = '';
7329    
7330     $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;
7331     // On vérifie l'existence du paramètre 'option_bloquer_notif_auto_dln',
7332     // On vérifie si la date limite est dépassée ou si le type d'événement est erroné
7333     if (! empty($option_bloquer_notif_auto_dln_types_evenements)
7334     && $this->is_type_evenement_autorise($ev, array('types_evenements_autorises'=> $option_bloquer_notif_auto_dln_types_evenements)) === true
7335     && $this->is_date_limite_notification_premier_mois_depasee() === true) {
7336     // Ajout de la notif et récupération de son id
7337     $idNotif = $this->ajouter_notification(
7338     $this->getVal($this->clePrimaire),
7339     $this->f->get_connected_user_login_name(),
7340     $demandeur,
7341     $collectivite_di,
7342     array(),
7343     true,
7344     'Echec',
7345     __('La date limite de notification au demandeur est dépassée')
7346 softime 13528 );
7347 softime 18876 if ($idNotif === false) {
7348     // Termine le traitement
7349     $this->addToLog(
7350     sprintf('%s() : %s', __METHOD__, $msgLog),
7351     DEBUG_MODE
7352     );
7353     return $this->end_treatment(__METHOD__, false);
7354     }
7355     $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."));
7356 softime 10813 }
7357 softime 18876 else {
7358     // Ajout de la notif et récupération de son id
7359     $idNotif = $this->ajouter_notification(
7360     $this->getVal($this->clePrimaire),
7361     $this->f->get_connected_user_login_name(),
7362     $demandeur,
7363     $collectivite_di,
7364     array(),
7365     true
7366 softime 13528 );
7367 softime 18876 if ($idNotif === false) {
7368     // Termine le traitement
7369     $this->addToLog(
7370     sprintf('%s() : %s', __METHOD__, $msgLog),
7371     DEBUG_MODE
7372     );
7373     return $this->end_treatment(__METHOD__, false);
7374     }
7375     $notification_by_task = $this->notification_by_task(
7376     $idNotif,
7377     $this->getVal('dossier'),
7378     $categorie
7379 softime 10813 );
7380 softime 18876 if ($notification_by_task === false) {
7381     $this->addToLog(
7382     sprintf('%s() : %s', __METHOD__, $msgLog),
7383     DEBUG_MODE
7384     );
7385     $this->addToMessage(
7386     __("Erreur lors de la génération de la notification au(x) pétitionnaire(s).")
7387     );
7388     // Termine le traitement
7389     return $this->end_treatment(__METHOD__, false);
7390     }
7391     $msg_notif = sprintf('%s<br/>%s', __("La notification a été générée."), __("Le suivi de la notification est disponible depuis l'instruction."));
7392 softime 10813 }
7393 softime 10808 }
7394 softime 18876 $this->addToMessage($message .= $msg_notif);
7395 softime 10808 }
7396 softime 12847 // Pour la notification par mail ou la notification via portal si le dossier a
7397     // été déposés via portal, si le demandeur principal n'est pas notifiable,
7398     // on créé une nouvelle notification en erreur avec en commentaire la raison pour
7399     // laquelle le demandeur principal n'a pas pu être notifié
7400     $depotPortal = $this->dossier_depose_sur_portail();
7401     if (! $demandeurPrincipalNotifie && ($isPortal === false || $depotPortal === true)) {
7402 softime 13137 // Préparation des logs pour indiquer que le pétitionnaire principale n'est pas notifiable
7403 softime 13528 $msgLog .= sprintf(' %s', __('Le pétitionnaire principale n\'est pas notifiable.'));
7404 softime 12124 // Analyse pour savoir pourquoi le demandeur principal n'est pas notifiable
7405     $erreursParam = $this->get_info_notification_fail();
7406     $demandeurPrincipal = $this->get_info_petitionnaire_principal_dossier($this->getVal('dossier'));
7407     // Ajout de la notif et récupération de son id
7408     $idNotif = $this->ajouter_notification(
7409     $this->valF[$this->clePrimaire],
7410     $this->f->get_connected_user_login_name(),
7411     $demandeurPrincipal,
7412     $collectivite_di,
7413 softime 12433 array(),
7414 softime 12124 true,
7415     'Echec',
7416     implode(' ', $erreursParam)
7417     );
7418     if ($idNotif === false) {
7419     $this->addToMessage(
7420     __('Erreur : la création de la notification a échouée.').
7421     __("Veuillez contacter votre administrateur.")
7422     );
7423 softime 13528 $this->addToLog(
7424     sprintf('%s() : %s', __METHOD__, $msgLog),
7425     DEBUG_MODE
7426     );
7427 softime 12124 return false;
7428     }
7429     // Prépare un message d'alerte à destination de l'instructeur pour l'informer
7430     // de l'échec de la notification
7431     $dossier_message = $this->get_inst_dossier_message(0);
7432     $dossier_message_val = array(
7433     'dossier' => $this->getVal('dossier'),
7434 softime 18876 'type' => __('erreur expedition'),
7435 softime 12124 'emetteur' => $this->f->get_connected_user_login_name(),
7436     'login' => $_SESSION['login'],
7437     'date_emission' => date('Y-m-d H:i:s'),
7438 softime 18876 'contenu' => __('Échec lors de la notification de l\'instruction ').
7439 softime 12124 $ev->getVal('libelle').
7440     '.<br>'.
7441     implode("\n", $erreursParam).
7442     '<br>'.
7443 softime 18876 __('Veuillez corriger ces informations avant de renvoyer la notification.')
7444 softime 12124 );
7445     $add = $dossier_message->add_notification_message($dossier_message_val, true);
7446     // Si une erreur se produit pendant l'ajout
7447     if ($add !== true) {
7448     $this->addToLog(__METHOD__."(): Le message d'alerte concernant l'echec de l'envoi de la notification n'a pas pu être envoyé.", DEBUG_MODE);
7449     return false;
7450     }
7451     }
7452 softime 10808 }
7453    
7454 mbroquet 3730 // Termine le traitement
7455 softime 18436 // Événement
7456     $data['ev'] = $ev;
7457     $data['collectivite_di'] = $collectivite_di;
7458     $this->f->module_manager->run_hooks('finalize_post', $this, $data);
7459     $this->f->log(__METHOD__, 'END');
7460    
7461 mbroquet 3730 return $this->end_treatment(__METHOD__, true);
7462     }
7463    
7464     /**
7465 softime 12124 * Récupère l'instance de dossier message.
7466     *
7467     * @param string $dossier_message Identifiant du message.
7468     *
7469     * @return object
7470     */
7471     private function get_inst_dossier_message($dossier_message = null) {
7472     //
7473     return $this->get_inst_common("dossier_message", $dossier_message);
7474     }
7475    
7476     /**
7477 softime 11585 * Vérifie si le signataire est obligatoire pour finaliser
7478     * le document apartir du paramétrage de l'événement.
7479     * Si c'est le cas, vérifie si il y a bien un signataire
7480     * renseigné.
7481     * Si c'est le cas renvoie true, sinon renvoie false.
7482     *
7483     * @param evenement évenement de l'instruction permettant de
7484     * récupérer le paramétrage
7485     * @return boolean
7486     */
7487     protected function controle_signataire($evenement) {
7488     // Vérifie si le signataire est obligatoire et si c'est le cas
7489     // vérifie si il y a bien un signataire pour le document
7490     if ($evenement->is_signataire_obligatoire() &&
7491     ($this->getVal('signataire_arrete') === null ||
7492     $this->getVal('signataire_arrete') === '')) {
7493     return false;
7494     }
7495     return true;
7496     }
7497    
7498     /**
7499 mbroquet 3730 * TREATMENT - unfinalize.
7500     *
7501     * Permet de définaliser un enregistrement.
7502     *
7503     * @param array $val valeurs soumises par le formulaire
7504     *
7505     * @return boolean
7506     */
7507     function unfinalize($val = array()) {
7508    
7509     // Cette méthode permet d'exécuter une routine en début des méthodes
7510     // dites de TREATMENT.
7511     $this->begin_treatment(__METHOD__);
7512    
7513     // Traitement de la finalisation
7514     $ret = $this->manage_finalizing("unfinalize", $val);
7515    
7516     // Si le traitement retourne une erreur
7517     if ($ret !== true) {
7518    
7519     // Termine le traitement
7520 softime 5024 return $this->end_treatment(__METHOD__, false);
7521 mbroquet 3730 }
7522    
7523     // Termine le traitement
7524     return $this->end_treatment(__METHOD__, true);
7525     }
7526    
7527     /**
7528     * VIEW - view_edition
7529     *
7530     * Edite l'édition de l'instruction ou affiche celle contenue dans le stockage.
7531     *
7532     * @return null Si l'action est incorrecte
7533     */
7534     function view_edition() {
7535    
7536     // Si l'instruction est finalisée
7537     if($this->getVal("om_final_instruction") == 't'
7538     && $this->getVal("om_final_instruction") != null) {
7539    
7540     // Ouvre le document
7541 softime 7996 $lien = '../app/index.php?module=form&snippet=file&obj='.$this->table.'&'.
7542 mbroquet 3730 'champ=om_fichier_instruction&id='.$this->getVal($this->clePrimaire);
7543     //
7544     header("Location: ".$lien);
7545     } else {
7546    
7547     // Récupère la collectivite du dossier d'instruction
7548     $dossier_instruction_om_collectivite = $this->get_dossier_instruction_om_collectivite();
7549    
7550     //
7551     $collectivite = $this->f->getCollectivite($dossier_instruction_om_collectivite);
7552    
7553     // Paramètre du PDF
7554     $params = array(
7555     "watermark" => true,
7556     "specific" => array(
7557     "mode" => "previsualisation",
7558     ),
7559     );
7560 softime 8593 // Si la rédaction libre est activée sur l'instruction
7561     if ($this->getVal("flag_edition_integrale") == 't') {
7562     $params["specific"]["corps"] = array(
7563     "mode" => "set",
7564     "value" => $this->getVal("corps_om_htmletatex"),
7565     );
7566     $params["specific"]["titre"] = array(
7567     "mode" => "set",
7568     "value" => $this->getVal("titre_om_htmletat"),
7569     );
7570     }
7571 mbroquet 3730
7572     // Génération du PDF
7573     $result = $this->compute_pdf_output('lettretype', $this->getVal("lettretype"), $collectivite, null, $params);
7574 softime 18436 $result['filename'] = $this->determinate_name_doc_pdf();
7575 mbroquet 3730 // Affichage du PDF
7576     $this->expose_pdf_output(
7577     $result['pdf_output'],
7578     $result['filename']
7579     );
7580     }
7581     }
7582    
7583     /**
7584     * Récupère la collectivité du dossier d'instruction.
7585     *
7586 softime 7685 * @param string $dossier_instruction_id Identifiant du DI.
7587     *
7588 mbroquet 3730 * @return integer
7589     */
7590 softime 7685 function get_dossier_instruction_om_collectivite($dossier_instruction_id = null) {
7591 mbroquet 3730
7592 softime 7685 // Si l'identifiant n'est pas renseigné
7593     if ($dossier_instruction_id === null) {
7594 softime 8593 // Récupère la valeur
7595     if ($this->getVal('dossier') !== null && $this->getVal('dossier') !== '') {
7596     $dossier_instruction_id = $this->getVal('dossier');
7597     } elseif ($this->getParameter('idxformulaire') !== null
7598     && $this->getParameter('idxformulaire') !== '') {
7599     //
7600     $dossier_instruction_id = $this->getParameter('idxformulaire');
7601     } elseif ($this->f->get_submitted_get_value('idxformulaire') !== null
7602     && $this->f->get_submitted_get_value('idxformulaire') !== '') {
7603     //
7604     $dossier_instruction_id = $this->f->get_submitted_get_value('idxformulaire');
7605     }
7606 softime 7685 }
7607    
7608 mbroquet 3730 //
7609 softime 7996 $dossier_instruction = $this->f->get_inst__om_dbform(array(
7610     "obj" => "dossier_instruction",
7611     "idx" => $dossier_instruction_id,
7612     ));
7613 mbroquet 3730
7614     //
7615     return $dossier_instruction->getVal('om_collectivite');
7616     }
7617    
7618     /**
7619     * VIEW - view_bible
7620     *
7621     * Affiche la bible manuelle.
7622     *
7623     * @return void
7624     */
7625     function view_bible() {
7626     // Vérification de l'accessibilité sur l'élément
7627     $this->checkAccessibility();
7628    
7629     /**
7630     * Affichage de la structure HTML
7631     */
7632     //
7633 softime 8989 if ($this->f->isAjaxRequest()) {
7634 mbroquet 3730 //
7635     header("Content-type: text/html; charset=".HTTPCHARSET."");
7636     } else {
7637     //
7638 softime 8989 $this->f->setFlag("htmlonly");
7639     $this->f->display();
7640 mbroquet 3730 }
7641     //
7642 softime 8989 $this->f->displayStartContent();
7643 mbroquet 3730 //
7644 softime 18876 $this->f->setTitle(__("Liste des éléments de la bible en lien avec un evenement"));
7645 softime 8989 $this->f->displayTitle();
7646 mbroquet 3730
7647     /**
7648     *
7649     */
7650     //
7651 softime 8989 ($this->f->get_submitted_get_value("ev") ? $evenement = $this->f->get_submitted_get_value("ev") : $evenement = "");
7652 mbroquet 3730 $evenement = intval($evenement);
7653     //
7654 softime 8989 ($this->f->get_submitted_get_value("idx") ? $idx = $this->f->get_submitted_get_value("idx") : $idx = "");
7655 softime 5169 // Récupération du code du type de DA
7656     $code_da_type = '';
7657     if (preg_match('/[A-Za-z]{2,3}/', $idx, $matches) !== false) {
7658     $code_da_type = $matches[0];
7659     }
7660 mbroquet 3730 //
7661 softime 8989 ($this->f->get_submitted_get_value("complement") ? $complement = $this->f->get_submitted_get_value("complement") : $complement = "1");
7662 mbroquet 3730
7663     // Récupération de la collectivité du dossier
7664 softime 7996 $dossier = $this->f->get_inst__om_dbform(array(
7665     "obj" => "dossier",
7666     "idx" => $idx,
7667     ));
7668 mbroquet 3730
7669 softime 14542 $qres = $this->f->get_all_results_from_db_query(
7670     sprintf(
7671     'SELECT
7672     *,
7673     bible.libelle as bible_lib
7674     FROM
7675     %1$sbible
7676     LEFT OUTER JOIN %1$sdossier_autorisation_type
7677     ON bible.dossier_autorisation_type = dossier_autorisation_type.dossier_autorisation_type
7678     LEFT JOIN %1$som_collectivite
7679     ON bible.om_collectivite = om_collectivite.om_collectivite
7680     WHERE
7681     (evenement = %2$d
7682     OR evenement IS NULL)
7683     AND (complement = %3$d
7684     OR complement IS NULL)
7685     AND (bible.dossier_autorisation_type IS NULL
7686     OR dossier_autorisation_type.code = \'%4$s\')
7687     AND (om_collectivite.niveau = \'2\'
7688     OR bible.om_collectivite = %5$d)
7689     ORDER BY
7690     bible_lib ASC',
7691     DB_PREFIXE,
7692     intval($evenement),
7693     intval($complement),
7694     $this->f->db->escapeSimple($code_da_type),
7695     intval($dossier->getVal("om_collectivite"))
7696     ),
7697     array(
7698     'origin' => __METHOD__
7699     )
7700     );
7701 mbroquet 3730 //
7702     echo "<form method=\"post\" name=\"f3\" action=\"#\">\n";
7703     //
7704 softime 15835 if ($qres['row_count'] > 0) {
7705 mbroquet 3730 //
7706     echo "\t<table id='tab-bible' width='100%'>\n";
7707     //
7708     echo "\t\t<tr class=\"ui-tabs-nav ui-accordion ui-state-default tab-title\">";
7709 softime 18876 echo "<th>".__("Choisir")."</th>";
7710     echo "<th>".__("Libelle")."</th>";
7711 mbroquet 3730 echo "</tr>\n";
7712     //
7713     $i = 0;
7714     //
7715 softime 14542 foreach ($qres['result'] as $row) {
7716 mbroquet 3730 //
7717     echo "\t\t<tr";
7718     echo " class=\"".($i % 2 == 0 ? "odd" : "even")."\"";
7719     echo ">";
7720     //
7721     echo "<td class=\"center\"><input type=\"checkbox\" name=\"choix[]\" value=\"".$i."\" id=\"checkbox".$i."\" /></td>";
7722     // XXX utilisation de l'attribut titre pour afficher une infobulle
7723     echo "<td><span class=\"content\" title=\"".htmlentities($row['contenu'])."\" id=\"content".$i."\">".$row['bible_lib']."</span></td>";
7724     //
7725     echo "</tr>\n";
7726     //
7727     $i++;
7728     }
7729     echo "\t</table>\n";
7730     //
7731     echo "<div class=\"formControls\">\n";
7732 softime 8989 $this->f->layout->display_form_button(array(
7733 softime 18876 "value" => __("Valider"),
7734 mbroquet 3730 "onclick" => "bible_return('f2', 'complement".($complement == "1" ? "" : $complement)."_om_html'); return false;",
7735     ));
7736 softime 8989 $this->f->displayLinkJsCloseWindow();
7737 mbroquet 3730 echo "</div>\n";
7738    
7739     } else {
7740     //
7741     $message_class = "error";
7742 softime 18876 $message = __("Aucun element dans la bible pour l'evenement")." : ".$evenement;
7743 softime 8989 $this->f->displayMessage($message_class, $message);
7744 mbroquet 3730 //
7745     echo "<div class=\"formControls\">\n";
7746 softime 8989 $this->f->displayLinkJsCloseWindow();
7747 mbroquet 3730 echo "</div>\n";
7748     }
7749     //
7750     echo "</form>\n";
7751    
7752     /**
7753     * Affichage de la structure HTML
7754     */
7755     //
7756 softime 8989 $this->f->displayEndContent();
7757 mbroquet 3730 }
7758    
7759     /**
7760 softime 5169 * VIEW - view_bible_auto
7761 mbroquet 3730 *
7762 softime 5169 * Renvoie les valeurs de la bible à placer dans les compléments de l'instruction.
7763 mbroquet 3730 *
7764     * @return void
7765     */
7766     function view_bible_auto() {
7767     // Vérification de l'accessibilité sur l'élément
7768     $this->checkAccessibility();
7769     //
7770 softime 8989 $this->f->disableLog();
7771 mbroquet 3730
7772     $formatDate="AAAA-MM-JJ";
7773    
7774     // Récupération des paramètres
7775 softime 8989 $idx = $this->f->get_submitted_get_value('idx');
7776     $evenement = $this->f->get_submitted_get_value('ev');
7777 mbroquet 3730
7778     // Initialisation de la variable de retour
7779     $retour['complement_om_html'] = '';
7780     $retour['complement2_om_html'] = '';
7781     $retour['complement3_om_html'] = '';
7782     $retour['complement4_om_html'] = '';
7783 softime 14064
7784 mbroquet 3730 // Vérification d'une consultation liée à l'événement
7785 softime 14064 $instEvenement = $this->f->get_inst__om_dbform(array(
7786     "obj" => "evenement",
7787     "idx" => $evenement,
7788     ));
7789    
7790 mbroquet 3730 // Si consultation liée, récupération du retour d'avis
7791 softime 14064 if($instEvenement->getVal('consultation') == 'Oui'){
7792 softime 14542
7793     $qres = $this->f->get_all_results_from_db_query(
7794     sprintf(
7795     'SELECT
7796     date_retour,
7797     avis_consultation.libelle as avis_consultation,
7798     COALESCE(service.libelle, tiers_consulte.libelle) as service
7799     FROM
7800     %1$sconsultation
7801     LEFT JOIN %1$stiers_consulte
7802     ON consultation.tiers_consulte = tiers_consulte.tiers_consulte
7803     LEFT JOIN %1$sservice
7804     ON consultation.service = service.service
7805     LEFT JOIN %1$savis_consultation
7806     ON consultation.avis_consultation = avis_consultation.avis_consultation
7807     WHERE
7808     dossier = \'%2$s\'
7809     AND consultation.visible',
7810     DB_PREFIXE,
7811     $this->f->db->escapeSimple($idx)
7812     ),
7813     array(
7814     'origin' => __METHOD__
7815     )
7816 softime 11876 );
7817 mbroquet 3730 // Récupération des consultations
7818 softime 14542 foreach ($qres['result'] as $row) {
7819 mbroquet 3730 $correct=false;
7820     // date retour
7821     if ($row['date_retour']<>""){
7822     if ($formatDate=="AAAA-MM-JJ"){
7823     $date = explode("-", $row['date_retour']);
7824     // controle de date
7825 softime 18876 if (count($date) == 3 &&
7826 mbroquet 3730 checkdate($date[1], $date[2], $date[0])) {
7827     $date_retour_f= $date[2]."/".$date[1]."/".$date[0];
7828     $correct=true;
7829     }else{
7830     $msg= $msg."<br>La date ".$row['date_retour']." n'est pas une date.";
7831     $correct=false;
7832     }
7833     }
7834     }
7835     //
7836     $temp="Vu l'avis ".$row['avis_consultation']." du service ".$row['service'];
7837     if($correct == true){
7838     $temp=$temp." du ".$date_retour_f;
7839     }
7840     // Concaténation des retours d'avis de consultation
7841 softime 7067 $retour['complement_om_html'] .= $temp . "<br/><br/>";
7842 mbroquet 3730 } // while
7843    
7844     } // consultation
7845     // Récupération des bibles automatiques pour le champ complement_om_html
7846 softime 8989 $retour['complement_om_html'] .= $this->getBible($evenement, $idx, '1');
7847 mbroquet 3730 // Récupération des bibles automatiques pour le champ complement2_om_html
7848 softime 8989 $retour['complement2_om_html'] .= $this->getBible($evenement, $idx, '2');
7849 mbroquet 3730 // Récupération des bibles automatiques pour le champ complement3_om_html
7850 softime 8989 $retour['complement3_om_html'] .= $this->getBible($evenement, $idx, '3');
7851 mbroquet 3730 // Récupération des bibles automatiques pour le champ complement4_om_html
7852 softime 8989 $retour['complement4_om_html'] .= $this->getBible($evenement, $idx, '4');
7853 mbroquet 3730
7854    
7855    
7856     echo json_encode($retour);
7857     }
7858    
7859     /**
7860 softime 7521 * VIEW - view_pdf_temp
7861     *
7862     * @return void
7863     */
7864     function view_pdf_temp() {
7865     $this->checkAccessibility();
7866 softime 8593 // Utilisation de $_POST pour ne pas que les textes soient altérés.
7867 softime 7521 $this->f->set_submitted_value();
7868 softime 8593 $merge_fields = array();
7869     //
7870     if (array_key_exists('c1', $_POST) === true) {
7871 softime 11876 $merge_fields['[complement_instruction]'] = $_POST['c1'];
7872     $merge_fields['[complement1_instruction]'] = $_POST['c1'];
7873 softime 8593 }
7874     if (array_key_exists('c2', $_POST) === true) {
7875 softime 11876 $merge_fields['[complement2_instruction]'] = $_POST['c2'];
7876 softime 8593 }
7877     if (array_key_exists('c3', $_POST) === true) {
7878 softime 11876 $merge_fields['[complement3_instruction]'] = $_POST['c3'];
7879 softime 8593 }
7880     if (array_key_exists('c4', $_POST) === true) {
7881 softime 11876 $merge_fields['[complement4_instruction]'] = $_POST['c4'];
7882 softime 8593 }
7883 softime 7521 $params = array(
7884     "watermark" => true,
7885     "specific" => array(
7886     "merge_fields" => $merge_fields,
7887     ),
7888     );
7889 softime 8593 //
7890     if (array_key_exists('corps', $_POST) === true) {
7891     $params["specific"]["corps"] = array(
7892     "mode" => "set",
7893 softime 11876 "value" => $_POST['corps'],
7894 softime 8593 );
7895     }
7896     if (array_key_exists('titre', $_POST) === true) {
7897     $params["specific"]["titre"] = array(
7898     "mode" => "set",
7899 softime 11876 "value" => $_POST['titre'],
7900 softime 8593 );
7901     }
7902 softime 7521 $dossier_instruction_om_collectivite = $this->get_dossier_instruction_om_collectivite();
7903     $collectivite = $this->f->getCollectivite($dossier_instruction_om_collectivite);
7904     $result = $this->compute_pdf_output('lettretype', $this->getVal('lettretype'), $collectivite, null, $params);
7905     $retour = array(
7906     'base' => base64_encode($result['pdf_output']),
7907     );
7908     echo json_encode($retour);
7909     }
7910    
7911     /**
7912     * Dans le contexte de prévisualisation des éditions, génère le rendu du
7913     * PDF sans prise en compte de la valeur des compléments et le retourne en
7914     * base 64.
7915     *
7916     * @return string Rendu PDF converti en base 64.
7917     */
7918     function init_pdf_temp() {
7919     $params = array(
7920     "watermark" => true,
7921     );
7922 softime 8593 // Si la rédaction libre est activée sur l'instruction
7923     if ($this->getVal("flag_edition_integrale") == 't') {
7924     $params["specific"]["corps"] = array(
7925     "mode" => "set",
7926     "value" => $this->getVal("corps_om_htmletatex"),
7927     );
7928     $params["specific"]["titre"] = array(
7929     "mode" => "set",
7930     "value" => $this->getVal("titre_om_htmletat"),
7931     );
7932     }
7933 softime 7521 $dossier_instruction_om_collectivite = $this->get_dossier_instruction_om_collectivite();
7934     $collectivite = $this->f->getCollectivite($dossier_instruction_om_collectivite);
7935     $result = $this->compute_pdf_output('lettretype', $this->getVal('lettretype'), $collectivite, null, $params);
7936    
7937     return base64_encode($result['pdf_output']);
7938     }
7939    
7940     /**
7941 mbroquet 3730 * Récupération des éléments de bible.
7942     *
7943     * @param integer $event id de l'événement
7944     * @param string $idx id du dossier
7945     * @param integer $compnb numéro du champ complement
7946 softime 17036 * @param string $type types possibles : automatique ou precharge
7947 mbroquet 3730 *
7948     * @return string Chaîne de texte à insérer dans le champ complement
7949     */
7950 softime 17036 function getBible($event, $idx, $compnb, $type = 'automatique') {
7951 mbroquet 3730 // Récupération de la collectivité du dossier
7952 softime 7996 $dossier = $this->f->get_inst__om_dbform(array(
7953     "obj" => "dossier",
7954     "idx" => $idx,
7955     ));
7956 softime 5169 // Récupération du code du type de DA
7957     $code_da_type = '';
7958     if (preg_match('/[A-Za-z]{2,3}/', $idx, $matches) !== false) {
7959     $code_da_type = $matches[0];
7960     }
7961 mbroquet 3730
7962 softime 17036 // Prépare le filtre de la requête selon le type de remplissage voulu
7963     $sql_filter_type = '';
7964     if ($type === 'automatique') {
7965     $sql_filter_type = "AND automatique = 'Oui'";
7966     } elseif ($type === 'precharge') {
7967     $sql_filter_type = "AND precharge IS TRUE";
7968     }
7969    
7970 softime 14542 $qres = $this->f->get_all_results_from_db_query(
7971     sprintf(
7972     'SELECT
7973     *
7974     FROM
7975     %1$sbible
7976     LEFT OUTER JOIN %1$sdossier_autorisation_type
7977     ON bible.dossier_autorisation_type =
7978     dossier_autorisation_type.dossier_autorisation_type
7979     LEFT JOIN %1$som_collectivite
7980     ON bible.om_collectivite = om_collectivite.om_collectivite
7981     WHERE
7982     (evenement = %2$d
7983     OR evenement IS NULL)
7984     AND (complement = %3$d
7985     OR complement IS NULL)
7986     AND (dossier_autorisation_type.code = \'%4$s\'
7987     OR bible.dossier_autorisation_type IS NULL)
7988     AND (om_collectivite.niveau = \'2\'
7989 softime 17036 OR bible.om_collectivite = %5$d)
7990     %6$s',
7991 softime 14542 DB_PREFIXE,
7992     intval($event),
7993     intval($compnb),
7994     $this->f->db->escapeSimple($code_da_type),
7995 softime 17036 intval($dossier->getVal("om_collectivite")),
7996     $sql_filter_type
7997 softime 14542 ),
7998     array(
7999     "origin" => __METHOD__
8000     )
8001     );
8002 mbroquet 3730 $temp = "";
8003 softime 14542 foreach ($qres['result'] as $row) {
8004 mbroquet 3730 // Remplacement des retours à la ligne par des br
8005     $temp .= preg_replace(
8006     '#(\\\r|\\\r\\\n|\\\n)#', '<br/>', $row['contenu']
8007     );
8008 softime 7521 // Ajout d'un saut de ligne entre chaque bible.
8009     $temp .= '<br/>';
8010 mbroquet 3730 } // fin while
8011     return $temp;
8012     }
8013    
8014     /**
8015     * VIEW - view_suivi_bordereaux.
8016     *
8017 nmeucci 4317 * Formulaire de choix du bordereau de suivi, permettant de générer les 4 bordereaux.
8018     * Si l'utilisateur est d'une collectivité de niveau 2 il a le choix de la
8019     * collectivité des dossiers affichés.
8020 mbroquet 3730 *
8021     * @return void
8022     */
8023     function view_suivi_bordereaux() {
8024     // Vérification de l'accessibilité sur l'élément
8025     $this->checkAccessibility();
8026    
8027     /**
8028     * Validation du formulaire
8029     */
8030     // Si le formulaire a été validé
8031 softime 8989 if ($this->f->get_submitted_post_value("validation") !== null) {
8032 mbroquet 3730 // Si un bordereau à été sélectionné
8033 softime 8989 if ($this->f->get_submitted_post_value("bordereau") !== null && $this->f->get_submitted_post_value("bordereau") == "" ) {
8034 mbroquet 3730 // Si aucun bordereau n'a été sélectionné
8035     $message_class = "error";
8036 softime 18876 $message = __("Veuillez selectionner un bordereau.");
8037 mbroquet 3730 }
8038     // Sinon si les dates ne sont pas valide
8039 softime 8989 elseif (($this->f->get_submitted_post_value("date_bordereau_debut") !== null
8040     && $this->f->get_submitted_post_value("date_bordereau_debut") == "")
8041     || ($this->f->get_submitted_post_value("date_bordereau_fin") !== null
8042     && $this->f->get_submitted_post_value("date_bordereau_fin") == "")) {
8043 mbroquet 3730 // Si aucune date n'a été saisie
8044     $message_class = "error";
8045 softime 18876 $message = __("Veuillez saisir une date valide.");
8046 mbroquet 3730 }
8047 softime 7366 // Sinon si les dates ne sont pas valides
8048 softime 8989 elseif ($this->f->get_submitted_post_value("bordereau") === "bordereau_avis_maire_prefet"
8049     && $this->f->getParameter("id_evenement_bordereau_avis_maire_prefet") == null) {
8050 softime 7366 // Si aucune date n'a été saisie
8051     $message_class = "error";
8052 softime 18876 $message = __("Erreur de parametrage. Contactez votre administrateur.");
8053 softime 7366 }
8054 mbroquet 3730 // Affiche le message de validation
8055     else {
8056     // On récupère le libellé du bordereau pour l'afficher à l'utilisateur
8057 softime 14064 $etat = $this->f->get_inst__om_dbform(array(
8058     "obj" => "om_etat",
8059     "idx" => $this->f->get_submitted_post_value("bordereau")
8060     ));
8061     $qres = $this->f->get_one_result_from_db_query(
8062     sprintf(
8063     'SELECT
8064     om_etat.libelle
8065     FROM
8066     %som_etat
8067     WHERE
8068     om_etat.id = \'%s\'',
8069     DB_PREFIXE,
8070     $this->f->db->escapeSimple($this->f->get_submitted_post_value("bordereau"))
8071     ),
8072     array(
8073     "origin" => __METHOD__,
8074     )
8075     );
8076    
8077 mbroquet 3730 //
8078     $message_class = "valid";
8079 softime 18876 $message = __("Cliquez sur le lien ci-dessous pour telecharger votre bordereau");
8080 mbroquet 3730 $message .= " : <br/><br/>";
8081     $message .= "<a class='om-prev-icon pdf-16'";
8082 softime 18876 $message .= " title=\"".__("Bordereau")."\"";
8083 softime 7996 $message .= "href='".OM_ROUTE_FORM."&obj=instruction";
8084 nmeucci 4317 $message .= "&action=220";
8085     $message .= "&idx=0";
8086 softime 8989 $message .= "&type_bordereau=".$this->f->get_submitted_post_value("bordereau");
8087     $message .= "&date_bordereau_debut=".$this->f->get_submitted_post_value("date_bordereau_debut");
8088     $message .= "&date_bordereau_fin=".$this->f->get_submitted_post_value("date_bordereau_fin");
8089 mbroquet 3730 // Si l'utilisateur est MULTI alors on ajoute le paramètre collectivite
8090 softime 8989 if ($this->f->get_submitted_post_value("om_collectivite") !== null) {
8091     $message .= "&collectivite=".$this->f->get_submitted_post_value("om_collectivite");
8092 mbroquet 3730 }
8093     $message .= "'"." target='_blank'>";
8094 softime 18876 $message .= $qres['result']." ".__("du")." ".$this->f->get_submitted_post_value("date_bordereau_debut")
8095     ." ".__("au")." ".$this->f->get_submitted_post_value("date_bordereau_fin");
8096 mbroquet 3730 $message .= "</a>";
8097     }
8098     }
8099    
8100     /**
8101     * Affichage des messages et du formulaire
8102     */
8103     // Affichage du message de validation ou d'erreur
8104     if (isset($message) && isset($message_class) && $message != "") {
8105 softime 8989 $this->f->displayMessage($message_class, $message);
8106 mbroquet 3730 }
8107     // Ouverture du formulaire
8108     printf("\t<form");
8109     printf(" method=\"post\"");
8110     printf(" id=\"suivi_bordereaux_form\"");
8111     printf(" action=\"\"");
8112     printf(">\n");
8113     // Paramétrage des champs du formulaire
8114     $champs = array("date_bordereau_debut", "date_bordereau_fin", "bordereau");
8115 softime 8989 // Si l'utilisateur est d'une collectivité de niveau 2 on affiche un select
8116 mbroquet 3730 // collectivité dans le formulaire
8117 softime 8989 if ($_SESSION["niveau"] == 2) {
8118 mbroquet 3730 array_push($champs, "om_collectivite");
8119     }
8120     // Création d'un nouvel objet de type formulaire
8121 softime 7996 $form = $this->f->get_inst__om_formulaire(array(
8122     "validation" => 0,
8123     "maj" => 0,
8124     "champs" => $champs,
8125     ));
8126 mbroquet 3730 // Paramétrage du champ date_bordereau_debut
8127 softime 18876 $form->setLib("date_bordereau_debut", __("date_bordereau_debut"));
8128 mbroquet 3730 $form->setType("date_bordereau_debut", "date");
8129     $form->setTaille("date_bordereau_debut", 12);
8130     $form->setMax("date_bordereau_debut", 12);
8131     $form->setRequired("date_bordereau_debut");
8132     $form->setOnchange("date_bordereau_debut", "fdate(this)");
8133     $form->setVal("date_bordereau_debut", date("d/m/Y"));
8134     // Paramétrage du champ date_bordereau_fin
8135 softime 18876 $form->setLib("date_bordereau_fin", __("date_bordereau_fin"));
8136 mbroquet 3730 $form->setType("date_bordereau_fin", "date");
8137     $form->setTaille("date_bordereau_fin", 12);
8138     $form->setMax("date_bordereau_fin", 12);
8139     $form->setRequired("date_bordereau_fin");
8140     $form->setOnchange("date_bordereau_fin", "fdate(this)");
8141     $form->setVal("date_bordereau_fin", date("d/m/Y"));
8142     // Paramétrage du champ bordereau
8143 softime 18876 $form->setLib("bordereau", __("bordereau"));
8144 mbroquet 3730 $form->setType("bordereau", "select");
8145     $form->setRequired("bordereau");
8146     // Valeurs des champs
8147 softime 8989 if ($this->f->get_submitted_post_value("validation") !== null) {
8148     $form->setVal("date_bordereau_debut", $this->f->get_submitted_post_value("date_bordereau_debut"));
8149     $form->setVal("date_bordereau_fin", $this->f->get_submitted_post_value("date_bordereau_fin"));
8150     $form->setVal("bordereau", $this->f->get_submitted_post_value("bordereau"));
8151     $form->setVal("om_collectivite", $this->f->get_submitted_post_value("om_collectivite"));
8152 mbroquet 3730 }
8153     // Données du select - On récupère ici la liste de tous les états disponibles
8154     // dans la table om_etat qui ont un id qui commence par la cahine de caractères
8155     // 'bordereau_'
8156 softime 14542 $qres = $this->f->get_all_results_from_db_query(
8157     sprintf(
8158     'SELECT
8159     om_etat.id,
8160     om_etat.libelle
8161     FROM
8162     %1$som_etat
8163     WHERE
8164     om_etat.id LIKE \'bordereau_%%\'
8165     ORDER BY
8166     om_etat.id',
8167     DB_PREFIXE
8168     ),
8169     array(
8170     "origin" => __METHOD__
8171     )
8172     );
8173 mbroquet 3730 // Données du select
8174     $contenu = array(
8175     0 => array("", ),
8176 softime 18876 1 => array(__("choisir bordereau")),
8177 mbroquet 3730 );
8178 softime 14542 foreach ($qres['result'] as $row) {
8179 mbroquet 3730 $contenu[0][] = $row['id'];
8180     $contenu[1][] = $row['libelle'];
8181     }
8182     $form->setSelect("bordereau", $contenu);
8183 softime 8989 //
8184     if ($_SESSION["niveau"] == 2) {
8185 softime 18876 $form->setLib("om_collectivite", __("collectivite"));
8186 softime 8989 $form->setType("om_collectivite", "select");
8187 mbroquet 3730
8188 softime 8989 // Données du select - On récupère ici la liste de tous toutes les collectivités
8189     // de niveau 1
8190 softime 14542 $qres = $this->f->get_all_results_from_db_query(
8191     sprintf(
8192     'SELECT
8193     om_collectivite,
8194     libelle
8195     FROM
8196     %1$som_collectivite
8197     WHERE
8198     niveau = \'1\'
8199     ORDER BY
8200     libelle',
8201     DB_PREFIXE
8202     ),
8203     array(
8204     "origin" => __METHOD__
8205     )
8206     );
8207 softime 8989 // La valeur par défaut du select est Toutes
8208     $list_collectivites = array(
8209     0 => array("", ),
8210 softime 18876 1 => array(__("toutes"))
8211 softime 8989 );
8212 mbroquet 3730
8213 softime 8989 $id_colls = "";
8214     // On stocke dans $id_colls l'id de toutes les collectivités de niveau 1 séparées
8215     // par des virgules, pour un traitement plus facile dans la requête de sous-état
8216 softime 14542 foreach ($qres['result'] as $row) {
8217 softime 8989 if ($id_colls != "") {
8218     $id_colls .= ",";
8219     }
8220     $id_colls .= $row['om_collectivite'];
8221     $list_collectivites[0][] = $row['om_collectivite'];
8222     $list_collectivites[1][] = $row['libelle'];
8223 mbroquet 3730 }
8224 softime 8989 // On affecte la liste d'identifiants à l'option Toutes
8225     $list_collectivites[0][0] = $id_colls ;
8226     $form->setSelect("om_collectivite", $list_collectivites);
8227 mbroquet 3730 }
8228     // Affichage du formulaire
8229     $form->entete();
8230     $form->afficher($champs, 0, false, false);
8231     $form->enpied();
8232     // Affichage du bouton
8233     printf("\t<div class=\"formControls\">\n");
8234 softime 18876 $this->f->layout->display_form_button(array("value" => __("Valider"), "name" => "validation"));
8235 mbroquet 3730 printf("\t</div>\n");
8236     // Fermeture du formulaire
8237     printf("\t</form>\n");
8238     }
8239    
8240 nmeucci 4317
8241     /**
8242     * VIEW - view_generate_suivi_bordereaux.
8243     *
8244     * Génère et affiche les bordereaux de suivi.
8245     *
8246     * @return [void]
8247     */
8248     function view_generate_suivi_bordereaux() {
8249     // Vérification de l'accessibilité sur l'élément
8250     $this->checkAccessibility();
8251     // Récupération du type de bordereau
8252     $bordereau = $this->f->get_submitted_get_value('type_bordereau');
8253     // Génération du PDF
8254     $result = $this->compute_pdf_output('etat', $bordereau, null, $this->getVal($this->clePrimaire));
8255     // Affichage du PDF
8256     $this->expose_pdf_output(
8257     $result['pdf_output'],
8258     $result['filename']
8259     );
8260     }
8261    
8262    
8263 mbroquet 3730 /**
8264     * VIEW - view_suivi_envoi_lettre_rar.
8265     *
8266 softime 8989 * Vue pour imprimer les AR.
8267 mbroquet 3730 *
8268     * @return void
8269     */
8270     function view_suivi_envoi_lettre_rar() {
8271     // Vérification de l'accessibilité sur l'élément
8272     $this->checkAccessibility();
8273    
8274     //
8275 softime 8989 if ($this->f->get_submitted_post_value("date") !== null) {
8276     $date = $this->f->get_submitted_post_value("date");
8277 mbroquet 3730 } else {
8278     $date = "";
8279     }
8280     //
8281 softime 8989 if ($this->f->get_submitted_post_value("liste_code_barres_instruction") !== null) {
8282     $liste_code_barres_instruction = $this->f->get_submitted_post_value("liste_code_barres_instruction");
8283 mbroquet 3730 } else {
8284     $liste_code_barres_instruction = "";
8285     }
8286    
8287     // Compteur du nombre de page générées
8288     $nbLettres = 0;
8289     // Liste d'id des instructions
8290     $id4Gen = array();
8291     //
8292     $error = "";
8293    
8294 softime 5504 // Initialisation du tableau qui va contenir les DI pour lister les liens
8295     $dossierTab = array();
8296     // On vérifie que l'utilisateur ait les droits pour afficher des consultations
8297     $isAccredited = $this->f->isAccredited(array("dossier_instruction","dossier_instruction_consulter"), "OR");
8298     $hasHidden = true;
8299     // S'il ne peut pas les consulter il aura des dossiers caché
8300     if ($isAccredited === true) {
8301     $hasHidden = false;
8302     }
8303    
8304 mbroquet 3730 /**
8305     * Validation du formulaire
8306     */
8307     // Si le formulaire a été validé
8308 softime 8989 if ($this->f->get_submitted_post_value('validation') !== null) {
8309 mbroquet 3730 //
8310     if (empty($date) || empty($liste_code_barres_instruction)) {
8311     //
8312     $message_class = "error";
8313 softime 18876 $message = __("Tous les champs doivent etre remplis.");
8314 mbroquet 3730 } else {
8315     // Création d'un tableau d'instruction
8316 softime 8989 $liste = explode("\r\n", $this->f->get_submitted_post_value("liste_code_barres_instruction"));
8317 mbroquet 3730 //
8318     foreach ($liste as $code_barres) {
8319     // On enlève les éventuels espaces saisis
8320     $code_barres = trim($code_barres);
8321     // Vérification de l'existence de l'instruction
8322     if ($code_barres != "") {
8323     // Si la valeur transmise est numérique
8324     if (is_numeric($code_barres)) {
8325     //
8326 softime 6565 $sql = "SELECT count(*)
8327     FROM ".DB_PREFIXE."instruction
8328     INNER JOIN ".DB_PREFIXE."dossier
8329     ON dossier.dossier=instruction.dossier
8330     INNER JOIN ".DB_PREFIXE."dossier_instruction_type
8331     ON dossier.dossier_instruction_type = dossier_instruction_type.dossier_instruction_type
8332     INNER JOIN ".DB_PREFIXE."dossier_autorisation_type_detaille
8333     ON dossier_instruction_type.dossier_autorisation_type_detaille = dossier_autorisation_type_detaille.dossier_autorisation_type_detaille
8334     INNER JOIN ".DB_PREFIXE."dossier_autorisation_type
8335     ON dossier_autorisation_type_detaille.dossier_autorisation_type = dossier_autorisation_type.dossier_autorisation_type
8336     INNER JOIN ".DB_PREFIXE."groupe
8337     ON dossier_autorisation_type.groupe = groupe.groupe
8338     WHERE code_barres='".$this->f->db->escapesimple($code_barres)."'";
8339 softime 7067
8340     // Ajout d'un filtre sur les groupes auxquels l'utilisateur a accès
8341     $group_clause = array();
8342     foreach ($_SESSION["groupe"] as $key => $value) {
8343     $group_clause[$key] = "(groupe.code = '".$key."'";
8344     if($value["confidentiel"] !== true) {
8345     $group_clause[$key] .= " AND dossier_autorisation_type.confidentiel IS NOT TRUE";
8346     }
8347     $group_clause[$key] .= ")";
8348     }
8349     $conditions = implode(" OR ", $group_clause);
8350     $sql .= " AND (" . $conditions . ")";
8351    
8352 softime 14064 $qres = $this->f->get_one_result_from_db_query(
8353     $sql,
8354     array(
8355     "origin" => __METHOD__,
8356     )
8357     );
8358    
8359     if ($qres['result'] == "1") {
8360 mbroquet 3730 // Récupération de la date d'envoi de l'instruction bippé
8361 softime 14542 $qres = $this->f->get_all_results_from_db_query(
8362     sprintf(
8363     'SELECT
8364     to_char(date_envoi_rar, \'DD/MM/YYYY\') as date_envoi_rar,
8365     instruction
8366     FROM
8367     %1$sinstruction
8368     WHERE
8369     code_barres = \'%2$s\'',
8370     DB_PREFIXE,
8371     $this->f->db->escapeSimple($code_barres)
8372     ),
8373     array(
8374     'origin' => __METHOD__
8375     )
8376     );
8377     $row = array_shift($qres['result']);
8378 mbroquet 3730 // Si pas de date ou correspond à la date du formulaire on
8379     // effectue le traitement
8380     if ($row["date_envoi_rar"] == "" || $row["date_envoi_rar"] == $date) {
8381 softime 7996 $instr = $this->f->get_inst__om_dbform(array(
8382     "obj" => "instruction",
8383     "idx" => $row['instruction'],
8384     ));
8385 mbroquet 3730 $valF = array();
8386     foreach($instr->champs as $id => $champ) {
8387     $valF[$champ] = $instr->val[$id];
8388     }
8389 softime 5504
8390     # Si on peut consulter les dossiers et que le dossier n'existe pas déjà dans la liste
8391     if ($isAccredited === true
8392     && array_key_exists($instr->getVal("dossier"), $dossierTab) === false) {
8393 softime 7996 $dossier = $this->f->get_inst__om_dbform(array(
8394     "obj" => "dossier",
8395     "idx" => $instr->getVal("dossier"),
8396     ));
8397 softime 5504 if ($dossier->is_user_from_allowed_collectivite()){
8398     $dossierTab[$instr->getVal("dossier")] = $dossier;
8399     } else {
8400     $hasHidden = true;
8401     }
8402     }
8403    
8404 mbroquet 3730 $valF['date_evenement']=
8405     $instr->dateDBToForm($valF['date_evenement']);
8406     $valF['archive_date_complet']=
8407     $instr->dateDBToForm($valF['archive_date_complet']);
8408     $valF['archive_date_rejet']=
8409     $instr->dateDBToForm($valF['archive_date_rejet']);
8410     $valF['archive_date_limite']=
8411     $instr->dateDBToForm($valF['archive_date_limite']);
8412     $valF['archive_date_notification_delai']=
8413     $instr->dateDBToForm($valF['archive_date_notification_delai']);
8414     $valF['archive_date_decision']=
8415     $instr->dateDBToForm($valF['archive_date_decision']);
8416     $valF['archive_date_validite']=
8417     $instr->dateDBToForm($valF['archive_date_validite']);
8418     $valF['archive_date_achevement']=
8419     $instr->dateDBToForm($valF['archive_date_achevement']);
8420     $valF['archive_date_chantier']=
8421     $instr->dateDBToForm($valF['archive_date_chantier']);
8422     $valF['archive_date_conformite']=
8423     $instr->dateDBToForm($valF['archive_date_conformite']);
8424     $valF['archive_date_dernier_depot']=
8425     $instr->dateDBToForm($valF['archive_date_dernier_depot']);
8426     $valF['archive_date_limite_incompletude']=
8427     $instr->dateDBToForm($valF['archive_date_limite_incompletude']);
8428     $valF['date_finalisation_courrier']=
8429     $instr->dateDBToForm($valF['date_finalisation_courrier']);
8430     $valF['date_envoi_signature']=
8431     $instr->dateDBToForm($valF['date_envoi_signature']);
8432     $valF['date_retour_signature']=
8433     $instr->dateDBToForm($valF['date_retour_signature']);
8434     $valF['date_envoi_rar']=
8435     $instr->dateDBToForm($valF['date_envoi_rar']);
8436     $valF['date_retour_rar']=
8437     $instr->dateDBToForm($valF['date_retour_rar']);
8438     $valF['date_envoi_controle_legalite']=
8439     $instr->dateDBToForm($valF['date_envoi_controle_legalite']);
8440     $valF['date_retour_controle_legalite']=
8441     $instr->dateDBToForm($valF['date_retour_controle_legalite']);
8442     $valF['date_envoi_rar'] = $date;
8443    
8444     // Vérification de la finalisation du document
8445     // correspondant au code barres
8446     if($instr->getVal("om_final_instruction") === 't') {
8447     $instr->setParameter('maj', 1);
8448 nmeucci 3971 $instr->class_actions[1]["identifier"] =
8449     "envoi lettre RAR (depuis le menu suivi des pièces)";
8450 softime 8989 if ($instr->modifier($valF) == true) {
8451 mbroquet 3730 $id4Gen[] = $code_barres;
8452     $nbLettres ++;
8453     } else {
8454     //
8455     if ($error != "") {
8456     $error .= "<br/>";
8457     }
8458 softime 18876 $error .= sprintf(__("Une erreur s'est produite lors de la modification de l'instruction %s."),
8459 mbroquet 3730 $code_barres);
8460     $error .= " ";
8461 softime 18876 $error .= __("Veuillez contacter votre administrateur.");
8462 mbroquet 3730 }
8463     } else {
8464     //
8465     if ($error != "") {
8466     $error .= "<br/>";
8467     }
8468 softime 18876 $error .= sprintf(__("Le document correspondant au
8469 mbroquet 3730 code barres %s n'est pas finalise,
8470     le bordereau ne sera pas genere."),
8471     $code_barres);
8472     }
8473    
8474     } else {
8475     //
8476     if ($error != "") {
8477     $error .= "<br/>";
8478     }
8479 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.");
8480 mbroquet 3730 }
8481     } else {
8482     //
8483     if ($error != "") {
8484     $error .= "<br/>";
8485     }
8486 softime 18876 $error .= __("Le numero")." ".$code_barres." ".__("ne correspond a aucun code barres d'instruction.");
8487 mbroquet 3730 }
8488     } else {
8489     //
8490     if ($error != "") {
8491     $error .= "<br/>";
8492     }
8493 softime 18876 $error .= __("Le code barres d'instruction")." ".$code_barres." ".__("n'est pas valide.");
8494 mbroquet 3730 }
8495     }
8496     }
8497     }
8498     }
8499    
8500     /**
8501     * Affichage des messages et du formulaire
8502     */
8503     // Affichage du message de validation ou d'erreur
8504     if (isset($message) && isset($message_class) && $message != "") {
8505 softime 8989 $this->f->displayMessage($message_class, $message);
8506 mbroquet 3730 }
8507     // Affichage du message d'erreur
8508     if(!empty($error)) {
8509 softime 8989 $this->f->displayMessage("error", $error);
8510 mbroquet 3730 }
8511     // Affichage du message de validation de la saisie
8512     if ($nbLettres > 0) {
8513     //
8514 softime 5504 echo "\n<div class=\"message ui-widget ui-corner-all ui-state-highlight ui-state-valid\" >";
8515     echo "\n<p>";
8516     echo "\n<span class=\"ui-icon ui-icon-info\"></span>";
8517     echo "\n<span class=\"text\">";
8518 softime 18876 echo __("Cliquez sur le lien ci-dessous pour telecharger votre document");
8519 softime 5504 echo " : \n<br/><br/>";
8520     echo "\n<a class='om-prev-icon pdf-16'";
8521 softime 18876 echo "\n title=\"".__("imprimer les AR")."\"";
8522 softime 7996 echo "\n href=\"".OM_ROUTE_FORM."&obj=instruction&action=180&idx=0&liste=".implode(",",$id4Gen)."\"";
8523 softime 5504 echo "\n target='_blank'>";
8524 softime 18876 echo __("Telecharger le document pour")." ".$nbLettres." ".__("AR");
8525 softime 5504 echo "\n</a>";
8526     echo "\n</span>";
8527     echo "\n</p>";
8528     echo "\n<br/>\n";
8529     if ($isAccredited === true) {
8530     echo '<fieldset id="fieldset-form-rar-lien_di" class="cadre ui-corner-all startClosed" style="background-color: inherite;">';
8531     echo "\n<legend class=\"ui-corner-all ui-widget-content ui-state-active\" style=\"background-color: transparent; color: inherit;\">\n";
8532 softime 18876 echo __('Dossiers concernés par ce traitement');
8533 softime 5504 echo "\n</legend>";
8534     echo "\n<div class=\"fieldsetContent\" style=\"display: none;background-color: inherite\">";
8535    
8536     if ($hasHidden === true) {
8537     echo "\n<br/>";
8538     echo "\n<p>";
8539     echo "\n<span class='text'>";
8540 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.");
8541 softime 5504 echo "</span>";
8542     echo "\n</p>";
8543     echo "\n<br/>";
8544     }
8545     foreach ($dossierTab as $dossier) {
8546 softime 7067
8547     $inst_da = $this->get_inst_common("dossier_autorisation", $dossier->getVal('dossier_autorisation'));
8548     $inst_datd = $this->get_inst_common("dossier_autorisation_type_detaille", $inst_da->getVal('dossier_autorisation_type_detaille'));
8549     $code_datd = $inst_datd->getVal('code');
8550    
8551     $obj = "dossier_instruction";
8552 softime 18876 if ($code_datd === 'REC' || $code_datd === 'REG') {
8553 softime 7067 $obj = "dossier_contentieux_tous_recours";
8554     }
8555     if ($code_datd === 'IN') {
8556     $obj = "dossier_contentieux_toutes_infractions";
8557     }
8558    
8559 softime 5504 echo "\n<div class=\"bloc group\">";
8560     echo "\n<div class=\"field field-type-text\">";
8561    
8562     echo "\n<p>";
8563     echo "\n<span class='text'>";
8564 softime 18876 echo "\n<a class=\"om-icon om-icon-16 consult-16\" title=\"" . __('Consulter') . "\"";
8565 softime 7996 echo "\n href=\"".OM_ROUTE_FORM."&obj=dossier_instruction&action=3&idx=";
8566 softime 5504 echo $dossier->getVal("dossier");
8567     echo "\">";
8568     echo "\n</a>";
8569    
8570 softime 18876 echo "\n<a title=\"".__("Consulter")."\" style=\"vertical-align:middle;\"";
8571 softime 7996 echo " href=\"".OM_ROUTE_FORM."&obj=";
8572 softime 7067 echo $obj;
8573     echo "&action=3&idx=";
8574 softime 5504 echo $dossier->getVal("dossier");
8575     echo "\">";
8576     echo $dossier->getVal("dossier_libelle");
8577     echo "\n</a>";
8578     echo "\n</span>";
8579     echo "\n</p>";
8580    
8581     echo "\n</div>";
8582     echo "\n</div>";
8583     }
8584     echo "\n</div>";
8585     echo "\n</fieldset>";
8586     }
8587     echo "\n</div>";
8588     echo "\n</div>";
8589 mbroquet 3730 }
8590     // Ouverture du formulaire
8591     echo "\t<form";
8592     echo " method=\"post\"";
8593     echo " id=\"suivi_envoi_lettre_rar_form\"";
8594     echo " action=\"\"";
8595     echo ">\n";
8596     // Paramétrage des champs du formulaire
8597     $champs = array("date", "liste_code_barres_instruction");
8598     // Création d'un nouvel objet de type formulaire
8599 softime 7996 $form = $this->f->get_inst__om_formulaire(array(
8600     "validation" => 0,
8601     "maj" => 0,
8602     "champs" => $champs,
8603     ));
8604 mbroquet 3730 // Paramétrage du champ date du formulaire
8605 softime 18876 $form->setLib("date", __("Date")."* :");
8606 mbroquet 3730 $form->setType("date", "date");
8607     $form->setOnchange("date", "fdate(this)");
8608     $form->setVal("date", ($date == "" ? date("d/m/Y") : $date));
8609     $form->setTaille("date", 10);
8610     $form->setMax("date", 10);
8611     // Paramétrage du champ liste_code_barres_instruction du formulaire
8612 softime 18876 $form->setLib("liste_code_barres_instruction", __("Liste des codes barres d'instructions scannes")."* :");
8613 mbroquet 3730 $form->setType("liste_code_barres_instruction", "textarea");
8614     $form->setVal("liste_code_barres_instruction", $liste_code_barres_instruction);
8615     $form->setTaille("liste_code_barres_instruction", 20);
8616     $form->setMax("liste_code_barres_instruction", 20);
8617     // Affichage du formulaire
8618     $form->entete();
8619     $form->afficher($champs, 0, false, false);
8620     $form->enpied();
8621     // Affichage du bouton
8622     echo "\t<div class=\"formControls\">\n";
8623 softime 18876 $this->f->layout->display_form_button(array("value" => __("Valider"), "name" => "validation"));
8624 mbroquet 3730 echo "\t</div>\n";
8625     // Fermeture du formulaire
8626     echo "\t</form>\n";
8627     }
8628    
8629     /**
8630     * VIEW - view_suivi_mise_a_jour_des_dates.
8631     *
8632     * Vu pour mettre à jour les dates de suivi de l'instruction.
8633     *
8634     * @return void
8635     */
8636     function view_suivi_mise_a_jour_des_dates() {
8637     // Vérification de l'accessibilité sur l'élément
8638     $this->checkAccessibility();
8639    
8640     // Récupération des valeur passées en POST ou GET
8641 softime 8989 if($this->f->get_submitted_post_value("type_mise_a_jour") !== null) {
8642     $type_mise_a_jour = $this->f->get_submitted_post_value("type_mise_a_jour");
8643     } elseif($this->f->get_submitted_get_value('type_mise_a_jour') !== null) {
8644     $type_mise_a_jour = $this->f->get_submitted_get_value('type_mise_a_jour');
8645 mbroquet 3730 } else {
8646     $type_mise_a_jour = "";
8647     }
8648 softime 8989 if($this->f->get_submitted_post_value('date') !== null) {
8649     $date = $this->f->get_submitted_post_value('date');
8650     } elseif($this->f->get_submitted_get_value('date') !== null) {
8651     $date = $this->f->get_submitted_get_value('date');
8652 mbroquet 3730 } else {
8653     $date = "";
8654     }
8655 softime 8989 if($this->f->get_submitted_post_value('code_barres') !== null) {
8656     $code_barres = $this->f->get_submitted_post_value('code_barres');
8657     } elseif($this->f->get_submitted_get_value('code_barres') !== null) {
8658     $code_barres = $this->f->get_submitted_get_value('code_barres');
8659 mbroquet 3730 } else {
8660     $code_barres = "";
8661     }
8662     // Booléen permettant de définir si un enregistrement à eu lieu
8663     $correct = false;
8664     // Booléen permettant de définir si les dates peuvent êtres enregistrées
8665     $date_error = false;
8666     // Champs date à mettre à jour
8667     $liste_champs=array();
8668    
8669     // Si le formulaire a été validé
8670 softime 8989 if ($this->f->get_submitted_post_value('validation') !== null) {
8671 softime 18876 if(!empty($type_mise_a_jour) && !empty($date) && !empty($code_barres)) {
8672 mbroquet 3730
8673 softime 7067 // Ajout d'un filtre sur les groupes auxquels l'utilisateur a accès
8674     $group_clause = array();
8675     foreach ($_SESSION["groupe"] as $key => $value) {
8676     $group_clause[$key] = "(groupe.code = '".$key."'";
8677     if($value["confidentiel"] !== true) {
8678     $group_clause[$key] .= " AND dossier_autorisation_type.confidentiel IS NOT TRUE";
8679     }
8680     $group_clause[$key] .= ")";
8681     }
8682     $conditions = implode(" OR ", $group_clause);
8683 softime 14542 $groupFilter = " AND (" . $conditions . ")";
8684 softime 7067
8685 softime 14542 $qres = $this->f->get_all_results_from_db_query(
8686     sprintf(
8687     'SELECT
8688     instruction
8689     FROM
8690     %1$sinstruction
8691     INNER JOIN %1$sdossier
8692     ON dossier.dossier = instruction.dossier
8693     INNER JOIN %1$sdossier_instruction_type
8694     ON dossier.dossier_instruction_type = dossier_instruction_type.dossier_instruction_type
8695     INNER JOIN %1$sdossier_autorisation_type_detaille
8696     ON dossier_instruction_type.dossier_autorisation_type_detaille = dossier_autorisation_type_detaille.dossier_autorisation_type_detaille
8697     INNER JOIN %1$sdossier_autorisation_type
8698     ON dossier_autorisation_type_detaille.dossier_autorisation_type = dossier_autorisation_type.dossier_autorisation_type
8699     INNER JOIN %1$sgroupe
8700     ON dossier_autorisation_type.groupe = groupe.groupe
8701     WHERE
8702     code_barres = \'%2$s\'
8703     %3$s',
8704     DB_PREFIXE,
8705     $this->f->db->escapeSimple($code_barres),
8706     $groupFilter
8707     ),
8708     array(
8709     'origin' => __METHOD__
8710     )
8711     );
8712 softime 15835 if($qres['row_count'] === 1) {
8713 mbroquet 3730 $liste_champs = explode(";", $type_mise_a_jour);
8714 softime 14542 $row = array_shift($qres['result']);
8715 softime 11418 $instr = $this->f->get_inst__om_dbform(array(
8716     "obj" => "instruction",
8717     "idx" => $row['instruction'],
8718     ));
8719 mbroquet 3730 // Mise à jour des dates après l'écran de verification
8720 softime 18876 if($this->f->get_submitted_post_value('is_valid') !== null && $this->f->get_submitted_post_value('is_valid') == "true") {
8721 mbroquet 3730 $valF = array();
8722     foreach($instr->champs as $id => $champ) {
8723     $valF[$champ] = $instr->val[$id];
8724     }
8725 softime 6565 $valF['date_evenement'] = $instr->dateDBToForm($valF['date_evenement']);
8726     $valF['archive_date_complet'] = $instr->dateDBToForm($valF['archive_date_complet']);
8727     $valF['archive_date_rejet'] = $instr->dateDBToForm($valF['archive_date_rejet']);
8728     $valF['archive_date_limite'] = $instr->dateDBToForm($valF['archive_date_limite']);
8729     $valF['archive_date_notification_delai'] = $instr->dateDBToForm($valF['archive_date_notification_delai']);
8730     $valF['archive_date_decision'] = $instr->dateDBToForm($valF['archive_date_decision']);
8731     $valF['archive_date_validite'] = $instr->dateDBToForm($valF['archive_date_validite']);
8732     $valF['archive_date_achevement'] = $instr->dateDBToForm($valF['archive_date_achevement']);
8733     $valF['archive_date_chantier'] = $instr->dateDBToForm($valF['archive_date_chantier']);
8734     $valF['archive_date_conformite'] = $instr->dateDBToForm($valF['archive_date_conformite']);
8735     $valF['archive_date_dernier_depot'] = $instr->dateDBToForm($valF['archive_date_dernier_depot']);
8736     $valF['archive_date_limite_incompletude'] = $instr->dateDBToForm($valF['archive_date_limite_incompletude']);
8737     $valF['date_finalisation_courrier'] = $instr->dateDBToForm($valF['date_finalisation_courrier']);
8738     $valF['date_envoi_signature'] = $instr->dateDBToForm($valF['date_envoi_signature']);
8739     $valF['date_retour_signature'] = $instr->dateDBToForm($valF['date_retour_signature']);
8740     $valF['date_envoi_rar'] = $instr->dateDBToForm($valF['date_envoi_rar']);
8741     $valF['date_retour_rar'] = $instr->dateDBToForm($valF['date_retour_rar']);
8742     $valF['date_envoi_controle_legalite'] = $instr->dateDBToForm($valF['date_envoi_controle_legalite']);
8743     $valF['date_retour_controle_legalite'] = $instr->dateDBToForm($valF['date_retour_controle_legalite']);
8744     $valF['archive_date_cloture_instruction'] = $instr->dateDBToForm($valF['archive_date_cloture_instruction']);
8745     $valF['archive_date_premiere_visite'] = $instr->dateDBToForm($valF['archive_date_premiere_visite']);
8746     $valF['archive_date_derniere_visite'] = $instr->dateDBToForm($valF['archive_date_derniere_visite']);
8747     $valF['archive_date_contradictoire'] = $instr->dateDBToForm($valF['archive_date_contradictoire']);
8748     $valF['archive_date_retour_contradictoire'] = $instr->dateDBToForm($valF['archive_date_retour_contradictoire']);
8749     $valF['archive_date_ait'] = $instr->dateDBToForm($valF['archive_date_ait']);
8750     $valF['archive_date_transmission_parquet'] = $instr->dateDBToForm($valF['archive_date_transmission_parquet']);
8751 mbroquet 3730
8752     foreach(explode(";", $type_mise_a_jour) as $maj_date) {
8753     $valF[$maj_date]=$date;
8754     }
8755    
8756     // Vérification de la finalisation du document
8757     // correspondant au code barres
8758 softime 18876 if($valF["om_final_instruction"] === 't' ||
8759 mbroquet 3730 $valF["lettretype"] == '') {
8760     $code_barres = "";
8761    
8762     //Désactivation de l'autocommit
8763 softime 8989 $this->f->db->autoCommit(false);
8764 mbroquet 3730
8765     //On modifie les valeurs de l'instruction
8766     $instr->setParameter('maj', 170);
8767 nmeucci 3965 $instr->class_actions[170]["identifier"] =
8768 nmeucci 3972 "mise à jour des dates (depuis le menu suivi des pièces)";
8769 softime 8989 $retour = $instr->modifier($valF);
8770 mbroquet 3730
8771     //Si une erreur s'est produite, on défait les modifications
8772     //qui ont été faites
8773     if (!$retour){
8774     $instr->undoValidation();
8775     }
8776     //Sinon, on valide en base de données les modifications
8777     else {
8778 softime 8989 $this->f->db->commit();
8779 mbroquet 3730 }
8780    
8781     // Variable correct retourné depuis la classe instruction
8782     $correct = $instr->correct;
8783    
8784     // Si la modification sur l'instruction a échoué
8785     if ($correct === false) {
8786    
8787     // Message d'erreur de la classe instruction
8788     $error = $instr->msg;
8789     }
8790    
8791     } else {
8792     // Indique que le traitement est en erreur
8793     $correct = false;
8794     // Message d'erreur
8795 softime 18876 $error = sprintf(__("Le document n'est pas finalise."),
8796 mbroquet 3730 "<span class='bold'>".$code_barres."</span>");
8797     }
8798     } else {
8799     // Récupération des infos du dossier
8800 softime 14542 $qres = $this->f->get_all_results_from_db_query(
8801     sprintf(
8802     'SELECT
8803     dossier.dossier_libelle,
8804     evenement.libelle as evenement,
8805     autorite_competente.code as autorite_competente_code,
8806     autorite_competente.libelle as autorite_competente,
8807     evenement.type as evenement_type,
8808     to_char(date_envoi_signature,\'DD/MM/YYYY\') as date_envoi_signature,
8809     to_char(date_retour_signature,\'DD/MM/YYYY\') as date_retour_signature,
8810     to_char(date_envoi_controle_legalite,\'DD/MM/YYYY\') as date_envoi_controle_legalite,
8811     to_char(date_retour_controle_legalite,\'DD/MM/YYYY\') as date_retour_controle_legalite,
8812     to_char(date_envoi_rar,\'DD/MM/YYYY\') as date_envoi_rar,
8813     to_char(date_retour_rar,\'DD/MM/YYYY\') as date_retour_rar
8814     FROM
8815     %1$sinstruction
8816     INNER JOIN %1$sdossier
8817     ON dossier.dossier=instruction.dossier
8818     LEFT JOIN %1$sautorite_competente
8819     ON dossier.autorite_competente=autorite_competente.autorite_competente
8820     INNER JOIN %1$sevenement
8821     ON instruction.evenement=evenement.evenement
8822     WHERE
8823     code_barres = \'%2$s\'',
8824     DB_PREFIXE,
8825     $this->f->db->escapeSimple($code_barres)
8826     ),
8827     array(
8828     "origin" => __METHOD__
8829     )
8830     );
8831     $infos = array_shift($qres['result']);
8832 mbroquet 3730
8833     // Vérification de la non modification des dates de suivi
8834     foreach(explode(";", $type_mise_a_jour) as $champ) {
8835 softime 11418 if ($champ === 'date_envoi_controle_legalite') {
8836     if ($instr->is_sent_to_cl() === true) {
8837     $error = __("Les dates de suivis ne peuvent etre modifiees");
8838     $date_error = true;
8839     break;
8840     }
8841     }
8842 softime 18876 if($infos[$champ] != "" && $infos[$champ] != $date) {
8843     $error = __("Les dates de suivis ne peuvent etre modifiees");
8844 mbroquet 3730 $date_error = true;
8845 softime 11418 break;
8846 mbroquet 3730 }
8847     }
8848     }
8849     } else {
8850 softime 18876 $error = __("Le numero saisi ne correspond a aucun code barres d'instruction.");
8851 mbroquet 3730 }
8852    
8853     } else {
8854 softime 18876 $error = __("Tous les champs doivent etre remplis.");
8855 mbroquet 3730 }
8856     }
8857    
8858     /**
8859     * Affichage des messages et du formulaire
8860     */
8861     // Affichage du message de validation ou d'erreur
8862     if (isset($message) && isset($message_class) && $message != "") {
8863 softime 8989 $this->f->displayMessage($message_class, $message);
8864 mbroquet 3730 }
8865     // Affichage du message d'erreur
8866     if(!empty($error)) {
8867 softime 8989 $this->f->displayMessage("error", $error);
8868 mbroquet 3730 }
8869    
8870     // Affichage du message de validation de la saisie
8871     if($correct === true) {
8872 softime 18876 $this->f->displayMessage("ok", __("Saisie enregistree"));
8873 mbroquet 3730 }
8874     // Ouverture du formulaire
8875     echo "\t<form";
8876     echo " method=\"post\"";
8877     echo " id=\"suivi_mise_a_jour_des_dates_form\"";
8878     echo " action=\"\"";
8879     echo ">\n";
8880     // Paramétrage des champs du formulaire
8881     if(isset($infos)) {
8882     $champs = array("type_mise_a_jour", "date", "code_barres", "dossier_libelle", "evenement"
8883     , "autorite_competente", "date_envoi_signature",
8884     "date_retour_signature", "date_envoi_controle_legalite",
8885     "date_retour_controle_legalite", "date_envoi_rar",
8886     "date_retour_rar", "is_valid");
8887     } else {
8888     $champs = array("type_mise_a_jour", "date", "code_barres");
8889     }
8890     // Création d'un nouvel objet de type formulaire
8891 softime 7996 $form = $this->f->get_inst__om_formulaire(array(
8892     "validation" => 0,
8893     "maj" => 0,
8894     "champs" => $champs,
8895     ));
8896 mbroquet 3730 // Paramétrage des champs du formulaire
8897     // Parametrage du champ type_mise_a_jour
8898 softime 18876 $form->setLib("type_mise_a_jour", __("Date a mettre a jour")."* :");
8899 mbroquet 3730 if(isset($infos)) {
8900     $form->setType("type_mise_a_jour", "selecthiddenstatic");
8901    
8902     } else {
8903     $form->setType("type_mise_a_jour", "select");
8904    
8905     }
8906     $form->setVal("type_mise_a_jour", $type_mise_a_jour);
8907     $contenu = array();
8908    
8909     $contenu[0][0] = "date_envoi_signature";
8910 softime 18876 $contenu[1][0] = __("date d'envoi pour signature Mairie/Prefet");
8911 mbroquet 3730
8912     $contenu[0][1] = "date_retour_signature";
8913 softime 18876 $contenu[1][1] = __("date de retour de signature Mairie/Prefet");
8914 mbroquet 3730
8915     $contenu[0][2] = "date_retour_signature;date_envoi_controle_legalite";
8916 softime 18876 $contenu[1][2] = __("date de retour de signature + Envoi controle legalite");
8917 mbroquet 3730
8918     $contenu[0][3] = "date_envoi_controle_legalite";
8919 softime 18876 $contenu[1][3] = __("date d'envoi au controle de legalite");
8920 mbroquet 3730
8921     $contenu[0][4] = "date_retour_controle_legalite";
8922 softime 18876 $contenu[1][4] = __("date de retour de controle de legalite");
8923 mbroquet 3730
8924     $contenu[0][5] = "date_retour_rar";
8925 softime 8989 $contenu[1][5] = __("date de notification du correspondant");
8926 mbroquet 3730
8927     $form->setSelect("type_mise_a_jour", $contenu);
8928    
8929     // Parametrage du champ date
8930 softime 18876 $form->setLib("date", __("Date")."* :");
8931 mbroquet 3730 if(isset($infos)) {
8932     $form->setType("date", "hiddenstaticdate");
8933    
8934     } else {
8935     $form->setType("date", "date");
8936     }
8937     $form->setVal("date", $date);
8938     $form->setTaille("date", 10);
8939     $form->setMax("date", 10);
8940    
8941     // Parametrage du champ code_barres
8942 softime 18876 $form->setLib("code_barres", __("Code barres d'instruction")."* :");
8943 mbroquet 3730 if(isset($infos)) {
8944     $form->setType("code_barres", "hiddenstatic");
8945     } else {
8946     $form->setType("code_barres", "text");
8947     }
8948     $form->setVal("code_barres", $code_barres);
8949     $form->setTaille("code_barres", 20);
8950     $form->setMax("code_barres", 20);
8951    
8952     // Ajout des infos du dossier correspondantes à l'instruction séléctionnée
8953     if(isset($infos)) {
8954    
8955     // Tous les champs sont défini par defaut à static
8956     foreach ($infos as $key => $value) {
8957     $form->setType($key, "static");
8958     if(in_array($key, $liste_champs)) {
8959     $form->setVal($key, $date);
8960     } else {
8961     $form->setVal($key, $value);
8962     }
8963     }
8964    
8965     // Les champs dont on viens de définir la valeur sont en gras
8966     foreach ($liste_champs as $value) {
8967     $form->setBloc($value,'DF',"",'bold');
8968     }
8969    
8970     // Parametrage du champ dossier
8971 softime 18876 $form->setLib("dossier_libelle", __("dossier_libelle")." :");
8972 mbroquet 3730 $form->setType("dossier_libelle", "static");
8973     $form->setVal("dossier_libelle", $infos['dossier_libelle']);
8974    
8975     // Parametrage du champ evenement
8976 softime 18876 $form->setLib("evenement", __("evenement")." :");
8977 mbroquet 3730 $form->setType("evenement", "static");
8978     $form->setVal("evenement", $infos['evenement']);
8979    
8980     // Parametrage du champ autorite_competente
8981 softime 18876 $form->setLib("autorite_competente", __("Autorite competente")." :");
8982 mbroquet 3730 $form->setType("autorite_competente", "static");
8983     $form->setVal("autorite_competente", $infos['autorite_competente']);
8984    
8985 softime 8989 // Parametrage des libellés d'envoi avec AR
8986     $form->setLib("date_envoi_rar", __("date_envoi_ar")." :");
8987     $form->setLib("date_retour_rar", __("date_notification")." :");
8988 mbroquet 3730
8989 softime 18876 $form->setLib("date_envoi_signature", __("date_envoi_signature")." :");
8990     $form->setLib("date_retour_signature", __("date_retour_signature")." :");
8991     $form->setLib("date_envoi_controle_legalite", __("date_envoi_controle_legalite")." :");
8992     $form->setLib("date_retour_controle_legalite", __("date_retour_controle_legalite")." :");
8993 mbroquet 3730 // Configuration des libellé en fonction de l'autorité compétente
8994     if($infos['autorite_competente_code'] == 'ETAT') {
8995     $form->setType("date_envoi_controle_legalite", "hiddendate");
8996     $form->setType("date_retour_controle_legalite", "hiddendate");
8997     }
8998    
8999     // Ajout d'un champ hidden permettant de savoir que le formulaire précédant est celui de vérification
9000 softime 18876 $form->setLib("is_valid", __("Valide")." :");
9001 mbroquet 3730 $form->setType("is_valid", "hidden");
9002     $form->setVal("is_valid", 'true');
9003    
9004     $form->setFieldset('dossier_libelle','D',_('Synthese'));
9005     $form->setFieldset('is_valid','F');
9006    
9007     }
9008    
9009    
9010     // Création du fieldset regroupant les champs permettant la mise à jour des date
9011     $form->setFieldset('type_mise_a_jour','D',_('Mise a jour'));
9012     $form->setFieldset('code_barres','F');
9013     // Affichage du formulaire
9014     $form->entete();
9015     $form->afficher($champs, 0, false, false);
9016     $form->enpied();
9017     // Affichage du bouton
9018     echo "\t<div class=\"formControls\">\n";
9019     //
9020     if(!$date_error) {
9021 softime 18876 $this->f->layout->display_form_button(array("value" => __("Valider"), "name" => "validation"));
9022 mbroquet 3730 }
9023     // Si pas sur l'écran de validation
9024     if(isset($infos)) {
9025 softime 7996 echo "<a class=\"retour\" href=\"".OM_ROUTE_FORM."&obj=instruction_suivi_mise_a_jour_des_dates&action=170&idx=0";
9026 mbroquet 3730 echo "&amp;type_mise_a_jour=".$type_mise_a_jour."&amp;date=".$date."&amp;code_barres=".$code_barres;
9027     echo "\">Retour</a>";
9028     }
9029     echo "\t</div>\n";
9030     // Fermeture du formulaire
9031     echo "\t</form>\n";
9032     }
9033    
9034     /**
9035     * [view_pdf_lettre_rar description]
9036     *
9037     * @return [type] [description]
9038     */
9039     function view_pdf_lettre_rar() {
9040     // Vérification de l'accessibilité sur l'élément
9041     $this->checkAccessibility();
9042 softime 8989 //
9043     $this->f->disableLog();
9044 mbroquet 3730
9045 softime 8989 if($this->f->get_submitted_get_value('liste') != null) {
9046     $listeCodeBarres = explode(',',$this->f->get_submitted_get_value('liste'));
9047 mbroquet 3730
9048     // Classe permettant la mise en page de l'édition pdf
9049     require_once "../obj/pdf_lettre_rar.class.php";
9050     $pdf_lettre_rar = new pdf_lettre_rar('P', 'mm', 'A4');
9051     // Initialisation de la mise en page
9052 softime 8989 $pdf_lettre_rar->init($this->f);
9053 mbroquet 3730
9054     foreach ($listeCodeBarres as $code_barres) {
9055    
9056 softime 7067 // On récupère le dossier
9057 softime 14064 $qres = $this->f->get_one_result_from_db_query(
9058     sprintf(
9059     'SELECT
9060     dossier
9061     FROM
9062     %1$sinstruction
9063     WHERE
9064     code_barres = \'%2$s\'',
9065     DB_PREFIXE,
9066     $this->f->db->escapeSimple($code_barres)
9067     ),
9068     array(
9069     "origin" => __METHOD__,
9070     )
9071     );
9072    
9073 softime 7996 $inst_dossier = $this->f->get_inst__om_dbform(array(
9074     "obj" => "dossier",
9075 softime 14064 "idx" => $qres['result'],
9076 softime 7996 ));
9077 softime 7067
9078     // En fonction du type de dossier, on récupère un demandeur différent dans les requêtes
9079     $groupe = $inst_dossier->get_type_affichage_formulaire();
9080     switch ($groupe) {
9081     case 'CTX IN':
9082     $sql_demandeur = "(lien_dossier_demandeur.petitionnaire_principal IS TRUE AND demandeur.type_demandeur='plaignant')";
9083     break;
9084     case 'CTX RE':
9085     $sql_demandeur = "(lien_dossier_demandeur.petitionnaire_principal IS TRUE AND demandeur.type_demandeur='requerant')";
9086     break;
9087     case 'ADS':
9088     case 'DPC':
9089 softime 10573 case 'CONSULTATION ENTRANTE':
9090 softime 7067 default:
9091     $sql_demandeur = "((lien_dossier_demandeur.petitionnaire_principal IS TRUE AND demandeur.type_demandeur='petitionnaire') OR demandeur.type_demandeur='delegataire')";
9092     break;
9093     }
9094    
9095 mbroquet 3730 // Test si l'evenement est de type arrete et si un délégataire a été nommé
9096 softime 14542 $qres = $this->f->get_all_results_from_db_query(
9097     sprintf(
9098     'SELECT
9099 mbroquet 3730 dossier.dossier_libelle,
9100     evenement.type,
9101 softime 3834 count(lien_dossier_demandeur) as nbdemandeur,
9102     CASE
9103     WHEN division.libelle IS NOT NULL AND phase.code IS NOT NULL
9104 softime 14542 THEN CONCAT(phase.code, \' - \', division.libelle)
9105 softime 3834 ELSE
9106     phase.code
9107     END AS code_phase
9108 softime 14542 FROM
9109     %1$sinstruction
9110     LEFT JOIN %1$sdossier
9111     ON instruction.dossier = dossier.dossier
9112     LEFT JOIN %1$sdivision
9113     ON dossier.division = division.division
9114     INNER JOIN %1$sevenement
9115     ON instruction.evenement=evenement.evenement
9116     LEFT JOIN %1$sphase
9117     ON evenement.phase = phase.phase
9118     inner JOIN %1$slien_dossier_demandeur
9119     ON instruction.dossier=lien_dossier_demandeur.dossier
9120     inner join %1$sdemandeur
9121     ON demandeur.demandeur=lien_dossier_demandeur.demandeur
9122     WHERE
9123     code_barres = \'%2$s\'
9124     AND %3$s
9125     GROUP BY
9126     dossier.dossier_libelle,
9127     evenement.type,
9128     phase.code,
9129     division.libelle',
9130     DB_PREFIXE,
9131     $this->f->db->escapeSimple($code_barres),
9132     $sql_demandeur
9133     ),
9134     array(
9135     "origin" => __METHOD__
9136     )
9137     );
9138     $testDemandeur = array_shift($qres['result']);
9139 mbroquet 3730
9140    
9141     // Recuperation de l'adresse de destination
9142     // Envoi pour delegataire ou petitionnaire principal selon le type d'evenement
9143 softime 14542 $sqlAdresse = " AND demandeur.type_demandeur='petitionnaire' AND lien_dossier_demandeur.petitionnaire_principal IS TRUE";
9144 softime 18876 if($testDemandeur['type'] != 'arrete' && $testDemandeur['nbdemandeur'] > 1) {
9145 softime 14542 $sqlAdresse = " AND demandeur.type_demandeur='delegataire'";
9146 mbroquet 3730 }
9147    
9148 softime 14542 $qres = $this->f->get_all_results_from_db_query(
9149     sprintf(
9150     'SELECT
9151     CASE WHEN demandeur.qualite = \'particulier\'
9152     THEN TRIM(CONCAT_WS(\' \', pc.libelle, demandeur.particulier_nom, demandeur.particulier_prenom))
9153     ELSE TRIM(demandeur.personne_morale_denomination)
9154     END as ligne1,
9155     CASE WHEN demandeur.qualite = \'personne_morale\'
9156     THEN TRIM(demandeur.personne_morale_raison_sociale)
9157     ELSE \'\'
9158     END as ligne1_1,
9159     CASE WHEN demandeur.qualite = \'personne_morale\' AND (demandeur.personne_morale_nom IS NOT NULL OR demandeur.personne_morale_prenom IS NOT NULL)
9160     THEN TRIM(CONCAT_WS(\' \', \'rep. par\', demandeur.personne_morale_nom, demandeur.personne_morale_prenom))
9161     ELSE \'\'
9162     END as ligne1_2,
9163     trim(concat(demandeur.numero,\' \',demandeur.voie)) as ligne2,
9164     CASE demandeur.complement
9165     WHEN null THEN \'\'
9166     ELSE trim(demandeur.complement)
9167     END as ligne3,
9168     CASE demandeur.lieu_dit
9169     WHEN null THEN \'\'
9170     ELSE trim(demandeur.lieu_dit)
9171     END as ligne4,
9172     CONCAT_WS(\' \', demandeur.code_postal, demandeur.localite,
9173     (CASE WHEN demandeur.bp IS NOT NULL
9174     THEN CONCAT_WS(\' \', \'BP\', demandeur.bp)
9175     ELSE \'\'
9176     END),
9177     (CASE WHEN demandeur.cedex IS NOT NULL
9178     THEN CONCAT_WS(\' \', \'CEDEX\', demandeur.cedex)
9179     ELSE \'\'
9180     END))
9181     as ligne5,
9182     code_barres as code_barres
9183     FROM
9184     %1$sinstruction
9185     INNER JOIN %1$sdossier
9186     ON dossier.dossier = instruction.dossier
9187     INNER JOIN %1$slien_dossier_demandeur
9188     ON dossier.dossier = lien_dossier_demandeur.dossier
9189     INNER JOIN %1$sdemandeur
9190     ON lien_dossier_demandeur.demandeur = demandeur.demandeur
9191     LEFT OUTER JOIN %1$scivilite AS pc
9192     ON demandeur.particulier_civilite = pc.civilite
9193     OR demandeur.personne_morale_civilite = pc.civilite
9194     WHERE
9195     instruction.code_barres = \'%2$s\'
9196     %3$s',
9197     DB_PREFIXE,
9198     $this->f->db->escapeSimple($code_barres),
9199     $sqlAdresse
9200     ),
9201     array(
9202     "origin" => __METHOD__
9203     )
9204     );
9205     $adresse_dest = array_shift($qres['result']);
9206 mbroquet 3730
9207     // Création adresse destinataire sans ligne vide
9208     $adresse_destinataire = array();
9209     if (!empty($adresse_dest['ligne1'])) {
9210     $adresse_destinataire[] = $adresse_dest['ligne1'];
9211     }
9212     if (!empty($adresse_dest['ligne1_1'])) {
9213     $adresse_destinataire[] = $adresse_dest['ligne1_1'];
9214     }
9215     if (!empty($adresse_dest['ligne1_2'])) {
9216     $adresse_destinataire[] = $adresse_dest['ligne1_2'];
9217     }
9218     $adresse_destinataire[] = $adresse_dest['ligne2'];
9219     if (!empty($adresse_dest['ligne3'])) {
9220     $adresse_destinataire[] = $adresse_dest['ligne3'];
9221     }
9222     if (!empty($adresse_dest['ligne4'])) {
9223     $adresse_destinataire[] = $adresse_dest['ligne4'];
9224     }
9225     $adresse_destinataire[] = $adresse_dest['ligne5'];
9226    
9227     // Création du champ specifique
9228     $specifique_content = array();
9229     $specifique_content[] = $adresse_dest['ligne1'];
9230     $specifique_content[] = $adresse_dest['ligne1_1'];
9231     $specifique_content[] = $adresse_dest['ligne1_2'];
9232     $specifique_content[] = $testDemandeur['dossier_libelle'];
9233     $specifique_content[] = "|||||".$adresse_dest['code_barres']."|||||";
9234     unset($adresse_dest['code_barres']);
9235     // Ajout d'une page aux pdf
9236 softime 3834 $pdf_lettre_rar->addLetter($adresse_destinataire, $specifique_content, $testDemandeur['code_phase']);
9237 mbroquet 3730
9238     }
9239     $pdf_output = $pdf_lettre_rar->output("lettre_rar".date("dmYHis").".pdf","S");
9240 softime 7685 $om_edition = $this->f->get_inst__om_edition();
9241 softime 17542 $om_edition->set_object_linked($this);
9242 mbroquet 3730 $om_edition->expose_pdf_output($pdf_output, "lettre_rar".date("dmYHis").".pdf");
9243     }
9244     }
9245    
9246     /**
9247     * VIEW - view_bordereau_envoi_maire.
9248     *
9249     * Formulaire demandant :
9250     * - le code-barres de l'événement d'instruction
9251     * - la date d'envoi du courrier pour signature par le maire
9252     *
9253     * Lors de la validation :
9254     * => met à jour cette date dans l'événement d'instruction
9255     * => crée un lien permettant de générer en PDF le bordereau
9256     *
9257     * @return void
9258     */
9259     function view_bordereau_envoi_maire() {
9260     // Vérification de l'accessibilité sur l'élément
9261     $this->checkAccessibility();
9262    
9263     // Récupération des valeur passées en POST ou GET
9264     $code_barres = "";
9265     if($this->f->get_submitted_post_value('code_barres') !== null) {
9266     $code_barres = $this->f->get_submitted_post_value('code_barres');
9267     } elseif($this->f->get_submitted_get_value('code_barres')!==null) {
9268     $code_barres = $this->f->get_submitted_get_value('code_barres');
9269     }
9270     $date = "";
9271     if($this->f->get_submitted_post_value('date') !== null) {
9272     $date = $this->f->get_submitted_post_value('date');
9273     } elseif($this->f->get_submitted_get_value('date') !== null) {
9274     $date = $this->f->get_submitted_get_value('date');
9275     }
9276     $validation = 0;
9277     if($this->f->get_submitted_post_value('validation') !== null) {
9278     $validation = $this->f->get_submitted_post_value('validation');
9279     } elseif($this->f->get_submitted_get_value('validation') !== null) {
9280     $validation = $this->f->get_submitted_get_value('validation');
9281     }
9282    
9283     // Si le formulaire a été validé
9284     if ($this->f->get_submitted_post_value('validation') !== null) {
9285     // Tous les champs doivent obligatoirement être remplis
9286     if (!empty($date) && !empty($code_barres)) {
9287     $date_en = $this->dateDB($date);
9288     // Si date valide
9289     if ($date_en != "") {
9290     $id_instruction = $this->get_instruction_by_barcode($code_barres);
9291     // Si un événement d'instruction a été trouvé pour ce code-barres
9292     if ($id_instruction !== null) {
9293     $ret = $this->update_date_envoi_signature($id_instruction, $date_en);
9294     // Si mise à jour réussie de la date d'envoi du courrier
9295     // pour signature par l'autorité compétente
9296     if($ret === true) {
9297     // Message de validation avec lien PDF
9298     $message_class = "valid";
9299 softime 18876 $message = '&bullet; '.__("Veuillez cliquer sur le lien ci-dessous pour telecharger votre bordereau");
9300 mbroquet 3730 $message .= " : <br/><br/>";
9301     $message .= "<a class='om-prev-icon pdf-16'";
9302     $message .= " id=\"generer_bordereau_envoi_maire\"";
9303 softime 18876 $message .= " title=\"".__("Bordereau")."\"";
9304 softime 7996 $message .= " href='".OM_ROUTE_FORM."&obj=instruction";
9305 mbroquet 3730 $message .= "&action=200";
9306     $message .= "&idx=".$id_instruction."'";
9307     $message .= " target='_blank'>";
9308 softime 18876 $message .= __("Bordereau d'envoi au maire");
9309 mbroquet 3730 $message .= "</a><br/><br/>";
9310 softime 18876 $message .= '&bullet; '.__("Rappel des informations saisies")." :<br/><br/>";
9311     $message .= __("Code du courrier")." : ".$code_barres."<br/>";
9312     $message .= __("Date d'envoi du courrier pour signature par le maire")." : ".$date;
9313 mbroquet 3730
9314     } else {
9315     // Message d'erreur
9316     $message_class = "error";
9317 softime 18876 $message = sprintf(__("Erreur lors de la mise a jour de l'evenement d'instruction correspondant au code barres %s."),
9318 mbroquet 3730 $code_barres);
9319     }
9320     }
9321     else {
9322     $message_class = "error";
9323 softime 18876 $message = __("Le numero saisi ne correspond a aucun code-barres d'evenement d'instruction.");
9324 mbroquet 3730 }
9325     }
9326     else {
9327     $message_class = "error";
9328 softime 18876 $message = __("La date est invalide.");
9329 mbroquet 3730 }
9330     } else {
9331     $message_class = "error";
9332 softime 18876 $message = __("Tous les champs doivent etre remplis.");
9333 mbroquet 3730 }
9334     }
9335    
9336     /**
9337     * Affichage des messages et du formulaire
9338     */
9339    
9340     // Affichage du message de validation ou d'erreur
9341     if (isset($message) && isset($message_class) && $message != "") {
9342     $this->f->displayMessage($message_class, $message);
9343     }
9344    
9345     // Ouverture du formulaire
9346     $datasubmit = $this->getDataSubmit();
9347     echo "\n<!-- ########## START DBFORM ########## -->\n";
9348     echo "<form";
9349     echo " id=\"bordereau_envoi_maire\"";
9350     echo " method=\"post\"";
9351     echo " name=\"f1\"";
9352     echo " action=\"";
9353     echo $datasubmit;
9354     echo "\"";
9355     echo ">\n";
9356    
9357     // Paramétrage des champs du formulaire
9358     $champs = array("code_barres","date");
9359    
9360     // Création d'un nouvel objet de type formulaire
9361 softime 7996 $form = $this->f->get_inst__om_formulaire(array(
9362     "validation" => 0,
9363     "maj" => 0,
9364     "champs" => $champs,
9365     ));
9366 mbroquet 3730
9367     $template_required_label = '%s *';
9368     // Parametrage du champ code_barres
9369     $form->setLib("code_barres", sprintf($template_required_label,_("Code du courrier")));
9370     $form->setType("code_barres", "text");
9371     $form->setVal("code_barres", $code_barres);
9372     $form->setTaille("code_barres", 20);
9373     $form->setMax("code_barres", 20);
9374     // Parametrage du champ date
9375     $form->setLib("date", sprintf($template_required_label,_("Date d'envoi du courrier pour signature par le maire")));
9376     $form->setType("date", "date") ;
9377     if (empty($date)) {
9378     $date = date('d/m/Y');
9379     }
9380     $form->setVal("date", $date);
9381     $form->setTaille("date", 10);
9382     $form->setMax("date", 10);
9383    
9384     // Création du bloc regroupant les champs
9385     $form->setBloc('code_barres','D');
9386     $form->setBloc('date','F');
9387     // Affichage du formulaire
9388     $form->entete();
9389     $form->afficher($champs, 0, false, false);
9390     $form->enpied();
9391     // Affichage du bouton
9392     printf("\t<div class=\"formControls\">\n");
9393     //
9394 softime 18876 $this->f->layout->display_form_button(array("value" => __("Valider"), "name" => "validation"));
9395 mbroquet 3730 printf("\t</div>\n");
9396     // Fermeture du formulaire
9397     printf("\t</form>\n");
9398     }
9399    
9400     /**
9401     * VIEW - view_bordereau_envoi_maire.
9402     *
9403     * PDF de bordereau d'envoi au maire pour l'événement d'instruction instancié
9404     *
9405     * @return [void]
9406     */
9407     function view_generate_bordereau_envoi_maire() {
9408     // Vérification de l'accessibilité sur l'élément
9409     $this->checkAccessibility();
9410     // Récupération de la collectivité du dossier d'instruction
9411     $collectivite_di = $this->get_dossier_instruction_om_collectivite();
9412     // Récupération de ses paramètres
9413     $collectivite = $this->f->getCollectivite($collectivite_di);
9414     // Génération du PDF
9415     $result = $this->compute_pdf_output('etat', 'communaute_bordereau_envoi_maire', $collectivite, $this->getVal(($this->clePrimaire)));
9416     // Affichage du PDF
9417     $this->expose_pdf_output(
9418     $result['pdf_output'],
9419     $result['filename']
9420     );
9421     }
9422    
9423     /**
9424 softime 10808 * VIEW - view_rapport_instruction.
9425     *
9426     * Ouvre le sous-formulaire en ajaxIt dans un overlay.
9427     * Cette action est bindée pour utiliser la fonction popUpIt.
9428     *
9429     * @return void
9430     */
9431     function view_overlay_notification_manuelle() {
9432    
9433     // Vérification de l'accessibilité sur l'élément
9434     $this->checkAccessibility();
9435    
9436     printf(
9437     '<script type="text/javascript" >
9438     overlayIt(\'%1$s\',\'%2$s&objsf=%1$s&idxformulaire=%4$s&retourformulaire=dossier_instruction&obj=%1$s&action=411&idx=%3$s\', 1);
9439     </script>',
9440     'instruction_notification_manuelle',
9441     OM_ROUTE_SOUSFORM,
9442     $this->getVal($this->clePrimaire),
9443     $this->getVal('dossier')
9444     );
9445     }
9446    
9447     /**
9448 softime 11585 * VIEW - view_overlay_notification_service_consulte.
9449     *
9450     * Ouvre le sous-formulaire de notification des services consulte
9451     * en ajaxIt dans un overlay.
9452     * Cette action est bindée pour utiliser la fonction popUpIt.
9453     *
9454     * @return void
9455     */
9456     function view_overlay_notification_service_consulte() {
9457    
9458     // Vérification de l'accessibilité sur l'élément
9459     $this->checkAccessibility();
9460    
9461     printf(
9462     '<script type="text/javascript" >
9463     overlayIt(\'%1$s\',\'%2$s&objsf=%1$s&idxformulaire=%4$s&retourformulaire=dossier_instruction&obj=%1$s&action=420&idx=%3$s\', 1);
9464     </script>',
9465     'instruction_notification_manuelle',
9466     OM_ROUTE_SOUSFORM,
9467     $this->getVal($this->clePrimaire),
9468     $this->getVal('dossier')
9469     );
9470     }
9471    
9472     /**
9473     * VIEW - overlay_notification_tiers_consulte.
9474     *
9475     * Ouvre le sous-formulaire de notification des tiers consulte
9476     * en ajaxIt dans un overlay.
9477     * Cette action est bindée pour utiliser la fonction popUpIt.
9478     *
9479     * @return void
9480     */
9481     function view_overlay_notification_tiers_consulte() {
9482    
9483     // Vérification de l'accessibilité sur l'élément
9484     $this->checkAccessibility();
9485    
9486     printf(
9487     '<script type="text/javascript" >
9488     overlayIt(\'%1$s\',\'%2$s&objsf=%1$s&idxformulaire=%4$s&retourformulaire=dossier_instruction&obj=%1$s&action=430&idx=%3$s\', 1);
9489     </script>',
9490     'instruction_notification_manuelle',
9491     OM_ROUTE_SOUSFORM,
9492     $this->getVal($this->clePrimaire),
9493     $this->getVal('dossier')
9494     );
9495     }
9496 softime 12847
9497 softime 11585 /**
9498 softime 12847 * VIEW - view_modale_selection_document_signe
9499     *
9500     * Ouvre le sous-formulaire de notification des services consulte
9501     * en ajaxIt dans un overlay.
9502     * Cette action est bindée pour utiliser la fonction popUpIt.
9503     *
9504     * @return void
9505     */
9506     function view_modale_selection_document_signe() {
9507    
9508     // Vérification de l'accessibilité sur l'élément
9509     $this->checkAccessibility();
9510    
9511     printf(
9512     '<script type="text/javascript" >
9513     overlayIt(\'%1$s\',\'%2$s&objsf=%1$s&idxformulaire=%4$s&retourformulaire=dossier_instruction&obj=%1$s&action=115&idx=%3$s\', 1);
9514     </script>',
9515     'instruction_modale',
9516     OM_ROUTE_SOUSFORM,
9517     $this->getVal($this->clePrimaire),
9518     $this->getVal('dossier')
9519     );
9520     }
9521    
9522     /**
9523 softime 6565 * Retourne l'événement d'instruction dont on donne le code-barres, avec un filtre
9524     * pour exclure les dossiers du groupe contentieux.
9525 mbroquet 3730 *
9526     * @param [string] $barcode numéro du code-barres
9527     * @return [mixed] ID de son instruction ou null si aucun code
9528     */
9529     function get_instruction_by_barcode($barcode) {
9530     // Begin
9531     $this->begin_treatment(__METHOD__);
9532 softime 14064
9533 mbroquet 3730 // Vérification de l'existence de l'événement d'instruction
9534 softime 6565 // pour le code-barres donné, en excluant les dossiers liés au groupe CTX
9535 softime 14064 $qres = $this->f->get_one_result_from_db_query(
9536     sprintf(
9537     'SELECT
9538     instruction
9539     FROM
9540     %1$sinstruction
9541     INNER JOIN %1$sdossier
9542 softime 6565 ON dossier.dossier=instruction.dossier
9543 softime 14064 INNER JOIN %1$sdossier_instruction_type
9544 softime 6565 ON dossier.dossier_instruction_type = dossier_instruction_type.dossier_instruction_type
9545 softime 14064 INNER JOIN %1$sdossier_autorisation_type_detaille
9546 softime 6565 ON dossier_instruction_type.dossier_autorisation_type_detaille = dossier_autorisation_type_detaille.dossier_autorisation_type_detaille
9547 softime 14064 INNER JOIN %1$sdossier_autorisation_type
9548 softime 6565 ON dossier_autorisation_type_detaille.dossier_autorisation_type = dossier_autorisation_type.dossier_autorisation_type
9549 softime 14064 INNER JOIN %1$sgroupe
9550 softime 6565 ON dossier_autorisation_type.groupe = groupe.groupe
9551 softime 14064 AND groupe.code != \'CTX\'
9552     WHERE
9553     code_barres = \'%2$s\'',
9554     DB_PREFIXE,
9555     $this->f->db->escapeSimple($barcode)
9556     ),
9557     array(
9558     "origin" => __METHOD__,
9559     )
9560     );
9561    
9562 mbroquet 3730 // Retourne résultat
9563 softime 14064 return $this->end_treatment(__METHOD__, $qres['result']);
9564 mbroquet 3730 }
9565    
9566     /**
9567     * Met à jour le champ date d'envoi signature
9568     * avec la date fournie et pour l'instruction donnée
9569     *
9570     * @param [string] $id ID de l'événement d'instruction
9571     * @param [string] $date date au format EN
9572     * @return [boolean] true si mise à jour avec succès
9573     */
9574     function update_date_envoi_signature($id, $date) {
9575     // Préparation du tableau
9576     $valF = array();
9577     $valF['date_envoi_signature'] = $date;
9578     // Begin
9579     $this->begin_treatment(__METHOD__);
9580     // Requête
9581 softime 12847 $res = $this->f->db->autoexecute(
9582 mbroquet 3730 DB_PREFIXE.$this->table,
9583     $valF,
9584     DB_AUTOQUERY_UPDATE,
9585     $this->getCle($id)
9586     );
9587 softime 12847 $this->addToLog(
9588     __METHOD__."(): db->autoexecute(\"".DB_PREFIXE.'.'.$this->table."\", ".print_r($valF, true).", DB_AUTOQUERY_UPDATE, \"".$this->getCle($id)."\");",
9589     VERBOSE_MODE
9590     );
9591     if ($this->f->isDatabaseError($res, true) !== false) {
9592 mbroquet 3730 $this->end_treatment(__METHOD__, false);
9593     }
9594     //
9595     return $this->end_treatment(__METHOD__, true);
9596     }
9597    
9598     /**
9599     * Méthode permettant de définir des valeurs à envoyer en base après
9600     * validation du formulaire d'ajout.
9601     * @param array $val tableau des valeurs retournées par le formulaire
9602     */
9603 softime 6929 function setValFAjout($val = array()) {
9604 mbroquet 3730 // Mise à jour du flag created_by_commune lors d'un changement de décision
9605     // par un utilisateur de commune sur un dossier instruit par la comcom
9606 softime 6565 if ($this->isInstrCanChangeDecision($this->valF["dossier"])) {
9607 mbroquet 3730 $this->valF['created_by_commune'] = true;
9608     }
9609 softime 8593
9610     //
9611     if ($this->evenement_has_an_edition($this->valF['evenement']) === false) {
9612     if (isset($this->valF['flag_edition_integrale']) === true) {
9613     unset($this->valF['flag_edition_integrale']);
9614     }
9615     if (isset($this->valF['signataire_arrete']) === true) {
9616     unset($this->valF['signataire_arrete']);
9617     }
9618     }
9619 mbroquet 3730 }
9620 nmeucci 3876
9621 fmichon 3892
9622 fmichon 4708 /**
9623     * Récupère l'instance d'un événement de workflow.
9624     *
9625     * @param mixed $evenement Identifiant de l'événement.
9626     *
9627     * @return object
9628     */
9629     function get_inst_evenement($evenement = null) {
9630     //
9631     return $this->get_inst_common("evenement", $evenement);
9632     }
9633 softime 3976
9634 fmichon 3892 /**
9635 softime 3976 * Logue l'action de l'instruction dans son DI.
9636 nmeucci 3933 *
9637 softime 3976 * @param string $id Clé primaire de l'instruction.
9638     * @param array $val Valeurs de l'instruction.
9639     *
9640     * @return bool Vrai si traitement effectué avec succès
9641 nmeucci 3876 */
9642 softime 3976 private function add_log_to_dossier($id, array $val) {
9643 nmeucci 3933 $maj = $this->getParameter("maj");
9644 nmeucci 3943 // Action = Trace par défaut
9645     $action = $this->get_backtrace();
9646     // Action = Identifant de l'action si contexte connu
9647     if (empty($maj) === false
9648     || (empty($maj) === true && $maj === 0)) {
9649     $action = $this->get_action_param($maj, 'identifier');
9650 nmeucci 3965 if ($action === 'modifier_suivi') {
9651     $action = "modifier (via l'action suivi des dates)";
9652     }
9653 nmeucci 4108 if ($action === 'notifier_commune'
9654     && isset($val['mails_destinataires']) === true) {
9655     $action = "notification de la commune (courriels : ";
9656     $action .= $val['mails_destinataires'].")";
9657     }
9658 nmeucci 3943 }
9659 nmeucci 3876 // Création du log
9660     $log = array(
9661     'date' => date('Y-m-d H:i:s'),
9662     'user' => $_SESSION['login'],
9663     'action' => $action,
9664     'values' => array(
9665     'date_evenement' => $this->dateDB($val['date_evenement']),
9666     'date_retour_rar' => $this->dateDB($val['date_retour_rar']),
9667     'date_retour_signature' => $this->dateDB($val['date_retour_signature']),
9668     'evenement' => $val['evenement'],
9669     'action' => $val['action'],
9670 nmeucci 3963 'instruction' => $id,
9671 nmeucci 3876 'etat' => $val['etat'],
9672     ),
9673     );
9674     // Ajout du log
9675 softime 3976 $di = $this->get_inst_dossier($val['dossier']);
9676 nmeucci 3876 $ret = $di->add_log_instructions($log);
9677     if ($ret === false) {
9678     $this->correct = false;
9679     $this->msg = '';
9680     $this->addToMessage($di->msg);
9681     }
9682     return $ret;
9683     }
9684 nmeucci 3943
9685 softime 3976
9686 nmeucci 3943 /**
9687 softime 3976 * Retourne le contexte de déboguage formaté en HTML.
9688 nmeucci 3943 *
9689 softime 3976 * @return string Une ligne par trace
9690 nmeucci 3943 */
9691     private function get_backtrace() {
9692     $trace = debug_backtrace();
9693 nmeucci 3957 $backtrace = '';
9694     $i = 1;
9695 nmeucci 3943 foreach ($trace as $key => $value) {
9696 nmeucci 3957 $func = $trace[$key]['function'];
9697     // On ne s'autolog pas
9698     if ($func === 'get_backtrace'
9699     || $func === 'add_log_to_dossier') {
9700     continue;
9701     }
9702     $backtrace .= $i.') ';
9703     // Si dans une classe
9704     if (isset($trace[$key]['class']) === true
9705     && empty($trace[$key]['class']) === false) {
9706 nmeucci 3963 $backtrace .= $trace[$key]['class'].'->'.$func;
9707 nmeucci 3957 }
9708     // Si procédural
9709     else {
9710     $file = $trace[$key]['file'];
9711 nmeucci 3963 $line = $trace[$key]['line'];
9712 softime 3976 $truncated_file = $this->f->get_relative_path($file);
9713 nmeucci 3963 if ($truncated_file !== false) {
9714     $file = $truncated_file;
9715     }
9716     $backtrace .= $func.' IN<br/>&nbsp;&nbsp;&nbsp;&nbsp; '.$file.':'.$line;
9717 nmeucci 3957 }
9718     $backtrace .= '<br/>';
9719     $i++;
9720 nmeucci 3943 }
9721 nmeucci 3957 return $backtrace;
9722 nmeucci 3943 }
9723 nmeucci 3963
9724 nmeucci 4108 /**
9725     * CONDITION - is_notifiable.
9726     *
9727     * Condition pour afficher l'action notifier_commune.
9728     *
9729     * @return boolean
9730     */
9731     public function is_notifiable() {
9732     // L'instruction doit être finalisée, ce qui revient à dire
9733     // définalisable sans bypass
9734     if ($this->is_unfinalizable_without_bypass() === false) {
9735     return false;
9736     }
9737     // La collectivité de l'utilisateur doit être de niveau multi
9738     if ($this->f->has_collectivite_multi() === false) {
9739     return false;
9740     }
9741     // Le paramètre multi de l'objet du courriel doit exister
9742     if ($this->f->getParameter('param_courriel_de_notification_commune_objet_depuis_instruction') === NULL) {
9743     return false;
9744     }
9745     // Le paramètre multi du modèle du courriel doit exister
9746     if ($this->f->getParameter('param_courriel_de_notification_commune_modele_depuis_instruction') === NULL) {
9747     return false;
9748     }
9749     // A ce stade toutes les conditions sont satisfaites
9750     return true;
9751     }
9752 nmeucci 3963
9753 nmeucci 4108 /**
9754     * TREATMENT - notifier_commune.
9755     *
9756     * Notifie aux communes et par courriel la finalisation d'une instruction.
9757     *
9758     * @return boolean
9759     */
9760     public function notifier_commune() {
9761     // Cette méthode permet d'exécuter une routine en début des méthodes
9762     // dites de TREATMENT.
9763     $this->begin_treatment(__METHOD__);
9764 softime 14542 $message = __('Erreur de paramétrage :');
9765 softime 12654 $erreurParametrage = false;
9766     // Récupération du paramétrage de la collectivité du dossier
9767 nmeucci 4108 $id_di = $this->getVal('dossier');
9768     $di = $this->get_inst_dossier($id_di);
9769     $collectivite_di = $di->getVal('om_collectivite');
9770 softime 12654 // Récupération de l'url permettant d'accèder à l'instruction et au dossier
9771     $urlAcces = $this->f->get_parametre_notification_url_acces($collectivite_di);
9772     if (empty($urlAcces) && empty(PATH_BASE_URL)) {
9773     $erreurParametrage = true;
9774     $message .= '<br>'.__("* l'url de notification n'est pas correctement paramétré");
9775 nmeucci 4108 }
9776 softime 12654
9777     // Récupération de la liste des mails
9778     $adresses = $this->f->get_param_courriel_de_notification_commune($collectivite_di);
9779     if (empty($adresses)) {
9780     $erreurParametrage = true;
9781     $message .= '<br>'.__("* aucun courriel valide de destinataire de la commune");
9782 nmeucci 4108 }
9783 softime 12654
9784     // Vérification du paramétrage des mails
9785     $paramMail = $this->f->get_notification_commune_parametre_courriel_type($collectivite_di);
9786     if (empty($paramMail) || empty($paramMail['parametre_courriel_type_message'])) {
9787     $erreurParametrage = true;
9788     $message .= '<br>'.__("* le modèle du courriel envoyé aux communes est vide");
9789 nmeucci 4108 }
9790 softime 12654 if (empty($paramMail) || empty($paramMail['parametre_courriel_type_titre'])) {
9791     $erreurParametrage = true;
9792     $message .= '<br>'.__("* l'objet du courriel envoyé aux communes est vide");
9793 nmeucci 4108 }
9794 softime 12654
9795     // Si il y a des erreurs de paramétrage on ne déclenche pas la notification et
9796     // un message a destination de l'utilisateur est affiché
9797     if ($erreurParametrage) {
9798     $message .= '<br>'.__("Veuillez contacter votre administrateur.");
9799     $this->addToMessage($message);
9800 nmeucci 4108 return $this->end_treatment(__METHOD__, false);
9801     }
9802 softime 12654
9803     // Création d'un notification et de sa tâche associé pour chaque mail
9804     foreach ($adresses as $adresse) {
9805     // Ajout de la notif et récupération de son id
9806     $destinataire = array(
9807     'destinataire' => $adresse,
9808     'courriel' => $adresse
9809     );
9810     $idNotif = $this->ajouter_notification(
9811     $this->getVal($this->clePrimaire),
9812     $this->f->get_connected_user_login_name(),
9813     $destinataire,
9814     $collectivite_di
9815     );
9816     if ($idNotif === false) {
9817     $this->addToMessage(__("Veuillez contacter votre administrateur."));
9818     return $this->end_treatment(__METHOD__, false);
9819 nmeucci 4108 }
9820 softime 12654 // Création de la tache en lui donnant l'id de la notification
9821     $notification_by_task = $this->notification_by_task(
9822     $idNotif,
9823     $this->getVal('dossier'),
9824     'mail',
9825     'notification_commune'
9826     );
9827     if ($notification_by_task === false) {
9828     $this->addToMessage(__("Erreur lors de la préparation de la notification des communes."));
9829     $this->addToMessage(__("Veuillez contacter votre administrateur."));
9830     return $this->end_treatment(__METHOD__, false);
9831     }
9832 nmeucci 4108 }
9833 softime 12654 $this->addToMessage(__('La commune a été notifiée.'));
9834 nmeucci 4108 return $this->end_treatment(__METHOD__, true);
9835     }
9836    
9837     /**
9838 softime 5169 * Récupère l'instance de l'instructeur
9839     *
9840     * @param integer $instructeur Identifiant de l'instructeur.
9841     *
9842     * @return object
9843     */
9844     protected function get_inst_instructeur($instructeur) {
9845     //
9846     return $this->get_inst_common("instructeur", $instructeur);
9847     }
9848    
9849    
9850     /**
9851     * Récupère l'instance de l'utilisateur
9852     *
9853     * @param integer $om_utilisateur Identifiant de l'utilisateur.
9854     *
9855     * @return object
9856     */
9857     protected function get_inst_om_utilisateur($om_utilisateur) {
9858     //
9859     return $this->get_inst_common("om_utilisateur", $om_utilisateur);
9860     }
9861    
9862    
9863 softime 6565 /**
9864 softime 5295 * Récupère l'instance de la division.
9865     *
9866     * @param integer $division Identifiant de la division.
9867     *
9868     * @return object
9869     */
9870     protected function get_inst_division($division) {
9871     //
9872     return $this->get_inst_common("division", $division);
9873     }
9874    
9875    
9876     /**
9877     * Récupère l'instance de la direction.
9878     *
9879     * @param integer $direction Identifiant de la direction.
9880     *
9881     * @return object
9882     */
9883     protected function get_inst_direction($direction) {
9884     //
9885     return $this->get_inst_common("direction", $direction);
9886     }
9887    
9888    
9889     /**
9890     * Récupère la collectivité d'un instructeur en passant par sa division puis
9891     * par sa direction.
9892     *
9893     * @param integer $instructeur Identifiant de l'instructeur.
9894     *
9895     * @return integer
9896     */
9897     protected function get_instructeur_om_collectivite($instructeur) {
9898     // Chemin vers la collectivité d'un instructeur
9899     $inst_instr = $this->get_inst_instructeur($instructeur);
9900     $inst_division = $this->get_inst_division($inst_instr->getVal('division'));
9901     $inst_direction = $this->get_inst_direction($inst_division->getVal('direction'));
9902    
9903     // Collectivité
9904     $om_collectivite = $inst_direction->getVal('om_collectivite');
9905    
9906     //
9907     return $om_collectivite;
9908     }
9909    
9910 softime 6565 /*
9911     * CONDITION - can_user_access_dossier_contexte_ajout
9912     *
9913     * Vérifie que l'utilisateur a bien accès au dossier d'instruction passé dans le
9914     * formulaire d'ajout.
9915     * Cette méthode vérifie que l'utilisateur est lié au groupe du dossier, et si le
9916     * dossier est confidentiel qu'il a accès aux confidentiels de ce groupe.
9917     *
9918     */
9919     function can_user_access_dossier_contexte_ajout() {
9920 softime 5295
9921 softime 6565 ($this->f->get_submitted_get_value('idxformulaire') !== null ? $id_dossier =
9922     $this->f->get_submitted_get_value('idxformulaire') : $id_dossier = "");
9923     //
9924     if ($id_dossier !== "") {
9925 softime 7996 $dossier = $this->f->get_inst__om_dbform(array(
9926     "obj" => "dossier_instruction",
9927     "idx" => $id_dossier,
9928     ));
9929 softime 6565 //
9930     return $dossier->can_user_access_dossier();
9931     }
9932     return false;
9933     }
9934    
9935     /*
9936     * CONDITION - can_user_access_dossier
9937     *
9938     * Vérifie que l'utilisateur a bien accès au dossier lié à l'instruction instanciée.
9939     * Cette méthode vérifie que l'utilisateur est lié au groupe du dossier, et si le
9940     * dossier est confidentiel qu'il a accès aux confidentiels de ce groupe.
9941     *
9942     */
9943     function can_user_access_dossier_contexte_modification() {
9944    
9945     $id_dossier = $this->getVal('dossier');
9946     //
9947     if ($id_dossier !== "" && $id_dossier !== null) {
9948 softime 7996 $dossier = $this->f->get_inst__om_dbform(array(
9949     "obj" => "dossier_instruction",
9950     "idx" => $id_dossier,
9951     ));
9952 softime 6565 //
9953     return $dossier->can_user_access_dossier();
9954     }
9955     return false;
9956     }
9957    
9958 softime 8593 /**
9959 softime 10713 * TREATMENT - envoyer_a_signature_sans_relecture
9960     *
9961     * Permet d'envoyer le document de l'instruction au parapheur pour signature sans relecture
9962     *
9963     * @return boolean true si l'envoi a été effectué avec succès false sinon
9964     */
9965     function envoyer_a_signature_sans_relecture() {
9966     return $this->envoyer_a_signature();
9967     }
9968    
9969     /**
9970     * TREATMENT - envoyer_a_signature_avec_relecture
9971     *
9972     * Permet d'envoyer le document de l'instruction au parapheur pour signature avec relecture
9973     *
9974     * @return boolean true si l'envoi a été effectué avec succès false sinon
9975     */
9976     function envoyer_a_signature_avec_relecture() {
9977 softime 10808 $is_forced_view_files = true;
9978     return $this->envoyer_a_signature($is_forced_view_files);
9979 softime 10713 }
9980    
9981     /**
9982 softime 10573 * TREATMENT - envoyer_a_signature
9983     *
9984     * Permet d'envoyer le document de l'instruction au parapheur pour signature
9985 softime 10713 *
9986     * @param boolean $is_forced_view_files Indique si il y a une relecture (true) ou non (false)
9987 softime 10573 *
9988     * @return boolean true si l'envoi a été effectué avec succès false sinon
9989     */
9990 softime 10713 function envoyer_a_signature($is_forced_view_files = false) {
9991 softime 10573 $this->begin_treatment(__METHOD__);
9992     $this->correct = true;
9993    
9994     // Instanciation de l'objet signataire_arrete
9995     $inst_signataire_arrete = $this->f->get_inst__om_dbform(array(
9996     'obj' => 'signataire_arrete',
9997     'idx' => $this->getVal('signataire_arrete'),
9998     ));
9999    
10000     // Instanciation de l'objet dossier
10001     $inst_dossier = $this->f->get_inst__om_dbform(array(
10002     'obj' => 'dossier',
10003     'idx' => $this->getVal('dossier'),
10004     ));
10005    
10006 softime 15037 //Instanciation de la classe electronicsignature
10007     $inst_es = $this->get_electronicsignature_instance();
10008     if ($inst_es === false) {
10009     $this->correct = false;
10010     return $this->end_treatment(__METHOD__, false);
10011     }
10012    
10013     // Vérifie si la notification se fait via l'application ou via le parapheur
10014     try {
10015     $notification_required = $inst_es->signer_notification_is_delegated();
10016     } catch(electronicsignature_connector_method_not_implemented_exception $_) {
10017     // Si la méthode n'existe pas, on considère que la notification est faite par le parapheur
10018     $notification_required = false;
10019     }
10020    
10021     // Si la notification est faite par l'application vérifie que l'adresse mail du
10022     // signataire est correcte. Si ce n'est pas le cas le document n'est pas envoyé
10023     // au parapheur car il ne sera pas accessible sans le lien transmis dans la
10024     // notification
10025     if ($notification_required === true) {
10026     $signer_mail = $inst_signataire_arrete->getVal('email');
10027     $signer_name = trim($inst_signataire_arrete->getVal('prenom').' '.$inst_signataire_arrete->getVal('nom'));
10028    
10029     $err_msg = __('Le document n\'a pas pu être envoyé en signature car ');
10030    
10031     if (empty($signer_mail)) {
10032     $this->correct = false;
10033     $err_detail = sprintf(__("l'email du signataire '%s' est vide."), $signer_name);
10034     $this->addToMessage($err_msg.$err_detail);
10035     $this->addToLog(__METHOD__.$err_msg.$err_detail.' Instruction : '.$this->getVal($this->clePrimaire), DEBUG_MODE);
10036     return $this->end_treatment(__METHOD__, false);
10037     }
10038     if (! $this->f->checkValidEmailAddress($signer_mail)) {
10039     $this->correct = false;
10040     $err_detail = sprintf(__("l'email du signataire '%s' est invalide (%s)."), $signer_name, $signer_mail);
10041     $this->addToMessage($err_msg.$err_detail);
10042     $this->addToLog(__METHOD__.$err_msg.$err_detail.' Instruction : '.$this->getVal($this->clePrimaire), DEBUG_MODE);
10043     return $this->end_treatment(__METHOD__, false);
10044     }
10045     }
10046    
10047 softime 10573 // Récupération du document à signer
10048     $file = $this->f->storage->get($this->getVal('om_fichier_instruction'));
10049     if ($file === OP_FAILURE) {
10050     $this->correct = false;
10051     $this->addToMessage(__("Une erreur est survenue lors de la récupération du contenu du document de l'instruction."));
10052     // Termine le traitement
10053     return $this->end_treatment(__METHOD__, false);
10054     }
10055    
10056     // Initialisation des paramètre à passer pour l'envoi en signature
10057 softime 18769 $this->f->getUserInfos();
10058 softime 10808 $data = array(
10059 softime 10573 "om_utilisateur_email" => $this->f->om_utilisateur['email'],
10060     "om_utilisateur_nom" => $this->f->om_utilisateur['nom'],
10061     "signataire_arrete_email" => $inst_signataire_arrete->getVal('email'),
10062     "signataire_arrete_nom" => $inst_signataire_arrete->getVal('nom'),
10063     "signataire_arrete_prenom" => $inst_signataire_arrete->getVal('prenom'),
10064 softime 11876 // Permet d'envoyer en signature l'instruction le jour de la date limite
10065 softime 14064 "date_limite_instruction" => $this->compute_date_limite(1) != null ? $this->compute_date_limite(1) : null,
10066 softime 10573 "dossier" => $this->getVal('dossier'),
10067 softime 10713 "is_forced_view_files" => $is_forced_view_files,
10068 softime 18876 'commentaire_signature' => $is_forced_view_files === true ? __('relecture demandee.') : null,
10069     'instruction' => $this->getVal($this->clePrimaire),
10070     'last_statut_signature' => $this->getVal('statut_signature'),
10071     'last_commentaire_signature' => $this->getVal('commentaire_signature'),
10072 softime 10573 );
10073    
10074 softime 10808 // Initialisation des métadonnées
10075     $metadonnee_dossier = $file['metadata'];
10076 softime 18436 // Récupération du libellé du document transmis au parapheur
10077     $metadonnee_dossier['filename'] = $this->getVal('fichier_instruction_name');
10078 softime 11228 $metadonnee_dossier['titre_document'] = $this->getDocumentTitre();
10079 softime 10808
10080     $metadonnee_dossier['url_di'] = sprintf(
10081 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',
10082 softime 11418 $this->f->get_param_base_path_metadata_url_di() !== null ? $this->f->get_param_base_path_metadata_url_di() : PATH_BASE_URL,
10083 softime 15037 $this->getVal('dossier')
10084 softime 10808 );
10085    
10086     $optional_data = null;
10087     // Si il y a des paramètres supplémentaire spécifié dans le signataire alors on les récupère
10088     if ($inst_signataire_arrete->getVal('parametre_parapheur') !== null && $inst_signataire_arrete->getVal('parametre_parapheur') !== '') {
10089     $optional_data = json_decode($inst_signataire_arrete->getVal('parametre_parapheur'), true);
10090     if (json_last_error() !== JSON_ERROR_NONE) {
10091     $this->correct = false;
10092     $this->addToMessage(__("Les paramètres supplémentaires envoyés au parapheur ne sont pas au bon format."));
10093     $this->addToLog(__METHOD__."(): ".
10094     __("Erreur lors du décodage du format json des paramètres supplémentaires envoyé au parapheur.
10095     Tableau : ").var_export($inst_signataire_arrete->getVal('parametre_parapheur'), true)
10096     );
10097     // Termine le traitement
10098     return $this->end_treatment(__METHOD__, false);
10099     }
10100     }
10101    
10102 softime 10573 // Appel de la méthode de l'abstracteur send_for_signature()
10103     // Cette méthode doit retourner un tableau de valeur
10104     try {
10105 softime 10808 $result = $inst_es->send_for_signature($data, $file['file_content'], $metadonnee_dossier, $optional_data);
10106 softime 10573 } catch (electronicsignature_exception $e) {
10107     $this->handle_electronicsignature_exception($e);
10108     return $this->end_treatment(__METHOD__, false);
10109     }
10110    
10111     // Après avoir reçu le résultat du parapheur, il faut mettre à jour les champs
10112     $valF = array();
10113    
10114     // Pour appeler la fonction modifier il faut traiter tous les champs de l'objet
10115     foreach($this->champs as $identifiant => $champ) {
10116     $valF[$champ] = $this->val[$identifiant];
10117     }
10118     // On fait ensuite nos modifications spécifiques
10119     $valF['id_parapheur_signature'] = $result['id_parapheur_signature'];
10120     $valF['statut_signature'] = $result['statut'];
10121     $valF['commentaire_signature'] = isset($result['commentaire_signature']) == true ? $result['commentaire_signature'] : null;
10122     $valF['date_envoi_signature'] = date("Y-m-d", strtotime($result['date_envoi_signature']));
10123     $valF['historique_signature'] = $this->get_updated_historique_signature($result);
10124 softime 15037 $valF['parapheur_lien_page_signature'] = isset($result['signature_page_url']) ? $result['signature_page_url'] : null;
10125 softime 18769 $this->setParameter("maj", 1);
10126 softime 10573 $ret = $this->modifier($valF);
10127    
10128     if ($ret === false) {
10129     $this->correct = false;
10130     $this->addToMessage(__("Une erreur est survenue lors de la mise à jour des champs."));
10131     // Termine le traitement
10132     return $this->end_treatment(__METHOD__, false);
10133     }
10134    
10135 softime 15037 // Notification du signataire
10136     if ($notification_required === true) {
10137     if ($this->notify_signer($signer_name, $signer_mail, $data['om_utilisateur_nom']) === false) {
10138     $msg = __("Une erreur s'est produite lors de la notification du signataire \"%s (%s)\". Annulation de l'envoi pour signature du document%s.");
10139     $this->addToMessage(sprintf($msg, $signer_name, $signer_mail, ''));
10140     $this->addToLog(sprintf($msg, $signer_name, $signer_mail, ' : '.$this->getVal($this->clePrimaire)), DEBUG_MODE);
10141     // Met à jour les valeurs de l'objet courant pour prendre en compte les modifications faites
10142     // precedemment
10143     $this->init_record_data($this->getVal($this->clePrimaire));
10144     $this->annuler_envoi_en_signature();
10145     $this->correct = false;
10146     return $this->end_treatment(__METHOD__, true);
10147     }
10148     }
10149    
10150 softime 10573 // Message
10151     $this->addToMessage(__("Le document a été envoyé pour signature dans le parapheur."));
10152 softime 15037 if ($this->f->is_option_enabled('option_afficher_lien_parapheur') === true
10153     && array_key_exists('signature_page_url', $result) === true) {
10154 softime 10573 $this->addToMessage(sprintf(
10155 softime 11228 '<br> > <a href="%1$s" title="%2$s" target="_blank">%2$s</a>',
10156     $result['signature_page_url'],
10157     __("Signez directement le document")
10158 softime 10573 ));
10159     }
10160 softime 15037 if ($notification_required !== true) {
10161     $this->addToMessage(__("L'envoi de la notification au signataire est effectué par la plateforme."));
10162     }
10163 softime 10573
10164     // Tout s'est bien passé, on termine le traitement
10165     return $this->end_treatment(__METHOD__, true);
10166     }
10167    
10168     /**
10169 softime 15037 * Notifie le signataire d'un document à signer.
10170     * Gère l'affichage des messages à destination de l'utilisateur selon l'état du traitement.
10171     * En cas d'erreur ajoute une ligne dans les logs de l'application.
10172     *
10173     * @param string $signer_name Nom du signataire
10174     * @param string $signer_mail Mail du signataire
10175     * @param string $user_name Nom de l'utilisateur openADS courant
10176     *
10177     * @return boolean true si succés, false si erreur
10178     */
10179     protected function notify_signer($signer_name, $signer_mail, $user_name) {
10180     // message d'erreur
10181     $err_msg_log = sprintf(
10182     __("Échec de la notification du signataire \"%s (%s)\" lors de l'envoi au parapaheur du document de l'instruction : %s"),
10183     $signer_name,
10184     $signer_mail,
10185     $this->getVal($this->clePrimaire)
10186     );
10187     $err_msg = sprintf(
10188     '%s %s (%s)"',
10189     __("Échec de la notification du signataire"),
10190     $signer_name,
10191     $signer_mail
10192     );
10193    
10194     // vérification des informations requises
10195     if (empty($signer_name)) {
10196     $err_detail = __("le nom du signataire est vide");
10197     $this->addToLog(__METHOD__.', '.$err_msg_log.', '.$err_detail, DEBUG_MODE);
10198     $this->addToMessage($err_msg.', '.$err_detail);
10199     return false;
10200     }
10201     if (empty($signer_mail)) {
10202     $err_detail = __("le courriel du signataire est vide");
10203     $this->addToLog(__METHOD__.', '.$err_msg_log.', '.$err_detail, DEBUG_MODE);
10204     $this->addToMessage($err_msg.', '.$err_detail);
10205     return false;
10206     }
10207     if (empty($this->getVal('dossier'))) {
10208     $err_detail = __("l'identifiant du dossier est vide");
10209     $this->addToLog(__METHOD__.', '.$err_msg_log.', '.$err_detail, DEBUG_MODE);
10210     $this->addToMessage($err_msg.', '.$err_detail);
10211     return false;
10212     }
10213    
10214     // ajout de la notification à la liste des notifications de l'instruction
10215     $instruction_id = $this->getVal($this->clePrimaire);
10216     $inst_notif = $this->f->get_inst__om_dbform(array(
10217     "obj" => "instruction_notification",
10218     "idx" => "]",
10219     ));
10220     $notif_val = array(
10221     'instruction_notification' => null,
10222     'instruction' => $instruction_id,
10223     'automatique' => true,
10224     'emetteur' => $user_name,
10225     'date_envoi' => null,
10226     'destinataire' => "$signer_name <$signer_mail>",
10227     'courriel' => $signer_mail,
10228     'date_premier_acces' => null,
10229     'statut' => '',
10230     'commentaire' => ''
10231     );
10232     $add_notif = $inst_notif->ajouter($notif_val);
10233     if ($add_notif === false) {
10234     $err_detail = __("Échec de l'ajout de la notification.");
10235     $this->addToLog(__METHOD__.' '.$err_msg_log.'. '.$err_detail.' Notification : '.var_export($notif_val, true), DEBUG_MODE);
10236     $this->addToMessage($err_msg);
10237     return false;
10238     }
10239     $notification_id = $inst_notif->getVal($inst_notif->clePrimaire);
10240    
10241     // ajout d'une tâche de notification (envoi du mail)
10242     $notification_task = $this->notification_by_task(
10243     $notification_id,
10244     $this->getVal('dossier'),
10245     'mail',
10246     'notification_signataire'
10247     );
10248     if ($notification_task === false) {
10249     $err_detail = sprintf(
10250     __("Échec de l'ajout de la tâche de notification (notification %s)."),
10251     $notification_id);
10252     $this->addToLog(__METHOD__.' '.$err_msg_log.'. '.$err_detail, DEBUG_MODE);
10253     $this->addToMessage($err_msg);
10254     return false;
10255     }
10256    
10257     // Vérification de la réussite de l'envoi du mail
10258     // Fais une requête pour récupérer la liste des notifications de signataire faites par mail
10259     // et associées à l'instruction en cours. Récupère uniquement la dernière qui doit être celle
10260     // qui viens d'être créée.
10261     // Si la tâche d'envoi du mail est en erreur alors on considère que l'envoi du mail a échoué.
10262     $qres = $this->f->get_one_result_from_db_query(
10263     sprintf(
10264     'SELECT
10265     state
10266     FROM
10267     %1$stask
10268     WHERE
10269     type = \'notification_signataire\'
10270     AND category = \'mail\'
10271     AND dossier = \'%2$s\'
10272     ORDER BY
10273     task DESC
10274     LIMIT 1',
10275     DB_PREFIXE,
10276     $this->f->db->escapeSimple($this->getVal('dossier'))
10277     ),
10278     array(
10279     'origin' => __METHOD__
10280     )
10281     );
10282     if ($qres['result'] === 'error') {
10283     $err_detail = sprintf(
10284     __("Échec de l'envoi du mail de notification (notification %s)."),
10285     $notification_id);
10286     $this->addToLog(__METHOD__.' '.$err_msg_log.'. '.$err_detail, DEBUG_MODE);
10287     $this->addToMessage($err_msg);
10288     return false;
10289     }
10290 softime 18436 // TODO gérer les autres cas (gestion d'erreur)
10291 softime 15037
10292     // succès de la planification de la notification
10293     $this->addToMessage(sprintf(
10294     __('Le signataire "%s (%s)" sera notifié prochainement'),
10295     $signer_name,
10296     $signer_mail));
10297     return true;
10298     }
10299    
10300     /**
10301 softime 11876 * Permet de récupérer la bonne date limite en fonction de si l'instruction
10302     * est en incomplet notifié ou non.
10303     * On peut ajouter des jours à cette date grâce au paramètre "delay".
10304     * Cette fonction est utilisée dans un cas spécifique où on veut envoyer
10305     * l'instruction en signature le jour de la date limite.
10306     *
10307     * @param int $delay Le nombre de jour à ajouter à la date limite.
10308     *
10309     * @return string $date_limite la date limite calculé ou false
10310     */
10311     private function compute_date_limite($delay) {
10312     // Instanciation de l'objet dossier
10313     $inst_dossier = $this->f->get_inst__om_dbform(array(
10314     'obj' => 'dossier',
10315     'idx' => $this->getVal('dossier'),
10316     ));
10317    
10318     $date_to_compute = null;
10319     if ($inst_dossier->getVal('incomplet_notifie') === 't') {
10320     $date_to_compute = $inst_dossier->getVal('date_limite_incompletude');
10321     } else {
10322     $date_to_compute = $inst_dossier->getVal('date_limite');
10323     }
10324 softime 14064 if ($date_to_compute != null) {
10325     return date("Y-m-d", strtotime($date_to_compute."+ $delay days"));
10326     }
10327 softime 11876
10328 softime 14064 return null;
10329 softime 11876 }
10330    
10331     /**
10332 softime 10573 * Permet de récupérer la traduction de la valeur de statut_signature
10333     *
10334     * @return string la valeur de statut_signature traduite | false
10335     */
10336     function get_trad_for_statut($value_to_trad){
10337     $statut_signature_tab = array(
10338     'waiting' => __('en préparation'),
10339     'in_progress' => __('en cours de signature'),
10340     'canceled' => __('signature annulée'),
10341 softime 10808 'expired' => __('délai de signature expiré'),
10342 softime 10573 'finished' => __('signé')
10343     );
10344     if (array_key_exists($value_to_trad, $statut_signature_tab) === true) {
10345     return $statut_signature_tab[$value_to_trad];
10346     }
10347    
10348     return false;
10349     }
10350    
10351     /**
10352     * Permet de mettre à jour le tableau json sotcké dans le champ historique_signature
10353     *
10354     * @return string (json) la valeur de historique_signature mis à jour | false
10355     */
10356     function get_updated_historique_signature($historique_signature_values) {
10357    
10358     $historique_signature_value_tab = $this->get_historique_signature_decoded();
10359    
10360     if ($historique_signature_value_tab === false) {
10361     $this->addToLog(__METHOD__."(): erreur historique signature", DEBUG_MODE);
10362     return false;
10363     }
10364    
10365     $last_val_historique_signature = array();
10366    
10367     // Si la tableau récupéré n'est pas vide alors
10368     // on récupère la dernière ligne du tableau
10369     if (empty($historique_signature_value_tab) === false) {
10370     $last_val_historique_signature = end($historique_signature_value_tab);
10371     }
10372    
10373     $format_date = '';
10374     $format_date_hour = '';
10375     $date_converted=array();
10376    
10377     $date_to_convert = array(
10378     'date_envoi_signature' => $historique_signature_values['date_envoi_signature'],
10379 softime 11876 'date_limite_instruction' => $this->compute_date_limite(0),
10380 softime 10573 'date_retour_signature' => $historique_signature_values['date_retour_signature']
10381     );
10382    
10383     // Conversion des dates en fonction de leur format
10384     foreach ($date_to_convert as $key => $value) {
10385     $date_converted[$key] = null;
10386     if ($value != null) {
10387     $format_date = 'd/m/Y';
10388     $format_date_hour = 'd/m/Y H:i:s';
10389     $date_converted[$key] = empty(date_parse($value)['hour']) === false ? date($format_date_hour, strtotime($value)) : date($format_date, strtotime($value));
10390     }
10391     }
10392    
10393     // Ce tableau permet de lister les colonnes de historique_signature et de les rendre traduisibles.
10394     // Il faut en effet mettre les gettext avec l'intitulé explicite au moins
10395     // une fois afin qu'il puisse être reconnu par le logiciel de traduction.
10396     $tab_for_columns_trad = array(
10397     __('entry_date'),
10398     __('id_parapheur_signature'),
10399     __('emetteur'),
10400     __('signataire'),
10401     __('date_envoi'),
10402     __('date_limite'),
10403     __('date_retour'),
10404     __('statut_signature'),
10405     __('commentaire_signature')
10406     );
10407    
10408     array_push($historique_signature_value_tab, array(
10409     'entry_date' => date('d/m/Y H:i:s'),
10410     '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'],
10411     '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'],
10412     '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'],
10413     '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'],
10414     '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'],
10415     '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'],
10416     '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']),
10417     'commentaire_signature' => isset($historique_signature_values['commentaire_signature']) === false || $historique_signature_values['commentaire_signature'] == null ? null : $historique_signature_values['commentaire_signature'],
10418     ));
10419    
10420     return json_encode($historique_signature_value_tab, JSON_HEX_APOS);
10421     }
10422 softime 11876
10423     /**
10424     * TREATMENT - annuler_envoi_en_signature
10425     *
10426     * Permet d'annuler l'envoi du document de l'instruction au parapheur pour signature
10427     *
10428     * @return boolean true si l'annulation a été effectué avec succès false sinon
10429     */
10430     function annuler_envoi_en_signature() {
10431     $this->begin_treatment(__METHOD__);
10432     $this->correct = true;
10433 softime 10573
10434 softime 11876 //Instanciation de la classe electronicsignature
10435     $inst_es = $this->get_electronicsignature_instance();
10436     if ($inst_es === false) {
10437     $this->correct = false;
10438     return $this->end_treatment(__METHOD__, false);
10439     }
10440 softime 10573
10441 softime 11876 $data = array();
10442     if (! empty($this->getVal('id_parapheur_signature'))) {
10443     $data['id_parapheur_signature'] = $this->getVal('id_parapheur_signature');
10444     } else {
10445     $this->correct = false;
10446     $this->addToMessage(__("Il n'y a pas d'identifiant de parapheur."));
10447     return $this->end_treatment(__METHOD__, false);
10448     }
10449    
10450     // Appel de la méthode de l'abstracteur cancel_send_for_signature()
10451     // Cette méthode doit retourner un tableau de valeur
10452     try {
10453     $result = $inst_es->cancel_send_for_signature($data);
10454     } catch (electronicsignature_exception $e) {
10455     $this->handle_electronicsignature_exception($e);
10456     return $this->end_treatment(__METHOD__, false);
10457     }
10458    
10459     // Après avoir reçu le résultat du parapheur, il faut mettre à jour les champs
10460     $valF = array();
10461    
10462     // Pour appeler la fonction modifier il faut traiter tous les champs de l'objet
10463     foreach($this->champs as $identifiant => $champ) {
10464     $valF[$champ] = $this->val[$identifiant];
10465     }
10466     // On fait ensuite nos modifications spécifiques
10467     $valF['id_parapheur_signature'] = null;
10468     $valF['statut_signature'] = $result['statut'];
10469     $valF['commentaire_signature'] = isset($result['commentaire_signature']) == true ? $result['commentaire_signature'] : null;
10470     $valF['date_envoi_signature'] = null;
10471     $valF['historique_signature'] = $this->get_updated_historique_signature($result);
10472    
10473 softime 18769 $this->setParameter("maj", 1);
10474 softime 11876 $ret = $this->modifier($valF);
10475    
10476     if ($ret === false) {
10477     $this->correct = false;
10478     $this->addToMessage(__("Une erreur est survenue lors de la mise à jour des champs."));
10479     // Termine le traitement
10480     return $this->end_treatment(__METHOD__, false);
10481     }
10482    
10483     // Message
10484     $this->addToMessage(__("L'annulation a été effectuée avec succès."));
10485    
10486     // Tout s'est bien passé, on termine le traitement
10487     return $this->end_treatment(__METHOD__, true);
10488     }
10489    
10490    
10491 softime 10573 /**
10492     * Récupère le contenu du champ historique_signature et le converti en tableau
10493     *
10494     * @return array sinon false en cas d'erreur
10495     */
10496     protected function get_historique_signature_decoded() {
10497 softime 11876 $val = str_replace("'", '"', $this->getVal('historique_signature'));
10498     if ($val === '' || $val == 'false') {
10499 softime 10573 $val = json_encode(array());
10500     }
10501     if($this->isJson($val) === false) {
10502     return false;
10503     }
10504     return json_decode($val, true);
10505     }
10506    
10507 softime 10808 /**
10508     * Récupère les informations à afficher dans le tableau de suivi à l'aide
10509     * d'une requête sql. Stocke ces informations dans un tableau.
10510 softime 12433 * Converti le tableau au format json et renvoi le json obtenu.
10511 softime 10808 *
10512 softime 12433 * Pour identifier quel suivi est affiché (notification des demandeurs, des services ou
10513     * de tiers) ce sont les tâches liées aux notifications qui sont utilisés.
10514     * La clause where de la requête est construite à partir du tableau contenant les types
10515     * de tâches fourni en paramètre.
10516     * Il est également possible d'afficher les notifications n'étant pas lié à des tâches.
10517     *
10518     * Si le suivi concerne la notification des demandeurs via le portail citoyen,
10519     * la date de premier accès ne sera pas affichée.
10520     *
10521     * @param array liste des tâches permettant d'identifier quelles notification afficher
10522     * @param boolean permet d'afficher les notifications non liées à des tâches
10523 softime 10808 * @return json
10524     */
10525 softime 15037 public function get_json_suivi_notification($typeTache, $nonLieTache = false) {
10526 softime 11585 $whereTypeTache = '';
10527 softime 15037 $sqlTaskNull = 'INNER';
10528 softime 12654
10529     // Liste des champs à afficher. Permet également la traduction des noms de colonnes.
10530     $listeChampsTrad = array(
10531     __('emetteur'),
10532     __('date_envoi'),
10533     __('destinataire'),
10534     __('date_premier_acces'),
10535     __('instruction'),
10536     __('annexes'),
10537     __('statut'),
10538     __('commentaire')
10539     );
10540     $listeChamps = array(
10541     'emetteur',
10542     'date_envoi',
10543     'destinataire',
10544     'date_premier_acces',
10545     'instruction',
10546     'annexes',
10547     'statut',
10548     'commentaire'
10549     );
10550    
10551 softime 12124 // Défini si on veux que la requête récupère également les notifications qui n'ont pas
10552     // de tâches associées. C'est le cas pour les notifications de demandeurs lorsque la
10553     // notification du demandeur principal n'a pas pu être envoyée à cause d'un mauvais
10554     // paramétrage
10555     if(is_bool($nonLieTache) && $nonLieTache === true) {
10556 softime 15037 $sqlTaskNull = 'LEFT';
10557 softime 12124 }
10558     // Prépare la clause where pour ne récupérer que les notifications liées à certain type de tâches
10559     // Permet de différencier les notifications des demandeurs de celle des services et de celles des
10560     // tiers consulté
10561 softime 12433 if (is_array($typeTache) && $typeTache != array()) {
10562 softime 11585 if (is_array($typeTache)) {
10563     $whereTypeTache = sprintf(
10564 softime 15835 'AND (task.task IS NULL OR (task.task IS NOT NULL AND task.type IN (%1$s)))',
10565 softime 15037 "'".implode("', '", $typeTache)."'"
10566 softime 11585 );
10567     }
10568 softime 12433 // La date de premier accès n'a pas besoin d'être renseigné pour
10569     // les notifications des demandeurs via le portail citoyen.
10570     // Les notifications des demandeurs sont liés à 3 types de tâches
10571     // notification_recepisse, notification_instruction, notification_decision
10572     // Si le suivi de la notification concerne un de ces types de tâches on
10573     // considère que c'est une notification de demandeurs.
10574     // Dans ce cas on vérifie si cette notification est paramétrée pour passer
10575     // via le portail. Par défaut si rien n'est paramétré on considère que la
10576     // notification est faite via le portail
10577     if ((in_array('notification_recepisse', $typeTache) ||
10578     in_array('notification_instruction', $typeTache) ||
10579     in_array('notification_decision', $typeTache))) {
10580     $dossier = $this->getVal('dossier');
10581     $collectivite_di = $this->get_dossier_instruction_om_collectivite($dossier);
10582     $modeNotification = $this->f->get_param_option_notification($collectivite_di);
10583 softime 14064 if ($modeNotification === PORTAL) {
10584 softime 12654 $listeChamps = array(
10585     'emetteur',
10586     'date_envoi',
10587     'destinataire',
10588     'instruction',
10589     'annexes',
10590     'statut',
10591     'commentaire'
10592     );
10593 softime 12433 }
10594     }
10595 softime 12654 // Il n'y a pas d'annexe pour la notification des communes donc pas besoin
10596     // de les afficher dans le suivi
10597     if (in_array('notification_depot_demat', $typeTache)) {
10598     $listeChamps = array(
10599     'emetteur',
10600     'date_envoi',
10601     'destinataire',
10602     'instruction',
10603     'statut',
10604     'commentaire'
10605     );
10606     }
10607 softime 11585 }
10608 softime 12433
10609 softime 10808 $valSuivi = array();
10610     // Récupération des infos nécessaires à l'affichage du tableau
10611     $sql = sprintf(
10612 softime 11585 'SELECT DISTINCT
10613 softime 10869 instruction_notification.instruction_notification,
10614 softime 12124 -- Affiche la mention automatique avec le nom de l emetteur si la notification a été envoyé automatiquement
10615 softime 10869 CASE WHEN instruction_notification.automatique = TRUE
10616     THEN TRIM(CONCAT(instruction_notification.emetteur, \' \', \'(automatique)\'))
10617     ELSE instruction_notification.emetteur
10618     END as emetteur,
10619 softime 10808 date_envoi,
10620     instruction_notification.destinataire,
10621 softime 10869 instruction_notification.date_premier_acces,
10622 softime 10808 evenement.libelle as instruction,
10623 softime 10869 instruction_notification.statut,
10624     instruction_notification.commentaire,
10625 softime 12433 annexes.instruction_annexe as annexes
10626 softime 10808 FROM
10627     %1$sinstruction_notification
10628     LEFT JOIN %1$sinstruction
10629     ON instruction.instruction = instruction_notification.instruction
10630     LEFT JOIN %1$sevenement
10631     ON instruction.evenement = evenement.evenement
10632 softime 10869 LEFT JOIN %1$sinstruction_notification_document
10633     ON instruction_notification.instruction_notification = instruction_notification_document.instruction_notification
10634     AND instruction_notification_document.annexe = true
10635 softime 12124 -- Récupère les tâches liées au notification pour pouvoir par la suite identifier le type de notification
10636 softime 15037 %4$s JOIN %1$stask
10637 softime 11585 ON instruction_notification.instruction_notification::CHARACTER VARYING = task.object_id
10638 softime 15835 AND task.type LIKE \'notification%%\'
10639 softime 12124 -- Récupération de la liste des annexes sous la forme d une liste
10640 softime 11585 LEFT JOIN (
10641     SELECT
10642     instruction_notification,
10643 softime 12124 -- Récupère la liste des annexes de la notification
10644 softime 12433 -- sous la forme d un json pour récupérer toutes les informatiosn nécessaire
10645     -- à l affichage du lien vers les annexes
10646     CONCAT(
10647     \'[\',
10648     STRING_AGG(
10649     -- Affiche le nom du fichier selon le type de document/pièce
10650     CASE
10651     WHEN instruction_notification_document.document_type = \'instruction\'
10652     THEN CONCAT(
10653     \'{
10654     "obj" : "instruction",
10655     "champs" : "om_fichier_instruction",
10656     "label" : "\', evenement.libelle, \'",
10657     "id" : "\', instruction.instruction,\'"
10658     }\'
10659     )
10660     WHEN instruction_notification_document.document_type = \'consultation\'
10661     THEN CONCAT(
10662 softime 15218 \'{
10663     "obj" : "consultation",
10664     "champs" : "fichier",
10665     "label" : "\', CONCAT_WS( \' - \', \'Avis\', service.libelle, to_char(consultation.date_retour,\'DD/MM/YYYY\')), \'",
10666     "id" : "\', consultation.consultation, \'"
10667     }\'
10668 softime 12433 )
10669     ELSE
10670     CONCAT(
10671     \'{
10672     "obj" : "document_numerise",
10673     "champs" : "uid",
10674     "label" : "\', document_numerise.nom_fichier, \' - \', document_numerise_type.libelle, \'",
10675     "id" : "\', document_numerise.document_numerise,\'"
10676     }\'
10677     )
10678     END,
10679     \', \'),
10680     \']\'
10681 softime 11585 ) AS instruction_annexe
10682     FROM
10683     %1$sinstruction_notification_document
10684     LEFT JOIN %1$sinstruction
10685     ON instruction_notification_document.instruction = instruction.instruction
10686     LEFT JOIN %1$sevenement
10687     ON instruction.evenement = evenement.evenement
10688     LEFT JOIN %1$sconsultation
10689     ON instruction_notification_document.document_id = consultation.consultation
10690     LEFT JOIN %1$sservice
10691     ON consultation.service = service.service
10692 softime 12433 LEFT JOIN %1$sdocument_numerise
10693     ON instruction_notification_document.document_id = document_numerise.document_numerise
10694     LEFT JOIN %1$sdocument_numerise_type
10695     ON document_numerise.document_numerise_type = document_numerise_type.document_numerise_type
10696 softime 11585 WHERE
10697     instruction_notification_document.annexe = \'t\'
10698     GROUP BY
10699     instruction_notification
10700     ) AS annexes
10701     ON
10702     annexes.instruction_notification = instruction_notification.instruction_notification
10703 softime 10808 WHERE
10704 softime 10869 instruction.instruction = %2$s
10705 softime 15835 %3$s
10706 softime 10869 ORDER BY
10707     date_envoi ASC, instruction_notification.destinataire ASC',
10708 softime 10808 DB_PREFIXE,
10709 softime 14542 intval($this->getVal('instruction')),
10710 softime 15037 $whereTypeTache,
10711     $sqlTaskNull
10712 softime 10808 );
10713 softime 14542 $qres = $this->f->get_all_results_from_db_query($sql, array(
10714     "origin" => __METHOD__
10715     )
10716     );
10717 softime 12433 // Préparation du lien de téléchargement des annexes
10718     $htmlList =
10719     '<style>
10720     #content .gridjs-td a.lien_annexe {
10721     text-decoration : underline dotted 1px;
10722     }
10723     #content a.lien_annexe:hover {
10724     text-decoration : underline solid 1px;
10725     color : #46aede;
10726     }
10727     ol {padding-left : 10px;}
10728     </style>
10729     <ol>%1$s</ol>';
10730     $lienTelechargement =
10731     '<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">
10732     Annexe
10733     </a>';
10734 softime 10808 // Stockage des infos de chaque notification dans un tableau
10735 softime 14542 foreach ($qres['result'] as $row) {
10736 softime 10808 $valNotif = array();
10737     foreach($listeChamps as $champ) {
10738     $valNotif[$champ] = $row[$champ];
10739 softime 10815 if (($champ === 'date_envoi'
10740     || $champ === 'date_premier_acces')
10741     && $row[$champ] !== null
10742     && $row[$champ] !== '') {
10743 softime 10814 //
10744     $valNotif[$champ] = date('d/m/Y H:i:s', strtotime($row[$champ]));
10745 softime 12433 } else if ($champ === 'annexes') {
10746     $listeAnnexe = '';
10747     $infoAnnexes = json_decode($row[$champ], true);
10748     if (! empty($infoAnnexes) && json_last_error() === JSON_ERROR_NONE) {
10749     // A partir des infos récupérées prépare le code html du lien vers chacune
10750     // des annexes et ajoute un élément de liste par annexe
10751     foreach($infoAnnexes as $annexe) {
10752     $listeAnnexe .= sprintf(
10753     '<li>%s</li>',
10754     sprintf($lienTelechargement,
10755     $annexe['obj'],
10756     $annexe['champs'],
10757     $annexe['id'],
10758     $annexe['label']
10759     )
10760     );
10761     }
10762     // Construction de la liste des annexes
10763     $valNotif[$champ] = sprintf(
10764     $htmlList,
10765     $listeAnnexe
10766     );
10767     }
10768 softime 10814 }
10769 softime 10808 }
10770     array_push($valSuivi, $valNotif);
10771     }
10772    
10773     // Passage du tableau au format json
10774     return json_encode($valSuivi, JSON_HEX_APOS);
10775     }
10776    
10777 softime 10573 /**
10778     * Traitement des erreurs retournées par l'abstracteur electronicsignature.
10779     *
10780     * @param electronicsignature_exception $exception Exception retournée par l'abstracteur.
10781     *
10782     * @return void
10783     */
10784     public function handle_electronicsignature_exception(electronicsignature_exception $exception) {
10785 softime 18769 $this->correct = false;
10786     $this->addToMessage($exception->getMessage());
10787 softime 10573 }
10788    
10789    
10790     /**
10791     * Retourne une instance du connecteur electronicsignature, et la créer si elle n'existe pas.
10792     *
10793     * @param boolean $with_handle_error Flag pour afficher ou non le message d'erreur à l'utilisateur.
10794     * @return electronicsignature Instance de l'abstracteur.
10795     */
10796     public function get_electronicsignature_instance($with_handle_error = true) {
10797     if(isset($this->electronicsignature_instance)) {
10798     return $this->electronicsignature_instance;
10799     }
10800     // Instanciation du connecteur electronicsignature
10801     try {
10802     require_once "electronicsignature.class.php";
10803     $collectivites = array("collectivite_idx" => $this->get_dossier_instruction_om_collectivite(), "collectivite_multi_idx" => $this->f->get_idx_collectivite_multi());
10804 softime 18876 $extra_params = array(
10805     "inst_framework" => $this->f,
10806     );
10807     $this->electronicsignature_instance = new electronicsignature($collectivites, $extra_params);
10808 softime 10573 } catch (electronicsignature_exception $e) {
10809     if ($with_handle_error === true) {
10810     $this->handle_electronicsignature_exception($e);
10811     }
10812     return false;
10813     }
10814     return $this->electronicsignature_instance;
10815     }
10816    
10817     /**
10818 softime 11418 * TREATMENT - envoyer_au_controle_de_legalite
10819     *
10820     * Ajoute la tâche envoi_CL.
10821     * C'est le traitement de la tâche qui mettra à jour la date d'envoi au contrôle de légalité.
10822     *
10823     * @return [type] [description]
10824     */
10825     function envoyer_au_controle_de_legalite() {
10826     $this->begin_treatment(__METHOD__);
10827     $this->correct = true;
10828    
10829     //
10830 softime 18876 if ($this->can_be_sent_to_cl() === true) {
10831 softime 11418 // Création de la task 'envoi_CL'
10832     $inst_task = $this->f->get_inst__om_dbform(array(
10833     "obj" => "task",
10834     "idx" => 0,
10835     ));
10836     $task_val = array(
10837     'type' => 'envoi_CL',
10838     'object_id' => $this->getVal('instruction'),
10839     'dossier' => $this->getVal('dossier'),
10840     );
10841     // Change l'état de la tâche de notification en fonction de l'état de
10842     // transmission du dossier d'instruction
10843     $inst_di = $this->get_inst_dossier($this->getVal('dossier'));
10844     if ($this->f->is_option_mode_service_consulte_enabled() === false
10845     && ($inst_di->getVal('etat_transmission_platau') == 'non_transmissible'
10846     || $inst_di->getVal('etat_transmission_platau') == 'transmis_mais_non_transmissible')) {
10847     //
10848 softime 18436 $task_val['state'] = task::STATUS_DRAFT;
10849 softime 11418 }
10850     $add_task = $inst_task->add_task(array('val' => $task_val));
10851     if ($add_task === false) {
10852     $this->addToMessage(sprintf('%s %s',
10853     __("Une erreur s'est produite lors de la création tâche."),
10854     __("Veuillez contacter votre administrateur.")
10855     ));
10856     $this->correct = false;
10857     return $this->end_treatment(__METHOD__, false);
10858     }
10859     // Mise à jour du champs 'envoye_cl_platau'
10860     $instr_val = array(
10861     'envoye_cl_platau' => 't',
10862     );
10863     $res = $this->f->db->autoExecute(
10864     DB_PREFIXE.$this->table,
10865     $instr_val,
10866     DB_AUTOQUERY_UPDATE,
10867     $this->getCle($this->getVal($this->clePrimaire))
10868     );
10869 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);
10870 softime 11418 if ($this->f->isDatabaseError($res, true) === true) {
10871     $this->addToMessage(sprintf('%s %s',
10872     __("Une erreur s'est produite lors de la mise à jour de l'instruction."),
10873     __("Veuillez contacter votre administrateur.")
10874     ));
10875     $this->correct = false;
10876     return $this->end_treatment(__METHOD__, false);
10877     }
10878     // Message de validation à l'utilisateur
10879     $this->addToMessage(__('Votre demande de transfert au contrôle de légalité à bien été prise en compte.'));
10880     $this->addToMessage(__("La date d'envoi au contrôle de légalité sera mise à jour ultérieurement."));
10881     }
10882     //
10883     return $this->end_treatment(__METHOD__, true);
10884     }
10885    
10886    
10887     /**
10888 softime 8593 * Retourne le lien de retour (VIEW formulaire et VIEW sousformulaire).
10889     *
10890     * @param string $view Appel dans le contexte de la vue 'formulaire' ou de
10891     * la vue 'sousformulaire'.
10892     *
10893     * @return string
10894     */
10895     function get_back_link($view = "formulaire") {
10896     //
10897     $href = parent::get_back_link($view);
10898     //
10899     $crud = $this->get_action_crud();
10900 mbroquet 3730
10901 softime 8593 // Redirection vers le formulaire de modification à la validation du
10902     // formulaire d'ajout si l'événement associé possède une lettre type
10903     if (($crud === 'create'
10904     || ($crud === null
10905     && $this->getParameter('maj') == 0))
10906     && $this->correct == true
10907     && $this->evenement_has_an_edition($this->valF['evenement']) === true) {
10908 softime 7996
10909 softime 8593 // On instancie l'instruction
10910     $inst_instruction = $this->f->get_inst__om_dbform(array(
10911     "obj" => "instruction",
10912     "idx" => $this->valF[$this->clePrimaire],
10913     ));
10914    
10915     // Si l'instruction n'est pas finalisée automatiquement
10916     if ($inst_instruction->getVal('om_final_instruction') !== 't') {
10917     $href = str_replace("&action=3", "&action=1", $href);
10918     //
10919     if (strpos($href, "&retour=tab") !== false) {
10920     $href = str_replace("&retour=tab", "&retour= form", $href);
10921     } else {
10922     $href .= "&retour=form";
10923     }
10924     }
10925     }
10926    
10927     //
10928     return $href;
10929     }
10930    
10931 softime 10573 public function view_json_data() {
10932     $this->checkAccessibility();
10933     $this->f->disableLog();
10934     $view = $this->get_json_data();
10935     printf(json_encode($view));
10936     }
10937    
10938     public function get_json_data() {
10939     $val = array_combine($this->champs, $this->val);
10940     foreach ($val as $key => $value) {
10941     $val[$key] = strip_tags($value);
10942     }
10943     $val['tacite'] = 'f';
10944     $inst_ad = $this->f->get_inst__om_dbform(array(
10945     "obj" => "avis_decision",
10946     "idx" => $val['avis_decision'],
10947     ));
10948     if (preg_match('/[tT]acite/', $inst_ad->getVal('libelle')) === 1) {
10949     $val['tacite'] = 't';
10950     }
10951     return $val;
10952     }
10953    
10954 softime 13528 /**
10955     * Permet de récupérer l'identifiant de l'instruction sur le dossier, ayant
10956     * comme événement lié le suivant définit dans l'événement de l'instruction
10957     * instanciée.
10958     *
10959     * @param string $next_type Correspond aux trois déclenchement automatique
10960     * de création d'instruction paramétré sur un événement.
10961     * @param integer $instruction Identifiant de l'instruction à instancier.
10962     * @return mixed Identifiant de l'instruction recherchée ou false.
10963     */
10964 softime 11418 public function get_related_instructions_next($next_type = 'retour_signature', $instruction = null) {
10965     if (in_array($next_type, array('retour_signature', 'retour_ar', 'suivant_tacite', )) === false) {
10966     return false;
10967     }
10968     $result = array();
10969     $evenements = array();
10970     if ($instruction === null) {
10971     $instruction = $this->getVal($this->clePrimaire);
10972     $evenement = $this->getVal('evenement');
10973     $dossier = $this->getVal('dossier');
10974     } else {
10975     $inst = $this->f->get_inst__om_dbform(array(
10976     "obj" => "instruction",
10977     "idx" => $instruction,
10978     ));
10979     $evenement = $inst->getVal('evenement');
10980     $dossier = $inst->getVal('dossier');
10981     }
10982 softime 13528 // Récupération de l'identifiant de l'événement paramétré comme suivant
10983     // sur l'instruction instanciée
10984 softime 13137 $qres = $this->f->get_one_result_from_db_query(
10985     sprintf(
10986     'SELECT
10987     evenement_%3$s
10988     FROM
10989     %1$sevenement
10990     WHERE
10991     evenement = %2$s',
10992     DB_PREFIXE,
10993     intval($evenement),
10994     $next_type
10995     ),
10996     array(
10997     "origin" => __METHOD__,
10998     "force_return" => true,
10999     )
11000 softime 11418 );
11001 softime 13137 if ($qres["code"] !== "OK") {
11002 softime 11418 return false;
11003     }
11004 softime 13137 $ev_next = $qres["result"];
11005 softime 13528 // Récupération de l'instruction dans le dossier utilisant l'événement
11006     // suivant identifié dans la requête précédente
11007     $qres = $this->f->get_one_result_from_db_query(
11008 softime 13137 sprintf(
11009     'SELECT
11010     MAX(instruction.instruction) as instruction
11011     FROM
11012     %1$sinstruction
11013     WHERE
11014     dossier = \'%3$s\'
11015     AND evenement = %2$s',
11016     DB_PREFIXE,
11017     intval($ev_next),
11018 softime 14064 $this->f->db->escapeSimple($dossier)
11019 softime 13137 ),
11020     array(
11021     "origin" => __METHOD__,
11022     "force_return" => true,
11023     )
11024 softime 11418 );
11025 softime 13137 if ($qres["code"] !== "OK") {
11026 softime 11418 return false;
11027     }
11028 softime 13137 return $qres["result"];
11029 softime 11418 }
11030    
11031 softime 10573 public function get_related_instructions($instruction = null) {
11032     $result = array();
11033     $evenements = array();
11034     if ($instruction === null) {
11035     $instruction = $this->getVal($this->clePrimaire);
11036     $evenement = $this->getVal('evenement');
11037     $dossier = $this->getVal('dossier');
11038     } else {
11039     $inst = $this->f->get_inst__om_dbform(array(
11040     "obj" => "instruction",
11041     "idx" => $instruction,
11042     ));
11043     $evenement = $inst->getVal('evenement');
11044     $dossier = $inst->getVal('dossier');
11045     }
11046     //
11047 softime 13137 $qres = $this->f->get_one_result_from_db_query(
11048     sprintf(
11049     'SELECT
11050     evenement
11051     FROM
11052     %1$sevenement
11053     WHERE
11054     evenement_retour_ar = %2$s
11055     OR evenement_retour_signature = %2$s',
11056     DB_PREFIXE,
11057     intval($evenement)
11058     ),
11059     array(
11060     "origin" => __METHOD__,
11061     "force_return" => true,
11062     )
11063 softime 10573 );
11064 softime 13137 if ($qres["code"] !== "OK") {
11065 softime 10573 return false;
11066     }
11067 softime 13137 $ev_parent = $qres["result"];
11068 softime 10573 //
11069 softime 13137 $qres = $this->f->get_one_result_from_db_query(
11070     sprintf(
11071     'SELECT
11072     MAX(instruction.instruction) as instruction
11073     FROM
11074     %1$sinstruction
11075     WHERE
11076     dossier = \'%3$s\'
11077     AND evenement = %2$s',
11078     DB_PREFIXE,
11079     intval($ev_parent),
11080     $this->f->db->escapeSimple($dossier)
11081     ),
11082     array(
11083     "origin" => __METHOD__,
11084     "force_return" => true,
11085     )
11086 softime 10573 );
11087 softime 13137 if ($qres["code"] !== "OK") {
11088 softime 10573 return false;
11089     }
11090 softime 13137 $result[] = $qres["result"];
11091 softime 10573 //
11092 softime 13137 $qres = $this->f->get_one_result_from_db_query(
11093     sprintf(
11094     'SELECT
11095     evenement_retour_ar
11096     FROM
11097     %1$sevenement
11098     WHERE
11099 softime 14542 evenement = %2$d
11100     AND evenement_retour_ar != %3$d',
11101 softime 13137 DB_PREFIXE,
11102     intval($ev_parent),
11103     intval($evenement)
11104     ),
11105     array(
11106     "origin" => __METHOD__,
11107     "force_return" => true,
11108     )
11109 softime 10573 );
11110 softime 13137 if ($qres["code"] !== "OK") {
11111 softime 10573 return false;
11112     }
11113 softime 13137 $evenements[] = $qres["result"];
11114 softime 10573 //
11115 softime 13137 $qres = $this->f->get_one_result_from_db_query(
11116     sprintf(
11117     'SELECT
11118     evenement_retour_signature
11119     FROM
11120     %1$sevenement
11121     WHERE
11122     evenement = %2$s
11123     AND evenement_retour_signature != %3$s
11124     ',
11125     DB_PREFIXE,
11126     intval($ev_parent),
11127     intval($evenement)
11128     ),
11129     array(
11130     "origin" => __METHOD__,
11131     "force_return" => true,
11132     )
11133 softime 10573 );
11134 softime 13137 if ($qres["code"] !== "OK") {
11135 softime 10573 return false;
11136     }
11137 softime 13137 $evenements[] = $qres["result"];
11138 softime 10573 foreach ($evenements as $value) {
11139     if ($value !== null) {
11140 softime 13137 $qres = $this->f->get_one_result_from_db_query(
11141     sprintf(
11142     'SELECT
11143     MAX(instruction.instruction) as instruction
11144     FROM
11145     %1$sinstruction
11146     WHERE
11147     dossier = \'%3$s\'
11148     AND evenement = %2$s',
11149     DB_PREFIXE,
11150     intval($value),
11151     $this->f->db->escapeSimple($dossier)
11152     ),
11153     array(
11154     "origin" => __METHOD__,
11155     "force_return" => true,
11156     )
11157 softime 10573 );
11158 softime 13137 if ($qres["code"] !== "OK") {
11159 softime 10573 return false;
11160     }
11161 softime 13137 $result[] = $qres["result"];
11162 softime 10573 }
11163     }
11164     return $result;
11165     }
11166    
11167     protected function getDocumentType($champ = null) {
11168     $evenementId = $this->getVal('evenement');
11169     if (! empty($evenementId)) {
11170     $evenement = $this->f->findObjectById('evenement', $evenementId);
11171     if (! empty($evenement)) {
11172     return __("Instruction").':'.$evenement->getVal('libelle');
11173     }
11174     }
11175     return parent::getDocumentType();
11176     }
11177    
11178 softime 10808 /**
11179     * Récupère à l'aide d'une requête sql la liste des demandeurs
11180     * pouvant être notifié. C'est à dire les demandeurs acceptant
11181     * les notifications et pour lesquels une adresse mail existe.
11182     *
11183     * Dans le cas, d'une notification pour le portail citoyen, seul
11184     * le pétitionnaire principal doit être notifier et uniquement si
11185     * il a une adress mail et qu'il accepte les notifications.
11186     *
11187     * @param string identifiant du dossier
11188     * @param boolean true si il faut récupérer la liste des demandeurs notifiable
11189     * pour une notification de categorie portail
11190     * @return array liste des demandeurs pouvant être notifié
11191     */
11192 softime 18436 public function get_demandeurs_notifiable($idDossier = null, $portail = false) {
11193 softime 10808 if ($idDossier === null) {
11194     $idDossier = $this->getVal('dossier');
11195     }
11196     // Ajoute une condition sur le where pour ne récupérer que le pétitionnaire principal
11197     // pour une notification depuis le portail citoyen
11198     $sqlPetitionnairePrincipal = '';
11199 softime 12124 // Gestion des champs nécessaires pour la notification d'un demandeur
11200     $condition_demandeur = "AND demandeur.notification = 't'
11201     AND demandeur.courriel IS NOT NULL";
11202 softime 10808 if ($portail === true) {
11203     $sqlPetitionnairePrincipal = 'AND lien_dossier_demandeur.petitionnaire_principal = true';
11204 softime 12124 $condition_demandeur = "AND (
11205     (notification = 't' AND courriel IS NOT NULL)
11206     OR demande.source_depot = 'portal'
11207     )";
11208 softime 10808 }
11209    
11210     $listeDemandeursNotifiable = array();
11211    
11212     // Requête de récupération des demandeurs
11213 softime 14542 $qres = $this->f->get_all_results_from_db_query(
11214     sprintf(
11215     'SELECT
11216     demandeur.demandeur,
11217     CASE
11218     WHEN demandeur.qualite=\'particulier\'
11219     THEN TRIM(CONCAT(demandeur.particulier_nom, \' \', demandeur.particulier_prenom, \' \', demandeur.courriel))
11220     ELSE
11221     TRIM(CONCAT(demandeur.personne_morale_raison_sociale, \' \', demandeur.personne_morale_denomination, \' \', demandeur.courriel))
11222     END AS destinataire,
11223     demandeur.courriel,
11224     petitionnaire_principal
11225     FROM
11226     %1$sdossier
11227     INNER JOIN %1$slien_dossier_demandeur
11228     ON dossier.dossier = lien_dossier_demandeur.dossier
11229     INNER JOIN %1$sdemandeur
11230     ON lien_dossier_demandeur.demandeur = demandeur.demandeur
11231     -- Récupération de la plus ancienne demande associée au dossier (la demande
11232     -- de création du dossier)
11233     INNER JOIN (
11234     SELECT
11235     demande,
11236     dossier_instruction,
11237     source_depot
11238     FROM
11239     %1$sdemande
11240     WHERE
11241     dossier_instruction = \'%2$s\'
11242     ORDER BY
11243     demande ASC
11244     LIMIT 1
11245     ) as demande
11246     ON dossier.dossier = demande.dossier_instruction
11247     WHERE
11248     dossier.dossier = \'%2$s\'
11249     %3$s
11250     %4$s',
11251     DB_PREFIXE,
11252     $this->f->db->escapeSimple($idDossier),
11253     $condition_demandeur,
11254     $sqlPetitionnairePrincipal
11255     ),
11256     array(
11257     "origin" => __METHOD__
11258     )
11259 softime 10808 );
11260     // Récupération des infos des demandeurs et stockage dans un tableau
11261     // ayant pour clé les id des demandeurs
11262 softime 14542 foreach ($qres['result'] as $row) {
11263 softime 10869 $listeDemandeursNotifiable[$row['demandeur']] = $row;
11264 softime 10808 }
11265    
11266     return $listeDemandeursNotifiable;
11267     }
11268    
11269     /**
11270     * Renvoie la liste des notifications liées à l'instruction
11271     *
11272     * @param integer id de l'instruction dont on cherche les notifications
11273     * @return array liste des instruction_notification liés à l'instruction
11274     */
11275 softime 12124 public function get_instruction_notification($id_instruction, $typeNotification = null, $nonLieTache = false) {
11276 softime 18436 // Compose la clause définissant dans la requête le type de tâche attendus
11277     $clause_type_tache = '';
11278 softime 11585 if ($typeNotification != null) {
11279     if (is_array($typeNotification)) {
11280 softime 18436 $clause_type_tache = sprintf(
11281     'AND task.type IN (\'%1$s\')',
11282     implode("', '", $typeNotification),
11283 softime 11585 );
11284     } else {
11285 softime 18436 $clause_type_tache = sprintf(
11286     'AND task.type = \'%1$s\'',
11287 softime 15037 $typeNotification
11288 softime 11585 );
11289     }
11290     }
11291 softime 18436
11292     // Récupère les notifications liées à des tâches du type voulu et les stocke dans un tableau
11293 softime 14542 $qres = $this->f->get_all_results_from_db_query(
11294     sprintf('
11295     SELECT
11296     instruction_notification.instruction_notification
11297     FROM
11298     %1$sinstruction_notification
11299 softime 18436 INNER JOIN %1$stask
11300 softime 14542 ON instruction_notification.instruction_notification::CHARACTER VARYING = task.object_id
11301 softime 18436 %3$s
11302 softime 14542 WHERE
11303 softime 15037 instruction = %2$s',
11304 softime 14542 DB_PREFIXE,
11305     intval($id_instruction),
11306 softime 18436 $clause_type_tache
11307 softime 14542 ),
11308     array(
11309 softime 18436 "origin" => __METHOD__,
11310     'log_level' => DEBUG_MODE
11311 softime 14542 )
11312 softime 10808 );
11313 softime 18436 $listeInstrNotif = array();
11314 softime 14542 foreach ($qres['result'] as $row) {
11315 softime 10808 $listeInstrNotif[] = $row['instruction_notification'];
11316     }
11317 softime 18436
11318     // Défini si on veux que la requête récupère également les notifications qui n'ont pas
11319     // de tâches associées. C'est le cas pour les notifications de demandeurs lorsque la
11320     // notification du demandeur principal n'a pas pu être envoyée à cause d'un mauvais
11321     // paramétrage
11322     if(is_bool($nonLieTache) && $nonLieTache === true) {
11323     $qres = $this->f->get_all_results_from_db_query(
11324     sprintf('
11325     SELECT
11326     instruction_notification.instruction_notification
11327     FROM
11328     %1$sinstruction_notification
11329     LEFT JOIN %1$stask
11330     ON instruction_notification.instruction_notification::CHARACTER VARYING = task.object_id
11331     AND task.type LIKE \'%%notification%%\'
11332     WHERE
11333     instruction = %2$s
11334     AND task.task IS NULL',
11335     DB_PREFIXE,
11336     intval($id_instruction)
11337     ),
11338     array(
11339     "origin" => __METHOD__
11340     )
11341     );
11342    
11343     foreach ($qres['result'] as $row) {
11344     $listeInstrNotif[] = $row['instruction_notification'];
11345     }
11346     }
11347    
11348 softime 10808 return $listeInstrNotif;
11349     }
11350    
11351     /**
11352     * Crée une clé d'accès unique permettant à un utilisateur
11353     * anonyme de récupérer le document.
11354     *
11355     * @return string clé d'accès du document
11356     */
11357 softime 18436 function getCleAccesDocument() {
11358 softime 10869 // Initialisation d'un tableau
11359     $number_list = array();
11360    
11361     // Génération aléatoire d'un nombre sur 4 caractères, 4 fois
11362     for ($i = 0; $i < 4; $i++) {
11363     $number_list[] = str_pad(mt_rand(0, 9999), 4, 0, STR_PAD_LEFT);
11364     }
11365    
11366     // Transformation en chaîne tout en séparant les nombres par un "-"
11367     $result = implode('-', $number_list);
11368    
11369     // Vérifie si la clé existe déjà et si c'est le cas génére une nouvelle clé
11370     if ($this->getUidDocumentInstructionWithKey($result) != null) {
11371     return $this->getCleAccesDocument();
11372     }
11373    
11374     //
11375     return $result;
11376 softime 10808 }
11377    
11378     /**
11379 softime 10869 * Récupère une clé et renvoie l'uid du document liée à cette
11380     * clé. Si la clé n'existe pas renvoie null.
11381     *
11382     * @param string $cleGen clé dont on cherche l'instruction
11383     * @return integer|null
11384     */
11385     protected function getUidDocumentInstructionWithKey($cleGen) {
11386 softime 14064 $qres = $this->f->get_one_result_from_db_query(
11387     sprintf(
11388     'SELECT
11389     instruction.om_fichier_instruction
11390     FROM
11391     %1$sinstruction_notification_document
11392     LEFT JOIN %1$sinstruction
11393     ON instruction_notification_document.instruction = instruction.instruction
11394     WHERE
11395     instruction_notification_document.cle = \'%2$s\'',
11396     DB_PREFIXE,
11397     $this->f->db->escapeSimple($cleGen)
11398     ),
11399     array(
11400     "origin" => __METHOD__,
11401     )
11402 softime 10869 );
11403 softime 14064
11404     return $qres['result'];
11405 softime 10869 }
11406    
11407     /**
11408     * Récupère une clé, fait une requête pour récupérer l'id de la notification liée a cette clé.
11409     * Récupère l'instance de instruction_notification dont l'id a été récupéré et la renvoie.
11410     *
11411     * @param string $cleGen
11412     * @return instruction_notification
11413     */
11414     protected function getInstanceNotificationWithKey($key) {
11415 softime 14064 $qres = $this->f->get_one_result_from_db_query(
11416     sprintf(
11417     'SELECT
11418     instruction_notification
11419     FROM
11420     %1$sinstruction_notification_document
11421     WHERE
11422     cle = \'%2$s\'',
11423     DB_PREFIXE,
11424     $this->f->db->escapeSimple($key)
11425     ),
11426     array(
11427     "origin" => __METHOD__,
11428     )
11429 softime 10869 );
11430    
11431     // Récupération de l'instance de notification
11432     $instNotif = $this->f->get_inst__om_dbform(array(
11433     "obj" => "instruction_notification",
11434 softime 14064 "idx" => $qres['result'],
11435 softime 10869 ));
11436     return $instNotif;
11437     }
11438    
11439    
11440     /**
11441 softime 10808 * Affiche la page de téléchargement du document de la notification.
11442     *
11443     * @param boolean $content_only Affiche le contenu seulement.
11444     *
11445     * @return void
11446     */
11447 softime 10869 public function view_telecharger_document_anonym() {
11448 softime 10808 // Par défaut on considère qu'on va afficher le formulaire
11449     $idx = 0;
11450     // Flag d'erreur
11451     $error = false;
11452     // Message d'erreur
11453     $message = '';
11454    
11455 softime 10869 // Paramètres GET : récupération de la clé d'accès
11456     $cle_acces_document = $this->f->get_submitted_get_value('key');
11457 softime 10808 $cle_acces_document = $this->f->db->escapeSimple($cle_acces_document);
11458 softime 10869 // Vérification de l'existence de la clé et récupération de l'uid du fichier
11459     $uidFichier = $this->getUidDocumentInstructionWithKey($cle_acces_document);
11460     if ($uidFichier != null) {
11461     // Récupération du document
11462     $file = $this->f->storage->get($uidFichier);
11463 softime 10808
11464 softime 10869 // Headers
11465     header("Cache-Control: no-cache, must-revalidate"); // HTTP/1.1
11466     header("Expires: Sat, 26 Jul 1997 05:00:00 GMT"); // Date dans le passé
11467     header("Content-Type: ".$file['metadata']['mimetype']);
11468     header("Accept-Ranges: bytes");
11469     header("Content-Disposition: inline; filename=\"".$file['metadata']['filename']."\";" );
11470     // Affichage du document
11471     echo $file['file_content'];
11472 softime 10808
11473 softime 10869 // Récupération de la date de premier accès et maj du suivi uniquement
11474     // si la date de 1er accès n'a pas encore été remplis
11475     $inst_notif = $this->getInstanceNotificationWithKey($cle_acces_document);
11476     if ($inst_notif->getVal('date_premier_acces') == null ||
11477     $inst_notif->getVal('date_premier_acces') == '') {
11478     $notif_val = array();
11479     foreach ($inst_notif->champs as $champ) {
11480     $notif_val[$champ] = $inst_notif->getVal($champ);
11481     }
11482     $notif_val['date_premier_acces'] = date("d/m/Y H:i:s");
11483     $notif_val['statut'] = 'vu';
11484     $notif_val['commentaire'] = 'Le document a été vu';
11485     $suivi_notif = $inst_notif->modifier($notif_val);
11486 softime 10808 }
11487    
11488     } else {
11489 softime 10869 // Page vide 404
11490     printf('Ressource inexistante');
11491     header('HTTP/1.0 404 Not Found');
11492 softime 10808 }
11493     }
11494    
11495 softime 11228 /**
11496     * Récupère le titre du document envoyé au parapheur
11497     */
11498 softime 10808 protected function getDocumentTitre($champ = null) {
11499     $title = $this->getTitle();
11500     $dossier = $this->getDossier();
11501     return $dossier.' '.$title;
11502     }
11503    
11504 softime 10869 /**
11505     * Surcharge permettant de ne pas afficher le fil d'Ariane dans
11506     * l'overlay de notification des demandeurs.
11507     */
11508     function getSubFormTitle($ent) {
11509 softime 11876 $actionSansPath = array('411', '420', '430');
11510     if (in_array($this->getParameter('maj'), $actionSansPath)) {
11511 softime 10869 return '';
11512     }
11513     return parent::getSubFormTitle($ent);
11514     }
11515 softime 13137
11516     /**
11517     * Traitement de la notification automatique des tiers consulté.
11518     *
11519     * Récupère la liste des adresses mails des tiers notifiables. Pour chaque adresses
11520     * récupérées ajoute une notification et une tâche de notification par mail.
11521     * La création de la tâche de notification par mail déclenchera l'envoi du mail
11522     * et la mise à jour du suivi.
11523     *
11524     * Les tiers notifiables sont ceux :
11525     * - n’ayant pas un ID PLAT’AU correspondant à l’ID PLAT’AU du service consultant
11526     * - ayant une habilitation dont le type est listé dans les paramètres de
11527     * notification de l’événement,
11528     * - intervenant sur la commune ou le département du dossier
11529     * - ayant au moins une adresse mail valide
11530     *
11531     * @param evenement instance de l'événement associée à l'instruction
11532     * @param dossier instance du dossier de l'instruction
11533     * @return boolean indique si le traitement à réussi
11534     */
11535 softime 18436 public function traitement_notification_automatique_tiers_consulte($evenement, $dossier) {
11536 softime 13137 // Récupération de l'identifiant plat'au du service consultant
11537     $consultationEntrante = $dossier->get_inst_consultation_entrante();
11538     // Récupération de la liste des types d'habilitations autorisées pour
11539     // cette notification
11540     $typesHabilitationsNotifiable = $evenement->get_types_habilitation_notifiable();
11541     // Récupération du département et de la commune du dossier
11542     $commune = $dossier->getVal('commune');
11543     // Le département est récupéré à partir de la commune du dossier donc si la
11544     // commune n'a pas pu être récupéré on ne récupère pas non plus le département.
11545     $idDepartement = null;
11546     if (! empty($commune)) {
11547     $departement = $dossier->get_inst_departement_dossier();
11548     $idDepartement = $departement->getVal($departement->clePrimaire);
11549     }
11550     // Récupération des courriels des tiers notifiables
11551     $tiersANotifier = $this->get_courriels_tiers_notifiable(
11552     $typesHabilitationsNotifiable,
11553     $consultationEntrante->getVal('service_consultant_id'),
11554     $commune,
11555     $idDepartement
11556     );
11557     // Traitement de chacune des listes de diffusion pour extraire les
11558     // courriels, vérifier la validité des courriels et envoyer la
11559     // notification
11560     $notificationSend = false;
11561     if (empty($tiersANotifier)) {
11562     $this->addToLog(
11563     sprintf(
11564 softime 14542 '%s() : %s %s : %s',
11565 softime 13137 __METHOD__,
11566     __("La récupération des tiers à échoué."),
11567     __('Paramétrage'),
11568     var_export(
11569     array(
11570     'types_habilitations_notifiable' => $typesHabilitationsNotifiable,
11571     'service_consultant' => $consultationEntrante->getVal('service_consultant_id'),
11572     'id_commune' => $commune,
11573     'id_departement' => $idDepartement
11574     ),
11575     true
11576     )
11577     ),
11578     DEBUG_MODE
11579     );
11580     return false;
11581     }
11582     foreach($tiersANotifier as $tierANotifier) {
11583     // Découpe la liste de diffusion pour stocker les adresses mails
11584     // des tiers dans un tableau
11585     $courriels =
11586     array_filter(
11587     array_map(
11588     'trim',
11589     preg_split("/\r\n|\n|\r/", $tierANotifier['liste_diffusion'])));
11590    
11591     foreach ($courriels as $courriel) {
11592     // Pour chaque adresse mail vérifie si l'adresse est valide
11593     if (! $this->f->checkValidEmailAddress($courriel)) {
11594     continue;
11595     }
11596     $destinataire = array(
11597     'destinataire' => $tierANotifier['libelle'].' : '.$courriel,
11598     'courriel' => $courriel
11599     );
11600     // Si l'adresse est valide ajoute une nouvelle notification
11601     // et une tâche d'envoi de mails
11602     $idNotif = $this->ajouter_notification(
11603     $this->getVal($this->clePrimaire),
11604     $this->f->get_connected_user_login_name(),
11605     $destinataire,
11606     $this->get_dossier_instruction_om_collectivite(),
11607     array(),
11608     true
11609     );
11610     if ($idNotif === false) {
11611     $this->addToLog(
11612     __METHOD__.
11613     __("L'ajout de la notification a échoué."),
11614     DEBUG_MODE
11615     );
11616     return false;
11617     }
11618     // Création de la tache en lui donnant l'id de la notification
11619     $notification_by_task = $this->notification_by_task(
11620     $idNotif,
11621     $dossier->getVal('dossier'),
11622     'mail',
11623     'notification_tiers_consulte'
11624     );
11625     if ($notification_by_task === false) {
11626     $this->addToLog(
11627     __METHOD__.
11628     __("L'ajout de la tâche de notification a échoué."),
11629     DEBUG_MODE
11630     );
11631     $this->addToMessage(
11632     __("Erreur lors de la génération de la notification au(x) pétitionnaire(s).")
11633     );
11634     return false;
11635     }
11636     $notificationSend = true;
11637     }
11638     }
11639     // Si aucune notification n'a été envoyé car il n'y a pas de courriels
11640     // valide, affiche un message dans les logs pour avoir un suivi.
11641     if (! $notificationSend) {
11642     $this->addToLog(
11643     sprintf(
11644     '%s %s : %s %s : %s',
11645     __METHOD__,
11646     __("Il n'y a pas de tiers notifiable pour l'instruction"),
11647     $evenement->getVal('libelle'),
11648     __("du dossier"),
11649     $this->getVal('dossier')
11650     ),
11651     DEBUG_MODE
11652     );
11653     }
11654     return true;
11655     }
11656    
11657     /**
11658     * Récupère, à l'aide d'une requête, la liste de diffusion des tiers
11659     * respectant les conditions suvantes :
11660     * - le tiers consulté dois accepté les notifications
11661     * - la liste de diffusion ne dois pas être vide
11662     * - l'uid du tiers consulté ne dois pas être celui passé en paramètre
11663     * si pas d'uid passé en paramètre alors on ne filtre pas selon l'uid
11664     * du tiers
11665     * - le type d'habilitation des tiers dois appartenir à la liste
11666     * fournie en paramètre
11667     * - le tiers dois être associé à la commune ou au département passé
11668     * en paramètre
11669     *
11670     * @param array $typesHabilitations tableau contenant la liste des types d'habilitation
11671     * pouvant être notifiée
11672     * @param integer $idPlautau uid de l'acteur plat'au du dossier qui ne dois pas être notifié
11673     * @param integer $commune identifiant de la commune du dossier
11674     * @param integer $departement identifiant du département du dossier
11675     *
11676     * @return array listes de diffusion des tiers notifiable
11677     */
11678 softime 18436 public function get_courriels_tiers_notifiable(array $typesHabilitations, $idPlatau, $commune, $departement) {
11679 softime 13137 // Si paramètre non renseigné alors ne renvoie rien
11680     if (empty($typesHabilitations) || empty($commune) || empty($departement)) {
11681     return false;
11682     }
11683     // Si il n'y a pas d'acteur associé au dossier alors on ne filtre pas sur l'uid de l'acteur
11684     $filtreServiceConsulteDI = '';
11685     if (! empty($idPlatau)) {
11686     $filtreServiceConsulteDI = sprintf(
11687 softime 14064 "-- Filtre les tiers ayant une ligne correspondante a l uid platau du service
11688     -- en charge du dossier
11689     AND (tiers_consulte.uid_platau_acteur !~ ('\y' || '%s' || '\y')
11690     OR tiers_consulte.uid_platau_acteur IS NULL)",
11691 softime 13137 $this->f->db->escapeSimple($idPlatau)
11692     );
11693     }
11694     $rst = $this->f->get_all_results_from_db_query(
11695     sprintf(
11696     'SELECT
11697 softime 14064 -- Tiers notifiables lié à la commune du dossier
11698 softime 13137 tiers_consulte.liste_diffusion,
11699     tiers_consulte.libelle
11700     FROM
11701     %1$shabilitation_tiers_consulte
11702     LEFT JOIN %1$stiers_consulte
11703     ON habilitation_tiers_consulte.tiers_consulte = tiers_consulte.tiers_consulte
11704     LEFT JOIN %1$slien_habilitation_tiers_consulte_commune
11705     ON habilitation_tiers_consulte.habilitation_tiers_consulte = lien_habilitation_tiers_consulte_commune.habilitation_tiers_consulte
11706 softime 14064 -- Conservation uniquement des tiers acteur de dossiers
11707     JOIN %1$slien_dossier_tiers
11708     ON tiers_consulte.tiers_consulte = lien_dossier_tiers.tiers
11709     WHERE
11710     tiers_consulte.accepte_notification_email IS TRUE
11711     AND tiers_consulte.liste_diffusion IS NOT NULL
11712     %3$s
11713     AND habilitation_tiers_consulte.type_habilitation_tiers_consulte IN (%2$s)
11714     AND lien_habilitation_tiers_consulte_commune.commune = %4$d
11715     -- Filtre sur les tiers acteur du dossier
11716     AND lien_dossier_tiers.dossier = \'%6$s\'
11717     UNION
11718     SELECT
11719     -- Tiers notifiables lié au département du dossier
11720     tiers_consulte.liste_diffusion,
11721     tiers_consulte.libelle
11722     FROM
11723     %1$shabilitation_tiers_consulte
11724     LEFT JOIN %1$stiers_consulte
11725     ON habilitation_tiers_consulte.tiers_consulte = tiers_consulte.tiers_consulte
11726 softime 13137 LEFT JOIN %1$slien_habilitation_tiers_consulte_departement
11727     ON habilitation_tiers_consulte.habilitation_tiers_consulte = lien_habilitation_tiers_consulte_departement.habilitation_tiers_consulte
11728 softime 14064 -- Conservation uniquement des tiers acteur de dossiers
11729     JOIN %1$slien_dossier_tiers
11730     ON tiers_consulte.tiers_consulte = lien_dossier_tiers.tiers
11731 softime 13137 WHERE
11732     tiers_consulte.accepte_notification_email IS TRUE
11733     AND tiers_consulte.liste_diffusion IS NOT NULL
11734     %3$s
11735     AND habilitation_tiers_consulte.type_habilitation_tiers_consulte IN (%2$s)
11736 softime 14064 AND lien_habilitation_tiers_consulte_departement.departement = %5$d
11737     -- Filtre sur les tiers acteur du dossier
11738     AND lien_dossier_tiers.dossier = \'%6$s\'',
11739 softime 13137 DB_PREFIXE,
11740     implode(', ', $typesHabilitations),
11741     $filtreServiceConsulteDI,
11742     intval($commune),
11743 softime 14064 intval($departement),
11744     $this->f->db->escapeSimple($this->getVal('dossier'))
11745 softime 13137 ),
11746     array(
11747     "origin" => __METHOD__
11748     )
11749     );
11750 softime 14064 // Faire un order by sur un union ne fonctionne pas. A la place
11751     // c'est le tableau des résultats qui est ordonné.
11752     usort($rst['result'], function($a, $b) {
11753     return strcmp($a['libelle'], $b['libelle']);
11754     });
11755 softime 13137 return $rst['result'];
11756     }
11757 softime 17036
11758     /**
11759 softime 17542 * Gestion spécifique de l'affichage des documents dans le tableau des
11760     * documents d'instruction.
11761     * Prend en compte qu'une instruction peut également avoir un document lié
11762     * dans la table storage.
11763     *
11764     * @return void
11765 softime 17036 */
11766 softime 17542 public function view_telecharger_editions() {
11767     // Récupère l'identifiant du document dans l'URL appelant l'action
11768     $idx = $this->f->get_submitted_get_value('idx');
11769     $obj = $this->table;
11770     $champ = 'om_fichier_instruction';
11771     // Cas d'un document historisé (dans la table storage)
11772     if (strpos($idx, 'STORAGE_') !== false) {
11773     $idx = substr($idx, 8);
11774     $obj = 'storage';
11775     $champ = 'uid';
11776 softime 17036 }
11777 softime 17542 // Ouvre le document
11778     $lien = '../app/index.php?module=form&snippet=file&obj='.$obj.'&champ='.$champ.'&id='.$idx;
11779     header("Location: ".$lien);
11780     }
11781 softime 13137 }

Properties

Name Value
svn:keywords "Id"

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26