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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 18769 - (hide annotations)
Thu Sep 19 14:21:33 2024 UTC (4 months, 1 week ago) by softime
File size: 511153 byte(s)
merge: fusion de la branche d'intégration 6.7.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 mbroquet 3730 $this->class_actions[1]["portlet"]["libelle"] = _("Modifier");
207    
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 mbroquet 3730 $this->class_actions[2]["portlet"]["libelle"] = _("Supprimer");
217    
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     "libelle" => _("Finaliser le document"),
229     "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     "libelle" => _("Reprendre la redaction du document"),
251     "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     "libelle" => _("Remplacer par le document signé"),
274     "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     "libelle" => _("Edition"),
292     "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     "libelle" => _("Suivi des dates"),
307     "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     "libelle" => _("Notifier la commune par courriel"),
406     "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     "libelle" => _("Rédaction libre"),
438     "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     "libelle" => _("Rédaction par compléments"),
459     "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     "libelle" => _("Envoyer à signature"),
496     "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     "can_be_sended_to_cl"
638     ),
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     $this->addToMessage(_("Rédaction par compléments activé."));
1187     return $this->end_treatment(__METHOD__, true);
1188     }
1189    
1190     // Termine le traitement
1191     return $this->end_treatment(__METHOD__, false);
1192     }
1193    
1194     /**
1195     * 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     $this->addToMessage(_("Rédaction libre activé."));
1250     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 11418 * CONDITION - can_be_sended_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 18436 function can_be_sended_to_cl() {
1592     $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     $contenu = array(_("automatique"));
2039     $form->setSelect("bible_auto",$contenu);
2040     // lien bible1
2041     $contenu = array(_("bible"));
2042     $form->setSelect("bible",$contenu);
2043     // lien bible2
2044     $contenu = array(_("bible"));
2045     $form->setSelect("bible2",$contenu);
2046     // lien bible3
2047     $contenu = array(_("bible"));
2048     $form->setSelect("bible3",$contenu);
2049     // lien bible4
2050     $contenu = array(_("bible"));
2051     $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 8593 $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     1 => array(_('Rédaction par compléments'), _('Rédaction libre'), ),
2065     );
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     if($this->valF[$champ] != "" AND !$this->f->user_is_admin) {
2238     // si l'utilisateur n'est pas un admin
2239     if($this->getVal($champ) != "" AND $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     $this->addToMessage(_("Les dates de suivis ne peuvent etre modifiees"));
2248     }
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 mbroquet 3730 $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     $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     }
2525     else {
2526     $form->setLib('flag_edition_integrale', _("Type de rédaction"));
2527     }
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     $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     }
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     $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     $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     $error_message = _("Mauvais parametrage de la restriction.")." ".
2985     _("Contactez votre administrateur");
2986     $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 6565 * Calcul des règle d'action selon leur type.
3086     *
3087     * Types de règle :
3088     * - date
3089     * - numeric
3090     * - text
3091     * - bool
3092     * - specific
3093     * - technical_data
3094 mbroquet 3730 *
3095 softime 6565 * @param string $rule Règle d'action.
3096     * @param string $rule_name Nom de la règle.
3097     * @param string $type Type de la règle.
3098     *
3099 mbroquet 3730 * @return mixed Résultat de la règle
3100     */
3101 softime 6565 public function regle($rule, $rule_name, $type = null) {
3102 mbroquet 3730
3103     // Supprime tous les espaces de la chaîne de caractère
3104     $rule = str_replace(' ', '', $rule);
3105 softime 17542 // On force les minuscules
3106     $rule = strtolower($rule);
3107 mbroquet 3730 // Coupe la chaîne au niveau de l'opérateur
3108     $operands = explode ("+", $rule);
3109     // Nombre d'opérande
3110     $nb_operands = count($operands);
3111    
3112     // Règle à null
3113     if ($rule == "null") {
3114     return null;
3115     }
3116    
3117     // Tableau des champs de type date
3118     $rule_type_date = array(
3119     "regle_date_limite",
3120     "regle_date_notification_delai",
3121     "regle_date_complet",
3122     "regle_date_validite",
3123     "regle_date_decision",
3124     "regle_date_chantier",
3125     "regle_date_achevement",
3126     "regle_date_conformite",
3127     "regle_date_rejet",
3128     "regle_date_dernier_depot",
3129     "regle_date_limite_incompletude",
3130 softime 6565 "regle_date_cloture_instruction",
3131     "regle_date_premiere_visite",
3132     "regle_date_derniere_visite",
3133     "regle_date_contradictoire",
3134     "regle_date_retour_contradictoire",
3135     "regle_date_ait",
3136     "regle_date_transmission_parquet",
3137 softime 8989 "regle_date_affichage",
3138 softime 17542 "duree_validite",
3139     "duree_validite_parametrage",
3140 mbroquet 3730 );
3141     // Tableau des champs de type numérique
3142     $rule_type_numeric = array(
3143 softime 17542 );
3144     // Tableau des champs de type text
3145     $rule_type_time_delai = array(
3146 mbroquet 3730 "regle_delai",
3147     "regle_delai_incompletude",
3148     );
3149 softime 6565 // Tableau des champs de type text
3150     $rule_type_text = array(
3151     );
3152     // Tableau des champs de type booléen
3153     $rule_type_bool = array(
3154 softime 10573 "regle_a_qualifier",
3155     "regle_incompletude",
3156     "regle_incomplet_notifie",
3157     "regle_evenement_suivant_tacite_incompletude",
3158 softime 6565 );
3159     // Tableau des champs spécifiques
3160     $rule_type_specific = array(
3161     "regle_autorite_competente",
3162     "regle_etat",
3163     "regle_accord_tacite",
3164     "regle_avis",
3165 softime 10573 "regle_pec_metier",
3166     "regle_etat_pendant_incompletude",
3167 softime 6565 );
3168     // Tableau des champs de données techniques
3169     $rule_type_technical_data = array(
3170     'regle_donnees_techniques1',
3171     'regle_donnees_techniques2',
3172     'regle_donnees_techniques3',
3173     'regle_donnees_techniques4',
3174     'regle_donnees_techniques5',
3175     );
3176 softime 8593 // Tableau des champs simple
3177     $rule_type_simple = array(
3178     "regle_dossier_instruction_type",
3179     );
3180 mbroquet 3730
3181     // Définit le type du champ
3182     if (in_array($rule_name, $rule_type_date) == true) {
3183     $type = "date";
3184     }
3185     if (in_array($rule_name, $rule_type_numeric) == true) {
3186     $type = "numeric";
3187     }
3188 softime 6565 if (in_array($rule_name, $rule_type_text) === true) {
3189     $type = "text";
3190     }
3191     if (in_array($rule_name, $rule_type_bool) === true) {
3192     $type = "bool";
3193     }
3194     if (in_array($rule_name, $rule_type_specific) === true) {
3195     $type = "specific";
3196     }
3197     if (in_array($rule_name, $rule_type_technical_data) === true) {
3198 softime 17542 $type = 'technical_text';
3199 softime 6565 }
3200 softime 8593 if (in_array($rule_name, $rule_type_simple) === true) {
3201     $type = 'simple';
3202     }
3203 softime 17542 if (in_array($rule_name, $rule_type_time_delai) === true) {
3204     $type = "time_delai";
3205     }
3206 mbroquet 3730
3207 softime 6565 // Si c'est un type spécifique ou booléen alors il n'a qu'un opérande
3208     // Récupère directement la valeur de l'opérande
3209 softime 10573 if ($type === 'specific') {
3210 softime 6565 //
3211     return $this->get_value_for_rule($rule);
3212     }
3213    
3214 mbroquet 3730 // Initialisation des variables
3215     $total_numeric = 0;
3216 softime 6565 $res_text = '';
3217 softime 18436 $final_date = null;
3218 mbroquet 3730
3219     // Pour chaque opérande
3220     foreach ($operands as $key => $operand) {
3221     // Si c'est une règle de type date
3222     if ($type == 'date') {
3223 softime 17542 if (is_numeric($operand) === false){
3224     $rule_value = $this->get_value_for_rule($operand);
3225     if (
3226     $rule_value !== null
3227     && (
3228     strpos($operand, 'mois') !== false
3229     || strpos($operand, 'jour') !== false
3230     )
3231     ){
3232     $rule_value = $operand;
3233     }
3234     if ($rule_value !== null){
3235     // Vérifie si l'opérande est une date
3236     if ($this->f->check_date($rule_value) == true) {
3237     // Affecte la date
3238     $final_date = $rule_value;
3239     }else{
3240     // Gère les opérandes
3241     preg_match_all('/(\d+) *([a-zA-Z]*)/', $rule_value, $matches, PREG_OFFSET_CAPTURE);
3242    
3243     // Ajoute l'opérande au total
3244     foreach ($matches[1] as $matche_key => $matche_value) {
3245     $timelength = $matches[1][$matche_key][0];
3246     $timetype = 'mois';
3247     if ( $matches[2][$matche_key][0] != ''){
3248     $timetype = $matches[2][$matche_key][0];
3249     }
3250     // Ajout au calcul de la date
3251     $final_date = $this->f->mois_date(
3252     $final_date,
3253     $timelength,
3254     "+",
3255     $timetype
3256     );
3257     }
3258     }
3259     }
3260 mbroquet 3730 }
3261     // Les autres opérandes doivent être que des numériques
3262     if (is_numeric($operand) == true) {
3263     // Ajoute l'opérande au total
3264 softime 17542 // Ajout au calcul de la date
3265     $final_date = $this->f->mois_date($final_date,
3266     $operand, "+");
3267 mbroquet 3730 }
3268     }
3269    
3270     // Si c'est une règle de type numérique
3271     if ($type == 'numeric') {
3272     // Les opérandes doivent être que des numériques
3273     if (is_numeric($operand) == true) {
3274     // Ajoute l'opérande au total
3275     $total_numeric += $operand;
3276     }
3277 softime 6565 if (is_numeric($operand) === false
3278     && $this->get_value_for_rule($operand) !== null
3279     && is_numeric($this->get_value_for_rule($operand)) == true) {
3280 mbroquet 3730 // Ajoute l'opérande au total
3281 softime 6565 $total_numeric += $this->get_value_for_rule($operand);
3282 mbroquet 3730 }
3283     }
3284 softime 6565
3285     // Si c'est une règle de type text
3286 softime 17542 if ($type === 'text' || $type === 'technical_text') {
3287 softime 6565 // Concatène toutes les chaînes de caractère
3288     $res_text .= $this->get_value_for_rule($operand);
3289     }
3290 softime 17542
3291     // Si c'est une règle de type time_delai
3292     if ($type === 'time_delai') {
3293     $rule_value = $this->get_value_for_rule($operand);
3294     if ( strlen($res_text) != 0) {
3295     $res_text .= "+";
3296     }
3297     if ($rule_value != null && $rule_value != ''){
3298     // Supprime tous les espaces de la chaîne de caractère
3299     // Concatène toutes les chaînes de caractère
3300     $res_text .= $rule_value;
3301     } else {
3302     $res_text .= $operand;
3303     }
3304     }
3305    
3306 mbroquet 3730 }
3307    
3308     // Résultat pour une règle de type date
3309     if ($type == 'date') {
3310 softime 17542 // Retourne la date
3311     return $final_date;
3312 mbroquet 3730 }
3313    
3314     // Résultat pour une règle de type numérique
3315     if ($type == 'numeric') {
3316     // Retourne le calcul
3317     return $total_numeric;
3318     }
3319 softime 6565
3320     // Résultat pour une règle de type text
3321 softime 17542 if (in_array($type, array('text', 'technical_text')) === true) {
3322 softime 6565 // Retourne la chaîne de caractère
3323     return $res_text;
3324     }
3325 softime 17542
3326     // Résultat pour une règle de type text
3327     if (in_array($type, array('time_delai')) === true) {
3328     // Traitement de la valeur à afficher
3329     $res_text = str_replace(' ', '', $res_text);
3330     $res_text = preg_replace('/(\d+)/', '$1 ', $res_text);
3331     $res_text = preg_replace('/(\+)/', ' $1 ', $res_text);
3332     $res_text = trim(preg_replace('/\s\s+/', ' ', strtolower($res_text)));
3333     return $res_text;
3334     }
3335    
3336 softime 10573 if ($type === 'simple' || $type === 'bool') {
3337 softime 8593 // Retourne la valeur du champs rule
3338     return $rule;
3339     }
3340 softime 6565 }
3341    
3342    
3343     /**
3344     * Récupère la valeur du champs dans l'instruction ou dans les données
3345     * techniques.
3346     * Spécifique au calcul des règles.
3347     *
3348     * @param string $field Champ
3349     *
3350     * @return mixed Valeur du champ
3351     */
3352     private function get_value_for_rule($field) {
3353     // Si le champ n'existe pas dans la table instruction
3354     if (array_key_exists($field, $this->valF) === false) {
3355     // Récupère l'instance de la classe donnees_techniques
3356     $inst_donnees_techniques = $this->get_inst_donnees_techniques();
3357     // Retourne la valeur de la donnée technique
3358     return $inst_donnees_techniques->getVal($field);
3359     }
3360    
3361     //
3362     return $this->valF[$field];
3363     }
3364    
3365    
3366     /**
3367 softime 18436 * Cette méthode permet de générer le nom de fichier lors de la génération du PDF
3368     * (Édition et finalisation) en fonction de l'existence ou non du type de document.
3369     *
3370     * 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é
3371     * sinon on utilise l'id de la lettretype en lien avec l'évènement.
3372     *
3373     * @return string : le nom du fichier générer
3374     */
3375     function determinate_name_doc_pdf(){
3376     $id_DI = $this->getVal("dossier");
3377     $date = date('Ymd');
3378     $data = "";
3379    
3380     // Récupération de l'id de la lettre type associée à l'instruction
3381     $data = $this->getVal("lettretype");
3382    
3383     // Récupération de l'id de l'instruction
3384     $id_instr = $this->getVal("instruction");
3385    
3386     // Si il existe un type de document associé à l'instruction, on le prend à la place de l'id de la lettretype
3387     if(!empty($this->get_type_document_linked_with_instruction())){
3388     $data = strtolower(str_replace(" ", "-", $this->get_type_document_linked_with_instruction()));
3389     }
3390    
3391     // On retourne le nom du fichier généré
3392     return $this->f->normalize_string(
3393     sprintf(
3394     "%s_%s_%s_%s",
3395     $id_DI,
3396     $id_instr,
3397     $date,
3398     $data
3399     )
3400     );
3401     }
3402    
3403    
3404     /**
3405 softime 6565 * [get_inst_donnees_techniques description]
3406     *
3407     * @param [type] $donnees_techniques [description]
3408     *
3409     * @return [type] [description]
3410     */
3411     function get_inst_donnees_techniques($donnees_techniques = null) {
3412     //
3413     if (isset($this->inst_donnees_techniques) === false or
3414     $this->inst_donnees_techniques === null) {
3415     //
3416     if (is_null($donnees_techniques)) {
3417     $donnees_techniques = $this->getDonneesTechniques();
3418     }
3419     //
3420 softime 7996 $this->inst_donnees_techniques = $this->f->get_inst__om_dbform(array(
3421     "obj" => "donnees_techniques",
3422     "idx" => $donnees_techniques,
3423     ));
3424 softime 6565 }
3425     //
3426     return $this->inst_donnees_techniques;
3427     }
3428    
3429    
3430     /**
3431     * Retourne l'identifiant des données techniques liées du dossier
3432     * @return string L'identifiant des données techniques liées du dossier
3433     */
3434     function getDonneesTechniques() {
3435 softime 14064
3436     $qres = $this->f->get_one_result_from_db_query(
3437     sprintf(
3438     'SELECT
3439     donnees_techniques
3440     FROM
3441     %1$sdonnees_techniques
3442     WHERE
3443     dossier_instruction = \'%2$s\'',
3444     DB_PREFIXE,
3445     $this->f->db->escapeSimple($this->valF["dossier"])
3446     ),
3447     array(
3448     "origin" => __METHOD__,
3449     )
3450     );
3451 mbroquet 3730
3452 softime 14064 return $qres['result'];
3453 mbroquet 3730 }
3454    
3455 fmichon 4708 /**
3456     * TRIGGER - triggerajouterapres.
3457     *
3458     * - Mise à jour des informations liées au workflow sur le dossier
3459     * - Interface avec le référentiel ERP [105][111]
3460     * - Mise à jour du DA
3461     * - Historisation de la vie du DI
3462     *
3463     * @return boolean
3464     */
3465 softime 8989 function triggerajouterapres($id, &$dnu1 = null, $val = array(), $dnu2 = null) {
3466     $this->addToLog(__METHOD__."(): start", EXTRA_VERBOSE_MODE);
3467 fmichon 4708
3468 softime 18436 $parent_res = parent::triggerajouterapres($id, $dnu1, $val);
3469     if ($parent_res === false) return $parent_res;
3470    
3471     $data = array('val' => &$val, 'id' => $id, 'parent_res' => &$parent_res);
3472     $this->f->module_manager->run_hooks('triggerajouterapres_override_pre', $this, $data);
3473    
3474 fmichon 4708 // On a besoin de l'instance du dossier lié à l'événement d'instruction
3475     $inst_di = $this->get_inst_dossier($this->valF['dossier']);
3476     // Instance de la classe evenement
3477     $inst_evenement = $this->get_inst_evenement($this->valF['evenement']);
3478 softime 9245 // Instance de l'état courant du dossier d'instruction
3479     $inst_current_etat = $this->f->get_inst__om_dbform(array(
3480     "obj" => "etat",
3481     "idx" => $inst_di->get_id_etat(),
3482     ));
3483 fmichon 4708
3484 mbroquet 3730 /**
3485     * Mise à jour des valeurs du dossier en fonction des valeurs calculées
3486     * par l'action
3487     */
3488 fmichon 4708 // état de complétude actuel du dossier
3489     $incompletude = ($inst_di->getVal('incompletude') == 't' ? true : false);
3490 softime 10573 // L'événement suivant tacite paramétré est destiné à la gestion de l'incomplétude
3491     $ev_suiv_tacite_incompletude = false;
3492 mbroquet 3730 // Initialisation
3493 softime 9245 $valF = array();
3494     $valF_dt = array();
3495 fmichon 4708 //
3496 mbroquet 3730 // Récupération des paramètres de l'action
3497 softime 14542 // TODO : remplacer cette requête par l'instanciation de l'action
3498     $qres = $this->f->get_all_results_from_db_query(
3499     sprintf(
3500     'SELECT
3501     *
3502     FROM
3503     %1$saction
3504     WHERE
3505     action = \'%2$s\'',
3506     DB_PREFIXE,
3507     $this->f->db->escapeSimple($this->valF['action'])
3508     ),
3509     array(
3510     "origin" => __METHOD__
3511     )
3512     );
3513     foreach ($qres['result'] as $row) {
3514 mbroquet 3730
3515     // pour chacune des regles, on applique la regle
3516 softime 6565 if ($row['regle_delai'] != '') {
3517 mbroquet 3730 $valF['delai'] = $this->regle($row['regle_delai'], 'regle_delai');
3518     }
3519 softime 6565 if ($row['regle_accord_tacite'] != '') {
3520 mbroquet 3730 $valF['accord_tacite'] = $this->regle($row['regle_accord_tacite'], 'regle_accord_tacite');
3521     }
3522 softime 6565 if ($row['regle_avis'] != '') {
3523 mbroquet 3730 $valF['avis_decision'] = $this->regle($row['regle_avis'], 'regle_avis');
3524     }
3525 softime 6565 if ($row['regle_date_limite'] != '') {
3526     $valF['date_limite'] = $this->regle($row['regle_date_limite'], 'regle_date_limite');
3527 mbroquet 3730 }
3528 softime 6565 if ($row['regle_date_complet'] != '') {
3529     $valF['date_complet'] = $this->regle($row['regle_date_complet'], 'regle_date_complet');
3530 mbroquet 3730 }
3531 softime 6565 if ($row['regle_date_dernier_depot'] != '') {
3532     $valF['date_dernier_depot'] = $this->regle($row['regle_date_dernier_depot'], 'regle_date_dernier_depot');
3533 mbroquet 3730 }
3534 softime 6565 if ($row['regle_date_notification_delai'] != '') {
3535     $valF['date_notification_delai'] = $this->regle($row['regle_date_notification_delai'], 'regle_date_notification_delai');
3536 mbroquet 3730 }
3537 softime 6565 if ($row['regle_date_decision'] != '') {
3538     $valF['date_decision'] = $this->regle($row['regle_date_decision'], 'regle_date_decision');
3539 mbroquet 3730 }
3540 softime 6565 if ($row['regle_date_rejet'] != '') {
3541     $valF['date_rejet'] = $this->regle($row['regle_date_rejet'], 'regle_date_rejet');
3542 mbroquet 3730 }
3543 softime 6565 if ($row['regle_date_validite'] != '') {
3544     $valF['date_validite'] = $this->regle($row['regle_date_validite'], 'regle_date_validite');
3545 mbroquet 3730 }
3546 softime 6565 if ($row['regle_date_chantier'] != '') {
3547     $valF['date_chantier'] = $this->regle($row['regle_date_chantier'], 'regle_date_chantier');
3548 mbroquet 3730 }
3549 softime 6565 if ($row['regle_date_achevement'] != '') {
3550     $valF['date_achevement'] = $this->regle($row['regle_date_achevement'], 'regle_date_achevement');
3551 mbroquet 3730 }
3552 softime 6565 if ($row['regle_date_conformite'] != '') {
3553     $valF['date_conformite'] = $this->regle($row['regle_date_conformite'], 'regle_date_conformite');
3554 mbroquet 3730 }
3555 softime 6565 if ($row['regle_date_limite_incompletude'] != '') {
3556     $valF['date_limite_incompletude'] = $this->regle($row['regle_date_limite_incompletude'], 'regle_date_limite_incompletude');
3557 mbroquet 3730 }
3558 softime 6565 if ($row['regle_delai_incompletude'] != '') {
3559     $valF['delai_incompletude'] = $this->regle($row['regle_delai_incompletude'], 'regle_delai_incompletude');
3560 mbroquet 3730 }
3561 softime 6565 if ($row['regle_autorite_competente'] != '') {
3562     $valF['autorite_competente'] = $this->regle($row['regle_autorite_competente'], 'regle_autorite_competente');
3563 mbroquet 3730 }
3564 softime 6565 if ($row['regle_etat'] != '') {
3565 softime 10573 $valF['etat'] = $this->regle($row['regle_etat'], 'regle_etat');
3566 mbroquet 3730 }
3567 softime 6565 if ($row['regle_date_cloture_instruction'] !== '') {
3568     $valF['date_cloture_instruction'] = $this->regle($row['regle_date_cloture_instruction'], 'regle_date_cloture_instruction');
3569     }
3570     if ($row['regle_date_premiere_visite'] !== '') {
3571     $valF['date_premiere_visite'] = $this->regle($row['regle_date_premiere_visite'], 'regle_date_premiere_visite');
3572     }
3573     if ($row['regle_date_derniere_visite'] !== '') {
3574     $valF['date_derniere_visite'] = $this->regle($row['regle_date_derniere_visite'], 'regle_date_derniere_visite');
3575     }
3576     if ($row['regle_date_contradictoire'] !== '') {
3577     $valF['date_contradictoire'] = $this->regle($row['regle_date_contradictoire'], 'regle_date_contradictoire');
3578     }
3579     if ($row['regle_date_retour_contradictoire'] !== '') {
3580     $valF['date_retour_contradictoire'] = $this->regle($row['regle_date_retour_contradictoire'], 'regle_date_retour_contradictoire');
3581     }
3582     if ($row['regle_date_ait'] !== '') {
3583     $valF['date_ait'] = $this->regle($row['regle_date_ait'], 'regle_date_ait');
3584     }
3585     if ($row['regle_donnees_techniques1'] !== '') {
3586     $valF_dt[$row['cible_regle_donnees_techniques1']] = $this->regle($row['regle_donnees_techniques1'], 'regle_donnees_techniques1');
3587     }
3588     if ($row['regle_donnees_techniques2'] !== '') {
3589     $valF_dt[$row['cible_regle_donnees_techniques2']] = $this->regle($row['regle_donnees_techniques2'], 'regle_donnees_techniques2');
3590     }
3591     if ($row['regle_donnees_techniques3'] !== '') {
3592     $valF_dt[$row['cible_regle_donnees_techniques3']] = $this->regle($row['regle_donnees_techniques3'], 'regle_donnees_techniques3');
3593     }
3594     if ($row['regle_donnees_techniques4'] !== '') {
3595     $valF_dt[$row['cible_regle_donnees_techniques4']] = $this->regle($row['regle_donnees_techniques4'], 'regle_donnees_techniques4');
3596     }
3597     if ($row['regle_donnees_techniques5'] !== '') {
3598     $valF_dt[$row['cible_regle_donnees_techniques5']] = $this->regle($row['regle_donnees_techniques5'], 'regle_donnees_techniques5');
3599     }
3600     if ($row['regle_date_transmission_parquet'] !== '') {
3601     $valF['date_transmission_parquet'] = $this->regle($row['regle_date_transmission_parquet'], 'regle_date_transmission_parquet');
3602     }
3603 softime 8593 if ($row['regle_dossier_instruction_type'] !== '') {
3604     $valF['dossier_instruction_type'] = $this->regle($row['regle_dossier_instruction_type'], 'regle_dossier_instruction_type');
3605     }
3606 softime 8989 // La date d'affichage est modifiée seulement si le champ n'est pas
3607     // renseigné
3608     if ($row['regle_date_affichage'] !== ''
3609     && ($inst_di->getVal('date_affichage') === ''
3610     || $inst_di->getVal('date_affichage') === null)) {
3611     //
3612     $valF['date_affichage'] = $this->regle($row['regle_date_affichage'], 'regle_date_affichage');
3613     }
3614 softime 10573 //
3615     if ($row['regle_pec_metier'] != '') {
3616     $valF['pec_metier'] = $this->regle($row['regle_pec_metier'], 'regle_pec_metier');
3617     }
3618     if ($row['regle_a_qualifier'] != '') {
3619     $valF['a_qualifier'] = $this->regle($row['regle_a_qualifier'], 'regle_a_qualifier');
3620     }
3621     //
3622     if ($row['regle_incompletude'] != '') {
3623     $valF['incompletude'] = $this->regle($row['regle_incompletude'], 'regle_incompletude');
3624     }
3625     if ($row['regle_incomplet_notifie'] != '') {
3626     $valF['incomplet_notifie'] = $this->regle($row['regle_incomplet_notifie'], 'regle_incomplet_notifie');
3627     }
3628     if ($row['regle_etat_pendant_incompletude'] != '') {
3629     $valF['etat_pendant_incompletude'] = $this->regle($row['regle_etat_pendant_incompletude'], 'regle_etat_pendant_incompletude');
3630     }
3631     if ($row['regle_evenement_suivant_tacite_incompletude'] != '') {
3632     $resti = $this->regle($row['regle_evenement_suivant_tacite_incompletude'], 'regle_evenement_suivant_tacite_incompletude');
3633     if (strtolower($resti) === 't' || strtolower($resti) === 'true') {
3634     $ev_suiv_tacite_incompletude = true;
3635     }
3636     }
3637 mbroquet 3730 }
3638 softime 6063
3639     // Si l'événement a un événement suivant tacite
3640     if($inst_evenement->getVal('evenement_suivant_tacite') != '') {
3641 softime 10573 // En fonction de l'action de l'événement, l'événement suivant tacite ne sera
3642     // pas associé de le même façon au dossier d'instruction
3643     if ($ev_suiv_tacite_incompletude === false) {
3644 softime 6063 $valF['evenement_suivant_tacite'] = $inst_evenement->getVal('evenement_suivant_tacite');
3645 softime 10573 }
3646     if ($ev_suiv_tacite_incompletude === true) {
3647 softime 6063 $valF['evenement_suivant_tacite_incompletude'] = $inst_evenement->getVal('evenement_suivant_tacite');
3648 nhaye 5254 }
3649 mbroquet 3730 }
3650 softime 6565 // Si des valeurs de données techniques ont été calculées alors on met à jour l'enregistrement
3651 softime 9245 if (count($valF_dt) > 0) {
3652 softime 6565 $dt_id = $this->getDonneesTechniques();
3653     // On met à jour le dossier
3654     $cle = " donnees_techniques='".$dt_id."'";
3655 softime 12847 $res1 = $this->f->db->autoexecute(DB_PREFIXE.'donnees_techniques', $valF_dt, DB_AUTOQUERY_UPDATE, $cle);
3656     $this->addToLog(
3657     __METHOD__."(): db->autoexecute(\"".DB_PREFIXE."donnees_techniques\", ".print_r($valF_dt, true).", DB_AUTOQUERY_UPDATE, \"".$cle."\");",
3658     VERBOSE_MODE
3659     );
3660     $this->f->isDatabaseError($res1);
3661 softime 6565 // Affichage d'informations à l'utilisateur
3662 softime 8989 $this->addToMessage(_('enregistrement')." ".$this->valF['dossier']." "._('table')." dossier [".$this->f->db->affectedRows()." "._('enregistrement')." "._('mis_a_jour')."]");
3663 softime 6565 }
3664 mbroquet 3730 // Si des valeurs ont été calculées alors on met à jour l'enregistrement
3665 softime 9245 if (count($valF) > 0) {
3666 softime 10573 //
3667     $inst_dossier = $this->f->get_inst__om_dbform(array(
3668     "obj" => "dossier",
3669     "idx" => $this->valF['dossier'],
3670     ));
3671     $valF['instruction'] = $id;
3672 softime 10968 $valF['crud'] = 'create';
3673 softime 10573 $update_by_instruction = $inst_dossier->update_by_instruction($valF);
3674     if ($update_by_instruction === false) {
3675     $this->cleanMessage();
3676     $this->addToMessage(sprintf('%s %s', __("Une erreur s'est produite lors de la mise à jour du dossier d'instruction."), __("Veuillez contacter votre administrateur.")));
3677     return false;
3678 mbroquet 3730 }
3679     // Affichage d'informations à l'utilisateur
3680 softime 8989 $this->addToMessage(_('enregistrement')." ".$this->valF['dossier']." "._('table')." dossier [".$this->f->db->affectedRows()." "._('enregistrement')." "._('mis_a_jour')."]");
3681 mbroquet 3730 }
3682    
3683     /**
3684 fmichon 4708 * Interface avec le référentiel ERP.
3685     *
3686     * (WS->ERP)[105] Arrêté d'un dossier PC effectué -> PC qui concerne un ERP
3687     * (WS->ERP)[111] Décision de conformité effectuée -> PC qui concerne un ERP
3688     * Déclencheur :
3689     * - L'option ERP est activée
3690     * - Le dossier est marqué comme "connecté au référentiel ERP"
3691     * - Le dossier est de type PC
3692     * - Le formulaire d'ajout d'un événement d'instruction est validé
3693     * avec un événement pour lequel les services ERP doivent être
3694     * informé
3695 mbroquet 3730 */
3696 fmichon 4708 //
3697 softime 7521 if ($this->f->is_option_referentiel_erp_enabled() === true
3698 fmichon 4708 && $inst_di->is_connected_to_referentiel_erp() === true
3699     && $this->f->getDATCode($this->valF['dossier']) == $this->f->getParameter('erp__dossier__nature__pc')
3700     && in_array($inst_evenement->getVal($inst_evenement->clePrimaire), explode(";", $this->f->getParameter('erp__evenements__decision__pc')))) {
3701 mbroquet 3730 //
3702 fmichon 4708 $infos = array(
3703     "dossier_instruction" => $this->valF['dossier'],
3704     "decision" => $inst_evenement->getVal("libelle"),
3705     );
3706 mbroquet 3730 //
3707 fmichon 4708 $ret = $this->f->send_message_to_referentiel_erp(105, $infos);
3708     if ($ret !== true) {
3709     $this->cleanMessage();
3710     $this->addToMessage(_("Une erreur s'est produite lors de la notification (105) du référentiel ERP. Contactez votre administrateur."));
3711     return false;
3712 mbroquet 3730 }
3713 fmichon 4708 $this->addToMessage(_("Notification (105) du référentiel ERP OK."));
3714     }
3715 mbroquet 3730
3716 softime 8989 // Si le mode en rédaction intégrale est activé
3717     if (isset($this->valF['flag_edition_integrale']) === true
3718     && $this->valF['flag_edition_integrale'] === true) {
3719     $redactionIntegraleValF = array();
3720    
3721     // Récupère la collectivite du dossier d'instruction
3722     $dossier_instruction_om_collectivite = $this->get_dossier_instruction_om_collectivite();
3723     $collectivite = $this->f->getCollectivite($dossier_instruction_om_collectivite);
3724     // Récupère le corps de la lettre type
3725     $params = array(
3726     "specific" => array(
3727     "corps" => array(
3728     "mode" => "get",
3729     )
3730     ),
3731     );
3732     $result = $this->compute_pdf_output('lettretype', $this->valF['lettretype'], $collectivite, $id, $params);
3733     $redactionIntegraleValF['corps_om_htmletatex'] = $result['pdf_output'];
3734     // Récupère le titre de la lettre type
3735     $params = array(
3736     "specific" => array(
3737     "titre" => array(
3738     "mode" => "get",
3739     )
3740     ),
3741     );
3742     $result = $this->compute_pdf_output('lettretype', $this->valF['lettretype'], $collectivite, $id, $params);
3743     $redactionIntegraleValF['titre_om_htmletat'] = $result['pdf_output'];
3744    
3745     // mise à jour en base de données
3746     $res = $this->f->db->autoExecute(
3747     DB_PREFIXE.$this->table,
3748     $redactionIntegraleValF,
3749     DB_AUTOQUERY_UPDATE,
3750     $this->clePrimaire."=".$id
3751     );
3752     $this->addToLog(__METHOD__."(): db->autoexecute(\"".DB_PREFIXE.'.'.$this->table."\", ".print_r($redactionIntegraleValF, true).", DB_AUTOQUERY_UPDATE, \"".$this->clePrimaire."=".$id."\");", VERBOSE_MODE);
3753     if ($this->f->isDatabaseError($res, true) === true) {
3754     return false;
3755     }
3756     }
3757    
3758 fmichon 4708 /**
3759 softime 7996 * Finalisation automatique de l'instruction si le paramétrage de l'événement l'autorise
3760     */
3761     // Si la finalisation automatique de l'événement est activée
3762     // ET si l'instruction n'a pas déjà été finalisée
3763     // ET s'il existe une lettre type associée
3764     if ($inst_evenement->getVal('finaliser_automatiquement') === 't'
3765     && $inst_evenement->getVal('om_final_instruction') !== 't'
3766     && $inst_evenement->getVal('lettretype') !== ''
3767     && $inst_evenement->getVal('lettretype') !== null) {
3768    
3769     // On instancie l'instruction
3770     $inst_instruction = $this->f->get_inst__om_dbform(array(
3771     "obj" => "instruction",
3772     "idx" => $this->valF[$this->clePrimaire],
3773     ));
3774    
3775     // On finalise l'instruction dans le contexte de finalisation : action 100
3776     $inst_instruction->setParameter('maj', 100);
3777     $finalize = $inst_instruction->finalize($inst_instruction->valF);
3778    
3779     // Une erreur de finalisation renvoie 'false' : ajout dans les logs
3780     // et dans le message d'erreur
3781     if ($finalize === false) {
3782     $this->f->addToLog(__METHOD__."() : ERROR - Impossible de finaliser l'instruction.", DEBUG_MODE);
3783     $this->addToMessage(_("Erreur lors de la finalisation de l'instruction. Contactez votre administrateur."));
3784     return false;
3785     }
3786     }
3787    
3788     /**
3789 softime 7521 * Finalisation automatique des instructions tacites ou retours.
3790     */
3791 softime 7685 // Si l'option de finalisation automatique des instructions tacites ou
3792     // retours est activée et l'événement d'instruction a une lettre type
3793     // associée
3794     $collectivite_di = $this->get_dossier_instruction_om_collectivite($val['dossier']);
3795     if ($this->f->is_option_finalisation_auto_enabled($collectivite_di) === true
3796     && $inst_evenement->getVal('lettretype') !== ''
3797 softime 7521 && $inst_evenement->getVal('lettretype') !== null) {
3798    
3799     // Rècupère l'identifiant de l'événement
3800     $evenement_id = $inst_evenement->getVal($inst_evenement->clePrimaire);
3801    
3802     // Si l'événement d'instruction est identifié comme un événement
3803     // retour
3804     // OU l'événement d'instruction est l'événement suivant tacite du
3805     // dossier d'instruction (incomplétude prise en compte)
3806 softime 7996 // ET l'événement d'instruction n'a pas déjà été finalisé
3807     if (($inst_evenement->getVal("retour") === 't'
3808 softime 7521 || ($inst_di->getVal('evenement_suivant_tacite_incompletude') === $evenement_id
3809 softime 7996 || $inst_di->getVal('evenement_suivant_tacite') === $evenement_id))
3810     && ($inst_evenement->getVal('om_final_instruction') !== 't')) {
3811 softime 7521
3812     // Finalise l'instruction
3813 softime 7996 $inst_instruction = $this->f->get_inst__om_dbform(array(
3814     "obj" => "instruction",
3815     "idx" => $this->valF[$this->clePrimaire],
3816     ));
3817 softime 7521 $inst_instruction->setParameter('maj', 100);
3818     $finalize = $inst_instruction->finalize($inst_instruction->valF);
3819     if ($finalize === false) {
3820     //
3821     return false;
3822     }
3823     }
3824     }
3825    
3826     /**
3827 softime 9245 * Mise à jour de la version de clôture *version_clos* du dossier si et
3828     * seulement si l'instruction met à jour l'état du dossier.
3829     */
3830     if (isset($valF['etat']) === true
3831     && $valF['etat'] !== null
3832     && $valF['etat'] !== '') {
3833     // Instanciation de l'état appliqué sur le dossier par l'instruction
3834     $inst_etat = $this->f->get_inst__om_dbform(array(
3835     "obj" => "etat",
3836     "idx" => $valF['etat'],
3837     ));
3838     //
3839     $update_version_clos = null;
3840     // En cas d'instruction qui clôture le dossier
3841     if ($inst_etat->getVal('statut') === 'cloture') {
3842     $update_version_clos = $inst_di->update_version_clos('up');
3843     }
3844     // En cas d'instruction qui rouvre le dossier
3845     if ($inst_current_etat->getVal('statut') === 'cloture'
3846     && $inst_etat->getVal('statut') !== 'cloture') {
3847     //
3848     $update_version_clos = $inst_di->update_version_clos('down');
3849     //
3850     $params = array(
3851     'di_reopened' => true,
3852     );
3853     }
3854     //
3855     if ($update_version_clos === false) {
3856     $this->f->addToLog(sprintf(
3857     "%s() : ERREUR - %s %s",
3858     __METHOD__,
3859     sprintf(
3860     __("Impossible de mettre à jour la version de clôture du dossier d'instruction %s."),
3861     $inst_di->getVal($inst_di->clePrimaire)
3862     ),
3863     sprintf(
3864     __("L'instruction tente d'appliquer l'état %s."),
3865     $inst_etat->getVal($inst_etat->clePrimaire)
3866     )
3867     ));
3868     $this->addToMessage(sprintf(
3869     "%s %s",
3870     __("Erreur lors de la mise à jour de la version de clôture du dossier d'instruction."),
3871     __("Veuillez contacter votre administrateur.")
3872     ));
3873     return false;
3874     }
3875     }
3876    
3877     /**
3878 softime 10808 * Notification automatique
3879     */
3880     // Notification automatique à l'ajout de l'instruction si la notification
3881     // automatique est choisie et qu'il n'y a pas de lettretype associée à l'événement
3882     if ($inst_evenement->getVal('notification') === 'notification_automatique' &&
3883     ($inst_evenement->getVal('lettretype') === null ||
3884     $inst_evenement->getVal('lettretype') === '')) {
3885 softime 13137 // Message à afficher dans les logs pour indiquer quelle notification a échouée
3886 softime 13528 $msgLog = sprintf(
3887     '%s %s : %d',
3888     __('Erreur lors de la notification automatique du(des) pétitionnaire(s).'),
3889     __('Instruction notifiée'),
3890     $id
3891     );
3892 softime 13137
3893 softime 10808 // Récupération de la liste des demandeurs à notifier et de la catégorie
3894     $categorie = $this->f->get_param_option_notification($collectivite_di);
3895 softime 14064 $isPortal = $categorie === PORTAL;
3896 softime 10869 $demandeursANotifie = $this->get_demandeurs_notifiable(
3897     $this->valF['dossier'],
3898     $isPortal
3899     );
3900 softime 10808
3901     // Création d'une notification et d'une tâche pour chaque demandeur à notifier
3902 softime 12124 $demandeurPrincipalNotifie = false;
3903 softime 10808 foreach ($demandeursANotifie as $demandeur) {
3904 softime 12124 // Identifie si le demandeur principal a été notifié ou pas
3905     // et récupère ses informations
3906     if ($demandeur['petitionnaire_principal'] == 't') {
3907     $demandeurPrincipalNotifie = true;
3908     // Si le demandeur principal est notifiable mais qu'il y a des erreurs dans
3909     // son paramétrage, on effectue pas le traitement et on passe à l'itération
3910     // suivante. On le considère également comme non notifié pour gérer l'envoie
3911     // des messages d'erreurs
3912     // Si la demande a été déposée via le portail alors le paramétrage n'a pas
3913     // d'impact sur la notification
3914     $erreursParam = $this->get_info_notification_fail($val['dossier']);
3915     if (! $this->dossier_depose_sur_portail($val['dossier']) && $erreursParam != array()) {
3916     $demandeurPrincipalNotifie = false;
3917     continue;
3918     }
3919     }
3920 softime 10808 // Ajout de la notif et récupération de son id
3921     $idNotif = $this->ajouter_notification(
3922     $this->valF[$this->clePrimaire],
3923     $this->f->get_connected_user_login_name(),
3924 softime 10968 $demandeur,
3925     $collectivite_di,
3926 softime 12433 array(),
3927 softime 10968 true
3928 softime 10808 );
3929     if ($idNotif === false) {
3930 softime 13528 $this->addToLog(
3931     sprintf('%s() : %s', __METHOD__, $msgLog),
3932     DEBUG_MODE
3933     );
3934 softime 10808 return false;
3935     }
3936     // Création de la tache en lui donnant l'id de la notification
3937     $notification_by_task = $this->notification_by_task(
3938     $idNotif,
3939     $this->valF['dossier'],
3940     $categorie
3941     );
3942     if ($notification_by_task === false) {
3943 softime 13528 $this->addToLog(
3944     sprintf('%s() : %s', __METHOD__, $msgLog),
3945     DEBUG_MODE
3946     );
3947 softime 10808 $this->addToMessage(
3948     __("Erreur lors de la génération de la notification au(x) pétitionnaire(s).")
3949     );
3950     return false;
3951     }
3952     }
3953 softime 12847 // Pour la notification par mail ou la notification via portal si le dossier a
3954     // été déposés via portal, si le demandeur principal n'est pas notifiable,
3955     // on créé une nouvelle notification en erreur avec en commentaire la raison pour
3956     // laquelle le demandeur principal n'a pas pu être notifié
3957     $depotPortal = $this->dossier_depose_sur_portail();
3958     if (! $demandeurPrincipalNotifie && ($isPortal === false || $depotPortal === true)) {
3959 softime 13137 // Précision dans les logs que le pétitionnaire principal n'est pas notifiable.
3960     // ' ' permet de mettre un espace entre les 2 msg de log.
3961 softime 13528 $msgLog .= sprintf(' %s', __('Le pétitionnaire principale n\'est pas notifiable.'));
3962 softime 12124 // Analyse pour savoir pourquoi le demandeur principal n'est pas notifiable
3963     $erreursParam = $this->get_info_notification_fail($val['dossier']);
3964     $demandeurPrincipal = $this->get_info_petitionnaire_principal_dossier($val['dossier']);
3965     // Ajout de la notif et récupération de son id
3966     $idNotif = $this->ajouter_notification(
3967     $this->valF[$this->clePrimaire],
3968     $this->f->get_connected_user_login_name(),
3969     $demandeurPrincipal,
3970     $collectivite_di,
3971 softime 12433 array(),
3972 softime 12124 true,
3973     'Echec',
3974     implode(' ', $erreursParam)
3975     );
3976     if ($idNotif === false) {
3977 softime 13528 $this->addToLog(
3978     sprintf('%s() : %s', __METHOD__, $msgLog),
3979     DEBUG_MODE
3980     );
3981 softime 12124 $this->addToMessage(
3982     __('Erreur : la création de la notification a échouée.').
3983     __("Veuillez contacter votre administrateur.")
3984     );
3985     return false;
3986     }
3987     // Prépare un message d'alerte à destination de l'instructeur pour l'informer
3988     // de l'échec de la notification
3989     $dossier_message = $this->get_inst_dossier_message(0);
3990     $dossier_message_val = array(
3991     'dossier' => $val['dossier'],
3992     'type' => _('erreur expedition'),
3993     'emetteur' => $this->f->get_connected_user_login_name().' (automatique)',
3994     'login' => $_SESSION['login'],
3995     'date_emission' => date('Y-m-d H:i:s'),
3996     'contenu' => _('Échec lors de la notification de l\'instruction ').
3997     $inst_evenement->getVal('libelle').
3998     '.<br>'.
3999     implode("\n", $erreursParam).
4000     '<br>'.
4001     _('Veuillez corriger ces informations avant de renvoyer la notification.')
4002     );
4003     $add = $dossier_message->add_notification_message($dossier_message_val, true);
4004     // Si une erreur se produit pendant l'ajout
4005     if ($add !== true) {
4006     $this->addToLog(__METHOD__."(): Le message d'alerte concernant l'echec de l'envoi de la notification n'a pas pu être envoyé.", DEBUG_MODE);
4007     return false;
4008     }
4009     }
4010 softime 10808 $this->addToMessage($message = sprintf('%s<br/>%s', __("La notification a été générée."), __("Le suivi de la notification est disponible depuis l'instruction.")));
4011     }
4012    
4013 softime 12654 // Notification automatique en cas de dépôt de dossier dématérialisé
4014     // Vérifie si l'option de notification est active et si il s'agit bien d'une
4015     // instruction de récépissé
4016     if (
4017     $this->f->is_option_notification_depot_demat_enabled($collectivite_di)
4018     && $this->is_instruction_recepisse()
4019     ) {
4020 softime 13137 // Message à afficher dans les logs pour indiquer quelle notification a échouée
4021 softime 13528 $msgLog = sprintf(
4022     __('Erreur lors de la notification de dépôt du dossier dématérialisé : %s.'),
4023     $val['dossier']
4024     );
4025 softime 12654 // Récupère l'instance de la demande
4026     $demande = $inst_di->get_inst_demande();
4027 softime 13137 // Vérifie que le dossier a été déposé via platau ou portal
4028 softime 12654 if (
4029 softime 13137 ($demande->getVal('source_depot') == PLATAU ||
4030     $demande->getVal('source_depot') == PORTAL)
4031 softime 12654 ) {
4032 softime 13137 // Récupère la liste des mails fournis en paramètre. Si aucun adresse n'a été récupéré
4033     // l'envoi de la notification n'est pas effectué et un message d'erreur est affiché.
4034     $listeEmails = $this->f->get_param_courriel_de_notification_commune($collectivite_di);
4035     if (empty($listeEmails)) {
4036     $this->addToLog(
4037 softime 13528 sprintf(
4038     '%s(): %s %s',
4039     __METHOD__,
4040     $msgLog,
4041     __('Aucun courriel paramétré.')
4042     ),
4043 softime 13137 DEBUG_MODE
4044 softime 12654 );
4045 softime 13137 } else {
4046     foreach ($listeEmails as $email) {
4047     // Ajout de la notif et récupération de son id
4048     $destinataire = array(
4049     'destinataire' => $email,
4050     'courriel' => $email
4051 softime 12654 );
4052 softime 13137 $idNotif = $this->ajouter_notification(
4053     $this->valF[$this->clePrimaire],
4054     $this->f->get_connected_user_login_name(),
4055     $destinataire,
4056     $collectivite_di,
4057     array(),
4058     true
4059     );
4060     if ($idNotif === false) {
4061 softime 13528 $this->addToLog(
4062     sprintf('%s(): %s', __METHOD__, $msgLog),
4063     DEBUG_MODE
4064     );
4065 softime 13137 return false;
4066     }
4067     // Création de la tache en lui donnant l'id de la notification
4068     $notification_by_task = $this->notification_by_task(
4069     $idNotif,
4070     $this->valF['dossier'],
4071     'mail',
4072     'notification_depot_demat'
4073     );
4074     if ($notification_by_task === false) {
4075     $this->addToMessage(
4076     __("Erreur lors de la génération de la notification de dépot de dossier par voie dématérialisée.")
4077     );
4078 softime 13528 $this->addToLog(
4079     sprintf('%s(): %s', __METHOD__, $msgLog),
4080     DEBUG_MODE
4081     );
4082 softime 13137 return false;
4083     }
4084 softime 12654 }
4085     }
4086     }
4087     }
4088    
4089 softime 10808 /**
4090 softime 7996 * Mise à jour de la date de dernière modification du dossier
4091     */
4092     $inst_di->update_last_modification_date();
4093    
4094     /**
4095 softime 8640 * Mise à jour des données du DA.
4096     */
4097     $inst_da = $inst_di->get_inst_dossier_autorisation();
4098 softime 9245 $params['di_id'] = $this->valF['dossier'];
4099 softime 8640 if ($inst_da->majDossierAutorisation($params) === false) {
4100     $this->addToMessage(_("Erreur lors de la mise a jour des donnees du dossier d'autorisation. Contactez votre administrateur."));
4101     $this->correct = false;
4102     return false;
4103     }
4104    
4105     /**
4106 fmichon 4708 * Historisation de la vie du DI.
4107     */
4108 softime 17542
4109     $res = $this->add_log_to_dossier($id, array_merge($val, $this->valF));
4110    
4111     $data = array('val' => &$val, 'id' => $id, 'result' => &$res);
4112 softime 18436 $this->f->module_manager->run_hooks('triggerajouterapres_override_post', $this, $data);
4113 softime 17542 return $res;
4114 nmeucci 3876 }
4115 mbroquet 3730
4116 softime 12124 /**
4117     * Cette méthode vérifie si toutes les conditions de l'envoi de la notification
4118     * sont remplies.
4119     * Les conditions vérifiées sont les suivantes :
4120 softime 14064 * - L'option de notification *option_notification* doit être définie
4121 softime 12124 * - Le petitionnaire principal doit accepter les notifications
4122     * - Le pétitionnaire principal doit avoir une adresse mail renseignée
4123     * - Le pétitionnaire principal doit avoir une adresse mail correcte
4124     * Pour chaque vérification effectué un message d'erreur est ajouté si la
4125     * condition n'est pas remplie.
4126     * Renvoie le message d'erreur en sortie.
4127     *
4128     * @param string identifiant du dossier sur lequel les notifications ont échouée
4129     * @return string
4130     */
4131 softime 18436 public function get_info_notification_fail($dossier = null) {
4132 softime 12124 // Utilise l'identifiant du dossier passé en paramètre et si aucun dossier n'a été récupéré
4133     // utilise celui associé à l'instruction
4134     if ($dossier == null) {
4135     $dossier = $this->getVal('dossier');
4136     }
4137     // Tableau contenant la liste des messages d'erreur
4138     $errorMessage = array();
4139 softime 14064 // Récupère l'option de notification
4140     $collectivite_di = $this->get_dossier_instruction_om_collectivite($dossier);
4141     $option_notification = $this->f->get_param_option_notification($collectivite_di);
4142     if ($option_notification !== PORTAL && $option_notification !== 'mail') {
4143     $errorMessage[] = __("L'option de notification option_notification doit obligatoirement être définie.");
4144     }
4145 softime 12124 // Récupère les informations du demandeurs principal
4146     $infoPetitionnaire = $this->get_info_petitionnaire_principal_dossier($dossier);
4147     // Vérifie si le pétitionnaire principal à bien la case "accepte les notification" cochée
4148     if (isset($infoPetitionnaire['notification']) && $infoPetitionnaire['notification'] != 't') {
4149     $errorMessage[] = __('Le pétitionnaire principal n\'accepte pas les notifications.');
4150     }
4151     // Vérifie si l'adresse mail du pétitionnaire principale est renseignée
4152     if (isset($infoPetitionnaire['courriel']) && ! empty($infoPetitionnaire['courriel'])) {
4153     // Vérifie si le format de l'adresse mail est pas correct et, si ce n'est pas le cas, informe l'utilisateur
4154     // qu'il doit le corriger avant de pouvoir ajouter l'nstruction
4155     if (! $this->f->checkValidEmailAddress($infoPetitionnaire['courriel'])) {
4156     $errorMessage[] = __('Le courriel du pétitionnaire principal n\'est pas correct : ').
4157     $infoPetitionnaire['courriel'].
4158     '.';
4159     }
4160     } else {
4161     // Si le courriel du pétitionnaire principal
4162     $errorMessage[] = __('Le courriel du pétitionnaire principal n\'est pas renseigné.');
4163     }
4164 softime 11585
4165 softime 12124 return $errorMessage;
4166     }
4167    
4168     /**
4169     * Méthode servant à vérifier si un dossier a été déposé sur
4170     * le portail citoyen ou pas.
4171     * La verification se fait via une requête sql dans laquelle
4172     * on va chercher un dossier ayant pour id l'identifiant de
4173     * dossier associé à l'instruction et pour lequel la demande
4174     * associée la plus ancienne est une demande de création de
4175     * dossier via portail
4176     *
4177     * @param string identifiant du dossier. Si non renseigné c'est le dossier
4178     * associé à l'instruction qui est utilisé
4179     * @return boolean|void true : dossier déposé via portail, false : dossier
4180     * non déposé via portail et null : erreur de base de données.
4181     */
4182     protected function dossier_depose_sur_portail($dossier = null) {
4183     if (empty($dossier)) {
4184     $dossier = $this->getVal('dossier');
4185     }
4186 softime 13137 $qres = $this->f->get_one_result_from_db_query(
4187     sprintf(
4188     'SELECT
4189     dossier
4190     FROM
4191     %1$sdossier
4192     -- Récuperation de la première demande associée au dossier
4193     LEFT JOIN (
4194     SELECT
4195     demande,
4196     dossier_instruction,
4197     source_depot
4198     FROM
4199     %1$sdemande
4200     WHERE
4201     dossier_instruction = \'%2$s\'
4202     ORDER BY
4203     demande ASC
4204     LIMIT 1
4205 softime 14064 ) AS demande
4206     ON dossier.dossier = demande.dossier_instruction
4207 softime 13137 WHERE
4208     dossier.dossier = \'%2$s\'
4209     AND demande.source_depot = \'portal\'',
4210     DB_PREFIXE,
4211     $this->f->db->escapeSimple($dossier)
4212     ),
4213     array(
4214     "origin" => __METHOD__,
4215     "force_return" => true,
4216     )
4217 softime 12124 );
4218 softime 13137 if ($qres["code"] !== "OK") {
4219 softime 12124 $this->addToMessage(__('Erreur : La vérification du mode de dépôt du dossier à échoué'));
4220     return;
4221     }
4222     // Si on a un résultat c'est que le dossier a été déposé via le portail
4223 softime 13137 return ! empty($qres["result"]);
4224 softime 12124 }
4225    
4226 softime 11585 public function is_service_notifiable() {
4227     $evenement = $this->get_inst_evenement($this->getVal('evenement'));
4228    
4229     // Si l'instruction a une édition non finalisé quel que soit
4230     // le type de notification, il n'est pas notifiable
4231     if ($this->has_an_edition() === true) {
4232     if ($this->is_unfinalizable_without_bypass() === false) {
4233     return false;
4234     }
4235     }
4236     // Vérifie si la notification des tiers est active pour l'évènement
4237     return $this->get_boolean_from_pgsql_value($evenement->getVal('notification_service'));
4238     }
4239    
4240     public function is_tiers_notifiable() {
4241     $evenement = $this->get_inst_evenement($this->getVal('evenement'));
4242    
4243     // Si l'instruction a une édition non finalisé quel que soit
4244     // le type de notification, il n'est pas notifiable
4245     if ($this->has_an_edition() === true) {
4246     if ($this->is_unfinalizable_without_bypass() === false) {
4247     return false;
4248     }
4249     }
4250     // Vérifie si la notification des tiers est active pour l'évènement
4251 softime 13137 return ! empty($evenement->getVal('notification_tiers'));
4252 softime 11585 }
4253    
4254 softime 12124 /**
4255     * Méthode permettant de savoir si une instruction peut
4256     * être notifiée manuellement selon les différents types
4257     * de notification.
4258     *
4259     * Si l'instruction a une édition non finalisée alors elle n'est pas
4260     * manuellement notifiable.
4261     * Si l'instruction est associé à un événement de notification pour
4262     * lequel un retour signature est recquis, elle n'est notifiable que
4263     * si la date de retour de signature est remplie.
4264     * Par défaut si le type de notification n'est pas connu alors l'instruction
4265     * n'est pas notifiable.
4266     * Pour tous les autres cas l'instruction est manuellement notifiable.
4267     *
4268     * @return boolean true : notifiable | false : non notifiable
4269     */
4270 softime 10808 public function is_notifiable_by_task_manual() {
4271     $ev = $this->get_inst_evenement($this->getVal('evenement'));
4272    
4273     // Si l'instruction a une édition non finalisé quel que soit
4274     // le type de notification, il n'est pas notifiable
4275     if ($this->has_an_edition() === true) {
4276     if ($this->is_unfinalizable_without_bypass() === false) {
4277     return false;
4278     }
4279     }
4280    
4281     // Gestion des différents cas selon la valeur du champs notification
4282 softime 12124 if ($ev->getVal('notification') == 'notification_manuelle' ||
4283     $ev->getVal('notification') == 'notification_manuelle_annexe' ||
4284     $ev->getVal('notification') == 'notification_automatique'
4285     ) {
4286     return true;
4287     } elseif (($ev->getVal('notification') == 'notification_auto_signature_requise' ||
4288     $ev->getVal('notification') == 'notification_manuelle_signature_requise' ||
4289     $ev->getVal('notification') == 'notification_manuelle_annexe_signature_requise') &&
4290     $this->getVal('date_retour_signature') != null &&
4291     $this->getVal('date_retour_signature') != ''
4292     ) {
4293     return true ;
4294 softime 10808 }
4295 softime 12124 return false;
4296 softime 10808 }
4297    
4298 softime 8989 /**
4299 softime 14542 * Crée une instance de notification et une tache notification_instruction de catégorie portal
4300     * pour le demandeur principal.
4301 softime 10808 *
4302     * @return boolean true si le traitement à réussi
4303     */
4304 softime 14542 protected function notifier_demandeur_principal_via_portal() {
4305 softime 10808 $this->begin_treatment(__METHOD__);
4306     $message = '';
4307     // Récupération des informations concernant le demandeur
4308     $dossier = $this->getVal('dossier');
4309 softime 10968 $collectivite_di = $this->get_dossier_instruction_om_collectivite($dossier);
4310 softime 10808 $demandeur = $this->get_demandeurs_notifiable(
4311     $dossier,
4312     true
4313     );
4314     if ($demandeur !== array()) {
4315 softime 10869 $destinataire = array_values($demandeur);
4316 softime 10808 // Ajout de la notif et récupération de son id
4317     $idNotification = $this->ajouter_notification(
4318     $this->getVal($this->clePrimaire),
4319     $this->f->get_connected_user_login_name(),
4320 softime 10968 $destinataire[0],
4321     $collectivite_di,
4322 softime 12433 array(),
4323 softime 10968 true
4324 softime 10808 );
4325     if ($idNotification === false) {
4326     return $this->end_treatment(__METHOD__, false);
4327     }
4328     // Création de la tâche en lui donnant l'id de la notification
4329 softime 14542 $notification_by_task = $this->notification_by_task($idNotification, $dossier, PORTAL);
4330 softime 10808 if ($notification_by_task === false) {
4331     $this->addToMessage(
4332     __("Erreur lors de la génération de la notification au(x) pétitionnaire(s).")
4333     );
4334     return $this->end_treatment(__METHOD__, false);
4335     }
4336     $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.")));
4337     return $this->end_treatment(__METHOD__, true);
4338     }
4339     $this->addToMessage( __("Le demandeur principal n'est pas notifiable."));
4340 softime 12124 return $this->end_treatment(__METHOD__, false);
4341 softime 10808 }
4342    
4343     public function notification_by_task($object_id, $dossier, $category = null, $type = null) {
4344     // Si le type n'est pas correctement spécifié, alors il est calculé
4345 softime 11585 if ($type !== 'notification_recepisse'
4346     && $type !== 'notification_instruction'
4347     && $type !== 'notification_decision'
4348     && $type !== 'notification_service_consulte'
4349 softime 12654 && $type !== 'notification_tiers_consulte'
4350     && $type !== 'notification_depot_demat'
4351 softime 15037 && $type !== 'notification_commune'
4352     && $type !== 'notification_signataire') {
4353 softime 10808 //
4354     $type = 'notification_instruction';
4355     // Vérifie si l'instruction est un récépissé
4356 softime 12654 if ($this->is_instruction_recepisse()) {
4357     $type = 'notification_recepisse';
4358    
4359 softime 10808 }
4360     // Vérifie si l'instruction est une décision
4361     if ($type !== 'notification_recepisse') {
4362     $avis_decision = $this->getVal('avis_decision') !== null ? $this->getVal('avis_decision') : $this->valF['avis_decision'];
4363     if ($avis_decision !== null && $avis_decision !== '') {
4364     $type = 'notification_decision';
4365     }
4366     }
4367     }
4368 softime 14064 // Préparation des valeurs de la tâche
4369 softime 10808 $task_val = array(
4370     'type' => $type,
4371     'object_id' => $object_id,
4372     'dossier' => $dossier,
4373     'category' => $category,
4374     );
4375 softime 14064 // Préparation de la tache de notification
4376     $inst_task = $this->f->get_inst__om_dbform(array(
4377     "obj" => "task",
4378     "idx" => 0,
4379     ));
4380 softime 10808
4381     $add_task = $inst_task->add_task(array('val' => $task_val));
4382     if ($add_task === false) {
4383 softime 13528 $this->addToLog(
4384     sprintf(
4385     '%s(): %s %s : %s',
4386     __METHOD__,
4387     __('Echec de l\'ajout de la tâche de notification.'),
4388     __('Paramétrage de la tâche'),
4389     var_export($task_val, true)
4390     ),
4391     DEBUG_MODE
4392     );
4393 softime 10808 return false;
4394     }
4395    
4396     return true;
4397     }
4398    
4399 softime 10968 /**
4400 softime 12654 * Cette méthode permet de savoir si l'instruction est une instruction
4401     * de recepisse (instruction lié à l'ajout du dossier).
4402     *
4403     * Pour cela, on récupère la liste des actions qui ont menées à la création
4404     * de l'instruction. Si une de ces actions est lié à un objet "demande" on
4405     * en deduis que c'est l'ajout d'une demande qui a déclenché la création de
4406     * l'instruction et donc qu'il s'agit d'un recepisse.
4407     *
4408     * @return boolean
4409     */
4410     protected function is_instruction_recepisse() {
4411     // Récupère la liste des actions qui ont mené à la création de
4412     // l'instruction
4413     $trace = debug_backtrace();
4414     // Parcours la liste des actions et si une de ces actions est lié
4415     // à la classe demande on cosidère que l'instruction est un recepisse
4416     foreach ($trace as $key => $value) {
4417     if (isset($trace[$key]['class']) === true
4418     && empty($trace[$key]['class']) === false) {
4419     if (strtolower($trace[$key]['class']) === 'demande') {
4420     return true;
4421     }
4422     }
4423     }
4424     return false;
4425     }
4426    
4427     /**
4428 softime 10968 * A partir des informations passée en argument ajoute un nouvel élément
4429     * dans la table instruction_notification.
4430     * Avant l'ajout vérifie en utilisant l'id de la collectivité passée en
4431     * paramètre si le paramétrage attendus est ok.
4432     * Ajoute également un nouvel élement dans instruction_notification_document
4433     * si l'instruction possède une lettretype.
4434     * Si un identifiant d'une instruction annexe est donnée ajoute un deuxième
4435     * élement dans la table instruction_notification_document qui correspondra
4436     * à l'annexe de la notification.
4437     *
4438     * @param integer identifiant de l'instruction notifiée
4439     * @param string information concernant l'emetteur
4440     * @param array tableau contenant 2 entrées
4441     * - destinatire : nom, prenom ou raison sociale, dénomination et courriel
4442     * - courriel : adresse mail de la personne à notifier
4443     * @param integer identifiant de la collectivité permettant de récupèrer les
4444     * paramètres à valider
4445     * @param boolean indique si la notification est automatique ou manuelle
4446     * @param integer identifiant d'une instruction dont l'édition sera annexé
4447     * à la notification
4448     *
4449     * @return integer|boolean identifiant de la notification créée si le traitement
4450     * a réussie, false sinon.
4451     */
4452 softime 10869 protected function ajouter_notification(
4453     $idInstruction,
4454     $emetteur,
4455     $destinataire,
4456 softime 10968 $collectiviteId,
4457 softime 12433 $annexes = array(),
4458 softime 10968 $demandeAuto = false,
4459 softime 12124 $statut = 'en cours d\'envoi',
4460 softime 12433 $commentaire = 'Notification en cours de traitement'
4461 softime 10869 ) {
4462 softime 10968 // Vérification que les paramètres nécessaires à l'envoi de la notification existe avant
4463     // de créer la notification
4464     if (! $this->is_parametrage_notification_correct($collectiviteId)) {
4465 softime 13137 $msgErreur = __("Erreur de paramétrage. L'url d'accès au(x) document(s) notifié(s) n'est pas paramétrée.");
4466     $this->addToMessage($msgErreur);
4467 softime 13528 $this->addToLog(
4468     sprintf('%s() : %s', __METHOD__, $msgErreur),
4469     DEBUG_MODE
4470     );
4471 softime 10968 return false;
4472     }
4473 softime 10808 // Préparation de la notification
4474     $inst_notif = $this->f->get_inst__om_dbform(array(
4475     "obj" => "instruction_notification",
4476     "idx" => "]",
4477     ));
4478     $notif_val = array(
4479     'instruction_notification' => null,
4480     'instruction' => $idInstruction,
4481     'automatique' => $demandeAuto,
4482     'emetteur' => $emetteur,
4483     'date_envoi' => null,
4484 softime 10869 'destinataire' => $destinataire['destinataire'],
4485     'courriel' => $destinataire['courriel'],
4486 softime 10808 'date_premier_acces' => null,
4487 softime 12124 'statut' => $statut,
4488     'commentaire' => $commentaire
4489 softime 10808 );
4490    
4491     // Création de la notification
4492     $add_notif = $inst_notif->ajouter($notif_val);
4493     if ($add_notif === false) {
4494 softime 10968 $this->addToMessage(__("Erreur lors de la génération de la notification au(x) pétitionnaire(s)."));
4495 softime 13528 $this->addToLog(
4496     sprintf(
4497     '%s() : %s %s : %s',
4498     __METHOD__,
4499     __("Echec de l'ajout de la notification en base de données."),
4500     __('Paramétrage de la notification'),
4501     var_export($notif_val, true)
4502     ),
4503     DEBUG_MODE
4504     );
4505 softime 10808 return false;
4506     }
4507    
4508 softime 10869 // Si il y a une lettretype finalisé stockage de la clé d'accès au documents
4509     if ($this->evenement_has_an_edition($this->getVal('evenement')) === true) {
4510 softime 12433 $add_notif_doc = $this->ajouter_notification_document(
4511     $inst_notif->getVal($inst_notif->clePrimaire),
4512 softime 10869 $this->getVal($this->clePrimaire),
4513 softime 12433 'instruction'
4514 softime 10808 );
4515     if ($add_notif_doc === false) {
4516 softime 10968 $this->addToMessage(__("Erreur lors de la génération de la notification du document."));
4517 softime 10808 return false;
4518     }
4519 softime 10869 }
4520     // Si une annexe a été choisie stockage de la clé d'accès à l'annexe
4521 softime 12433 if (! empty($annexes) && is_array($annexes)) {
4522     $add_notif_annexe = $this->ajouter_notification_document_multiple(
4523 softime 10869 $inst_notif->getVal($inst_notif->clePrimaire),
4524 softime 12433 $annexes
4525 softime 10869 );
4526     if ($add_notif_annexe === false) {
4527 softime 10968 $this->addToMessage(__("Erreur lors de la génération de la notification de l'annexe."));
4528 softime 10869 return false;
4529     }
4530     }
4531 softime 10808
4532     // Renvoie l'id de la nouvelle instance de instruction_notification
4533     return $inst_notif->getVal($inst_notif->clePrimaire);
4534     }
4535    
4536     /**
4537 softime 11585 * Pour chaque élément du tableau passé en paramètre ajoute une nouvelle
4538     * instance dans la table instruction_notification_document lié a la
4539     * notification dont l'id est passé en paramètre.
4540     *
4541     * @param array tableau contenant les informations nécessaires pour créer les annexes
4542     *
4543     * @return integer|boolean identifiant de la notification créée si le traitement
4544     * a réussie, false sinon.
4545     */
4546     protected function ajouter_notification_document_multiple($idNotification, $listeDocument) {
4547 softime 12433 foreach ($listeDocument as $paramDoc) {
4548     if (! $this->ajouter_notification_document($idNotification, $paramDoc['id'], $paramDoc['tableDocument'], $paramDoc['isAnnexe'])) {
4549 softime 11585 $this->addToMessage(__("Erreur lors de la génération des documents à notifier."));
4550     return false;
4551     }
4552     }
4553     return true;
4554     }
4555    
4556     /**
4557     * Ajoute un élément dans la table instruction_notification_document en utilisant
4558     * les éléments fourni en paramètre
4559     *
4560     * @param integer $idNotification : id de la notification à laquelle on associe le document
4561     * @param integer $idDocument : id de l'objet auquel est rattaché le document
4562     * @param string $tableDocument : nom de la table a laquelle est rattaché le document
4563     * @param boolean $isAnnexe : indique si le document est une annexe ou pas
4564     *
4565     * @return boolean indique si le traitement a réussi
4566     */
4567     protected function ajouter_notification_document($idNotification, $idDocument, $tableDocument, $isAnnexe = false) {
4568     $inst_notif_doc = $this->f->get_inst__om_dbform(array(
4569     "obj" => "instruction_notification_document",
4570     "idx" => "]",
4571     ));
4572     // l'attribut instruction doit obligatoirement être renseigné
4573     // pour éviter toutes confusion avec d'autres instruction l'id
4574     // 0 est donné au document n'appartenant pas aux instructions
4575     $notif_doc_val = array(
4576     'instruction_notification_document' => null,
4577     'instruction_notification' => $idNotification,
4578     'instruction' => $tableDocument == 'instruction' ? $idDocument : 0,
4579     'document_type' => $tableDocument,
4580     'document_id' => $idDocument,
4581     'cle' => $this->getCleAccesDocument(),
4582     'annexe' => $isAnnexe
4583     );
4584    
4585     $add_notif_doc = $inst_notif_doc->ajouter($notif_doc_val);
4586     if ($add_notif_doc === false) {
4587 softime 13528 $this->addToLog(
4588     sprintf(
4589     '%s() : %s %s : %s',
4590     __METHOD__,
4591     __('Echec de l\'ajout du paramétrage du document notifié en base de données.'),
4592     __('Paramétrage du document'),
4593     var_export($notif_doc_val, true)
4594     ),
4595     DEBUG_MODE
4596     );
4597 softime 11585 return false;
4598     }
4599     return true;
4600     }
4601 softime 18436
4602 softime 11585 /**
4603 softime 18436 * Récupère via une requête la liste des identifiants des éléments de la table
4604     * parametrage_annexe liés à une instruction.
4605     * Boucle sur cette liste pour instancier le parametrage_annexe correspondant
4606     * et lui appliquer le traitement de suppression.
4607     *
4608     * @param integer identifiant d'une instruction
4609     * @return boolean état du traitement. True : OK, False : Echec
4610     */
4611     function supprimer_parametrage_annexe($id_instruction) {
4612     // Récupère la liste des parametrage_annexe associés à l'instruction
4613     $qres = $this->f->get_all_results_from_db_query(sprintf(
4614     'SELECT parametrage_annexe
4615     FROM %sparametrage_annexe
4616     WHERE parametrage_annexe.instruction = %d',
4617     DB_PREFIXE,
4618     intval($id_instruction)),
4619     array('origin' => __METHOD__));
4620     // Instancie puis supprime chacun des éléments de la liste
4621     foreach ($qres['result'] as $res) {
4622     $parametrage_annexe = $this->f->get_inst__om_dbform(array(
4623     'obj' => 'parametrage_annexe',
4624     'idx' => $res['parametrage_annexe']
4625     ));
4626     foreach ($parametrage_annexe->champs as $champ) {
4627     $val[$champ] = $parametrage_annexe->getVal($champ);
4628     }
4629     $suppression = $parametrage_annexe->supprimer($val);
4630     // En cas d'échec arrête le traitement et renvoie false
4631     if ($suppression === false) {
4632     return false;
4633     }
4634     }
4635     return true;
4636     }
4637    
4638     /**
4639 softime 10968 * Vérifie si le paramétrage de la notification des demandeurs est correct.
4640     *
4641     * @param integer identifiant de la collectivité
4642     * @return boolean
4643     */
4644     protected function is_parametrage_notification_correct($collectiviteId) {
4645     $categorie = $this->f->get_param_option_notification($collectiviteId);
4646     $urlAccesNotif = $this->f->get_parametre_notification_url_acces($collectiviteId);
4647 softime 14064 if ($categorie === 'mail' && $urlAccesNotif === null) {
4648 softime 10968 return false;
4649     }
4650     return true;
4651     }
4652    
4653     /**
4654 softime 8989 * TRIGGER - triggermodifierapres.
4655     *
4656     * @return boolean
4657     */
4658     function triggermodifierapres($id, &$dnu1 = null, $val = array(), $dnu2 = null) {
4659     $this->addToLog(__METHOD__."(): start", EXTRA_VERBOSE_MODE);
4660 softime 17542 $data = array('val' => &$val, 'id' => $id);
4661     $this->f->module_manager->run_hooks('triggermodifierapres_pre', $this, $data);
4662 softime 10808 $collectivite_di = $this->get_dossier_instruction_om_collectivite($val['dossier']);
4663     $message = '';
4664 softime 18769 $res = true;
4665 softime 13137 // Définit si le dossier d'instruction doit être mis à jour
4666     $update_dossier = true;
4667     // Les actions de mise à jour des dates ne doivent pas appliquer
4668     // l'action de l'événement et donc ne pas mettre à jour le dossier
4669     if ($this->getParameter("maj") == 125
4670     || $this->getParameter("maj") == 170
4671     || $this->getParameter("maj") == 175) {
4672     $update_dossier = false;
4673     }
4674    
4675     // Traitement en cas de mise à jour du dossier
4676     if ($update_dossier === true) {
4677     /**
4678     * L'objectif ici est d'effectuer les recalculs de date dans le dossier
4679     * si la date de l'evenement est modifiee
4680     */
4681     // Initialisation
4682     $valF = array();
4683     $valF_dt = array();
4684     // Initialisation du type d'événement
4685     $type_evmt = "";
4686     // Récupération de l'action correspondante à l'événement
4687 softime 14064 $evenement = $this->f->get_inst__om_dbform(array(
4688     "obj" => "evenement",
4689     "idx" => $this->valF['evenement']
4690     ));
4691 softime 13137
4692     // Récupération des paramètres de l'action
4693 softime 14542 // TODO : remplacer cette requête par l'instanciation de l'action
4694     $qres = $this->f->get_all_results_from_db_query(
4695     sprintf(
4696     'SELECT
4697     *
4698     FROM
4699     %1$saction
4700     WHERE
4701     action = \'%2$s\'',
4702     DB_PREFIXE,
4703     $this->f->db->escapeSimple($evenement->getVal('action'))
4704     ),
4705     array(
4706     "origin" => __METHOD__
4707     )
4708 softime 14064 );
4709 softime 14542 foreach ($qres['result'] as $row) {
4710 softime 13137 // application des regles sur le courrier + delai
4711     if(preg_match("/date_evenement/",$row['regle_date_limite'])){
4712     $valF['date_limite']= $this->regle($row['regle_date_limite'], 'regle_date_limite');
4713     }
4714     if(preg_match("/date_evenement/",$row['regle_date_complet'])){
4715     $valF['date_complet']= $this->regle($row['regle_date_complet'], 'regle_date_complet');
4716     }
4717     if(preg_match("/date_evenement/",$row['regle_date_dernier_depot'])){
4718     $valF['date_dernier_depot']= $this->regle($row['regle_date_dernier_depot'], 'regle_date_dernier_depot');
4719     }
4720     if(preg_match("/date_evenement/",$row['regle_date_notification_delai'])){
4721     $valF['date_notification_delai']= $this->regle($row['regle_date_notification_delai'], 'regle_date_notification_delai');
4722     }
4723     if(preg_match("/date_evenement/",$row['regle_date_decision'])){
4724     $valF['date_decision']= $this->regle($row['regle_date_decision'], 'regle_date_decision');
4725     }
4726     if(preg_match("/date_evenement/",$row['regle_date_rejet'])){
4727     $valF['date_rejet']= $this->regle($row['regle_date_rejet'], 'regle_date_rejet');
4728     }
4729     if(preg_match("/date_evenement/",$row['regle_date_validite'])){
4730     $valF['date_validite']= $this->regle($row['regle_date_validite'], 'regle_date_validite');
4731     }
4732     if(preg_match("/date_evenement/",$row['regle_date_chantier'])){
4733     $valF['date_chantier']= $this->regle($row['regle_date_chantier'], 'regle_date_chantier');
4734     }
4735     if(preg_match("/date_evenement/",$row['regle_date_achevement'])){
4736     $valF['date_achevement']= $this->regle($row['regle_date_achevement'], 'regle_date_achevement');
4737     }
4738     if(preg_match("/date_evenement/",$row['regle_date_conformite'])){
4739     $valF['date_conformite']= $this->regle($row['regle_date_conformite'], 'regle_date_conformite');
4740     }
4741     if(preg_match("/date_evenement/",$row['regle_date_cloture_instruction'])){
4742     $valF['date_cloture_instruction']= $this->regle($row['regle_date_cloture_instruction'], 'regle_date_cloture_instruction');
4743     }
4744     if(preg_match("/date_evenement/",$row['regle_date_premiere_visite'])){
4745     $valF['date_premiere_visite']= $this->regle($row['regle_date_premiere_visite'], 'regle_date_premiere_visite');
4746     }
4747     if(preg_match("/date_evenement/",$row['regle_date_derniere_visite'])){
4748     $valF['date_derniere_visite']= $this->regle($row['regle_date_derniere_visite'], 'regle_date_derniere_visite');
4749     }
4750     if(preg_match("/date_evenement/",$row['regle_date_contradictoire'])){
4751     $valF['date_contradictoire']= $this->regle($row['regle_date_contradictoire'], 'regle_date_contradictoire');
4752     }
4753     if(preg_match("/date_evenement/",$row['regle_date_retour_contradictoire'])){
4754     $valF['date_retour_contradictoire']= $this->regle($row['regle_date_retour_contradictoire'], 'regle_date_retour_contradictoire');
4755     }
4756     if(preg_match("/date_evenement/",$row['regle_date_ait'])){
4757     $valF['date_ait']= $this->regle($row['regle_date_ait'], 'regle_date_ait');
4758     }
4759     if(preg_match("/date_evenement/",$row['regle_date_transmission_parquet'])){
4760     $valF['date_transmission_parquet']= $this->regle($row['regle_date_transmission_parquet'], 'regle_date_transmission_parquet');
4761     }
4762     if ($row['regle_donnees_techniques1'] !== '') {
4763     $valF_dt[$row['cible_regle_donnees_techniques1']] = $this->regle($row['regle_donnees_techniques1'], 'regle_donnees_techniques1');
4764     }
4765     if ($row['regle_donnees_techniques2'] !== '') {
4766     $valF_dt[$row['cible_regle_donnees_techniques2']] = $this->regle($row['regle_donnees_techniques2'], 'regle_donnees_techniques2');
4767     }
4768     if ($row['regle_donnees_techniques3'] !== '') {
4769     $valF_dt[$row['cible_regle_donnees_techniques3']] = $this->regle($row['regle_donnees_techniques3'], 'regle_donnees_techniques3');
4770     }
4771     if ($row['regle_donnees_techniques4'] !== '') {
4772     $valF_dt[$row['cible_regle_donnees_techniques4']] = $this->regle($row['regle_donnees_techniques4'], 'regle_donnees_techniques4');
4773     }
4774     if ($row['regle_donnees_techniques5'] !== '') {
4775     $valF_dt[$row['cible_regle_donnees_techniques5']] = $this->regle($row['regle_donnees_techniques5'], 'regle_donnees_techniques5');
4776     }
4777     if ($row['regle_dossier_instruction_type'] !== '') {
4778     $valF['dossier_instruction_type'] = $this->regle($row['regle_dossier_instruction_type'], 'regle_dossier_instruction_type');
4779     }
4780 mbroquet 3730 }
4781 softime 13137 // Si des valeurs de données techniques ont été calculées alors on met à jour l'enregistrement
4782     if (count($valF_dt) > 0) {
4783     $dt_id = $this->getDonneesTechniques();
4784     // On met à jour le dossier
4785     $cle = " donnees_techniques='".$dt_id."'";
4786     $res1 = $this->f->db->autoExecute(DB_PREFIXE.'donnees_techniques', $valF_dt, DB_AUTOQUERY_UPDATE, $cle);
4787     $this->addToLog(
4788     __METHOD__."(): db->autoexecute(\"".DB_PREFIXE."donnees_techniques\", ".print_r($valF_dt, true).", DB_AUTOQUERY_UPDATE, \"".$cle."\");",
4789     VERBOSE_MODE
4790     );
4791     $this->f->isDatabaseError($res1);
4792     // Affichage d'informations à l'utilisateur
4793     $this->addToMessage(_('enregistrement')." ".$this->valF['dossier']." "._('table')." dossier [".$this->f->db->affectedRows()." "._('enregistrement')." "._('mis_a_jour')."]");
4794 mbroquet 3730 }
4795 softime 13137 // Si des valeurs ont été calculées alors on met à jour l'enregistrement
4796     if (count($valF) > 0) {
4797     $inst_dossier = $this->f->get_inst__om_dbform(array(
4798     "obj" => "dossier",
4799     "idx" => $this->valF['dossier'],
4800     ));
4801     $valF['instruction'] = $id;
4802     $valF['crud'] = 'update';
4803     $update_by_instruction = $inst_dossier->update_by_instruction($valF);
4804     if ($update_by_instruction === false) {
4805     $this->cleanMessage();
4806     $this->addToMessage(sprintf('%s %s', __("Une erreur s'est produite lors de la mise à jour du dossier d'instruction."), __("Veuillez contacter votre administrateur.")));
4807     return false;
4808     }
4809     // Affichage d'informations à l'utilisateur
4810     $this->addToMessage(_('enregistrement')." ".$this->valF['dossier']." "._('table')." dossier [".$this->f->db->affectedRows()." "._('enregistrement')." "._('mis_a_jour')."]");
4811 mbroquet 3730 }
4812     }
4813    
4814 softime 14064 // Par défaut les instructions à ajouter suite à la saisie d'une date
4815     // de retour signature ou de notification, utilisent l'action 0
4816     // Si la création d'événement d'instruction suivant est déclenchée par
4817     // une notification suite au traitement d'une tâche (démat') alors l'ajout
4818     // de la nouvelle instruction se fait avec l'action 176
4819     // Cela permet de ne pas contrôler la restriction lors de l'ajout de la
4820     // nouvelle instruction, depuis la méthode verifier()
4821     $code_action_add = 0;
4822     if ($this->getParameter("maj") == 175) {
4823     $code_action_add = 176;
4824     }
4825 mbroquet 3730 $restriction = $this->get_restriction($val['evenement']);
4826     $this->restriction_valid = $this->restrictionIsValid($restriction);
4827    
4828     if($restriction == "" || $this->restriction_valid ){
4829     // Récupération de tous les paramètres de l'événement sélectionné
4830 softime 14542 // TODO : remplacer cette requête par l'instanciation de l'evenement
4831     $qres = $this->f->get_all_results_from_db_query(
4832     sprintf(
4833     'SELECT
4834     *
4835     FROM
4836     %1$sevenement
4837     WHERE
4838     evenement = %2$d',
4839     DB_PREFIXE,
4840     intval($this->valF['evenement'])
4841     ),
4842     array(
4843     "origin" => __METHOD__
4844     )
4845     );
4846 nmeucci 3965 $current_id = $this->getVal($this->clePrimaire);
4847 softime 14542 foreach ($qres['result'] as $row) {
4848 softime 18436 // Si la date de retour signature est éditée
4849     if (
4850     $this->getVal('date_retour_signature') == "" AND
4851     $this->valF['date_retour_signature'] != ""
4852     ){
4853     // On Lance le hook
4854     $data = array('val' => $this->valF);
4855     $data['dossier'] = $this->valF['dossier'];
4856     $this->f->module_manager->run_hooks('update_date_retour_signature_pre', $this, $data);
4857    
4858     // On vérifie si il existe un événement automatique
4859     if (
4860     $row['evenement_retour_signature'] != ""
4861     ) {
4862     $new_instruction = $this->f->get_inst__om_dbform(array(
4863     "obj" => "instruction",
4864     "idx" => "]",
4865     ));
4866     // Création d'un tableau avec la liste des champs de l'instruction
4867     foreach($new_instruction->champs as $champ) {
4868     $valNewInstr[$champ] = "";
4869     }
4870     // Définition des valeurs de la nouvelle instruction
4871     $valNewInstr["evenement"] = $row['evenement_retour_signature'];
4872     $valNewInstr["destinataire"] = $this->valF['destinataire'];
4873     $valNewInstr["dossier"] = $this->valF['dossier'];
4874     $valNewInstr["date_evenement"] = $this->f->formatDate($this->valF['date_retour_signature']);
4875     $valNewInstr["date_envoi_signature"] = $this->f->formatDate($this->valF['date_envoi_signature']);
4876     $valNewInstr["date_retour_signature"] = $this->f->formatDate($this->valF['date_retour_signature']);
4877     $valNewInstr["date_envoi_rar"] = $this->f->formatDate($this->valF['date_envoi_rar']);
4878     $valNewInstr["date_retour_rar"] = $this->f->formatDate($this->valF['date_retour_rar']);
4879     $valNewInstr["date_envoi_controle_legalite"] = $this->f->formatDate($this->valF['date_envoi_controle_legalite']);
4880     $valNewInstr["date_retour_controle_legalite"] = $this->f->formatDate($this->valF['date_retour_controle_legalite']);
4881     $new_instruction->setParameter("maj", $code_action_add);
4882     $new_instruction->class_actions[$code_action_add]["identifier"] =
4883     sprintf(
4884     __("Ajout suite au retour signature de l'instruction %s"),
4885     $current_id
4886     );
4887     $retour = $new_instruction->ajouter($valNewInstr);
4888    
4889     //Si une erreur s'est produite et qu'il s'agit d'un problème
4890     //de restriction
4891     if ($retour == false && !$new_instruction->restriction_valid){
4892     $error_message = $this->get_restriction_error_message($restriction);
4893     $this->f->displayMessage("error", $error_message);
4894     $this->addToLog(__METHOD__."(): evenement retour ".
4895     "instruction ".$this->valF[$this->clePrimaire]." : ".
4896     $new_instruction->msg);
4897     }
4898     //Si une erreur s'est produite après le test de la restriction
4899     elseif ($retour == false && $new_instruction->restriction_valid){
4900     $this->correct = false ;
4901     $this->msg .= $new_instruction->msg;
4902     return false;
4903     }
4904 mbroquet 3730 }
4905 softime 18436
4906     $this->f->module_manager->run_hooks('update_date_retour_signature_post', $this, $data);
4907 mbroquet 3730 }
4908 softime 18436
4909     // Si la date de retour AR est éditée
4910     if (
4911     $this->getVal('date_retour_rar') == "" AND
4912     $this->valF['date_retour_rar'] != ""
4913     ){
4914     // On Lance le hook Notification/Date retour Accusée Reception
4915     $data = array('val' => $this->valF);
4916     $data['dossier'] = $this->valF['dossier'];
4917     $this->f->module_manager->run_hooks('update_date_retour_rar_pre', $this, $data);
4918    
4919     // On vérifie si il existe un événement automatique
4920     if ( $row['evenement_retour_ar'] != "" ) {
4921 softime 7996 $new_instruction = $this->f->get_inst__om_dbform(array(
4922     "obj" => "instruction",
4923     "idx" => "]",
4924     ));
4925 mbroquet 3730 // Création d'un tableau avec la liste des champs de l'instruction
4926     foreach($new_instruction->champs as $champ) {
4927     $valNewInstr[$champ] = "";
4928     }
4929     // Définition des valeurs de la nouvelle instruction
4930     $valNewInstr["evenement"] = $row['evenement_retour_ar'];
4931     $valNewInstr["destinataire"] = $this->valF['destinataire'];
4932     $valNewInstr["dossier"] = $this->valF['dossier'];
4933     $valNewInstr["date_evenement"] = $this->f->formatDate($this->valF['date_retour_rar']);
4934     $valNewInstr["date_envoi_signature"] = $this->f->formatDate($this->valF['date_envoi_signature']);
4935     $valNewInstr["date_retour_signature"] = $this->f->formatDate($this->valF['date_retour_signature']);
4936     $valNewInstr["date_envoi_rar"] = $this->f->formatDate($this->valF['date_envoi_rar']);
4937     $valNewInstr["date_retour_rar"] = $this->f->formatDate($this->valF['date_retour_rar']);
4938     $valNewInstr["date_envoi_controle_legalite"] = $this->f->formatDate($this->valF['date_envoi_controle_legalite']);
4939     $valNewInstr["date_retour_controle_legalite"] = $this->f->formatDate($this->valF['date_retour_controle_legalite']);
4940 softime 14064 $new_instruction->setParameter("maj", $code_action_add);
4941     $new_instruction->class_actions[$code_action_add]["identifier"] =
4942 softime 13137 sprintf(__("Ajout suite à la notification de l'instruction %s"), $current_id);
4943 softime 8989 $retour = $new_instruction->ajouter($valNewInstr);
4944 mbroquet 3730
4945     //Si une erreur s'est produite et qu'il s'agit d'un problème
4946     //de restriction
4947     if ($retour == false && !$new_instruction->restriction_valid) {
4948     $error_message = $this->get_restriction_error_message($restriction);
4949     $this->f->displayMessage("error", $error_message);
4950     $this->addToLog(
4951 softime 8989 __METHOD__."(): evenement retour instruction ".
4952 mbroquet 3730 $this->valF[$this->clePrimaire]." : ".
4953     $new_instruction->msg
4954     );
4955     }
4956     //Si une erreur s'est produite après le test de la restriction
4957     elseif ($retour == false && $new_instruction->restriction_valid){
4958     $this->correct = false ;
4959     $this->msg .= $new_instruction->msg;
4960     return false;
4961     }
4962     }
4963 softime 18436 $this->f->module_manager->run_hooks('update_date_retour_rar_post', $this, $data);
4964 mbroquet 3730 }
4965 softime 18436
4966     // Si la date_envoi_signature est éditée
4967     if (
4968     $this->getVal('date_envoi_signature') == "" AND
4969     $this->valF['date_envoi_signature'] != ""
4970     ){
4971     // On Lance le hook
4972     $data = array('val' => $this->valF);
4973     $data['dossier'] = $this->valF['dossier'];
4974     $this->f->module_manager->run_hooks('update_date_envoi_signature', $this, $data);
4975     }
4976     // Si la date de envoi AR est éditée
4977     if (
4978     $this->getVal('date_envoi_rar') == "" AND
4979     $this->valF['date_envoi_rar'] != ""
4980     ){
4981     // On Lance le hook
4982     $data = array('val' => $this->valF);
4983     $data['dossier'] = $this->valF['dossier'];
4984     $this->f->module_manager->run_hooks('update_date_envoi_rar', $this, $data);
4985     }
4986     // Si la date de envoi controle legalite est éditée
4987     if (
4988     $this->getVal('date_envoi_controle_legalite') == "" AND
4989     $this->valF['date_envoi_controle_legalite'] != ""
4990     ){
4991     // On Lance le hook
4992     $data = array('val' => $this->valF);
4993     $data['dossier'] = $this->valF['dossier'];
4994     $this->f->module_manager->run_hooks('update_date_envoi_controle_legalite', $this, $data);
4995     }
4996     // Si la date de retour controle legalite est éditée
4997     if (
4998     $this->getVal('date_retour_controle_legalite') == "" AND
4999     $this->valF['date_retour_controle_legalite'] != ""
5000     ){
5001     // On Lance le hook
5002     $data = array('val' => $this->valF);
5003     $data['dossier'] = $this->valF['dossier'];
5004     $this->f->module_manager->run_hooks('update_date_retour_controle_legalite', $this, $data);
5005     }
5006 mbroquet 3730 }
5007     }
5008    
5009 softime 13137 // Traitement en cas de mise à jour du dossier
5010     if ($update_dossier === true) {
5011     /**
5012     * Mise à jour de la date de dernière modification du dossier
5013     * d'instruction
5014     */
5015     $inst_di = $this->get_inst_dossier($this->getVal('dossier'));
5016     $inst_di->update_last_modification_date();
5017 softime 8640
5018 softime 13137 // Mise à jour des données du dossier d'autorisation
5019     $da = $this->f->get_inst__om_dbform(array(
5020     "obj" => "dossier_autorisation",
5021     "idx" => $this->getNumDemandeAutorFromDossier($this->valF['dossier']),
5022     ));
5023     $params = array(
5024     'di_id' => $this->getVal('dossier'),
5025     );
5026     if($da->majDossierAutorisation($params) === false) {
5027     $this->addToMessage(_("Erreur lors de la mise a jour des donnees du dossier d'autorisation. Contactez votre administrateur."));
5028     $this->correct = false;
5029     return false;
5030     }
5031 mbroquet 3730 }
5032 softime 7996
5033 softime 10573 // mise à jour des métadonnées issues des dates de suivi
5034     $dateRetourSignatureModified = ($this->valF['date_retour_signature'] != $this->getVal('date_retour_signature'));
5035     $dateRetourRARModified = ($this->valF['date_retour_rar'] != $this->getVal('date_retour_rar'));
5036     if ($dateRetourSignatureModified || $dateRetourRARModified) {
5037    
5038     // Calculs des nouvelles métadonnées
5039     $metadata = $this->getMetadata("om_fichier_instruction");
5040    
5041     // On vérifie si l'instruction à finaliser a un événement de type arrete
5042 softime 14064 // TODO : A voir pour remplacer par une instanciation de l'événement.
5043     // Voir également si l'événement ne dois pas être instancié en début de
5044     // méthode pour pouvoir être réutilisé.
5045     $qres = $this->f->get_one_result_from_db_query(
5046     sprintf(
5047     'SELECT
5048     type
5049     FROM
5050     %1$sevenement
5051     WHERE
5052     evenement = \'%2$d\'',
5053     DB_PREFIXE,
5054     intval($this->getVal("evenement"))
5055     ),
5056     array(
5057     "origin" => __METHOD__,
5058     "force_return" => true,
5059     )
5060     );
5061    
5062     if ($qres["code"] !== "OK") {
5063 softime 10573 $this->correct = false;
5064     $this->addToMessage(__("Erreur de traitement de fichier."));
5065 softime 14064 $this->addToLog(__METHOD__."() erreur BDD: ".var_export($qres['message'], true), DEBUG_MODE);
5066 softime 10573 return false;
5067     }
5068    
5069     // Si l'événement est de type arrete, on ajoute les métadonnées spécifiques
5070 softime 14064 if ($qres['result'] == 'arrete'){
5071 softime 10573 $metadata = array_merge($metadata, $this->getMetadata("arrete"));
5072     }
5073    
5074     // Filtre pour conserver uniquement les métadonnées liées aux dates
5075     $metadataToKeep = array(
5076     "statutAutorisation",
5077     "dateEvenementDocument",
5078     'date_cloture_metier',
5079     "NotificationArrete",
5080     "dateNotificationArrete",
5081     "controleLegalite",
5082     "dateSignature",
5083     "nomSignataire",
5084     "qualiteSignataire",
5085     "dateControleLegalite",
5086     );
5087     $metadata = array_filter(
5088     $metadata,
5089     function($key) use ($metadataToKeep) { return in_array($key, $metadataToKeep); },
5090     ARRAY_FILTER_USE_KEY
5091     );
5092    
5093     // Mise à jour des métadonnées du document en GED
5094     $docUid = $this->getVal("om_fichier_instruction");
5095     $operationOrUID = $this->f->storage->update_metadata($docUid, $metadata);
5096     if ($operationOrUID == 'OP_FAILURE') {
5097     $this->correct = false;
5098     $this->addToMessage(__("Erreur de traitement de fichier."));
5099     $this->addToLog(__METHOD__."() failed to update metadata: ".var_export($operationOrUID, true), DEBUG_MODE);
5100     return false;
5101     }
5102    
5103     // mise à jour de l'UID du document en BDD
5104     else {
5105     $valF = array('om_fichier_instruction' => $operationOrUID);
5106     $res = $this->f->db->autoExecute(DB_PREFIXE.$this->table, $valF, DB_AUTOQUERY_UPDATE, $this->getCle($id));
5107     $this->addToLog(__METHOD__.'() : db->autoExecute("'.DB_PREFIXE.$this->table.'", '.print_r($valF, true).', DB_AUTOQUERY_UPDATE, "'.$this->getCle($id).'")', VERBOSE_MODE);
5108     if ($this->f->isDatabaseError($res, true) === true) {
5109     $this->correct = false;
5110     $this->addToMessage(__("Erreur de traitement de fichier."));
5111     $this->addToLog(__METHOD__."() erreur BDD: ".var_export($res->getMessage(), true), DEBUG_MODE);
5112     return false;
5113     }
5114     $this->addToMessage(__("La mise a jour du document s'est effectuee avec succes."));
5115     }
5116     }
5117    
5118 softime 13137 // Déclenchement des notifications automatique après finalisation et
5119     // retour de signature
5120 softime 10808 if ($dateRetourSignatureModified === true
5121     && $this->valF['date_retour_signature'] !== ''
5122     && $this->valF['date_retour_signature'] !== null) {
5123 softime 13137
5124     // Message à afficher dans les logs pour indiquer quelle notification a échouée
5125 softime 13528 $msgLog = sprintf(
5126     '%s %s : %d',
5127     __('Erreur lors de la notification automatique du(des) pétitionnaire(s) après retour signature.'),
5128     __('Instruction notifiée'),
5129     $id
5130     );
5131 softime 13137
5132     // Récupération de l'instance de l'événement pour accéder au paramètrage
5133     // des notifications
5134 softime 10808 $ev = $this->get_inst_evenement($this->valF['evenement']);
5135 softime 13137 // Si la notification automatique des tiers consulté est active
5136     // déclenche le traitement de notification.
5137     // Ce traitement va envoyer des courriels de notification à tous les tiers concernés
5138     $typeNotifTiers = $ev->getVal('notification_tiers');
5139     $inst_di = $this->get_inst_dossier($this->getVal('dossier'));
5140     if ($typeNotifTiers === 'notification_automatique') {
5141     if ($this->traitement_notification_automatique_tiers_consulte($ev, $inst_di) === false) {
5142     $this->addToMessage(__('Le traitement de la notification automatique de tiers à échoué.'));
5143     $this->correct = false;
5144     }
5145     }
5146    
5147 softime 10808 if ($ev->getVal('notification') === 'notification_auto_signature_requise') {
5148     // Récupération de la liste des demandeurs à notifier et de la catégorie
5149     $categorie = $this->f->get_param_option_notification($collectivite_di);
5150 softime 14064 $isPortal = $categorie === PORTAL;
5151 softime 10869 $demandeursANotifie = $this->get_demandeurs_notifiable(
5152     $this->valF['dossier'],
5153     $isPortal
5154     );
5155 softime 10808
5156     // Création d'une notification et d'une tâche pour chaque demandeur à notifier
5157 softime 12124 $demandeurPrincipalNotifie = false;
5158 softime 10808 foreach ($demandeursANotifie as $demandeur) {
5159 softime 12124 // Identifie si le demandeur principal a été notifié ou pas
5160     // et récupère ses informations
5161     if ($demandeur['petitionnaire_principal'] == 't') {
5162     $demandeurPrincipalNotifie = true;
5163     // Si le demandeur principal est notifiable mais qu'il y a des erreurs dans
5164     // son paramétrage, on effectue pas le traitement et on passe à l'itération
5165     // suivante. On le considère également comme non notifié pour gérer l'envoie
5166     // des messages d'erreurs
5167     // Si la demande a été déposée via le portail alors le paramétrage n'a pas
5168     // d'impact sur la notification
5169     $erreursParam = $this->get_info_notification_fail();
5170     if (! $this->dossier_depose_sur_portail() && $erreursParam != array()) {
5171     $demandeurPrincipalNotifie = false;
5172     continue;
5173     }
5174     }
5175 softime 10808 // Ajout de la notif et récupération de son id
5176     $idNotif = $this->ajouter_notification(
5177     $this->valF[$this->clePrimaire],
5178     $this->f->get_connected_user_login_name(),
5179 softime 10968 $demandeur,
5180     $collectivite_di,
5181 softime 12433 array(),
5182 softime 10968 true
5183 softime 10808 );
5184     if ($idNotif === false) {
5185 softime 13528 $this->addToLog(
5186     sprintf('%s() : %s',__METHOD__, $msgLog),
5187     DEBUG_MODE
5188     );
5189 softime 10808 return false;
5190     }
5191     // Création de la tache en lui donnant l'id de la notification
5192     $notification_by_task = $this->notification_by_task(
5193     $idNotif,
5194     $this->valF['dossier'],
5195     $categorie
5196     );
5197     if ($notification_by_task === false) {
5198 softime 13528 $this->addToLog(
5199     sprintf('%s() : %s',__METHOD__, $msgLog),
5200     DEBUG_MODE
5201     );
5202 softime 10808 $this->addToMessage(
5203     __("Erreur lors de la génération de la notification au(x) pétitionnaire(s).")
5204     );
5205     return false;
5206     }
5207     }
5208 softime 12847 // Pour la notification par mail ou la notification via portal si le dossier a
5209     // été déposés via portal, si le demandeur principal n'est pas notifiable,
5210     // on créé une nouvelle notification en erreur avec en commentaire la raison pour
5211     // laquelle le demandeur principal n'a pas pu être notifié
5212     $depotPortal = $this->dossier_depose_sur_portail();
5213     if (! $demandeurPrincipalNotifie && ($isPortal === false || $depotPortal === true)) {
5214 softime 13137 // Précise dans les logs que le pétitionnaire principal n'a pas été notifié
5215 softime 13528 $msgLog .= sprintf(' %s', __('Le pétitionnaire principale n\'est pas notifiable.'));
5216 softime 12124 // Analyse pour savoir pourquoi le demandeur principal n'est pas notifiable
5217     $erreursParam = $this->get_info_notification_fail();
5218     $demandeurPrincipal = $this->get_info_petitionnaire_principal_dossier($this->getVal('dossier'));
5219     // Ajout de la notif et récupération de son id
5220     $idNotif = $this->ajouter_notification(
5221     $this->valF[$this->clePrimaire],
5222     $this->f->get_connected_user_login_name(),
5223     $demandeurPrincipal,
5224     $collectivite_di,
5225 softime 12433 array(),
5226 softime 12124 true,
5227     'Echec',
5228     implode(' ', $erreursParam)
5229     );
5230     if ($idNotif === false) {
5231 softime 13528 $this->addToLog(
5232     sprintf('%s() : %s', __METHOD__, $msgLog),
5233     DEBUG_MODE
5234     );
5235 softime 12124 $this->addToMessage(
5236     __('Erreur : la création de la notification a échouée.').
5237     __("Veuillez contacter votre administrateur.")
5238     );
5239     return false;
5240     }
5241     // Prépare un message d'alerte à destination de l'instructeur pour l'informer
5242     // de l'échec de la notification
5243     $dossier_message = $this->get_inst_dossier_message(0);
5244     $dossier_message_val = array(
5245     'dossier' => $this->getVal('dossier'),
5246     'type' => _('erreur expedition'),
5247     'emetteur' => $this->f->get_connected_user_login_name(),
5248     'login' => $_SESSION['login'],
5249     'date_emission' => date('Y-m-d H:i:s'),
5250     'contenu' => _('Échec lors de la notification de l\'instruction ').
5251     $ev->getVal('libelle').
5252     '.<br>'.
5253     implode("\n", $erreursParam).
5254     '<br>'.
5255     _('Veuillez corriger ces informations avant de renvoyer la notification.')
5256     );
5257     $add = $dossier_message->add_notification_message($dossier_message_val, true);
5258     // Si une erreur se produit pendant l'ajout
5259     if ($add !== true) {
5260 softime 13528 $this->addToLog(
5261     sprintf(
5262     '%s() : %s',
5263     __METHOD__,
5264     __("Le message d'alerte concernant l'echec de l'envoi de la notification n'a pas pu être envoyé.")
5265     ),
5266     DEBUG_MODE
5267     );
5268 softime 12124 return false;
5269     }
5270     }
5271 softime 10808 $this->addToMessage($message .= sprintf('%s<br/>%s', __("La notification a été générée."), __("Le suivi de la notification est disponible depuis l'instruction.")));
5272     }
5273     }
5274 softime 18769 // Assigner les champs 'valF' à 'val' lorsque la modification a réussi
5275     if ($res !== false) {
5276     foreach($this->champs as $index => $champ) {
5277     // if (get_class($this) == 'instruction') {
5278     $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');
5279     // }
5280     $this->val[$index] = $this->valF[$champ] ?? null;
5281     }
5282     }
5283 softime 17542 $res = $this->add_log_to_dossier($id, $val);
5284     $data = array('val' => &$val, 'id' => $id, 'result' => &$res);
5285     $this->f->module_manager->run_hooks('triggermodifierapres_post', $this, $data);
5286     return $res;
5287 fmichon 4708 }
5288 mbroquet 3730
5289 softime 8989 /**
5290     * TRIGGER - triggersupprimer.
5291     *
5292     * @return boolean
5293     */
5294     function triggersupprimer($id, &$dnu1 = null, $val = array(), $dnu2 = null) {
5295     $this->addToLog(__METHOD__."(): start", EXTRA_VERBOSE_MODE);
5296 softime 17542 $data = array('val' => &$val, 'id' => $id);
5297     $this->f->module_manager->run_hooks('triggersupprimer_pre', $this, $data);
5298 mbroquet 3730 /**
5299     * L'objectif ici est de repositionner les valeurs récupérées en
5300     * archive dans le dossier d'instruction avant de supprimer l'événement
5301 softime 10573 * d'instruction si les valeurs du dossier sont différentes
5302 mbroquet 3730 */
5303 softime 10573 $valF = array();
5304     $inst_di = $this->get_inst_dossier($this->getVal('dossier'));
5305     foreach ($inst_di->champs as $key => $champ) {
5306     // Si le champ du DI à une archive dans l'instruction
5307     if (isset($val[sprintf('archive_%s', $champ)]) === true) {
5308     // Si la valeur entre le champ du DI et son archive dans instruction
5309     // est différente
5310     if ($inst_di->getVal($champ) !== $val[sprintf('archive_%s', $champ)]) {
5311     $val[sprintf('archive_%s', $champ)] === '' ? $valF[$champ] = null : $valF[$champ] = $val[sprintf('archive_%s', $champ)];
5312 softime 15037 // Gestion du cas particulier 'accord_tacite' pour renvoyer la valeur ' ' (3 espaces vides) au lieu de null
5313     // Car les valeurs possibles du champ accord_tacite sont : 'Oui', 'Non' ou ' '
5314     if ($champ === "accord_tacite" && $valF[$champ] === null) {
5315     $valF[$champ] = ' ';
5316     }
5317 softime 10573 }
5318     }
5319 softime 5024 }
5320 softime 10573 // Spécificité du champ avis_decision dont le champ archive est nommé
5321     // différemment
5322     if ($inst_di->getVal('avis_decision') !== $val['archive_avis']) {
5323     $val['archive_avis'] === '' ? $valF['avis_decision'] = null : $valF['avis_decision'] = $val['archive_avis'];
5324 softime 5024 }
5325 softime 10573 // Spécificité de la date d'affichage dont la valeur n'ai jamais modifiée
5326     // par l'archive
5327     unset($valF['date_affichage']);
5328 softime 6565
5329 softime 9245 /**
5330     * Mise à jour de la version de clôture *version_clos* du dossier si et
5331     * seulement si l'instruction met à jour l'état du dossier.
5332     */
5333 softime 10573 if (isset($valF['etat']) === true
5334     && $valF['etat'] !== null
5335 softime 9245 && $valF['etat'] !== '') {
5336 softime 10573 // Récupère l'état actuel du dossier d'instruction
5337     $inst_current_etat = $this->f->get_inst__om_dbform(array(
5338     "obj" => "etat",
5339     "idx" => $inst_di->get_id_etat(),
5340     ));
5341 softime 9245 // Instanciation de l'état archivé appliqué sur le dossier
5342     $inst_etat = $this->f->get_inst__om_dbform(array(
5343     "obj" => "etat",
5344     "idx" => $valF['etat'],
5345     ));
5346     //
5347     $update_version_clos = null;
5348     // En cas de clôture du dossier par l'état archivé
5349     if ($inst_etat->getVal('statut') === 'cloture') {
5350     $update_version_clos = $inst_di->update_version_clos('up');
5351     }
5352     // En cas de réouverture du dossier par l'état archivé
5353     if ($inst_current_etat->getVal('statut') === 'cloture'
5354     && $inst_etat->getVal('statut') !== 'cloture') {
5355     //
5356     $update_version_clos = $inst_di->update_version_clos('down');
5357     //
5358     $this->set_att_di_reopened(true);
5359     }
5360     //
5361     if ($update_version_clos === false) {
5362     $this->f->addToLog(sprintf(
5363     "%s() : ERREUR - %s %s",
5364     __METHOD__,
5365     sprintf(
5366     __("Impossible de mettre à jour la version de clôture du dossier d'instruction %s."),
5367     $inst_di->getVal($inst_di->clePrimaire)
5368     ),
5369     sprintf(
5370     __("L'instruction tente d'appliquer l'état %s."),
5371     $inst_etat->getVal($inst_etat->clePrimaire)
5372     )
5373     ));
5374     $this->addToMessage(sprintf(
5375     "%s %s",
5376     __("Erreur lors de la mise à jour de la version de clôture du dossier d'instruction."),
5377     __("Veuillez contacter votre administrateur.")
5378     ));
5379     return false;
5380     }
5381     }
5382 softime 10808 // On supprime toutes les notications liées à l'instruction
5383 softime 12654 $notifASupprimer = $this->get_instruction_notification(
5384     $this->getVal($this->clePrimaire),
5385     array(
5386     'notification_recepisse',
5387     'notification_instruction',
5388     'notification_decision',
5389     'notification_service_consulte',
5390     'notification_tiers_consulte',
5391 softime 13137 'notification_depot_demat',
5392 softime 15037 'notification_commune',
5393     'notification_signataire'
5394 softime 12654 ),
5395     true
5396     );
5397    
5398 softime 10808 foreach ($notifASupprimer as $idNotif) {
5399     $inst_notif = $this->f->get_inst__om_dbform(array(
5400     "obj" => "instruction_notification",
5401     "idx" => $idNotif,
5402     ));
5403     $val_notif = array();
5404     foreach ($inst_notif->champs as $champ) {
5405     $val_notif[$champ] = $inst_notif->getVal($champ);
5406     }
5407     // La suppression des notifications entrainera la suppression des tâches qui y sont
5408     // liées
5409     $supprNotif = $inst_notif->supprimer($val_notif);
5410     if ($supprNotif == false) {
5411     $this->addToMessage(sprintf(
5412     "%s %s",
5413     __("Erreur lors de la suppression des notifications de l'instruction."),
5414     __("Veuillez contacter votre administrateur.")
5415     ));
5416     return false;
5417     }
5418     }
5419 softime 9245
5420 softime 18436 // Suppression du paramétrage de l'annexe lié à l'évènement
5421     if ($this->supprimer_parametrage_annexe($this->getVal($this->clePrimaire)) === false) {
5422     $this->addToLog(sprintf(
5423     "%s %s",
5424     __("Erreur lors de la suppression du paramétrage des annexes de l'instruction."),
5425     __("Veuillez contacter votre administrateur.")
5426     ), DEBUG_MODE);
5427     return false;
5428     }
5429    
5430 softime 10573 // On met à jour le dossier
5431     $valF['instruction'] = $id;
5432 softime 10968 $valF['crud'] = 'delete';
5433 softime 10573 $update_by_instruction = $inst_di->update_by_instruction($valF);
5434     if ($update_by_instruction === false) {
5435     $this->cleanMessage();
5436     $this->addToMessage(sprintf('%s %s', __("Une erreur s'est produite lors de la mise à jour du dossier d'instruction."), __("Veuillez contacter votre administrateur.")));
5437     return false;
5438     }
5439    
5440 softime 5024 // Affichage d'informations à l'utilisateur
5441 softime 8989 $this->addToMessage(_("Suppression de l'instruction")." [".$this->f->db->affectedRows()." "._('enregistrement')." "._('mis_a_jour')."]");
5442 softime 5024
5443     // Mise à jour de la demande si un récépissé d'instruction correspond à l'instruction à supprimer
5444 softime 17542
5445     $res = true;
5446     $data = array('val' => &$val, 'id' => $id, 'result' => &$res);
5447     $this->f->module_manager->run_hooks('triggersupprimer_post', $this, $data);
5448     return $res;
5449 mbroquet 3730 }
5450    
5451 softime 8989 /**
5452     * TRIGGER - triggersupprimerapres.
5453     *
5454     * @return boolean
5455     */
5456     function triggersupprimerapres($id, &$dnu1 = null, $val = array(), $dnu2 = null) {
5457     $this->addToLog(__METHOD__."(): start", EXTRA_VERBOSE_MODE);
5458 softime 17542 $data = array('val' => &$val, 'id' => $id);
5459     $this->f->module_manager->run_hooks('triggersupprimerapres_pre', $this, $data);
5460 softime 8640 /**
5461     * Mise à jour de la date de dernière modification du dossier
5462     * d'instruction
5463     */
5464     $inst_di = $this->get_inst_dossier($this->getVal('dossier'));
5465     $inst_di->update_last_modification_date();
5466    
5467     /**
5468     * Mise à jour des données du dossier d'autorisation
5469     */
5470 softime 7996 $da = $this->f->get_inst__om_dbform(array(
5471     "obj" => "dossier_autorisation",
5472     "idx" => $this->getNumDemandeAutorFromDossier($val["dossier"]),
5473     ));
5474 softime 8640 $params = array(
5475     'di_id' => $this->getVal('dossier'),
5476 softime 9245 'di_reopened' => $this->get_att_di_reopened(),
5477 softime 8640 );
5478     if($da->majDossierAutorisation($params) === false) {
5479 mbroquet 3730 $this->addToMessage(_("Erreur lors de la mise a jour des donnees du dossier d'autorisation. Contactez votre administrateur."));
5480     $this->correct = false;
5481     return false;
5482     }
5483 softime 7996
5484 softime 10573 /**
5485     * Gestion des tâches pour la dématérialisation
5486     */
5487     $inst_task_empty = $this->f->get_inst__om_dbform(array(
5488     "obj" => "task",
5489     "idx" => 0,
5490     ));
5491     foreach ($inst_di->task_types as $task_type) {
5492     $task_exists = $inst_task_empty->task_exists($task_type, $id);
5493     if ($task_exists !== false) {
5494     $inst_task = $this->f->get_inst__om_dbform(array(
5495     "obj" => "task",
5496     "idx" => $task_exists,
5497     ));
5498 softime 18436 if ($inst_task->getVal('state') === task::STATUS_NEW || $inst_task->getVal('state') === task::STATUS_DRAFT) {
5499 softime 10573 $task_val = array(
5500 softime 18436 'state' => task::STATUS_CANCELED,
5501 softime 10573 );
5502     $update_task = $inst_task->update_task(array('val' => $task_val));
5503     if ($update_task === false) {
5504     $this->addToMessage(sprintf('%s %s',
5505     sprintf(__("Une erreur s'est produite lors de la modification de la tâche %."), $inst_task->getVal($inst_task->clePrimaire)),
5506     __("Veuillez contacter votre administrateur.")
5507     ));
5508     $this->correct = false;
5509     return false;
5510     }
5511     }
5512     }
5513     }
5514    
5515 softime 7996 //
5516 softime 8640 $val['evenement'] = $this->getVal('evenement');
5517 softime 17542 $res = $this->add_log_to_dossier($id, $val);
5518     $data = array('val' => &$val, 'id' => $id, 'result' => &$res);
5519     $this->f->module_manager->run_hooks('triggersupprimerapres_post', $this, $data);
5520     return $res;
5521 mbroquet 3730 }
5522    
5523     /**
5524 softime 9245 * Permet de mettre la valeur passée en paramètre dans l'attribut de classe
5525     * "di_reopened".
5526     *
5527     * @param boolean $val
5528     */
5529     function set_att_di_reopened($val) {
5530     $this->di_reopened = $val;
5531     }
5532    
5533     /**
5534     * Permet de récupérer la valeur de l'attribut de classe "di_reopened".
5535     *
5536     * @return boolean
5537     */
5538     function get_att_di_reopened() {
5539     return $this->di_reopened;
5540     }
5541    
5542     /**
5543 mbroquet 3730 * Permet de composer un message d'erreur sur restriction non valide en
5544     * fonction du contexte.
5545     *
5546     * @param string $restriction formule de la restriction
5547     *
5548     * @return string message d'erreur
5549     */
5550     function get_restriction_error_message($restriction) {
5551     // Affichage du message si la restriction s'applique
5552     // Contexte du suivi des dates (message simple)
5553     $message_restrict = _("Probleme de dates :");
5554     // Split restriction
5555     $champs_restrict = preg_split(
5556     '/(\W+)/',
5557     $restriction,
5558     null,
5559     PREG_SPLIT_NO_EMPTY|PREG_SPLIT_DELIM_CAPTURE
5560     );
5561     $formated_restrict = "";
5562     // Ajout des chaînes à traduire
5563     foreach ($champs_restrict as $value) {
5564     $formated_restrict .= _($value)." ";
5565     }
5566     $formated_restrict = substr($formated_restrict, 0, -1);
5567     // Message d'erreur dans le contexte du suivi des dates
5568     if($this->getParameter("maj") == 170) {
5569     $message_restrict .= " "._("contactez l'instructeur du dossier");
5570     $message_restrict .= "<br/>(".$formated_restrict.")";
5571     } else {
5572     // Affichage du message si la restriction s'applique
5573     // Contexte instruction
5574     $message_restrict .= "<br/>".$formated_restrict;
5575     }
5576    
5577     return $message_restrict;
5578     }
5579    
5580     /**
5581 softime 12124 * Surcharge de la méthode verifier() de la classe om_dbform pour y ajouter
5582     * les vérifications suivantes :
5583     * - Si l'instruction à un événement associé et que cet événement à des restrictions :
5584     * 1. vérifie si la restriction est valide, si ce n'est pas le cas récupère et affiche
5585     * le message d'erreur associé à la restriction
5586     * 2. vérifie si les restrictions sont respectées. Si ce n'est pas le cas bloque l'ajout
5587     * et / ou la modification et affiche un message d'erreur
5588     * -
5589     * -
5590     * -
5591     * -
5592     * -
5593     * -
5594     *
5595     * @param array val : tableau contenant les valeurs issues du formulaire.
5596     * @param - dnu1 : Paramètre déprécié et non utilisé.
5597     * @param - dnu2 : Paramètre déprécié et non utilisé.
5598     *
5599 softime 8989 * @return void
5600 mbroquet 3730 */
5601 softime 8989 function verifier($val = array(), &$dnu1 = null, $dnu2 = null) {
5602     parent::verifier($val);
5603     //
5604 mbroquet 3730 if ( isset($val['evenement']) && is_numeric($val['evenement'])){
5605     $restriction = $this->get_restriction($val['evenement']);
5606    
5607     //Test qu'une restriction est présente
5608     if ($restriction != "" ){
5609    
5610 softime 14064 // Vérifie le contexte de la modification et test si la restriction est valide.
5611     // Si l'instruction est modifiée par une tache le dossier n'est pas impacté.
5612     // Il n'est donc pas nécessaire de vérifier les restrictions.
5613 mbroquet 3730 $this->restriction_valid = $this->restrictionIsValid($restriction);
5614 softime 14064 if ($this->getParameter("maj") != 176
5615     && !$this->restriction_valid) {
5616 mbroquet 3730
5617     // Affichage du message si la restriction s'applique
5618     $this->addToMessage(
5619     $this->get_restriction_error_message($restriction)
5620     );
5621     $this->correct=false;
5622     return false;
5623     }
5624    
5625     // Liste des opérateurs possible
5626 nmeucci 3873 $operateurs = array(">=", "<=", "+", "-", "&&", "||", "==", "!=");
5627 mbroquet 3730 // Supprime tous les espaces de la chaîne de caractère
5628     $restriction = str_replace(' ', '', $restriction);
5629    
5630     // Met des espace avant et après les opérateurs puis transforme la
5631     // chaine en un tableau
5632     $tabRestriction = str_replace($operateurs, " ", $restriction);
5633     // Tableau des champ
5634     $tabRestriction = explode(" ", $tabRestriction);
5635     // Supprime les numériques du tableau
5636     foreach ($tabRestriction as $key => $value) {
5637     if (is_numeric($value)) {
5638     unset($tabRestriction[$key]);
5639     }
5640     }
5641    
5642     // Vérifie les champs utilisés pour la restriction
5643     $check_field_exist = $this->f->check_field_exist($tabRestriction, 'instruction');
5644     if ($check_field_exist !== true) {
5645    
5646     // Liste des champs en erreur
5647     $string_error_fields = implode(", ", $check_field_exist);
5648    
5649     // Message d'erreur
5650     $error_message = _("Le champ %s n'est pas utilisable pour le champ %s");
5651     if (count($check_field_exist) > 1) {
5652     $error_message = _("Les champs %s ne sont pas utilisable pour le champ %s");
5653     }
5654    
5655     // Affiche l'erreur
5656     $this->correct=false;
5657     $this->addToMessage(sprintf($error_message, $string_error_fields, _("restriction")));
5658     $this->addToMessage(_("Veuillez contacter votre administrateur."));
5659     }
5660     }
5661    
5662     }
5663     if(!$this->updateDate("date_envoi_signature")) {
5664     return false;
5665     }
5666     if(!$this->updateDate("date_retour_signature")) {
5667     return false;
5668     }
5669     if(!$this->updateDate("date_envoi_rar")) {
5670     return false;
5671     }
5672     if(!$this->updateDate("date_retour_rar")) {
5673     return false;
5674     }
5675     if(!$this->updateDate("date_envoi_controle_legalite")) {
5676     return false;
5677     }
5678     if(!$this->updateDate("date_retour_controle_legalite")) {
5679     return false;
5680     }
5681    
5682     }
5683 softime 12124
5684     /**
5685     * Récupère et stocket dans un tableau toutes les infos du pétitionnaire
5686     * principal du dossier auquel appartiens l'instruction.
5687     * Renvoie un tableau contenant les informations du pétitionnaire principal.
5688     *
5689     * Si l'identifiant de l'instruction n'a pas pu etre récupéré renvoie false
5690     * et affiche un message dans les logs.
5691     * En cas d'erreur de base de donnée renvoie false et affiche un message d'erreur.
5692     *
5693     * @param string identifiant du dossier
5694     * @return array|boolean
5695     */
5696 softime 18436 public function get_info_petitionnaire_principal_dossier($dossier = null) {
5697 softime 12124 // Si l'identifiant de l'instruction n'a pas été fournit on récupère celui de
5698     // l'objet courant
5699     if (empty($dossier)) {
5700     $dossier = $this->getVal('dossier');
5701     // Si la récupération de l'identifiant de l'instruction a échoué la méthode renvoie
5702     // false et on affiche un message d'erreur dans les logs
5703     if (empty($dossier)) {
5704     $this->addToLog(__METHOD__.' : L\'identifiant du dossier n\'a pas pu être récupéré');
5705     return false;
5706     }
5707     }
5708    
5709     // Requête sql servant à récupérer toutes les informations relatives au demandeurs
5710     // principal
5711 softime 13137 $qres = $this->f->get_all_results_from_db_query(
5712     sprintf(
5713     'SELECT
5714     -- Récupère toutes les informations du demandeur principal
5715     demandeur.*,
5716     CASE
5717     WHEN demandeur.qualite=\'particulier\'
5718     THEN TRIM(CONCAT(demandeur.particulier_nom, \' \', demandeur.particulier_prenom, \' \', demandeur.courriel))
5719     ELSE
5720     TRIM(CONCAT(demandeur.personne_morale_raison_sociale, \' \', demandeur.personne_morale_denomination, \' \', demandeur.courriel))
5721     END AS destinataire
5722     FROM
5723     %1$sdossier
5724     LEFT JOIN %1$slien_dossier_demandeur
5725     ON lien_dossier_demandeur.dossier = dossier.dossier
5726     LEFT JOIN %1$sdemandeur
5727     ON demandeur.demandeur = lien_dossier_demandeur.demandeur
5728     WHERE
5729     dossier.dossier = \'%2$s\'
5730     AND lien_dossier_demandeur.petitionnaire_principal IS TRUE',
5731     DB_PREFIXE,
5732     $this->f->db->escapeSimple($dossier)
5733     ),
5734     array(
5735     "origin" => __METHOD__,
5736     )
5737 softime 12124 );
5738 softime 13137 if (is_array($qres["result"]) === true
5739     && array_key_exists(0, $qres["result"]) === true) {
5740     //
5741     return $qres["result"][0];
5742 softime 12124 }
5743 softime 13137 return null;
5744 softime 12124 }
5745    
5746    
5747 mbroquet 3730
5748     /**
5749     * Finalisation des documents.
5750     * @param string $champ champ du fichier à finaliser
5751     * @param booleen $status permet de définir si on finalise ou définalise
5752     * @param string $sousform permet de savoir si se trouve dans un sousformulaire (passé au javascript)
5753     */
5754     function manage_finalizing($mode = null, $val = array()) {
5755 softime 5024 //
5756     $this->begin_treatment(__METHOD__);
5757 mbroquet 3730
5758 softime 5024 //
5759     $id_inst = $this->getVal($this->clePrimaire);
5760 mbroquet 3730
5761 softime 5024 //
5762     $admin_msg_error = _("Veuillez contacter votre administrateur.");
5763     $file_msg_error = _("Erreur de traitement de fichier.")
5764     ." ".$admin_msg_error;
5765     $bdd_msg_error = _("Erreur de base de données.")
5766     ." ".$admin_msg_error;
5767 softime 5169 $log_msg_error = "Finalisation non enregistrée - id instruction = %s - uid fichier = %s";
5768 mbroquet 3730
5769     // Si on finalise le document
5770     if ($mode == "finalize"){
5771 softime 5024 //
5772     $etat = _('finalisation');
5773 mbroquet 3730
5774     // Récupère la collectivite du dossier d'instruction
5775     $dossier_instruction_om_collectivite = $this->get_dossier_instruction_om_collectivite();
5776    
5777     //
5778     $collectivite = $this->f->getCollectivite($dossier_instruction_om_collectivite);
5779 softime 8593
5780     //
5781     $params = array(
5782     "specific" => array(),
5783     );
5784     // Si la rédaction libre est activée sur l'instruction
5785     if ($this->getVal("flag_edition_integrale") == 't') {
5786     $params["specific"]["corps"] = array(
5787     "mode" => "set",
5788     "value" => $this->getVal("corps_om_htmletatex"),
5789     );
5790     $params["specific"]["titre"] = array(
5791     "mode" => "set",
5792     "value" => $this->getVal("titre_om_htmletat"),
5793     );
5794     }
5795 mbroquet 3730 // Génération du PDF
5796 softime 8593 $result = $this->compute_pdf_output('lettretype', $this->getVal('lettretype'), $collectivite, null, $params);
5797 mbroquet 3730 $pdf_output = $result['pdf_output'];
5798 softime 10573
5799 mbroquet 3730 //Métadonnées du document
5800     $metadata = array(
5801 softime 18436 'filename' => $this->determinate_name_doc_pdf().'.pdf',
5802 mbroquet 3730 'mimetype' => 'application/pdf',
5803     'size' => strlen($pdf_output)
5804     );
5805    
5806     // Récupération des métadonnées calculées après validation
5807     $spe_metadata = $this->getMetadata("om_fichier_instruction");
5808    
5809     //On vérifie si l'instruction à finaliser a un événement de type arrete
5810 softime 14064 // TODO : A voir pour remplacer par une instanciation de l'événement.
5811     // Voir également si l'événement ne dois pas être instancié en début de
5812     // méthode pour pouvoir être réutilisé.
5813     $qres = $this->f->get_one_result_from_db_query(
5814     sprintf(
5815     'SELECT
5816     type
5817     FROM
5818     %1$sevenement
5819     WHERE
5820     evenement = \'%2$d\'',
5821     DB_PREFIXE,
5822     intval($this->getVal("evenement"))
5823     ),
5824     array(
5825     "origin" => __METHOD__,
5826     "force_return" => true,
5827     )
5828     );
5829    
5830     if ($qres["code"] !== "OK") {
5831 softime 5024 $this->correct = false;
5832     $this->addToMessage($bdd_msg_error);
5833     return $this->end_treatment(__METHOD__, false);
5834 mbroquet 3730 }
5835    
5836     //Initialisation de la variable
5837     $arrete_metadata = array();
5838     // Si l'événement est de type arrete, on ajoute les métadonnées spécifiques
5839 softime 14064 if ($qres['result'] === 'arrete'){
5840 mbroquet 3730 $arrete_metadata = $this->getMetadata("arrete");
5841     }
5842    
5843     $metadata = array_merge($metadata, $spe_metadata, $arrete_metadata);
5844    
5845 softime 18436 // Mise à jour du nom du fichier en bdd suite à la finalisation de l'instruction
5846     $res = $this->f->db->autoExecute(
5847     DB_PREFIXE.$this->table,
5848     ['fichier_instruction_name' => $metadata['filename']],
5849     DB_AUTOQUERY_UPDATE,
5850     "instruction='".$this->getVal("instruction")."'"
5851     );
5852 softime 10573
5853 softime 5024 // Si le document a déjà été finalisé on le met à jour
5854     // en conservant son UID
5855 mbroquet 3730 if ($this->getVal("om_fichier_instruction") != ''){
5856     $uid = $this->f->storage->update(
5857 softime 18436 $this->getVal("om_fichier_instruction"), $pdf_output, $metadata
5858     );
5859 mbroquet 3730 }
5860 softime 5024 // Sinon on crée un nouveau document et dont on récupère l'UID
5861 mbroquet 3730 else {
5862 softime 10573 $uid = $this->f->storage->create($pdf_output, $metadata, "from_content", $this->table.".om_fichier_instruction");
5863 mbroquet 3730 }
5864     }
5865    
5866 softime 5024 // Si on définalise le document
5867 mbroquet 3730 if ($mode == "unfinalize") {
5868 softime 5024 //
5869     $etat = _('définalisation');
5870 mbroquet 3730 // Récupération de l'uid du document finalisé
5871     $uid = $this->getVal("om_fichier_instruction");
5872     }
5873 softime 5024
5874     // Si on définalise l'UID doit être défini
5875     // Si on finalise la création/modification du fichier doit avoir réussi
5876 mbroquet 3730 if ($uid == '' || $uid == 'OP_FAILURE' ) {
5877 softime 5024 $this->correct = false;
5878     $this->addToMessage($file_msg_error);
5879 softime 8989 $this->addToLog(sprintf($log_msg_error, $id_inst, $uid), DEBUG_MODE);
5880 softime 5024 return $this->end_treatment(__METHOD__, false);
5881 mbroquet 3730 }
5882    
5883     //
5884     foreach ($this->champs as $key => $champ) {
5885     //
5886     $val[$champ] = $this->val[$key];
5887     }
5888    
5889     //
5890 softime 6565 $val['date_evenement'] = $this->dateDBToForm($val['date_evenement']);
5891     $val['archive_date_complet'] = $this->dateDBToForm($val['archive_date_complet']);
5892     $val['archive_date_rejet'] = $this->dateDBToForm($val['archive_date_rejet']);
5893     $val['archive_date_limite'] = $this->dateDBToForm($val['archive_date_limite']);
5894     $val['archive_date_notification_delai'] = $this->dateDBToForm($val['archive_date_notification_delai']);
5895     $val['archive_date_decision'] = $this->dateDBToForm($val['archive_date_decision']);
5896     $val['archive_date_validite'] = $this->dateDBToForm($val['archive_date_validite']);
5897     $val['archive_date_achevement'] = $this->dateDBToForm($val['archive_date_achevement']);
5898     $val['archive_date_chantier'] = $this->dateDBToForm($val['archive_date_chantier']);
5899     $val['archive_date_conformite'] = $this->dateDBToForm($val['archive_date_conformite']);
5900     $val['archive_date_dernier_depot'] = $this->dateDBToForm($val['archive_date_dernier_depot']);
5901     $val['archive_date_limite_incompletude'] = $this->dateDBToForm($val['archive_date_limite_incompletude']);
5902     $val['date_finalisation_courrier'] = $this->dateDBToForm($val['date_finalisation_courrier']);
5903     $val['date_envoi_signature'] = $this->dateDBToForm($val['date_envoi_signature']);
5904     $val['date_retour_signature'] = $this->dateDBToForm($val['date_retour_signature']);
5905     $val['date_envoi_rar'] = $this->dateDBToForm($val['date_envoi_rar']);
5906     $val['date_retour_rar'] = $this->dateDBToForm($val['date_retour_rar']);
5907     $val['date_envoi_controle_legalite'] = $this->dateDBToForm($val['date_envoi_controle_legalite']);
5908     $val['date_retour_controle_legalite'] = $this->dateDBToForm($val['date_retour_controle_legalite']);
5909     $val['archive_date_cloture_instruction'] = $this->dateDBToForm($val['archive_date_cloture_instruction']);
5910     $val['archive_date_premiere_visite'] = $this->dateDBToForm($val['archive_date_premiere_visite']);
5911     $val['archive_date_derniere_visite'] = $this->dateDBToForm($val['archive_date_derniere_visite']);
5912     $val['archive_date_contradictoire'] = $this->dateDBToForm($val['archive_date_contradictoire']);
5913     $val['archive_date_retour_contradictoire'] = $this->dateDBToForm($val['archive_date_retour_contradictoire']);
5914     $val['archive_date_ait'] = $this->dateDBToForm($val['archive_date_ait']);
5915     $val['archive_date_transmission_parquet'] = $this->dateDBToForm($val['archive_date_transmission_parquet']);
5916 softime 8989 $val['archive_date_affichage'] = $this->dateDBToForm($val['archive_date_affichage']);
5917 mbroquet 3730 $this->setvalF($val);
5918    
5919     // Verification de la validite des donnees
5920 softime 8989 $this->verifier($this->val);
5921 mbroquet 3730 // Si les verifications precedentes sont correctes, on procede a
5922     // la modification, sinon on ne fait rien et on retourne une erreur
5923 softime 5024 if ($this->correct === true) {
5924 mbroquet 3730 //
5925     $valF = array(
5926     "om_fichier_instruction" => $uid,
5927     "date_finalisation_courrier" => date('Y-m-d')
5928     );
5929     //
5930     if($mode=="finalize") {
5931     // état finalisé vrai
5932 softime 5024 $valF["om_final_instruction"] = true;
5933 mbroquet 3730 // ajout log utilisateur
5934     $login = $_SESSION['login'];
5935     $nom = "";
5936     $this->f->getUserInfos();
5937     if (isset($this->f->om_utilisateur["nom"])
5938     && !empty($this->f->om_utilisateur["nom"])) {
5939     $nom = $this->f->om_utilisateur["nom"];
5940     }
5941     $valF["om_final_instruction_utilisateur"] = $_SESSION['login'];
5942     if ($nom != "") {
5943     $valF["om_final_instruction_utilisateur"] .= " (".$nom.")";
5944     }
5945     } else {
5946     // état finalisé faux
5947 softime 5024 $valF["om_final_instruction"] = false;
5948 mbroquet 3730 // suppression log utilisateur
5949     $valF["om_final_instruction_utilisateur"] = '';
5950     }
5951    
5952     // Execution de la requête de modification des donnees de l'attribut
5953     // valF de l'objet dans l'attribut table de l'objet
5954 softime 8989 $res = $this->f->db->autoExecute(DB_PREFIXE.$this->table, $valF,
5955 softime 5024 DB_AUTOQUERY_UPDATE, $this->getCle($id_inst));
5956     $this->addToLog(__METHOD__."() : db->autoExecute(\"".DB_PREFIXE.$this->table."\", ".print_r($valF, true).", DB_AUTOQUERY_UPDATE, \"".$this->getCle($id_inst)."\")", VERBOSE_MODE);
5957     //
5958     if ($this->f->isDatabaseError($res, true) === true) {
5959     $this->correct = false;
5960     $this->addToMessage($bdd_msg_error);
5961     return $this->end_treatment(__METHOD__, false);
5962     }
5963 mbroquet 3730
5964 softime 5024 //
5965     $this->addToMessage(sprintf(_("La %s du document s'est effectuee avec succes."), $etat));
5966     //
5967     if ($this->add_log_to_dossier($id_inst, $val) === false) {
5968     return $this->end_treatment(__METHOD__, false);
5969     }
5970     //
5971     return $this->end_treatment(__METHOD__, true);
5972 mbroquet 3730 }
5973 softime 5024 // L'appel de verifier() a déjà positionné correct à false
5974     // et défini un message d'erreur.
5975 softime 8989 $this->addToLog(sprintf($log_msg_error, $id_inst, $uid), DEBUG_MODE);
5976 softime 5024 return $this->end_treatment(__METHOD__, false);
5977 mbroquet 3730 }
5978    
5979     /**
5980     * Récupération du numéro de dossier d'instruction à ajouter aux métadonnées
5981     * @return string numéro de dossier d'instruction
5982     */
5983 softime 10573 protected function getDossier($champ = null) {
5984 mbroquet 3730 if(empty($this->specificMetadata)) {
5985     $this->getSpecificMetadata();
5986     }
5987     return $this->specificMetadata->dossier;
5988     }
5989     /**
5990     * Récupération la version du dossier d'instruction à ajouter aux métadonnées
5991     * @return int Version
5992     */
5993     protected function getDossierVersion() {
5994     if(empty($this->specificMetadata)) {
5995     $this->getSpecificMetadata();
5996     }
5997     return $this->specificMetadata->version;
5998     }
5999     /**
6000     * Récupération du numéro de dossier d'autorisation à ajouter aux métadonnées
6001     * @return string numéro de dossier d'autorisation
6002     */
6003     protected function getNumDemandeAutor() {
6004     if(empty($this->specificMetadata)) {
6005     $this->getSpecificMetadata();
6006     }
6007     return $this->specificMetadata->dossier_autorisation;
6008     }
6009     /**
6010     * Récupération de la date de demande initiale du dossier à ajouter aux métadonnées
6011     * @return date de la demande initiale
6012     */
6013     protected function getAnneemoisDemandeAutor() {
6014     if(empty($this->specificMetadata)) {
6015     $this->getSpecificMetadata();
6016     }
6017     return $this->specificMetadata->date_demande_initiale;
6018     }
6019     /**
6020     * Récupération du type de dossier d'instruction à ajouter aux métadonnées
6021     * @return string type du dossier d'instruction
6022     */
6023     protected function getTypeInstruction() {
6024     if(empty($this->specificMetadata)) {
6025     $this->getSpecificMetadata();
6026     }
6027     return $this->specificMetadata->dossier_instruction_type;
6028     }
6029     /**
6030     * Récupération du statut du dossier d'autorisation à ajouter aux métadonnées
6031     * @return string avis
6032     */
6033     protected function getStatutAutorisation() {
6034     if(empty($this->specificMetadata)) {
6035     $this->getSpecificMetadata();
6036     }
6037     return $this->specificMetadata->statut;
6038     }
6039     /**
6040     * Récupération du type de dossier d'autorisation à ajouter aux métadonnées
6041     * @return string type du dossier d'autorisation
6042     */
6043     protected function getTypeAutorisation() {
6044     if(empty($this->specificMetadata)) {
6045     $this->getSpecificMetadata();
6046     }
6047     return $this->specificMetadata->dossier_autorisation_type;
6048     }
6049     /**
6050     * Récupération de la date d'ajout de document à ajouter aux métadonnées
6051     * @return date de l'évènement
6052     */
6053     protected function getDateEvenementDocument() {
6054     return date("Y-m-d");
6055     }
6056     /**
6057     * Récupération du groupe d'instruction à ajouter aux métadonnées
6058     * @return string Groupe d'instruction
6059     */
6060     protected function getGroupeInstruction() {
6061     if(empty($this->specificMetadata)) {
6062     $this->getSpecificMetadata();
6063     }
6064     return $this->specificMetadata->groupe_instruction;
6065     }
6066     /**
6067     * Récupération du libellé du type du document à ajouter aux métadonnées
6068     * @return string Groupe d'instruction
6069     */
6070     protected function getTitle() {
6071    
6072     // Récupère le champ événement
6073     if (isset($this->valF["evenement"]) AND $this->valF["evenement"] != "") {
6074     $evenement = $this->valF["evenement"];
6075     } else {
6076     $evenement = $this->getVal("evenement");
6077     }
6078    
6079     // Requête sql
6080 softime 14064 $evenement = $this->f->get_inst__om_dbform(array(
6081     "obj" => "evenement",
6082     "idx" => $evenement
6083     ));
6084    
6085 mbroquet 3730 // Retourne le libelle de l'événement
6086 softime 14064 return $evenement->getVal('libelle');
6087 mbroquet 3730 }
6088    
6089 softime 6272
6090 mbroquet 3730 /**
6091 softime 6272 * Récupération du champ ERP du dossier d'instruction.
6092     *
6093     * @return boolean
6094     */
6095     public function get_concerne_erp() {
6096     //
6097     if(empty($this->specificMetadata)) {
6098     $this->getSpecificMetadata();
6099     }
6100     //
6101     return $this->specificMetadata->erp;
6102     }
6103    
6104    
6105     /**
6106 mbroquet 3730 * Cette méthode permet de stocker en attribut toutes les métadonnées
6107     * nécessaire à l'ajout d'un document.
6108     */
6109     public function getSpecificMetadata() {
6110     if (isset($this->valF["dossier"]) AND $this->valF["dossier"] != "") {
6111     $dossier = $this->valF["dossier"];
6112     } else {
6113     $dossier = $this->getVal("dossier");
6114     }
6115     //Requête pour récupérer les informations essentiels sur le dossier d'instruction
6116 softime 14542 $qres = $this->f->get_all_results_from_db_query(
6117     sprintf(
6118     'SELECT
6119     dossier.dossier AS dossier,
6120     dossier_autorisation.dossier_autorisation AS dossier_autorisation,
6121     to_char(dossier.date_demande, \'YYYY/MM\') AS date_demande_initiale,
6122     dossier_instruction_type.code AS dossier_instruction_type,
6123     etat_dossier_autorisation.libelle AS statut,
6124     dossier_autorisation_type.code AS dossier_autorisation_type,
6125     groupe.code AS groupe_instruction,
6126     CASE WHEN dossier.erp IS TRUE
6127     THEN \'true\'
6128     ELSE \'false\'
6129     END AS erp
6130     FROM
6131     %1$sdossier
6132     LEFT JOIN %1$sdossier_instruction_type
6133 mbroquet 3730 ON dossier.dossier_instruction_type = dossier_instruction_type.dossier_instruction_type
6134 softime 14542 LEFT JOIN %1$sdossier_autorisation
6135 mbroquet 3730 ON dossier.dossier_autorisation = dossier_autorisation.dossier_autorisation
6136 softime 14542 LEFT JOIN %1$setat_dossier_autorisation
6137 mbroquet 3730 ON dossier_autorisation.etat_dossier_autorisation = etat_dossier_autorisation.etat_dossier_autorisation
6138 softime 14542 LEFT JOIN %1$sdossier_autorisation_type_detaille
6139 mbroquet 3730 ON dossier_autorisation.dossier_autorisation_type_detaille = dossier_autorisation_type_detaille.dossier_autorisation_type_detaille
6140 softime 14542 LEFT JOIN %1$sdossier_autorisation_type
6141 mbroquet 3730 ON dossier_autorisation_type_detaille.dossier_autorisation_type = dossier_autorisation_type.dossier_autorisation_type
6142 softime 14542 LEFT JOIN %1$sgroupe
6143 mbroquet 3730 ON dossier_autorisation_type.groupe = groupe.groupe
6144 softime 14542 WHERE
6145     dossier.dossier = \'%2$s\'',
6146     DB_PREFIXE,
6147     $this->f->db->escapeSimple($dossier)
6148     ),
6149     array(
6150     "origin" => __METHOD__,
6151     )
6152     );
6153     $row = array_shift($qres['result']);
6154 mbroquet 3730
6155     //Si il y a un résultat
6156 softime 14542 if (! empty($row)) {
6157 mbroquet 3730
6158 fmichon 3892 // Instrance de la classe dossier
6159     $inst_dossier = $this->get_inst_dossier($dossier);
6160 softime 14542 // TODO : améliorer ce code
6161     //
6162     // Avant l e résultat été récupéré dans un objet à partir de la requête mais en modifiant pour
6163     // utiliser la méthode get_all_results_from_db_query() c'est maintenant un tableau
6164     // qu'on obtiens. Pour garder le même fonctionnement on transforme le tableau des
6165     // valeurs issues de la requête en objet.
6166     $metadata = (object)$row;
6167 fmichon 3892 // Insère l'attribut version à l'objet
6168 softime 14542 $metadata->version = $inst_dossier->get_di_numero_suffixe();
6169 fmichon 3892
6170 mbroquet 3730 //Alors on créé l'objet dossier_instruction
6171 softime 14542 $this->specificMetadata = $metadata;
6172 mbroquet 3730
6173     }
6174     }
6175    
6176     /**
6177     * Retourne le statut du dossier d'instruction
6178     * @param string $idx Identifiant du dossier d'instruction
6179     * @return string Le statut du dossier d'instruction
6180     */
6181     function getStatutAutorisationDossier($idx){
6182    
6183     $statut = '';
6184    
6185     //Si l'identifiant du dossier d'instruction fourni est correct
6186     if ( $idx != '' ){
6187    
6188     //On récupère le statut de l'état du dossier à partir de l'identifiant du
6189     //dossier
6190 softime 14064 $qres = $this->f->get_one_result_from_db_query(
6191     sprintf(
6192     'SELECT
6193     etat.statut
6194     FROM
6195     %1$sdossier
6196     LEFT JOIN
6197     %1$setat
6198     ON
6199     dossier.etat = etat.etat
6200     WHERE
6201     dossier = \'%2$s\'',
6202     DB_PREFIXE,
6203     $this->f->db->escapeSimple($idx)
6204     ),
6205     array(
6206     "origin" => __METHOD__,
6207     )
6208     );
6209 mbroquet 3730 }
6210 softime 14064
6211     return $qres['result'];
6212 mbroquet 3730 }
6213    
6214     /**
6215     * Récupère les données du dossier
6216     * @return array
6217     */
6218     function get_dossier_actual() {
6219    
6220     // Initialisation de la valeur de retour
6221     $return = array();
6222    
6223     // Récupération de toutes les valeurs du dossier d'instruction en cours
6224 softime 14542 // TODO : remplacer cette requête par une instanciation de l'objet
6225     $qres = $this->f->get_all_results_from_db_query(
6226     sprintf(
6227     'SELECT
6228     *
6229     FROM
6230     %1$sdossier
6231     WHERE
6232     dossier = \'%2$s\'',
6233     DB_PREFIXE,
6234     $this->f->db->escapeSimple($this->valF['dossier'])
6235     ),
6236     array(
6237     'origin' => __METHOD__
6238     )
6239     );
6240 mbroquet 3730
6241 softime 14542 foreach ($qres['result'] as $row) {
6242 mbroquet 3730
6243     // Récupération de la valeur actuelle du délai, de l'accord tacite,
6244     // de l'état et de l'avis du dossier d'instruction
6245 softime 6565 $return['archive_delai'] = $row['delai'];
6246     $return['archive_accord_tacite'] = $row['accord_tacite'];
6247     $return['archive_etat'] = $row['etat'];
6248     $return['archive_avis'] = $row['avis_decision'];
6249     // Récupération de la valeur actuelle des dates du dossier
6250 mbroquet 3730 // d'instruction
6251 softime 6565 $return['archive_date_complet'] = $row['date_complet'];
6252     $return['archive_date_dernier_depot'] = $row['date_dernier_depot'];
6253     $return['archive_date_rejet'] = $row['date_rejet'];
6254     $return['archive_date_limite'] = $row['date_limite'];
6255     $return['archive_date_notification_delai'] = $row['date_notification_delai'];
6256     $return['archive_date_decision'] = $row['date_decision'];
6257     $return['archive_date_validite'] = $row['date_validite'];
6258     $return['archive_date_achevement'] = $row['date_achevement'];
6259     $return['archive_date_chantier'] = $row['date_chantier'];
6260     $return['archive_date_conformite'] = $row['date_conformite'];
6261     $return['archive_incompletude'] = $row['incompletude'];
6262     $return['archive_incomplet_notifie'] = $row['incomplet_notifie'];
6263     $return['archive_evenement_suivant_tacite'] = $row['evenement_suivant_tacite'];
6264     $return['archive_evenement_suivant_tacite_incompletude'] = $row['evenement_suivant_tacite_incompletude'];
6265     $return['archive_etat_pendant_incompletude'] = $row['etat_pendant_incompletude'];
6266     $return['archive_date_limite_incompletude'] = $row['date_limite_incompletude'];
6267     $return['archive_delai_incompletude'] = $row['delai_incompletude'];
6268     $return['archive_autorite_competente'] = $row['autorite_competente'];
6269 softime 8593 $return['archive_dossier_instruction_type'] = $row['dossier_instruction_type'];
6270 softime 6565 $return['duree_validite'] = $row['duree_validite'];
6271     $return['date_depot'] = $row['date_depot'];
6272 softime 10573 $return['date_depot_mairie'] = $row['date_depot_mairie'];
6273 softime 6565 $return['archive_date_cloture_instruction'] = $row['date_cloture_instruction'];
6274     $return['archive_date_premiere_visite'] = $row['date_premiere_visite'];
6275     $return['archive_date_derniere_visite'] = $row['date_derniere_visite'];
6276     $return['archive_date_contradictoire'] = $row['date_contradictoire'];
6277     $return['archive_date_retour_contradictoire'] = $row['date_retour_contradictoire'];
6278     $return['archive_date_ait'] = $row['date_ait'];
6279     $return['archive_date_transmission_parquet'] = $row['date_transmission_parquet'];
6280 softime 8989 $return['archive_date_affichage'] = $row['date_affichage'];
6281 softime 10573 $return['archive_pec_metier'] = $row['pec_metier'];
6282     $return['archive_a_qualifier'] = $row['a_qualifier'];
6283 mbroquet 3730 }
6284    
6285     // Retour de la fonction
6286     return $return;
6287    
6288     }
6289    
6290     /**
6291     * Permet de vérifier qu'un événement est verrouillable
6292     * @param integer $idx Identifiant de l'instruction
6293     * @return boolean
6294     */
6295     function checkEvenementNonVerrouillable($idx) {
6296     // Si la condition n'est pas vide
6297     if ($idx != "") {
6298    
6299     // Requête SQL
6300 softime 14064 $qres = $this->f->get_one_result_from_db_query(
6301     sprintf(
6302     'SELECT
6303     evenement.non_verrouillable
6304     FROM
6305     %1$sevenement
6306     LEFT JOIN %1$sinstruction
6307     ON instruction.evenement = evenement.evenement
6308     WHERE
6309     instruction.instruction = \'%2$s\'',
6310     DB_PREFIXE,
6311     intval($idx)
6312     ),
6313     array(
6314     "origin" => __METHOD__,
6315     )
6316     );
6317 mbroquet 3730 }
6318    
6319 softime 14064 // Si on a un résultat et que ce résultat indique que l'événement n'est
6320     // pas vérrouillable renvoie true, sinon renvoie false
6321     return isset($qres) && isset($qres['result']) && $qres['result'] == 't';
6322 mbroquet 3730 }
6323    
6324     /**
6325     * Mise à jour des champs archive_*
6326     * @param mixed $row La ligne de données
6327     */
6328     public function updateArchiveData($row){
6329    
6330     // Récupération de la valeur actuelle du délai, de l'accord tacite,
6331     // de l'état et de l'avis du dossier d'instruction
6332     $this->valF['archive_delai']=$row['delai'];
6333     $this->valF['archive_accord_tacite']=$row['accord_tacite'];
6334     $this->valF['archive_etat']=$row['etat'];
6335     $this->valF['archive_avis']=$row['avis_decision'];
6336     // Récupération de la valeur actuelle des 9 dates du dossier
6337     // d'instruction
6338     if ($row['date_complet'] != '') {
6339     $this->valF['archive_date_complet']=$row['date_complet'];
6340     }
6341     if ($row['date_dernier_depot'] != '') {
6342     $this->valF['archive_date_dernier_depot']=$row['date_dernier_depot'];
6343     }
6344 softime 6565 if ($row['date_rejet'] != '') {
6345 mbroquet 3730 $this->valF['archive_date_rejet']= $row['date_rejet'];
6346     }
6347 softime 6565 if ($row['date_limite'] != '') {
6348 mbroquet 3730 $this->valF['archive_date_limite']= $row['date_limite'];
6349     }
6350 softime 6565 if ($row['date_notification_delai'] != '') {
6351 mbroquet 3730 $this->valF['archive_date_notification_delai']= $row['date_notification_delai'];
6352     }
6353 softime 6565 if ($row['date_decision'] != '') {
6354 mbroquet 3730 $this->valF['archive_date_decision']= $row['date_decision'];
6355     }
6356 softime 6565 if ($row['date_validite'] != '') {
6357 mbroquet 3730 $this->valF['archive_date_validite']= $row['date_validite'];
6358     }
6359 softime 6565 if ($row['date_achevement'] != '') {
6360 mbroquet 3730 $this->valF['archive_date_achevement']= $row['date_achevement'];
6361     }
6362 softime 6565 if ($row['date_chantier'] != '') {
6363 mbroquet 3730 $this->valF['archive_date_chantier']= $row['date_chantier'];
6364     }
6365 softime 6565 if ($row['date_conformite'] != '') {
6366 mbroquet 3730 $this->valF['archive_date_conformite']= $row['date_conformite'];
6367     }
6368 softime 6565 if ($row['incompletude'] != '') {
6369 mbroquet 3730 $this->valF['archive_incompletude']= $row['incompletude'];
6370     }
6371 softime 6565 if ($row['incomplet_notifie'] != '') {
6372 mbroquet 3730 $this->valF['archive_incomplet_notifie']= $row['incomplet_notifie'];
6373     }
6374 softime 6565 if ($row['evenement_suivant_tacite'] != '') {
6375 mbroquet 3730 $this->valF['archive_evenement_suivant_tacite']= $row['evenement_suivant_tacite'];
6376     }
6377 softime 6565 if ($row['evenement_suivant_tacite_incompletude'] != '') {
6378 mbroquet 3730 $this->valF['archive_evenement_suivant_tacite_incompletude']= $row['evenement_suivant_tacite_incompletude'];
6379     }
6380 softime 6565 if ($row['etat_pendant_incompletude'] != '') {
6381 mbroquet 3730 $this->valF['archive_etat_pendant_incompletude']= $row['etat_pendant_incompletude'];
6382     }
6383 softime 6565 if ($row['date_limite_incompletude'] != '') {
6384 mbroquet 3730 $this->valF['archive_date_limite_incompletude']= $row['date_limite_incompletude'];
6385     }
6386 softime 6565 if ($row['delai_incompletude'] != '') {
6387 mbroquet 3730 $this->valF['archive_delai_incompletude']= $row['delai_incompletude'];
6388     }
6389 softime 6565 if ($row['autorite_competente'] != '') {
6390 mbroquet 3730 $this->valF['archive_autorite_competente']= $row['autorite_competente'];
6391     }
6392 softime 6565 if ($row['duree_validite'] != '') {
6393 mbroquet 3730 $this->valF['duree_validite']= $row['duree_validite'];
6394     }
6395 softime 6565 if ($row['date_depot'] != '') {
6396 nmeucci 3873 $this->valF['date_depot']= $row['date_depot'];
6397     }
6398 softime 10573 if ($row['date_depot_mairie'] != '') {
6399     $this->valF['date_depot_mairie']= $row['date_depot_mairie'];
6400     }
6401 softime 6565 // Dates concernant les dossiers contentieux
6402     if ($row['date_cloture_instruction'] != '') {
6403     $this->valF['archive_date_cloture_instruction']= $row['date_cloture_instruction'];
6404     }
6405     if ($row['date_premiere_visite'] != '') {
6406     $this->valF['archive_date_premiere_visite']= $row['date_premiere_visite'];
6407     }
6408     if ($row['date_derniere_visite'] != '') {
6409     $this->valF['archive_date_derniere_visite']= $row['date_derniere_visite'];
6410     }
6411     if ($row['date_contradictoire'] != '') {
6412     $this->valF['archive_date_contradictoire']= $row['date_contradictoire'];
6413     }
6414     if ($row['date_retour_contradictoire'] != '') {
6415     $this->valF['archive_date_retour_contradictoire']= $row['date_retour_contradictoire'];
6416     }
6417     if ($row['date_ait'] != '') {
6418     $this->valF['archive_date_ait']= $row['date_ait'];
6419     }
6420     if ($row['date_transmission_parquet'] != '') {
6421     $this->valF['archive_date_transmission_parquet']= $row['date_transmission_parquet'];
6422     }
6423 softime 8989 //
6424 softime 8593 if ($row['dossier_instruction_type'] != '') {
6425     $this->valF['archive_dossier_instruction_type']= $row['dossier_instruction_type'];
6426     }
6427 softime 8989 if ($row['date_affichage'] != '') {
6428     $this->valF['archive_date_affichage']= $row['date_affichage'];
6429     }
6430 softime 10573 if (isset($row['pec_metier']) === true && $row['pec_metier'] != '') {
6431     $this->valF['archive_pec_metier']= $row['pec_metier'];
6432     }
6433     if (isset($row['a_qualifier']) === true && $row['a_qualifier'] != '') {
6434     $this->valF['archive_a_qualifier']= $row['a_qualifier'];
6435     }
6436 mbroquet 3730 }
6437    
6438     // {{{
6439     // Méthodes de récupération des métadonnées arrêté
6440     /**
6441     * @return string Retourne le numéro d'arrêté
6442     */
6443     function getNumArrete() {
6444     return $this->getVal("numero_arrete");
6445     }
6446     /**
6447     * @return chaîne vide
6448     */
6449     function getReglementaireArrete() {
6450     return 'true';
6451     }
6452     /**
6453     * @return boolean de notification au pétitionnaire
6454     */
6455     function getNotificationArrete() {
6456     return 'true';
6457     }
6458     /**
6459     * @return date de notification au pétitionnaire
6460     */
6461     function getDateNotificationArrete() {
6462     if (empty($this->metadonneesArrete)) {
6463     $this->getArreteMetadata();
6464     }
6465     return $this->metadonneesArrete["datenotification"];
6466     }
6467     /**
6468     * @return boolean check si le document est passé au contrôle de légalité
6469     */
6470     function getControleLegalite() {
6471     return 'true';
6472     }
6473     /**
6474     * @return date de signature de l'arrêté
6475     */
6476     function getDateSignature() {
6477     if (empty($this->metadonneesArrete)) {
6478     $this->getArreteMetadata();
6479     }
6480     return $this->metadonneesArrete["datesignaturearrete"];
6481     }
6482     /**
6483     * @return string nom du signataire
6484     */
6485     function getNomSignataire() {
6486     if (empty($this->metadonneesArrete)) {
6487     $this->getArreteMetadata();
6488     }
6489     return $this->metadonneesArrete["nomsignataire"];
6490     }
6491     /**
6492     * @return string qualité du signataire
6493     */
6494     function getQualiteSignataire() {
6495     if (empty($this->metadonneesArrete)) {
6496     $this->getArreteMetadata();
6497     }
6498     return $this->metadonneesArrete["qualitesignataire"];
6499     }
6500     /**
6501     * @return string numéro du terrain
6502     */
6503     function getAp_numRue() {
6504     if (empty($this->metadonneesArrete)) {
6505     $this->getArreteMetadata();
6506     }
6507     return $this->metadonneesArrete["ap_numrue"];
6508     }
6509     /**
6510     * @return string nom de la rue du terrain
6511     */
6512     function getAp_nomDeLaVoie() {
6513     if (empty($this->metadonneesArrete)) {
6514     $this->getArreteMetadata();
6515     }
6516     return $this->metadonneesArrete["ap_nomdelavoie"];
6517     }
6518     /**
6519     * @return string code postal du terrain
6520     */
6521     function getAp_codePostal() {
6522     if (empty($this->metadonneesArrete)) {
6523     $this->getArreteMetadata();
6524     }
6525     return $this->metadonneesArrete["ap_codepostal"];
6526     }
6527     /**
6528     * @return string ville du terrain
6529     */
6530     function getAp_ville() {
6531     if (empty($this->metadonneesArrete)) {
6532     $this->getArreteMetadata();
6533     }
6534     return $this->metadonneesArrete["ap_ville"];
6535     }
6536     /**
6537     * @return string activité
6538     */
6539     function getActivite() {
6540     return "Droit du sol";
6541     }
6542     /**
6543     * @return string date du retour de controle légalité
6544     */
6545     function getDateControleLegalite() {
6546     if (empty($this->metadonneesArrete)) {
6547     $this->getArreteMetadata();
6548     }
6549     return $this->metadonneesArrete["datecontrolelegalite"];
6550     }
6551    
6552     // Fin des méthodes de récupération des métadonnées
6553     // }}}
6554    
6555     /**
6556     * Méthode de récupération des métadonnées arrêtés dans la base de données,
6557     * les données sont stockés dans l'attribut $this->metadonneesArrete
6558     */
6559     function getArreteMetadata() {
6560    
6561 softime 14542 //Récupération de la dernière instruction dont l'événement est de type 'arrete'
6562     $this->metadonneesArrete = array("nomsignataire"=>"", "qualitesignataire"=>"",
6563     "decisionarrete"=>"", "datenotification"=>"", "datesignaturearrete"=>"",
6564     "datecontrolelegalite"=>"", "ap_numrue"=>"", "ap_nomdelavoie"=>"",
6565     "ap_codepostal"=>"", "ap_ville"=>"");
6566 mbroquet 3730
6567 softime 14542 $qres = $this->f->get_all_results_from_db_query(
6568     sprintf(
6569     'SELECT
6570     signataire_arrete.prenom || \' \' ||signataire_arrete.nom as nomsignataire,
6571     signataire_arrete.qualite as qualitesignataire,
6572     instruction.etat as decisionarrete,
6573     instruction.date_retour_rar as datenotification,
6574     instruction.date_retour_signature as datesignaturearrete,
6575     instruction.date_retour_controle_legalite as datecontrolelegalite,
6576     dossier.terrain_adresse_voie_numero as ap_numrue,
6577     dossier.terrain_adresse_voie as ap_nomdelavoie,
6578     dossier.terrain_adresse_code_postal as ap_codepostal,
6579     dossier.terrain_adresse_localite as ap_ville
6580     FROM
6581     %1$sinstruction
6582     LEFT JOIN %1$ssignataire_arrete
6583     ON instruction.signataire_arrete = signataire_arrete.signataire_arrete
6584     LEFT JOIN %1$sdossier
6585     ON instruction.dossier = dossier.dossier
6586     LEFT JOIN %1$sdonnees_techniques
6587     ON donnees_techniques.dossier_instruction = dossier.dossier
6588     WHERE
6589     instruction.instruction = %2$d',
6590     DB_PREFIXE,
6591     intval($this->getVal('instruction'))
6592     ),
6593     array(
6594     'origin' => __METHOD__
6595     )
6596     );
6597     $this->metadonneesArrete = array_shift($qres['result']);
6598 mbroquet 3730 }
6599    
6600     /**
6601     * CONDITION - has_an_edition.
6602     *
6603     * Condition pour afficher le bouton de visualisation de l'édition.
6604     *
6605     * @return boolean
6606     */
6607     function has_an_edition() {
6608     // Récupère la valeur du champ lettretype
6609     $lettretype = $this->getVal("lettretype");
6610     // Si le champ est vide
6611 softime 7521 if ($lettretype !== '' && $lettretype !== null) {
6612 mbroquet 3730 //
6613 softime 7521 return true;
6614 mbroquet 3730 }
6615    
6616     //
6617 softime 7521 return false;
6618 mbroquet 3730 }
6619    
6620     /**
6621 softime 10573 * CONDITION - is_modifiable.
6622     *
6623     * Controle si l'évenement est modifiable.
6624     *
6625     * @return boolean
6626     */
6627     function is_evenement_modifiable() {
6628     $evenement = $this->get_inst_evenement($this->getVal('evenement'));
6629     return ! $this->get_boolean_from_pgsql_value($evenement->getVal('non_modifiable'));
6630     }
6631    
6632     /**
6633 mbroquet 3730 * CONDITION - is_editable.
6634     *
6635     * Condition pour la modification.
6636     *
6637     * @return boolean
6638     */
6639     function is_editable() {
6640 softime 10573
6641     // XXX
6642     // 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é)
6643     // Si cette tâche identifiée est DONE alors la suppression/modification de cette intruction est impossible
6644    
6645 mbroquet 3730 // Contrôle si l'utilisateur possède un bypass
6646 softime 7996 $bypass = $this->f->isAccredited($this->get_absolute_class_name()."_modifier_bypass");
6647 mbroquet 3730 //
6648     if ($bypass == true) {
6649     //
6650     return true;
6651     }
6652 softime 6565
6653 mbroquet 3730 // Si l'utilisateur est un instructeur, que le dossier est cloturé et
6654     // que l'événement n'est pas identifié comme non verrouillable
6655     if ($this->f->isUserInstructeur()
6656     && $this->getStatutAutorisationDossier($this->getParameter("idxformulaire")) == "cloture"
6657     && $this->checkEvenementNonVerrouillable($this->getVal("instruction")) === false) {
6658     //
6659     return false;
6660     }
6661    
6662 softime 6565 // Si l'utilisateur est un intructeur qui correspond à la division du
6663     // dossier
6664     if ($this->is_instructeur_from_division_dossier() === true) {
6665     //
6666     return true;
6667     }
6668    
6669     // Si l'utilisateur est instructeur de la commune du dossier et que
6670     // l'instruction est créée par un instructeur de la commune
6671     if ($this->is_instructeur_from_collectivite_dossier() === true and
6672     $this->getVal('created_by_commune') === 't') {
6673     return true;
6674     }
6675    
6676 mbroquet 3730 //
6677 softime 6565 return false;
6678 mbroquet 3730 }
6679    
6680     /**
6681 softime 10573 * Vérifie si l'événement est supprimable ou pas.
6682     *
6683     * @return boolean
6684     */
6685     function is_evenement_supprimable() {
6686     // Controle si l'évenement est supprimable
6687     $evenement = $this->get_inst_evenement($this->getVal('evenement'));
6688     return ! $this->get_boolean_from_pgsql_value($evenement->getVal('non_supprimable'));
6689     }
6690    
6691     /**
6692 mbroquet 3730 * CONDITION - is_deletable.
6693     *
6694 softime 6864 * Condition pour la suppression.
6695 mbroquet 3730 *
6696     * @return boolean
6697     */
6698     function is_deletable() {
6699 softime 10573
6700     // XXX
6701     // 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é)
6702     // Si cette tâche identifiée est DONE alors la suppression/modification de cette intruction est impossible
6703    
6704 softime 6864 // Contrôle si l'utilisateur possède un bypass intégral
6705 softime 7996 $bypass = $this->f->isAccredited($this->get_absolute_class_name()."_supprimer_bypass");
6706 mbroquet 3730 //
6707     if ($bypass == true) {
6708    
6709     //
6710     return true;
6711     }
6712    
6713     // Si l'utilisateur est un intructeur qui ne correspond pas à la
6714 softime 6864 // division du dossier et si l'utilisateur n'a pas la permission bypass
6715     // de la division
6716     if ($this->is_instructeur_from_division_dossier() === false
6717 softime 7996 && $this->f->isAccredited($this->get_absolute_class_name()."_supprimer_bypass_division") === false) {
6718 mbroquet 3730
6719     //
6720     return false;
6721     }
6722 softime 5024
6723     // l'événement est-il le dernier ?
6724     $dernier_evenement = false;
6725     // instanciation dossier
6726 softime 7996 $dossier = $this->f->get_inst__om_dbform(array(
6727     "obj" => "dossier",
6728     "idx" => $this->getVal('dossier'),
6729     ));
6730 softime 5024 // récupération dernier événement
6731     $id_dernier_evenement = $dossier->get_dernier_evenement();
6732     if ($id_dernier_evenement == $this->getVal($this->clePrimaire)) {
6733     $dernier_evenement = true;
6734     }
6735 mbroquet 3730
6736 softime 5024 // Si dossier cloturé ou si pas dernier événement
6737     // ou de type retour ou si une date est renseignée
6738     // ET utilisateur non administrateur
6739     if ($this->getStatutAutorisationDossier($this->getVal('dossier')) == 'cloture'
6740     || $dernier_evenement == false
6741     || $this->is_evenement_retour($this->getVal("evenement")) == true
6742     || $this->getVal('date_envoi_signature') != ''
6743     || $this->getVal('date_retour_signature') != ''
6744     || $this->getVal('date_envoi_rar') != ''
6745     || $this->getVal('date_retour_rar') != ''
6746     || $this->getVal('date_envoi_controle_legalite') != ''
6747     || $this->getVal('date_retour_controle_legalite') != '') {
6748     // pas le droit de supprimer
6749     return false;;
6750     }
6751    
6752 mbroquet 3730 //
6753     return true;
6754     }
6755 softime 6565
6756    
6757 mbroquet 3730 /**
6758 softime 6565 * Vérifie que l'utilisateur est instructeur et qu'il est de la division du
6759     * dossier.
6760     *
6761     * @return, boolean true/false
6762     */
6763     function is_instructeur_from_collectivite_dossier() {
6764     if ($this->f->isUserInstructeur() === true and
6765     $this->f->om_utilisateur["om_collectivite"] == $this->get_dossier_instruction_om_collectivite()) {
6766     return true;
6767     }
6768     return false;
6769     }
6770    
6771     /**
6772 mbroquet 3730 * CONDITION - is_addable.
6773     *
6774     * Condition pour afficher les boutons modifier et supprimer.
6775     *
6776     * @return boolean
6777     */
6778     function is_addable() {
6779     // Contrôle si l'utilisateur possède un bypass
6780 softime 7996 $bypass = $this->f->isAccredited($this->get_absolute_class_name()."_ajouter_bypass");
6781 mbroquet 3730 //
6782     if ($bypass == true) {
6783    
6784     //
6785     return true;
6786     }
6787 softime 6565 // Si l'utilisateur est un intructeur qui correspond à la
6788     // division du dossier ou qu'il peut changer la décision
6789     if ($this->is_instructeur_from_division_dossier() === true or
6790     $this->isInstrCanChangeDecision($this->getParameter('idxformulaire')) === true) {
6791 mbroquet 3730 //
6792 softime 6565 return true;
6793 mbroquet 3730 }
6794    
6795     //
6796 softime 6565 return false;
6797 mbroquet 3730 }
6798    
6799     /**
6800     * CONDITION - is_finalizable.
6801     *
6802     * Condition pour afficher le bouton.
6803     *
6804     * @return boolean
6805     */
6806     function is_finalizable() {
6807     // Contrôle si l'utilisateur possède un bypass
6808 softime 7996 $bypass = $this->f->isAccredited($this->get_absolute_class_name()."_finaliser_bypass");
6809 mbroquet 3730 //
6810     if ($bypass == true) {
6811     //
6812     return true;
6813     }
6814 softime 6565
6815 mbroquet 3730 // Si l'utilisateur est un instructeur, que le dossier est cloturé et
6816     // que l'événement n'est pas identifié comme non verrouillable
6817     if ($this->f->isUserInstructeur()
6818     && $this->getStatutAutorisationDossier($this->getParameter("idxformulaire")) == "cloture"
6819     && $this->checkEvenementNonVerrouillable($this->getVal("instruction")) === false) {
6820     //
6821     return false;
6822     }
6823 softime 6565
6824     // Si l'utilisateur est un intructeur qui correspond à la division du
6825     // dossier
6826     if ($this->is_instructeur_from_division_dossier() === true) {
6827     //
6828     return true;
6829     }
6830 mbroquet 3730
6831 softime 6565 // Si l'utilisateur est instructeur de la commune du dossier et que
6832     // l'instruction est créée par un instructeur de la commune
6833     if ($this->is_instructeur_from_collectivite_dossier() === true and
6834     $this->getVal('created_by_commune') === 't') {
6835     return true;
6836     }
6837    
6838 mbroquet 3730 //
6839 softime 6565 return false;
6840 mbroquet 3730 }
6841    
6842     /**
6843     * CONDITION - is_finalize_without_bypass.
6844     *
6845     * Condition pour afficher le bouton sans le bypass.
6846     *
6847     * @return boolean [description]
6848     */
6849     function is_finalizable_without_bypass() {
6850     // Récupère la valeur du champ finalisé
6851     $om_final_instruction = $this->getVal('om_final_instruction');
6852    
6853     // Si le rapport n'est pas finalisé
6854     if (empty($om_final_instruction)
6855     || $om_final_instruction == 'f') {
6856     //
6857     return true;
6858     }
6859    
6860     //
6861     return false;
6862     }
6863    
6864     /**
6865     * CONDITION - is_unfinalizable.
6866     *
6867     * Condition pour afficher le bouton.
6868     *
6869     * @return boolean
6870     */
6871     function is_unfinalizable(){
6872     // Contrôle si l'utilisateur possède un bypass
6873 softime 7996 $bypass = $this->f->isAccredited($this->get_absolute_class_name()."_definaliser_bypass");
6874 mbroquet 3730 //
6875     if ($bypass == true) {
6876     //
6877     return true;
6878     }
6879 softime 6565
6880     // Si l'utilisateur est un instructeur, que le dossier est cloturé et
6881     // que l'événement n'est pas identifié comme non verrouillable
6882 mbroquet 3730 if ($this->f->isUserInstructeur()
6883 softime 6565 && $this->getStatutAutorisationDossier($this->getParameter("idxformulaire")) == "cloture"
6884     && $this->checkEvenementNonVerrouillable($this->getVal("instruction")) === false) {
6885 mbroquet 3730 //
6886     return false;
6887     }
6888    
6889 softime 6565 // Si l'utilisateur est un intructeur qui correspond à la division du
6890     // dossier
6891     if ($this->is_instructeur_from_division_dossier() === true) {
6892     //
6893     return true;
6894 mbroquet 3730 }
6895    
6896 softime 6565 // Si l'utilisateur est instructeur de la commune du dossier et que
6897     // l'instruction est créée par un instructeur de la commune
6898     if ($this->is_instructeur_from_collectivite_dossier() === true and
6899     $this->getVal('created_by_commune') === 't') {
6900     return true;
6901 mbroquet 3730 }
6902    
6903     //
6904 softime 6565 return false;
6905 mbroquet 3730 }
6906    
6907     /**
6908     * CONDITION - is_unfinalizable_without_bypass.
6909     *
6910     * Condition pour afficher le bouton sans le bypass.
6911     *
6912     * @return boolean
6913     */
6914     function is_unfinalizable_without_bypass() {
6915     // Récupère la valeur du champ finalisé
6916     $om_final_instruction = $this->getVal('om_final_instruction');
6917    
6918     // Si l'instruction est finalisée
6919     if ($om_final_instruction == 't') {
6920     //
6921     return true;
6922     }
6923    
6924     //
6925     return false;
6926     }
6927    
6928 softime 5169
6929 mbroquet 3730 /**
6930 softime 6565 * Permet de définir si un instructeur commune peut editer une instruction
6931     *
6932     * @return boolean true si il peut
6933     */
6934     function isInstrCanChangeDecision($idx) {
6935    
6936     if ($this->f->isAccredited(array("instruction", "instruction_changer_decision"), "OR") !== true or
6937     $this->f->isUserInstructeur() !== true) {
6938     return false;
6939     }
6940    
6941    
6942    
6943     // Sinon on vérifie l'éligibilité du dossier au changement de décision
6944 softime 11876 // /!\ Requête lié à celles du widget indiquant les dossiers éligible au changement
6945     // de décision :
6946     // * dossier_instruction.class.php : view_widget_dossiers_evenement_retour_finalise()
6947     // * dossier_instruction.inc.php : si le paramètre filtre_decision = true
6948     $sql = sprintf(
6949     'SELECT
6950 softime 6565 dossier.dossier
6951     FROM
6952 softime 11876 %1$sdossier
6953     JOIN %1$setat
6954     ON dossier.etat = etat.etat AND etat.statut = \'encours\'
6955     JOIN %1$slien_dossier_demandeur
6956     ON dossier.dossier = lien_dossier_demandeur.dossier AND lien_dossier_demandeur.petitionnaire_principal IS TRUE
6957     JOIN %1$sdossier_instruction_type
6958     ON dossier.dossier_instruction_type=dossier_instruction_type.dossier_instruction_type
6959     JOIN %1$sinstruction
6960     -- Recherche de la dernière instruction qui ne soit pas liée à un événement retour
6961     ON instruction.instruction = (
6962     SELECT instruction
6963     FROM %1$sinstruction
6964     JOIN %1$sevenement ON instruction.evenement=evenement.evenement
6965     AND evenement.retour IS FALSE
6966     WHERE instruction.dossier = dossier.dossier
6967     ORDER BY date_evenement DESC, instruction DESC
6968     LIMIT 1
6969     )
6970     -- On ne garde que les dossiers pour lesquels la dernière instruction est finalisée
6971     -- ou alors pour laquelle l instruction a été ajouté par la commune et est
6972     -- non signée, non notifié, etc.
6973     AND (instruction.om_final_instruction IS TRUE
6974     OR instruction.created_by_commune IS TRUE)
6975     AND instruction.date_retour_signature IS NULL
6976     AND instruction.date_envoi_rar IS NULL
6977     AND instruction.date_retour_rar IS NULL
6978     AND instruction.date_envoi_controle_legalite IS NULL
6979     AND instruction.date_retour_controle_legalite IS NULL
6980     -- On vérifie que l instruction soit un arrêté ou un changement de décision
6981     JOIN %1$sevenement
6982     ON instruction.evenement=evenement.evenement
6983     AND (evenement.type = \'arrete\'
6984     OR evenement.type = \'changement_decision\')
6985     -- Recherche les informations du pétitionnaire principal pour l affichage
6986     JOIN %1$sdemandeur
6987     ON lien_dossier_demandeur.demandeur = demandeur.demandeur
6988     -- Recherche la collectivité rattachée à l instructeur
6989     JOIN %1$sinstructeur
6990     ON dossier.instructeur=instructeur.instructeur
6991     JOIN %1$sdivision
6992     ON instructeur.division=division.division
6993     JOIN %1$sdirection
6994     ON division.direction=direction.direction
6995     JOIN %1$som_collectivite
6996     ON direction.om_collectivite=om_collectivite.om_collectivite
6997 softime 6565 WHERE
6998 softime 11876 -- Vérification que la décision a été prise par l agglo
6999     om_collectivite.niveau = \'2\'
7000     AND dossier.dossier = \'%2$s\'
7001     ',
7002     DB_PREFIXE,
7003 softime 14064 $this->f->db->escapeSimple($idx)
7004 softime 11876 );
7005 softime 6565
7006    
7007     // Si collectivité de l'utilisateur niveau mono alors filtre sur celle-ci
7008     if ($this->f->isCollectiviteMono($_SESSION['collectivite']) === true) {
7009 softime 11876 $sql .= sprintf(
7010 softime 14064 ' AND dossier.om_collectivite = %1$d',
7011     intval($_SESSION['collectivite'])
7012 softime 11876 );
7013 softime 6565 }
7014 softime 14064 $qres = $this->f->get_one_result_from_db_query(
7015     $sql,
7016     array(
7017     "origin" => __METHOD__,
7018     )
7019     );
7020    
7021     return $qres['result'] !== null;
7022 softime 6565 }
7023    
7024    
7025     /**
7026 softime 5169 * CONDITION - can_monitoring_dates.
7027     *
7028     * Condition pour afficher le bouton de suivi des dates.
7029     *
7030     * @return boolean
7031     */
7032     public function can_monitoring_dates() {
7033     // Récupère la valeur du champ finalisé
7034     $om_final_instruction = $this->getVal('om_final_instruction');
7035    
7036     // Si l'instruction n'est pas finalisée
7037     if ($om_final_instruction !== 't') {
7038     //
7039     return false;
7040     }
7041    
7042     // Contrôle si l'utilisateur possède un bypass
7043 softime 7996 $bypass = $this->f->isAccredited($this->get_absolute_class_name()."_modification_dates_bypass");
7044 softime 5169 if ($bypass === true) {
7045     return true;
7046     }
7047    
7048 softime 8989 // Permission de modifier le suivi des dates sur un dossier cloturé pour
7049     // un utilisateur lié à un instructeur
7050     $perm_moni_dates_d_closed = $this->f->isAccredited($this->get_absolute_class_name()."_modification_dates_cloture");
7051    
7052     // On vérifie en premier lieu que le DI n'est pas clôturé et que
7053     // l'utilisateur ne possède pas la permission de modifier le suivi des
7054     // dates sur un dossier clôturé
7055 softime 5169 $inst_dossier = $this->get_inst_dossier();
7056 softime 8989 if ($inst_dossier->getStatut() === 'cloture'
7057     && $perm_moni_dates_d_closed === false) {
7058 softime 5169 //
7059     return false;
7060     }
7061     // On récupère ses infos
7062     $coll_di = $inst_dossier->getVal('om_collectivite');
7063     $div_di = $this->getDivisionFromDossier();
7064     // et celles de son éventuel instructeur
7065     $instr_di = $inst_dossier->getVal('instructeur');
7066    
7067 softime 6565 // Il faut disposer d'une entrée instructeur
7068     if ($this->f->isUserInstructeur() === false) {
7069     return false;
7070     }
7071    
7072 softime 5169 // Par défaut on prétend que l'instructeur n'est pas multi
7073     $instr_di_coll_multi = false;
7074     // Si un instructeur est affecté au dossier
7075     if ($instr_di !== '' && $instr_di !== null) {
7076     // Vérifie si l'instructeur est de la collectivité de niveau 2
7077 softime 5295 $instr_di_coll = $this->get_instructeur_om_collectivite($instr_di);
7078 softime 5169 if ($this->f->isCollectiviteMono($instr_di_coll) === false) {
7079     //
7080     $instr_di_coll_multi = true;
7081     }
7082     }
7083    
7084 softime 6565 // Il faut qu'il instruise le dossier ou soit de la même division
7085     if ($this->f->om_utilisateur['instructeur'] === $instr_di
7086     || $this->f->om_utilisateur['division'] === $div_di) {
7087 softime 5169 //
7088     return true;
7089     }
7090    
7091 softime 6565 // On donne également le droit s'il est de la même collectivité que
7092     // le dossier ET si l'instruction est déléguée à la communauté
7093     if ($this->f->isCollectiviteMono($this->f->om_utilisateur['om_collectivite']) === true
7094     && $this->f->om_utilisateur['om_collectivite'] === $coll_di
7095     && $instr_di_coll_multi === true) {
7096 softime 5169 //
7097     return true;
7098     }
7099    
7100 softime 6565 // Si l'instructeur ne rentre pas dans les deux cas précédents
7101 softime 5169 return false;
7102     }
7103    
7104    
7105     /**
7106 softime 12847 * CONDITION - is_finalized.
7107     *
7108     * Condition pour vérifier si une instruction est finalisée.
7109     *
7110     * @return boolean
7111     */
7112     public function is_finalized() {
7113    
7114     return $this->getVal('om_final_instruction') === "t";
7115     }
7116    
7117     /**
7118     * CONDITION - is_not_date_retour_signature_set.
7119     *
7120     * Condition pour vérifier si une date de retour signature n'est pas définie.
7121     *
7122     * @return boolean
7123     */
7124     public function is_not_date_retour_signature_set() {
7125    
7126     return $this->getVal('date_retour_signature') == null;
7127    
7128     }
7129    
7130    
7131     /**
7132 mbroquet 3730 * TREATMENT - finalize.
7133     *
7134     * Permet de finaliser un enregistrement.
7135     *
7136     * @param array $val valeurs soumises par le formulaire
7137     *
7138     * @return boolean
7139     */
7140     function finalize($val = array()) {
7141     // Cette méthode permet d'exécuter une routine en début des méthodes
7142     // dites de TREATMENT.
7143     $this->begin_treatment(__METHOD__);
7144 softime 10808 $message = '';
7145 softime 11585 $ev = $this->get_inst_evenement($this->getVal('evenement'));
7146 mbroquet 3730
7147 softime 18436 $this->f->log(__METHOD__, 'BEGIN');
7148     $collectivite_di = null;
7149     $data = array('val' => &$val);
7150     $data['ev'] = $ev;
7151     $data['collectivite_di'] = $collectivite_di;
7152     $this->f->module_manager->run_hooks('finalize_pre', $this, $data);
7153    
7154 softime 11585 // Controle du signataire
7155     if (! $this->controle_signataire($ev)) {
7156     $this->addToMessage(__("Le document ne peut pas être finalisé car aucun signataire n'a été sélectionné."));
7157     // Termine le traitement
7158     return $this->end_treatment(__METHOD__, false);
7159     }
7160    
7161 mbroquet 3730 // Traitement de la finalisation
7162     $ret = $this->manage_finalizing("finalize", $val);
7163    
7164     // Si le traitement retourne une erreur
7165     if ($ret !== true) {
7166    
7167     // Termine le traitement
7168 softime 5024 return $this->end_treatment(__METHOD__, false);
7169 mbroquet 3730 }
7170    
7171 softime 10808 // Envoi des notifications aux demandeurs si la notification est automatique
7172     // et que la signature n'est pas requise
7173     if ($ev->getVal('notification') === 'notification_automatique') {
7174 softime 13137 // Préparation du message de log en cas d'erreur de notification
7175 softime 13528 $msgLog = sprintf(
7176     '%s %s : %d',
7177     __('Erreur lors de la notification automatique du(des) pétitionnaire(s) suite à la finalisation de l\'instruction.'),
7178     __('Instruction notifiée'),
7179     $this->getVal($this->clePrimaire)
7180     );
7181 softime 10808 // Récupération de la catégorie et envoie des notifications au(x) demandeur(s)
7182     $collectivite_di = $this->get_dossier_instruction_om_collectivite($this->getVal('dossier'));
7183     // Récupération de la liste des demandeurs à notifier et de la catégorie
7184     $categorie = $this->f->get_param_option_notification($collectivite_di);
7185 softime 14064 $isPortal = $categorie === PORTAL;
7186 softime 10869 $demandeursANotifie = $this->get_demandeurs_notifiable(
7187     $this->getVal('dossier'),
7188     $isPortal
7189     );
7190 softime 10808
7191     // Création d'une notification et d'une tâche pour chaque demandeur à notifier
7192 softime 12124 $demandeurPrincipalNotifie = false;
7193 softime 10813 if (count($demandeursANotifie) > 0) {
7194     foreach ($demandeursANotifie as $demandeur) {
7195 softime 12124 // Identifie si le demandeur principal a été notifié ou pas
7196     // et récupère ses informations
7197     if ($demandeur['petitionnaire_principal'] == 't') {
7198     $demandeurPrincipalNotifie = true;
7199     // Si le demandeur principal est notifiable mais qu'il y a des erreurs dans
7200     // son paramétrage, on effectue pas le traitement et on passe à l'itération
7201     // suivante. On le considère également comme non notifié pour gérer l'envoie
7202     // des messages d'erreurs
7203     // Si la demande a été déposée via le portail alors le paramétrage n'a pas
7204     // d'impact sur la notification
7205     $erreursParam = $this->get_info_notification_fail();
7206     if (! $this->dossier_depose_sur_portail() && $erreursParam != array()) {
7207     $demandeurPrincipalNotifie = false;
7208     continue;
7209     }
7210     }
7211 softime 10813 // Ajout de la notif et récupération de son id
7212     $idNotif = $this->ajouter_notification(
7213     $this->getVal($this->clePrimaire),
7214     $this->f->get_connected_user_login_name(),
7215 softime 10968 $demandeur,
7216     $collectivite_di,
7217 softime 12433 array(),
7218 softime 10968 true
7219 softime 10808 );
7220 softime 10813 if ($idNotif === false) {
7221     // Termine le traitement
7222 softime 13528 $this->addToLog(
7223     sprintf('%s() : %s', __METHOD__, $msgLog),
7224     DEBUG_MODE
7225     );
7226 softime 10813 return $this->end_treatment(__METHOD__, false);
7227     }
7228     $notification_by_task = $this->notification_by_task(
7229     $idNotif,
7230     $this->getVal('dossier'),
7231     $categorie
7232 softime 10808 );
7233 softime 10813 if ($notification_by_task === false) {
7234 softime 13528 $this->addToLog(
7235     sprintf('%s() : %s', __METHOD__, $msgLog),
7236     DEBUG_MODE
7237     );
7238 softime 10813 $this->addToMessage(
7239     __("Erreur lors de la génération de la notification au(x) pétitionnaire(s).")
7240     );
7241     // Termine le traitement
7242     return $this->end_treatment(__METHOD__, false);
7243     }
7244 softime 12124 $this->addToMessage($message .= sprintf('%s<br/>%s', __("La notification a été générée."), __("Le suivi de la notification est disponible depuis l'instruction.")));
7245 softime 10808 }
7246     }
7247 softime 12847 // Pour la notification par mail ou la notification via portal si le dossier a
7248     // été déposés via portal, si le demandeur principal n'est pas notifiable,
7249     // on créé une nouvelle notification en erreur avec en commentaire la raison pour
7250     // laquelle le demandeur principal n'a pas pu être notifié
7251     $depotPortal = $this->dossier_depose_sur_portail();
7252     if (! $demandeurPrincipalNotifie && ($isPortal === false || $depotPortal === true)) {
7253 softime 13137 // Préparation des logs pour indiquer que le pétitionnaire principale n'est pas notifiable
7254 softime 13528 $msgLog .= sprintf(' %s', __('Le pétitionnaire principale n\'est pas notifiable.'));
7255 softime 12124 // Analyse pour savoir pourquoi le demandeur principal n'est pas notifiable
7256     $erreursParam = $this->get_info_notification_fail();
7257     $demandeurPrincipal = $this->get_info_petitionnaire_principal_dossier($this->getVal('dossier'));
7258     // Ajout de la notif et récupération de son id
7259     $idNotif = $this->ajouter_notification(
7260     $this->valF[$this->clePrimaire],
7261     $this->f->get_connected_user_login_name(),
7262     $demandeurPrincipal,
7263     $collectivite_di,
7264 softime 12433 array(),
7265 softime 12124 true,
7266     'Echec',
7267     implode(' ', $erreursParam)
7268     );
7269     if ($idNotif === false) {
7270     $this->addToMessage(
7271     __('Erreur : la création de la notification a échouée.').
7272     __("Veuillez contacter votre administrateur.")
7273     );
7274 softime 13528 $this->addToLog(
7275     sprintf('%s() : %s', __METHOD__, $msgLog),
7276     DEBUG_MODE
7277     );
7278 softime 12124 return false;
7279     }
7280     // Prépare un message d'alerte à destination de l'instructeur pour l'informer
7281     // de l'échec de la notification
7282     $dossier_message = $this->get_inst_dossier_message(0);
7283     $dossier_message_val = array(
7284     'dossier' => $this->getVal('dossier'),
7285     'type' => _('erreur expedition'),
7286     'emetteur' => $this->f->get_connected_user_login_name(),
7287     'login' => $_SESSION['login'],
7288     'date_emission' => date('Y-m-d H:i:s'),
7289     'contenu' => _('Échec lors de la notification de l\'instruction ').
7290     $ev->getVal('libelle').
7291     '.<br>'.
7292     implode("\n", $erreursParam).
7293     '<br>'.
7294     _('Veuillez corriger ces informations avant de renvoyer la notification.')
7295     );
7296     $add = $dossier_message->add_notification_message($dossier_message_val, true);
7297     // Si une erreur se produit pendant l'ajout
7298     if ($add !== true) {
7299     $this->addToLog(__METHOD__."(): Le message d'alerte concernant l'echec de l'envoi de la notification n'a pas pu être envoyé.", DEBUG_MODE);
7300     return false;
7301     }
7302     }
7303 softime 10808 }
7304    
7305 mbroquet 3730 // Termine le traitement
7306 softime 18436 // Événement
7307     $data['ev'] = $ev;
7308     $data['collectivite_di'] = $collectivite_di;
7309     $this->f->module_manager->run_hooks('finalize_post', $this, $data);
7310     $this->f->log(__METHOD__, 'END');
7311    
7312 mbroquet 3730 return $this->end_treatment(__METHOD__, true);
7313     }
7314    
7315     /**
7316 softime 12124 * Récupère l'instance de dossier message.
7317     *
7318     * @param string $dossier_message Identifiant du message.
7319     *
7320     * @return object
7321     */
7322     private function get_inst_dossier_message($dossier_message = null) {
7323     //
7324     return $this->get_inst_common("dossier_message", $dossier_message);
7325     }
7326    
7327     /**
7328 softime 11585 * Vérifie si le signataire est obligatoire pour finaliser
7329     * le document apartir du paramétrage de l'événement.
7330     * Si c'est le cas, vérifie si il y a bien un signataire
7331     * renseigné.
7332     * Si c'est le cas renvoie true, sinon renvoie false.
7333     *
7334     * @param evenement évenement de l'instruction permettant de
7335     * récupérer le paramétrage
7336     * @return boolean
7337     */
7338     protected function controle_signataire($evenement) {
7339     // Vérifie si le signataire est obligatoire et si c'est le cas
7340     // vérifie si il y a bien un signataire pour le document
7341     if ($evenement->is_signataire_obligatoire() &&
7342     ($this->getVal('signataire_arrete') === null ||
7343     $this->getVal('signataire_arrete') === '')) {
7344     return false;
7345     }
7346     return true;
7347     }
7348    
7349     /**
7350 mbroquet 3730 * TREATMENT - unfinalize.
7351     *
7352     * Permet de définaliser un enregistrement.
7353     *
7354     * @param array $val valeurs soumises par le formulaire
7355     *
7356     * @return boolean
7357     */
7358     function unfinalize($val = array()) {
7359    
7360     // Cette méthode permet d'exécuter une routine en début des méthodes
7361     // dites de TREATMENT.
7362     $this->begin_treatment(__METHOD__);
7363    
7364     // Traitement de la finalisation
7365     $ret = $this->manage_finalizing("unfinalize", $val);
7366    
7367     // Si le traitement retourne une erreur
7368     if ($ret !== true) {
7369    
7370     // Termine le traitement
7371 softime 5024 return $this->end_treatment(__METHOD__, false);
7372 mbroquet 3730 }
7373    
7374     // Termine le traitement
7375     return $this->end_treatment(__METHOD__, true);
7376     }
7377    
7378     /**
7379     * VIEW - view_edition
7380     *
7381     * Edite l'édition de l'instruction ou affiche celle contenue dans le stockage.
7382     *
7383     * @return null Si l'action est incorrecte
7384     */
7385     function view_edition() {
7386    
7387     // Si l'instruction est finalisée
7388     if($this->getVal("om_final_instruction") == 't'
7389     && $this->getVal("om_final_instruction") != null) {
7390    
7391     // Ouvre le document
7392 softime 7996 $lien = '../app/index.php?module=form&snippet=file&obj='.$this->table.'&'.
7393 mbroquet 3730 'champ=om_fichier_instruction&id='.$this->getVal($this->clePrimaire);
7394     //
7395     header("Location: ".$lien);
7396     } else {
7397    
7398     // Récupère la collectivite du dossier d'instruction
7399     $dossier_instruction_om_collectivite = $this->get_dossier_instruction_om_collectivite();
7400    
7401     //
7402     $collectivite = $this->f->getCollectivite($dossier_instruction_om_collectivite);
7403    
7404     // Paramètre du PDF
7405     $params = array(
7406     "watermark" => true,
7407     "specific" => array(
7408     "mode" => "previsualisation",
7409     ),
7410     );
7411 softime 8593 // Si la rédaction libre est activée sur l'instruction
7412     if ($this->getVal("flag_edition_integrale") == 't') {
7413     $params["specific"]["corps"] = array(
7414     "mode" => "set",
7415     "value" => $this->getVal("corps_om_htmletatex"),
7416     );
7417     $params["specific"]["titre"] = array(
7418     "mode" => "set",
7419     "value" => $this->getVal("titre_om_htmletat"),
7420     );
7421     }
7422 mbroquet 3730
7423     // Génération du PDF
7424     $result = $this->compute_pdf_output('lettretype', $this->getVal("lettretype"), $collectivite, null, $params);
7425 softime 18436 $result['filename'] = $this->determinate_name_doc_pdf();
7426 mbroquet 3730 // Affichage du PDF
7427     $this->expose_pdf_output(
7428     $result['pdf_output'],
7429     $result['filename']
7430     );
7431     }
7432     }
7433    
7434     /**
7435     * Récupère la collectivité du dossier d'instruction.
7436     *
7437 softime 7685 * @param string $dossier_instruction_id Identifiant du DI.
7438     *
7439 mbroquet 3730 * @return integer
7440     */
7441 softime 7685 function get_dossier_instruction_om_collectivite($dossier_instruction_id = null) {
7442 mbroquet 3730
7443 softime 7685 // Si l'identifiant n'est pas renseigné
7444     if ($dossier_instruction_id === null) {
7445 softime 8593 // Récupère la valeur
7446     if ($this->getVal('dossier') !== null && $this->getVal('dossier') !== '') {
7447     $dossier_instruction_id = $this->getVal('dossier');
7448     } elseif ($this->getParameter('idxformulaire') !== null
7449     && $this->getParameter('idxformulaire') !== '') {
7450     //
7451     $dossier_instruction_id = $this->getParameter('idxformulaire');
7452     } elseif ($this->f->get_submitted_get_value('idxformulaire') !== null
7453     && $this->f->get_submitted_get_value('idxformulaire') !== '') {
7454     //
7455     $dossier_instruction_id = $this->f->get_submitted_get_value('idxformulaire');
7456     }
7457 softime 7685 }
7458    
7459 mbroquet 3730 //
7460 softime 7996 $dossier_instruction = $this->f->get_inst__om_dbform(array(
7461     "obj" => "dossier_instruction",
7462     "idx" => $dossier_instruction_id,
7463     ));
7464 mbroquet 3730
7465     //
7466     return $dossier_instruction->getVal('om_collectivite');
7467     }
7468    
7469     /**
7470     * VIEW - view_bible
7471     *
7472     * Affiche la bible manuelle.
7473     *
7474     * @return void
7475     */
7476     function view_bible() {
7477     // Vérification de l'accessibilité sur l'élément
7478     $this->checkAccessibility();
7479    
7480     /**
7481     * Affichage de la structure HTML
7482     */
7483     //
7484 softime 8989 if ($this->f->isAjaxRequest()) {
7485 mbroquet 3730 //
7486     header("Content-type: text/html; charset=".HTTPCHARSET."");
7487     } else {
7488     //
7489 softime 8989 $this->f->setFlag("htmlonly");
7490     $this->f->display();
7491 mbroquet 3730 }
7492     //
7493 softime 8989 $this->f->displayStartContent();
7494 mbroquet 3730 //
7495 softime 8989 $this->f->setTitle(_("Liste des éléments de la bible en lien avec un evenement"));
7496     $this->f->displayTitle();
7497 mbroquet 3730
7498     /**
7499     *
7500     */
7501     //
7502 softime 8989 ($this->f->get_submitted_get_value("ev") ? $evenement = $this->f->get_submitted_get_value("ev") : $evenement = "");
7503 mbroquet 3730 $evenement = intval($evenement);
7504     //
7505 softime 8989 ($this->f->get_submitted_get_value("idx") ? $idx = $this->f->get_submitted_get_value("idx") : $idx = "");
7506 softime 5169 // Récupération du code du type de DA
7507     $code_da_type = '';
7508     if (preg_match('/[A-Za-z]{2,3}/', $idx, $matches) !== false) {
7509     $code_da_type = $matches[0];
7510     }
7511 mbroquet 3730 //
7512 softime 8989 ($this->f->get_submitted_get_value("complement") ? $complement = $this->f->get_submitted_get_value("complement") : $complement = "1");
7513 mbroquet 3730
7514     // Récupération de la collectivité du dossier
7515 softime 7996 $dossier = $this->f->get_inst__om_dbform(array(
7516     "obj" => "dossier",
7517     "idx" => $idx,
7518     ));
7519 mbroquet 3730
7520 softime 14542 $qres = $this->f->get_all_results_from_db_query(
7521     sprintf(
7522     'SELECT
7523     *,
7524     bible.libelle as bible_lib
7525     FROM
7526     %1$sbible
7527     LEFT OUTER JOIN %1$sdossier_autorisation_type
7528     ON bible.dossier_autorisation_type = dossier_autorisation_type.dossier_autorisation_type
7529     LEFT JOIN %1$som_collectivite
7530     ON bible.om_collectivite = om_collectivite.om_collectivite
7531     WHERE
7532     (evenement = %2$d
7533     OR evenement IS NULL)
7534     AND (complement = %3$d
7535     OR complement IS NULL)
7536     AND (bible.dossier_autorisation_type IS NULL
7537     OR dossier_autorisation_type.code = \'%4$s\')
7538     AND (om_collectivite.niveau = \'2\'
7539     OR bible.om_collectivite = %5$d)
7540     ORDER BY
7541     bible_lib ASC',
7542     DB_PREFIXE,
7543     intval($evenement),
7544     intval($complement),
7545     $this->f->db->escapeSimple($code_da_type),
7546     intval($dossier->getVal("om_collectivite"))
7547     ),
7548     array(
7549     'origin' => __METHOD__
7550     )
7551     );
7552 mbroquet 3730 //
7553     echo "<form method=\"post\" name=\"f3\" action=\"#\">\n";
7554     //
7555 softime 15835 if ($qres['row_count'] > 0) {
7556 mbroquet 3730 //
7557     echo "\t<table id='tab-bible' width='100%'>\n";
7558     //
7559     echo "\t\t<tr class=\"ui-tabs-nav ui-accordion ui-state-default tab-title\">";
7560     echo "<th>"._("Choisir")."</th>";
7561     echo "<th>"._("Libelle")."</th>";
7562     echo "</tr>\n";
7563     //
7564     $i = 0;
7565     //
7566 softime 14542 foreach ($qres['result'] as $row) {
7567 mbroquet 3730 //
7568     echo "\t\t<tr";
7569     echo " class=\"".($i % 2 == 0 ? "odd" : "even")."\"";
7570     echo ">";
7571     //
7572     echo "<td class=\"center\"><input type=\"checkbox\" name=\"choix[]\" value=\"".$i."\" id=\"checkbox".$i."\" /></td>";
7573     // XXX utilisation de l'attribut titre pour afficher une infobulle
7574     echo "<td><span class=\"content\" title=\"".htmlentities($row['contenu'])."\" id=\"content".$i."\">".$row['bible_lib']."</span></td>";
7575     //
7576     echo "</tr>\n";
7577     //
7578     $i++;
7579     }
7580     echo "\t</table>\n";
7581     //
7582     echo "<div class=\"formControls\">\n";
7583 softime 8989 $this->f->layout->display_form_button(array(
7584 mbroquet 3730 "value" => _("Valider"),
7585     "onclick" => "bible_return('f2', 'complement".($complement == "1" ? "" : $complement)."_om_html'); return false;",
7586     ));
7587 softime 8989 $this->f->displayLinkJsCloseWindow();
7588 mbroquet 3730 echo "</div>\n";
7589    
7590     } else {
7591     //
7592     $message_class = "error";
7593     $message = _("Aucun element dans la bible pour l'evenement")." : ".$evenement;
7594 softime 8989 $this->f->displayMessage($message_class, $message);
7595 mbroquet 3730 //
7596     echo "<div class=\"formControls\">\n";
7597 softime 8989 $this->f->displayLinkJsCloseWindow();
7598 mbroquet 3730 echo "</div>\n";
7599     }
7600     //
7601     echo "</form>\n";
7602    
7603     /**
7604     * Affichage de la structure HTML
7605     */
7606     //
7607 softime 8989 $this->f->displayEndContent();
7608 mbroquet 3730 }
7609    
7610     /**
7611 softime 5169 * VIEW - view_bible_auto
7612 mbroquet 3730 *
7613 softime 5169 * Renvoie les valeurs de la bible à placer dans les compléments de l'instruction.
7614 mbroquet 3730 *
7615     * @return void
7616     */
7617     function view_bible_auto() {
7618     // Vérification de l'accessibilité sur l'élément
7619     $this->checkAccessibility();
7620     //
7621 softime 8989 $this->f->disableLog();
7622 mbroquet 3730
7623     $formatDate="AAAA-MM-JJ";
7624    
7625     // Récupération des paramètres
7626 softime 8989 $idx = $this->f->get_submitted_get_value('idx');
7627     $evenement = $this->f->get_submitted_get_value('ev');
7628 mbroquet 3730
7629     // Initialisation de la variable de retour
7630     $retour['complement_om_html'] = '';
7631     $retour['complement2_om_html'] = '';
7632     $retour['complement3_om_html'] = '';
7633     $retour['complement4_om_html'] = '';
7634 softime 14064
7635 mbroquet 3730 // Vérification d'une consultation liée à l'événement
7636 softime 14064 $instEvenement = $this->f->get_inst__om_dbform(array(
7637     "obj" => "evenement",
7638     "idx" => $evenement,
7639     ));
7640    
7641 mbroquet 3730 // Si consultation liée, récupération du retour d'avis
7642 softime 14064 if($instEvenement->getVal('consultation') == 'Oui'){
7643 softime 14542
7644     $qres = $this->f->get_all_results_from_db_query(
7645     sprintf(
7646     'SELECT
7647     date_retour,
7648     avis_consultation.libelle as avis_consultation,
7649     COALESCE(service.libelle, tiers_consulte.libelle) as service
7650     FROM
7651     %1$sconsultation
7652     LEFT JOIN %1$stiers_consulte
7653     ON consultation.tiers_consulte = tiers_consulte.tiers_consulte
7654     LEFT JOIN %1$sservice
7655     ON consultation.service = service.service
7656     LEFT JOIN %1$savis_consultation
7657     ON consultation.avis_consultation = avis_consultation.avis_consultation
7658     WHERE
7659     dossier = \'%2$s\'
7660     AND consultation.visible',
7661     DB_PREFIXE,
7662     $this->f->db->escapeSimple($idx)
7663     ),
7664     array(
7665     'origin' => __METHOD__
7666     )
7667 softime 11876 );
7668 mbroquet 3730 // Récupération des consultations
7669 softime 14542 foreach ($qres['result'] as $row) {
7670 mbroquet 3730 $correct=false;
7671     // date retour
7672     if ($row['date_retour']<>""){
7673     if ($formatDate=="AAAA-MM-JJ"){
7674     $date = explode("-", $row['date_retour']);
7675     // controle de date
7676     if (count($date) == 3 and
7677     checkdate($date[1], $date[2], $date[0])) {
7678     $date_retour_f= $date[2]."/".$date[1]."/".$date[0];
7679     $correct=true;
7680     }else{
7681     $msg= $msg."<br>La date ".$row['date_retour']." n'est pas une date.";
7682     $correct=false;
7683     }
7684     }
7685     }
7686     //
7687     $temp="Vu l'avis ".$row['avis_consultation']." du service ".$row['service'];
7688     if($correct == true){
7689     $temp=$temp." du ".$date_retour_f;
7690     }
7691     // Concaténation des retours d'avis de consultation
7692 softime 7067 $retour['complement_om_html'] .= $temp . "<br/><br/>";
7693 mbroquet 3730 } // while
7694    
7695     } // consultation
7696     // Récupération des bibles automatiques pour le champ complement_om_html
7697 softime 8989 $retour['complement_om_html'] .= $this->getBible($evenement, $idx, '1');
7698 mbroquet 3730 // Récupération des bibles automatiques pour le champ complement2_om_html
7699 softime 8989 $retour['complement2_om_html'] .= $this->getBible($evenement, $idx, '2');
7700 mbroquet 3730 // Récupération des bibles automatiques pour le champ complement3_om_html
7701 softime 8989 $retour['complement3_om_html'] .= $this->getBible($evenement, $idx, '3');
7702 mbroquet 3730 // Récupération des bibles automatiques pour le champ complement4_om_html
7703 softime 8989 $retour['complement4_om_html'] .= $this->getBible($evenement, $idx, '4');
7704 mbroquet 3730
7705    
7706    
7707     echo json_encode($retour);
7708     }
7709    
7710     /**
7711 softime 7521 * VIEW - view_pdf_temp
7712     *
7713     * @return void
7714     */
7715     function view_pdf_temp() {
7716     $this->checkAccessibility();
7717 softime 8593 // Utilisation de $_POST pour ne pas que les textes soient altérés.
7718 softime 7521 $this->f->set_submitted_value();
7719 softime 8593 $merge_fields = array();
7720     //
7721     if (array_key_exists('c1', $_POST) === true) {
7722 softime 11876 $merge_fields['[complement_instruction]'] = $_POST['c1'];
7723     $merge_fields['[complement1_instruction]'] = $_POST['c1'];
7724 softime 8593 }
7725     if (array_key_exists('c2', $_POST) === true) {
7726 softime 11876 $merge_fields['[complement2_instruction]'] = $_POST['c2'];
7727 softime 8593 }
7728     if (array_key_exists('c3', $_POST) === true) {
7729 softime 11876 $merge_fields['[complement3_instruction]'] = $_POST['c3'];
7730 softime 8593 }
7731     if (array_key_exists('c4', $_POST) === true) {
7732 softime 11876 $merge_fields['[complement4_instruction]'] = $_POST['c4'];
7733 softime 8593 }
7734 softime 7521 $params = array(
7735     "watermark" => true,
7736     "specific" => array(
7737     "merge_fields" => $merge_fields,
7738     ),
7739     );
7740 softime 8593 //
7741     if (array_key_exists('corps', $_POST) === true) {
7742     $params["specific"]["corps"] = array(
7743     "mode" => "set",
7744 softime 11876 "value" => $_POST['corps'],
7745 softime 8593 );
7746     }
7747     if (array_key_exists('titre', $_POST) === true) {
7748     $params["specific"]["titre"] = array(
7749     "mode" => "set",
7750 softime 11876 "value" => $_POST['titre'],
7751 softime 8593 );
7752     }
7753 softime 7521 $dossier_instruction_om_collectivite = $this->get_dossier_instruction_om_collectivite();
7754     $collectivite = $this->f->getCollectivite($dossier_instruction_om_collectivite);
7755     $result = $this->compute_pdf_output('lettretype', $this->getVal('lettretype'), $collectivite, null, $params);
7756     $retour = array(
7757     'base' => base64_encode($result['pdf_output']),
7758     );
7759     echo json_encode($retour);
7760     }
7761    
7762     /**
7763     * Dans le contexte de prévisualisation des éditions, génère le rendu du
7764     * PDF sans prise en compte de la valeur des compléments et le retourne en
7765     * base 64.
7766     *
7767     * @return string Rendu PDF converti en base 64.
7768     */
7769     function init_pdf_temp() {
7770     $params = array(
7771     "watermark" => true,
7772     );
7773 softime 8593 // Si la rédaction libre est activée sur l'instruction
7774     if ($this->getVal("flag_edition_integrale") == 't') {
7775     $params["specific"]["corps"] = array(
7776     "mode" => "set",
7777     "value" => $this->getVal("corps_om_htmletatex"),
7778     );
7779     $params["specific"]["titre"] = array(
7780     "mode" => "set",
7781     "value" => $this->getVal("titre_om_htmletat"),
7782     );
7783     }
7784 softime 7521 $dossier_instruction_om_collectivite = $this->get_dossier_instruction_om_collectivite();
7785     $collectivite = $this->f->getCollectivite($dossier_instruction_om_collectivite);
7786     $result = $this->compute_pdf_output('lettretype', $this->getVal('lettretype'), $collectivite, null, $params);
7787    
7788     return base64_encode($result['pdf_output']);
7789     }
7790    
7791     /**
7792 mbroquet 3730 * Récupération des éléments de bible.
7793     *
7794     * @param integer $event id de l'événement
7795     * @param string $idx id du dossier
7796     * @param integer $compnb numéro du champ complement
7797 softime 17036 * @param string $type types possibles : automatique ou precharge
7798 mbroquet 3730 *
7799     * @return string Chaîne de texte à insérer dans le champ complement
7800     */
7801 softime 17036 function getBible($event, $idx, $compnb, $type = 'automatique') {
7802 mbroquet 3730 // Récupération de la collectivité du dossier
7803 softime 7996 $dossier = $this->f->get_inst__om_dbform(array(
7804     "obj" => "dossier",
7805     "idx" => $idx,
7806     ));
7807 softime 5169 // Récupération du code du type de DA
7808     $code_da_type = '';
7809     if (preg_match('/[A-Za-z]{2,3}/', $idx, $matches) !== false) {
7810     $code_da_type = $matches[0];
7811     }
7812 mbroquet 3730
7813 softime 17036 // Prépare le filtre de la requête selon le type de remplissage voulu
7814     $sql_filter_type = '';
7815     if ($type === 'automatique') {
7816     $sql_filter_type = "AND automatique = 'Oui'";
7817     } elseif ($type === 'precharge') {
7818     $sql_filter_type = "AND precharge IS TRUE";
7819     }
7820    
7821 softime 14542 $qres = $this->f->get_all_results_from_db_query(
7822     sprintf(
7823     'SELECT
7824     *
7825     FROM
7826     %1$sbible
7827     LEFT OUTER JOIN %1$sdossier_autorisation_type
7828     ON bible.dossier_autorisation_type =
7829     dossier_autorisation_type.dossier_autorisation_type
7830     LEFT JOIN %1$som_collectivite
7831     ON bible.om_collectivite = om_collectivite.om_collectivite
7832     WHERE
7833     (evenement = %2$d
7834     OR evenement IS NULL)
7835     AND (complement = %3$d
7836     OR complement IS NULL)
7837     AND (dossier_autorisation_type.code = \'%4$s\'
7838     OR bible.dossier_autorisation_type IS NULL)
7839     AND (om_collectivite.niveau = \'2\'
7840 softime 17036 OR bible.om_collectivite = %5$d)
7841     %6$s',
7842 softime 14542 DB_PREFIXE,
7843     intval($event),
7844     intval($compnb),
7845     $this->f->db->escapeSimple($code_da_type),
7846 softime 17036 intval($dossier->getVal("om_collectivite")),
7847     $sql_filter_type
7848 softime 14542 ),
7849     array(
7850     "origin" => __METHOD__
7851     )
7852     );
7853 mbroquet 3730 $temp = "";
7854 softime 14542 foreach ($qres['result'] as $row) {
7855 mbroquet 3730 // Remplacement des retours à la ligne par des br
7856     $temp .= preg_replace(
7857     '#(\\\r|\\\r\\\n|\\\n)#', '<br/>', $row['contenu']
7858     );
7859 softime 7521 // Ajout d'un saut de ligne entre chaque bible.
7860     $temp .= '<br/>';
7861 mbroquet 3730 } // fin while
7862     return $temp;
7863     }
7864    
7865     /**
7866     * VIEW - view_suivi_bordereaux.
7867     *
7868 nmeucci 4317 * Formulaire de choix du bordereau de suivi, permettant de générer les 4 bordereaux.
7869     * Si l'utilisateur est d'une collectivité de niveau 2 il a le choix de la
7870     * collectivité des dossiers affichés.
7871 mbroquet 3730 *
7872     * @return void
7873     */
7874     function view_suivi_bordereaux() {
7875     // Vérification de l'accessibilité sur l'élément
7876     $this->checkAccessibility();
7877    
7878     /**
7879     * Validation du formulaire
7880     */
7881     // Si le formulaire a été validé
7882 softime 8989 if ($this->f->get_submitted_post_value("validation") !== null) {
7883 mbroquet 3730 // Si un bordereau à été sélectionné
7884 softime 8989 if ($this->f->get_submitted_post_value("bordereau") !== null && $this->f->get_submitted_post_value("bordereau") == "" ) {
7885 mbroquet 3730 // Si aucun bordereau n'a été sélectionné
7886     $message_class = "error";
7887     $message = _("Veuillez selectionner un bordereau.");
7888     }
7889     // Sinon si les dates ne sont pas valide
7890 softime 8989 elseif (($this->f->get_submitted_post_value("date_bordereau_debut") !== null
7891     && $this->f->get_submitted_post_value("date_bordereau_debut") == "")
7892     || ($this->f->get_submitted_post_value("date_bordereau_fin") !== null
7893     && $this->f->get_submitted_post_value("date_bordereau_fin") == "")) {
7894 mbroquet 3730 // Si aucune date n'a été saisie
7895     $message_class = "error";
7896     $message = _("Veuillez saisir une date valide.");
7897     }
7898 softime 7366 // Sinon si les dates ne sont pas valides
7899 softime 8989 elseif ($this->f->get_submitted_post_value("bordereau") === "bordereau_avis_maire_prefet"
7900     && $this->f->getParameter("id_evenement_bordereau_avis_maire_prefet") == null) {
7901 softime 7366 // Si aucune date n'a été saisie
7902     $message_class = "error";
7903     $message = _("Erreur de parametrage. Contactez votre administrateur.");
7904     }
7905 mbroquet 3730 // Affiche le message de validation
7906     else {
7907     // On récupère le libellé du bordereau pour l'afficher à l'utilisateur
7908 softime 14064 $etat = $this->f->get_inst__om_dbform(array(
7909     "obj" => "om_etat",
7910     "idx" => $this->f->get_submitted_post_value("bordereau")
7911     ));
7912     $qres = $this->f->get_one_result_from_db_query(
7913     sprintf(
7914     'SELECT
7915     om_etat.libelle
7916     FROM
7917     %som_etat
7918     WHERE
7919     om_etat.id = \'%s\'',
7920     DB_PREFIXE,
7921     $this->f->db->escapeSimple($this->f->get_submitted_post_value("bordereau"))
7922     ),
7923     array(
7924     "origin" => __METHOD__,
7925     )
7926     );
7927    
7928 mbroquet 3730 //
7929     $message_class = "valid";
7930     $message = _("Cliquez sur le lien ci-dessous pour telecharger votre bordereau");
7931     $message .= " : <br/><br/>";
7932     $message .= "<a class='om-prev-icon pdf-16'";
7933     $message .= " title=\""._("Bordereau")."\"";
7934 softime 7996 $message .= "href='".OM_ROUTE_FORM."&obj=instruction";
7935 nmeucci 4317 $message .= "&action=220";
7936     $message .= "&idx=0";
7937 softime 8989 $message .= "&type_bordereau=".$this->f->get_submitted_post_value("bordereau");
7938     $message .= "&date_bordereau_debut=".$this->f->get_submitted_post_value("date_bordereau_debut");
7939     $message .= "&date_bordereau_fin=".$this->f->get_submitted_post_value("date_bordereau_fin");
7940 mbroquet 3730 // Si l'utilisateur est MULTI alors on ajoute le paramètre collectivite
7941 softime 8989 if ($this->f->get_submitted_post_value("om_collectivite") !== null) {
7942     $message .= "&collectivite=".$this->f->get_submitted_post_value("om_collectivite");
7943 mbroquet 3730 }
7944     $message .= "'"." target='_blank'>";
7945 softime 14064 $message .= $qres['result']." "._("du")." ".$this->f->get_submitted_post_value("date_bordereau_debut")
7946 softime 8989 ." "._("au")." ".$this->f->get_submitted_post_value("date_bordereau_fin");
7947 mbroquet 3730 $message .= "</a>";
7948     }
7949     }
7950    
7951     /**
7952     * Affichage des messages et du formulaire
7953     */
7954     // Affichage du message de validation ou d'erreur
7955     if (isset($message) && isset($message_class) && $message != "") {
7956 softime 8989 $this->f->displayMessage($message_class, $message);
7957 mbroquet 3730 }
7958     // Ouverture du formulaire
7959     printf("\t<form");
7960     printf(" method=\"post\"");
7961     printf(" id=\"suivi_bordereaux_form\"");
7962     printf(" action=\"\"");
7963     printf(">\n");
7964     // Paramétrage des champs du formulaire
7965     $champs = array("date_bordereau_debut", "date_bordereau_fin", "bordereau");
7966 softime 8989 // Si l'utilisateur est d'une collectivité de niveau 2 on affiche un select
7967 mbroquet 3730 // collectivité dans le formulaire
7968 softime 8989 if ($_SESSION["niveau"] == 2) {
7969 mbroquet 3730 array_push($champs, "om_collectivite");
7970     }
7971     // Création d'un nouvel objet de type formulaire
7972 softime 7996 $form = $this->f->get_inst__om_formulaire(array(
7973     "validation" => 0,
7974     "maj" => 0,
7975     "champs" => $champs,
7976     ));
7977 mbroquet 3730 // Paramétrage du champ date_bordereau_debut
7978     $form->setLib("date_bordereau_debut", _("date_bordereau_debut"));
7979     $form->setType("date_bordereau_debut", "date");
7980     $form->setTaille("date_bordereau_debut", 12);
7981     $form->setMax("date_bordereau_debut", 12);
7982     $form->setRequired("date_bordereau_debut");
7983     $form->setOnchange("date_bordereau_debut", "fdate(this)");
7984     $form->setVal("date_bordereau_debut", date("d/m/Y"));
7985     // Paramétrage du champ date_bordereau_fin
7986     $form->setLib("date_bordereau_fin", _("date_bordereau_fin"));
7987     $form->setType("date_bordereau_fin", "date");
7988     $form->setTaille("date_bordereau_fin", 12);
7989     $form->setMax("date_bordereau_fin", 12);
7990     $form->setRequired("date_bordereau_fin");
7991     $form->setOnchange("date_bordereau_fin", "fdate(this)");
7992     $form->setVal("date_bordereau_fin", date("d/m/Y"));
7993     // Paramétrage du champ bordereau
7994     $form->setLib("bordereau", _("bordereau"));
7995     $form->setType("bordereau", "select");
7996     $form->setRequired("bordereau");
7997     // Valeurs des champs
7998 softime 8989 if ($this->f->get_submitted_post_value("validation") !== null) {
7999     $form->setVal("date_bordereau_debut", $this->f->get_submitted_post_value("date_bordereau_debut"));
8000     $form->setVal("date_bordereau_fin", $this->f->get_submitted_post_value("date_bordereau_fin"));
8001     $form->setVal("bordereau", $this->f->get_submitted_post_value("bordereau"));
8002     $form->setVal("om_collectivite", $this->f->get_submitted_post_value("om_collectivite"));
8003 mbroquet 3730 }
8004     // Données du select - On récupère ici la liste de tous les états disponibles
8005     // dans la table om_etat qui ont un id qui commence par la cahine de caractères
8006     // 'bordereau_'
8007 softime 14542 $qres = $this->f->get_all_results_from_db_query(
8008     sprintf(
8009     'SELECT
8010     om_etat.id,
8011     om_etat.libelle
8012     FROM
8013     %1$som_etat
8014     WHERE
8015     om_etat.id LIKE \'bordereau_%%\'
8016     ORDER BY
8017     om_etat.id',
8018     DB_PREFIXE
8019     ),
8020     array(
8021     "origin" => __METHOD__
8022     )
8023     );
8024 mbroquet 3730 // Données du select
8025     $contenu = array(
8026     0 => array("", ),
8027     1 => array(_("choisir bordereau")),
8028     );
8029 softime 14542 foreach ($qres['result'] as $row) {
8030 mbroquet 3730 $contenu[0][] = $row['id'];
8031     $contenu[1][] = $row['libelle'];
8032     }
8033     $form->setSelect("bordereau", $contenu);
8034 softime 8989 //
8035     if ($_SESSION["niveau"] == 2) {
8036     $form->setLib("om_collectivite", _("collectivite"));
8037     $form->setType("om_collectivite", "select");
8038 mbroquet 3730
8039 softime 8989 // Données du select - On récupère ici la liste de tous toutes les collectivités
8040     // de niveau 1
8041 softime 14542 $qres = $this->f->get_all_results_from_db_query(
8042     sprintf(
8043     'SELECT
8044     om_collectivite,
8045     libelle
8046     FROM
8047     %1$som_collectivite
8048     WHERE
8049     niveau = \'1\'
8050     ORDER BY
8051     libelle',
8052     DB_PREFIXE
8053     ),
8054     array(
8055     "origin" => __METHOD__
8056     )
8057     );
8058 softime 8989 // La valeur par défaut du select est Toutes
8059     $list_collectivites = array(
8060     0 => array("", ),
8061     1 => array(_("toutes"))
8062     );
8063 mbroquet 3730
8064 softime 8989 $id_colls = "";
8065     // On stocke dans $id_colls l'id de toutes les collectivités de niveau 1 séparées
8066     // par des virgules, pour un traitement plus facile dans la requête de sous-état
8067 softime 14542 foreach ($qres['result'] as $row) {
8068 softime 8989 if ($id_colls != "") {
8069     $id_colls .= ",";
8070     }
8071     $id_colls .= $row['om_collectivite'];
8072     $list_collectivites[0][] = $row['om_collectivite'];
8073     $list_collectivites[1][] = $row['libelle'];
8074 mbroquet 3730 }
8075 softime 8989 // On affecte la liste d'identifiants à l'option Toutes
8076     $list_collectivites[0][0] = $id_colls ;
8077     $form->setSelect("om_collectivite", $list_collectivites);
8078 mbroquet 3730 }
8079     // Affichage du formulaire
8080     $form->entete();
8081     $form->afficher($champs, 0, false, false);
8082     $form->enpied();
8083     // Affichage du bouton
8084     printf("\t<div class=\"formControls\">\n");
8085 softime 8989 $this->f->layout->display_form_button(array("value" => _("Valider"), "name" => "validation"));
8086 mbroquet 3730 printf("\t</div>\n");
8087     // Fermeture du formulaire
8088     printf("\t</form>\n");
8089     }
8090    
8091 nmeucci 4317
8092     /**
8093     * VIEW - view_generate_suivi_bordereaux.
8094     *
8095     * Génère et affiche les bordereaux de suivi.
8096     *
8097     * @return [void]
8098     */
8099     function view_generate_suivi_bordereaux() {
8100     // Vérification de l'accessibilité sur l'élément
8101     $this->checkAccessibility();
8102     // Récupération du type de bordereau
8103     $bordereau = $this->f->get_submitted_get_value('type_bordereau');
8104     // Génération du PDF
8105     $result = $this->compute_pdf_output('etat', $bordereau, null, $this->getVal($this->clePrimaire));
8106     // Affichage du PDF
8107     $this->expose_pdf_output(
8108     $result['pdf_output'],
8109     $result['filename']
8110     );
8111     }
8112    
8113    
8114 mbroquet 3730 /**
8115     * VIEW - view_suivi_envoi_lettre_rar.
8116     *
8117 softime 8989 * Vue pour imprimer les AR.
8118 mbroquet 3730 *
8119     * @return void
8120     */
8121     function view_suivi_envoi_lettre_rar() {
8122     // Vérification de l'accessibilité sur l'élément
8123     $this->checkAccessibility();
8124    
8125     //
8126 softime 8989 if ($this->f->get_submitted_post_value("date") !== null) {
8127     $date = $this->f->get_submitted_post_value("date");
8128 mbroquet 3730 } else {
8129     $date = "";
8130     }
8131     //
8132 softime 8989 if ($this->f->get_submitted_post_value("liste_code_barres_instruction") !== null) {
8133     $liste_code_barres_instruction = $this->f->get_submitted_post_value("liste_code_barres_instruction");
8134 mbroquet 3730 } else {
8135     $liste_code_barres_instruction = "";
8136     }
8137    
8138     // Compteur du nombre de page générées
8139     $nbLettres = 0;
8140     // Liste d'id des instructions
8141     $id4Gen = array();
8142     //
8143     $error = "";
8144    
8145 softime 5504 // Initialisation du tableau qui va contenir les DI pour lister les liens
8146     $dossierTab = array();
8147     // On vérifie que l'utilisateur ait les droits pour afficher des consultations
8148     $isAccredited = $this->f->isAccredited(array("dossier_instruction","dossier_instruction_consulter"), "OR");
8149     $hasHidden = true;
8150     // S'il ne peut pas les consulter il aura des dossiers caché
8151     if ($isAccredited === true) {
8152     $hasHidden = false;
8153     }
8154    
8155 mbroquet 3730 /**
8156     * Validation du formulaire
8157     */
8158     // Si le formulaire a été validé
8159 softime 8989 if ($this->f->get_submitted_post_value('validation') !== null) {
8160 mbroquet 3730 //
8161     if (empty($date) || empty($liste_code_barres_instruction)) {
8162     //
8163     $message_class = "error";
8164     $message = _("Tous les champs doivent etre remplis.");
8165     } else {
8166     // Création d'un tableau d'instruction
8167 softime 8989 $liste = explode("\r\n", $this->f->get_submitted_post_value("liste_code_barres_instruction"));
8168 mbroquet 3730 //
8169     foreach ($liste as $code_barres) {
8170     // On enlève les éventuels espaces saisis
8171     $code_barres = trim($code_barres);
8172     // Vérification de l'existence de l'instruction
8173     if ($code_barres != "") {
8174     // Si la valeur transmise est numérique
8175     if (is_numeric($code_barres)) {
8176     //
8177 softime 6565 $sql = "SELECT count(*)
8178     FROM ".DB_PREFIXE."instruction
8179     INNER JOIN ".DB_PREFIXE."dossier
8180     ON dossier.dossier=instruction.dossier
8181     INNER JOIN ".DB_PREFIXE."dossier_instruction_type
8182     ON dossier.dossier_instruction_type = dossier_instruction_type.dossier_instruction_type
8183     INNER JOIN ".DB_PREFIXE."dossier_autorisation_type_detaille
8184     ON dossier_instruction_type.dossier_autorisation_type_detaille = dossier_autorisation_type_detaille.dossier_autorisation_type_detaille
8185     INNER JOIN ".DB_PREFIXE."dossier_autorisation_type
8186     ON dossier_autorisation_type_detaille.dossier_autorisation_type = dossier_autorisation_type.dossier_autorisation_type
8187     INNER JOIN ".DB_PREFIXE."groupe
8188     ON dossier_autorisation_type.groupe = groupe.groupe
8189     WHERE code_barres='".$this->f->db->escapesimple($code_barres)."'";
8190 softime 7067
8191     // Ajout d'un filtre sur les groupes auxquels l'utilisateur a accès
8192     $group_clause = array();
8193     foreach ($_SESSION["groupe"] as $key => $value) {
8194     $group_clause[$key] = "(groupe.code = '".$key."'";
8195     if($value["confidentiel"] !== true) {
8196     $group_clause[$key] .= " AND dossier_autorisation_type.confidentiel IS NOT TRUE";
8197     }
8198     $group_clause[$key] .= ")";
8199     }
8200     $conditions = implode(" OR ", $group_clause);
8201     $sql .= " AND (" . $conditions . ")";
8202    
8203 softime 14064 $qres = $this->f->get_one_result_from_db_query(
8204     $sql,
8205     array(
8206     "origin" => __METHOD__,
8207     )
8208     );
8209    
8210     if ($qres['result'] == "1") {
8211 mbroquet 3730 // Récupération de la date d'envoi de l'instruction bippé
8212 softime 14542 $qres = $this->f->get_all_results_from_db_query(
8213     sprintf(
8214     'SELECT
8215     to_char(date_envoi_rar, \'DD/MM/YYYY\') as date_envoi_rar,
8216     instruction
8217     FROM
8218     %1$sinstruction
8219     WHERE
8220     code_barres = \'%2$s\'',
8221     DB_PREFIXE,
8222     $this->f->db->escapeSimple($code_barres)
8223     ),
8224     array(
8225     'origin' => __METHOD__
8226     )
8227     );
8228     $row = array_shift($qres['result']);
8229 mbroquet 3730 // Si pas de date ou correspond à la date du formulaire on
8230     // effectue le traitement
8231     if ($row["date_envoi_rar"] == "" || $row["date_envoi_rar"] == $date) {
8232 softime 7996 $instr = $this->f->get_inst__om_dbform(array(
8233     "obj" => "instruction",
8234     "idx" => $row['instruction'],
8235     ));
8236 mbroquet 3730 $valF = array();
8237     foreach($instr->champs as $id => $champ) {
8238     $valF[$champ] = $instr->val[$id];
8239     }
8240 softime 5504
8241     # Si on peut consulter les dossiers et que le dossier n'existe pas déjà dans la liste
8242     if ($isAccredited === true
8243     && array_key_exists($instr->getVal("dossier"), $dossierTab) === false) {
8244 softime 7996 $dossier = $this->f->get_inst__om_dbform(array(
8245     "obj" => "dossier",
8246     "idx" => $instr->getVal("dossier"),
8247     ));
8248 softime 5504 if ($dossier->is_user_from_allowed_collectivite()){
8249     $dossierTab[$instr->getVal("dossier")] = $dossier;
8250     } else {
8251     $hasHidden = true;
8252     }
8253     }
8254    
8255 mbroquet 3730 $valF['date_evenement']=
8256     $instr->dateDBToForm($valF['date_evenement']);
8257     $valF['archive_date_complet']=
8258     $instr->dateDBToForm($valF['archive_date_complet']);
8259     $valF['archive_date_rejet']=
8260     $instr->dateDBToForm($valF['archive_date_rejet']);
8261     $valF['archive_date_limite']=
8262     $instr->dateDBToForm($valF['archive_date_limite']);
8263     $valF['archive_date_notification_delai']=
8264     $instr->dateDBToForm($valF['archive_date_notification_delai']);
8265     $valF['archive_date_decision']=
8266     $instr->dateDBToForm($valF['archive_date_decision']);
8267     $valF['archive_date_validite']=
8268     $instr->dateDBToForm($valF['archive_date_validite']);
8269     $valF['archive_date_achevement']=
8270     $instr->dateDBToForm($valF['archive_date_achevement']);
8271     $valF['archive_date_chantier']=
8272     $instr->dateDBToForm($valF['archive_date_chantier']);
8273     $valF['archive_date_conformite']=
8274     $instr->dateDBToForm($valF['archive_date_conformite']);
8275     $valF['archive_date_dernier_depot']=
8276     $instr->dateDBToForm($valF['archive_date_dernier_depot']);
8277     $valF['archive_date_limite_incompletude']=
8278     $instr->dateDBToForm($valF['archive_date_limite_incompletude']);
8279     $valF['date_finalisation_courrier']=
8280     $instr->dateDBToForm($valF['date_finalisation_courrier']);
8281     $valF['date_envoi_signature']=
8282     $instr->dateDBToForm($valF['date_envoi_signature']);
8283     $valF['date_retour_signature']=
8284     $instr->dateDBToForm($valF['date_retour_signature']);
8285     $valF['date_envoi_rar']=
8286     $instr->dateDBToForm($valF['date_envoi_rar']);
8287     $valF['date_retour_rar']=
8288     $instr->dateDBToForm($valF['date_retour_rar']);
8289     $valF['date_envoi_controle_legalite']=
8290     $instr->dateDBToForm($valF['date_envoi_controle_legalite']);
8291     $valF['date_retour_controle_legalite']=
8292     $instr->dateDBToForm($valF['date_retour_controle_legalite']);
8293     $valF['date_envoi_rar'] = $date;
8294    
8295     // Vérification de la finalisation du document
8296     // correspondant au code barres
8297     if($instr->getVal("om_final_instruction") === 't') {
8298     $instr->setParameter('maj', 1);
8299 nmeucci 3971 $instr->class_actions[1]["identifier"] =
8300     "envoi lettre RAR (depuis le menu suivi des pièces)";
8301 softime 8989 if ($instr->modifier($valF) == true) {
8302 mbroquet 3730 $id4Gen[] = $code_barres;
8303     $nbLettres ++;
8304     } else {
8305     //
8306     if ($error != "") {
8307     $error .= "<br/>";
8308     }
8309     $error .= sprintf(_("Une erreur s'est produite lors de la modification de l'instruction %s."),
8310     $code_barres);
8311     $error .= " ";
8312     $error .= _("Veuillez contacter votre administrateur.");
8313     }
8314     } else {
8315     //
8316     if ($error != "") {
8317     $error .= "<br/>";
8318     }
8319     $error .= sprintf(_("Le document correspondant au
8320     code barres %s n'est pas finalise,
8321     le bordereau ne sera pas genere."),
8322     $code_barres);
8323     }
8324    
8325     } else {
8326     //
8327     if ($error != "") {
8328     $error .= "<br/>";
8329     }
8330     $error .= _("Une lettre correspondante a l'instruction ayant pour code barres")." ".$code_barres." "._("a deja ete envoyee, le bordereau ne sera pas genere.");
8331     }
8332     } else {
8333     //
8334     if ($error != "") {
8335     $error .= "<br/>";
8336     }
8337     $error .= _("Le numero")." ".$code_barres." "._("ne correspond a aucun code barres d'instruction.");
8338     }
8339     } else {
8340     //
8341     if ($error != "") {
8342     $error .= "<br/>";
8343     }
8344     $error .= _("Le code barres d'instruction")." ".$code_barres." "._("n'est pas valide.");
8345     }
8346     }
8347     }
8348     }
8349     }
8350    
8351     /**
8352     * Affichage des messages et du formulaire
8353     */
8354     // Affichage du message de validation ou d'erreur
8355     if (isset($message) && isset($message_class) && $message != "") {
8356 softime 8989 $this->f->displayMessage($message_class, $message);
8357 mbroquet 3730 }
8358     // Affichage du message d'erreur
8359     if(!empty($error)) {
8360 softime 8989 $this->f->displayMessage("error", $error);
8361 mbroquet 3730 }
8362     // Affichage du message de validation de la saisie
8363     if ($nbLettres > 0) {
8364     //
8365 softime 5504 echo "\n<div class=\"message ui-widget ui-corner-all ui-state-highlight ui-state-valid\" >";
8366     echo "\n<p>";
8367     echo "\n<span class=\"ui-icon ui-icon-info\"></span>";
8368     echo "\n<span class=\"text\">";
8369     echo _("Cliquez sur le lien ci-dessous pour telecharger votre document");
8370     echo " : \n<br/><br/>";
8371     echo "\n<a class='om-prev-icon pdf-16'";
8372 softime 8989 echo "\n title=\""._("imprimer les AR")."\"";
8373 softime 7996 echo "\n href=\"".OM_ROUTE_FORM."&obj=instruction&action=180&idx=0&liste=".implode(",",$id4Gen)."\"";
8374 softime 5504 echo "\n target='_blank'>";
8375 softime 8989 echo _("Telecharger le document pour")." ".$nbLettres." "._("AR");
8376 softime 5504 echo "\n</a>";
8377     echo "\n</span>";
8378     echo "\n</p>";
8379     echo "\n<br/>\n";
8380     if ($isAccredited === true) {
8381     echo '<fieldset id="fieldset-form-rar-lien_di" class="cadre ui-corner-all startClosed" style="background-color: inherite;">';
8382     echo "\n<legend class=\"ui-corner-all ui-widget-content ui-state-active\" style=\"background-color: transparent; color: inherit;\">\n";
8383     echo _('Dossiers concernés par ce traitement');
8384     echo "\n</legend>";
8385     echo "\n<div class=\"fieldsetContent\" style=\"display: none;background-color: inherite\">";
8386    
8387     if ($hasHidden === true) {
8388     echo "\n<br/>";
8389     echo "\n<p>";
8390     echo "\n<span class='text'>";
8391     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.");
8392     echo "</span>";
8393     echo "\n</p>";
8394     echo "\n<br/>";
8395     }
8396     foreach ($dossierTab as $dossier) {
8397 softime 7067
8398     $inst_da = $this->get_inst_common("dossier_autorisation", $dossier->getVal('dossier_autorisation'));
8399     $inst_datd = $this->get_inst_common("dossier_autorisation_type_detaille", $inst_da->getVal('dossier_autorisation_type_detaille'));
8400     $code_datd = $inst_datd->getVal('code');
8401    
8402     $obj = "dossier_instruction";
8403     if ($code_datd === 'REC' OR $code_datd === 'REG') {
8404     $obj = "dossier_contentieux_tous_recours";
8405     }
8406     if ($code_datd === 'IN') {
8407     $obj = "dossier_contentieux_toutes_infractions";
8408     }
8409    
8410 softime 5504 echo "\n<div class=\"bloc group\">";
8411     echo "\n<div class=\"field field-type-text\">";
8412    
8413     echo "\n<p>";
8414     echo "\n<span class='text'>";
8415     echo "\n<a class=\"om-icon om-icon-16 consult-16\" title=\"" . _('Consulter') . "\"";
8416 softime 7996 echo "\n href=\"".OM_ROUTE_FORM."&obj=dossier_instruction&action=3&idx=";
8417 softime 5504 echo $dossier->getVal("dossier");
8418     echo "\">";
8419     echo "\n</a>";
8420    
8421     echo "\n<a title=\""._("Consulter")."\" style=\"vertical-align:middle;\"";
8422 softime 7996 echo " href=\"".OM_ROUTE_FORM."&obj=";
8423 softime 7067 echo $obj;
8424     echo "&action=3&idx=";
8425 softime 5504 echo $dossier->getVal("dossier");
8426     echo "\">";
8427     echo $dossier->getVal("dossier_libelle");
8428     echo "\n</a>";
8429     echo "\n</span>";
8430     echo "\n</p>";
8431    
8432     echo "\n</div>";
8433     echo "\n</div>";
8434     }
8435     echo "\n</div>";
8436     echo "\n</fieldset>";
8437     }
8438     echo "\n</div>";
8439     echo "\n</div>";
8440 mbroquet 3730 }
8441     // Ouverture du formulaire
8442     echo "\t<form";
8443     echo " method=\"post\"";
8444     echo " id=\"suivi_envoi_lettre_rar_form\"";
8445     echo " action=\"\"";
8446     echo ">\n";
8447     // Paramétrage des champs du formulaire
8448     $champs = array("date", "liste_code_barres_instruction");
8449     // Création d'un nouvel objet de type formulaire
8450 softime 7996 $form = $this->f->get_inst__om_formulaire(array(
8451     "validation" => 0,
8452     "maj" => 0,
8453     "champs" => $champs,
8454     ));
8455 mbroquet 3730 // Paramétrage du champ date du formulaire
8456     $form->setLib("date", _("Date")."* :");
8457     $form->setType("date", "date");
8458     $form->setOnchange("date", "fdate(this)");
8459     $form->setVal("date", ($date == "" ? date("d/m/Y") : $date));
8460     $form->setTaille("date", 10);
8461     $form->setMax("date", 10);
8462     // Paramétrage du champ liste_code_barres_instruction du formulaire
8463     $form->setLib("liste_code_barres_instruction", _("Liste des codes barres d'instructions scannes")."* :");
8464     $form->setType("liste_code_barres_instruction", "textarea");
8465     $form->setVal("liste_code_barres_instruction", $liste_code_barres_instruction);
8466     $form->setTaille("liste_code_barres_instruction", 20);
8467     $form->setMax("liste_code_barres_instruction", 20);
8468     // Affichage du formulaire
8469     $form->entete();
8470     $form->afficher($champs, 0, false, false);
8471     $form->enpied();
8472     // Affichage du bouton
8473     echo "\t<div class=\"formControls\">\n";
8474 softime 8989 $this->f->layout->display_form_button(array("value" => _("Valider"), "name" => "validation"));
8475 mbroquet 3730 echo "\t</div>\n";
8476     // Fermeture du formulaire
8477     echo "\t</form>\n";
8478     }
8479    
8480     /**
8481     * VIEW - view_suivi_mise_a_jour_des_dates.
8482     *
8483     * Vu pour mettre à jour les dates de suivi de l'instruction.
8484     *
8485     * @return void
8486     */
8487     function view_suivi_mise_a_jour_des_dates() {
8488     // Vérification de l'accessibilité sur l'élément
8489     $this->checkAccessibility();
8490    
8491     // Récupération des valeur passées en POST ou GET
8492 softime 8989 if($this->f->get_submitted_post_value("type_mise_a_jour") !== null) {
8493     $type_mise_a_jour = $this->f->get_submitted_post_value("type_mise_a_jour");
8494     } elseif($this->f->get_submitted_get_value('type_mise_a_jour') !== null) {
8495     $type_mise_a_jour = $this->f->get_submitted_get_value('type_mise_a_jour');
8496 mbroquet 3730 } else {
8497     $type_mise_a_jour = "";
8498     }
8499 softime 8989 if($this->f->get_submitted_post_value('date') !== null) {
8500     $date = $this->f->get_submitted_post_value('date');
8501     } elseif($this->f->get_submitted_get_value('date') !== null) {
8502     $date = $this->f->get_submitted_get_value('date');
8503 mbroquet 3730 } else {
8504     $date = "";
8505     }
8506 softime 8989 if($this->f->get_submitted_post_value('code_barres') !== null) {
8507     $code_barres = $this->f->get_submitted_post_value('code_barres');
8508     } elseif($this->f->get_submitted_get_value('code_barres') !== null) {
8509     $code_barres = $this->f->get_submitted_get_value('code_barres');
8510 mbroquet 3730 } else {
8511     $code_barres = "";
8512     }
8513     // Booléen permettant de définir si un enregistrement à eu lieu
8514     $correct = false;
8515     // Booléen permettant de définir si les dates peuvent êtres enregistrées
8516     $date_error = false;
8517     // Champs date à mettre à jour
8518     $liste_champs=array();
8519    
8520     // Si le formulaire a été validé
8521 softime 8989 if ($this->f->get_submitted_post_value('validation') !== null) {
8522 mbroquet 3730 if(!empty($type_mise_a_jour) and !empty($date) and !empty($code_barres)) {
8523    
8524 softime 7067 // Ajout d'un filtre sur les groupes auxquels l'utilisateur a accès
8525     $group_clause = array();
8526     foreach ($_SESSION["groupe"] as $key => $value) {
8527     $group_clause[$key] = "(groupe.code = '".$key."'";
8528     if($value["confidentiel"] !== true) {
8529     $group_clause[$key] .= " AND dossier_autorisation_type.confidentiel IS NOT TRUE";
8530     }
8531     $group_clause[$key] .= ")";
8532     }
8533     $conditions = implode(" OR ", $group_clause);
8534 softime 14542 $groupFilter = " AND (" . $conditions . ")";
8535 softime 7067
8536 softime 14542 $qres = $this->f->get_all_results_from_db_query(
8537     sprintf(
8538     'SELECT
8539     instruction
8540     FROM
8541     %1$sinstruction
8542     INNER JOIN %1$sdossier
8543     ON dossier.dossier = instruction.dossier
8544     INNER JOIN %1$sdossier_instruction_type
8545     ON dossier.dossier_instruction_type = dossier_instruction_type.dossier_instruction_type
8546     INNER JOIN %1$sdossier_autorisation_type_detaille
8547     ON dossier_instruction_type.dossier_autorisation_type_detaille = dossier_autorisation_type_detaille.dossier_autorisation_type_detaille
8548     INNER JOIN %1$sdossier_autorisation_type
8549     ON dossier_autorisation_type_detaille.dossier_autorisation_type = dossier_autorisation_type.dossier_autorisation_type
8550     INNER JOIN %1$sgroupe
8551     ON dossier_autorisation_type.groupe = groupe.groupe
8552     WHERE
8553     code_barres = \'%2$s\'
8554     %3$s',
8555     DB_PREFIXE,
8556     $this->f->db->escapeSimple($code_barres),
8557     $groupFilter
8558     ),
8559     array(
8560     'origin' => __METHOD__
8561     )
8562     );
8563 softime 15835 if($qres['row_count'] === 1) {
8564 mbroquet 3730 $liste_champs = explode(";", $type_mise_a_jour);
8565 softime 14542 $row = array_shift($qres['result']);
8566 softime 11418 $instr = $this->f->get_inst__om_dbform(array(
8567     "obj" => "instruction",
8568     "idx" => $row['instruction'],
8569     ));
8570 mbroquet 3730 // Mise à jour des dates après l'écran de verification
8571 softime 8989 if($this->f->get_submitted_post_value('is_valid') !== null and $this->f->get_submitted_post_value('is_valid') == "true") {
8572 mbroquet 3730 $valF = array();
8573     foreach($instr->champs as $id => $champ) {
8574     $valF[$champ] = $instr->val[$id];
8575     }
8576 softime 6565 $valF['date_evenement'] = $instr->dateDBToForm($valF['date_evenement']);
8577     $valF['archive_date_complet'] = $instr->dateDBToForm($valF['archive_date_complet']);
8578     $valF['archive_date_rejet'] = $instr->dateDBToForm($valF['archive_date_rejet']);
8579     $valF['archive_date_limite'] = $instr->dateDBToForm($valF['archive_date_limite']);
8580     $valF['archive_date_notification_delai'] = $instr->dateDBToForm($valF['archive_date_notification_delai']);
8581     $valF['archive_date_decision'] = $instr->dateDBToForm($valF['archive_date_decision']);
8582     $valF['archive_date_validite'] = $instr->dateDBToForm($valF['archive_date_validite']);
8583     $valF['archive_date_achevement'] = $instr->dateDBToForm($valF['archive_date_achevement']);
8584     $valF['archive_date_chantier'] = $instr->dateDBToForm($valF['archive_date_chantier']);
8585     $valF['archive_date_conformite'] = $instr->dateDBToForm($valF['archive_date_conformite']);
8586     $valF['archive_date_dernier_depot'] = $instr->dateDBToForm($valF['archive_date_dernier_depot']);
8587     $valF['archive_date_limite_incompletude'] = $instr->dateDBToForm($valF['archive_date_limite_incompletude']);
8588     $valF['date_finalisation_courrier'] = $instr->dateDBToForm($valF['date_finalisation_courrier']);
8589     $valF['date_envoi_signature'] = $instr->dateDBToForm($valF['date_envoi_signature']);
8590     $valF['date_retour_signature'] = $instr->dateDBToForm($valF['date_retour_signature']);
8591     $valF['date_envoi_rar'] = $instr->dateDBToForm($valF['date_envoi_rar']);
8592     $valF['date_retour_rar'] = $instr->dateDBToForm($valF['date_retour_rar']);
8593     $valF['date_envoi_controle_legalite'] = $instr->dateDBToForm($valF['date_envoi_controle_legalite']);
8594     $valF['date_retour_controle_legalite'] = $instr->dateDBToForm($valF['date_retour_controle_legalite']);
8595     $valF['archive_date_cloture_instruction'] = $instr->dateDBToForm($valF['archive_date_cloture_instruction']);
8596     $valF['archive_date_premiere_visite'] = $instr->dateDBToForm($valF['archive_date_premiere_visite']);
8597     $valF['archive_date_derniere_visite'] = $instr->dateDBToForm($valF['archive_date_derniere_visite']);
8598     $valF['archive_date_contradictoire'] = $instr->dateDBToForm($valF['archive_date_contradictoire']);
8599     $valF['archive_date_retour_contradictoire'] = $instr->dateDBToForm($valF['archive_date_retour_contradictoire']);
8600     $valF['archive_date_ait'] = $instr->dateDBToForm($valF['archive_date_ait']);
8601     $valF['archive_date_transmission_parquet'] = $instr->dateDBToForm($valF['archive_date_transmission_parquet']);
8602 mbroquet 3730
8603     foreach(explode(";", $type_mise_a_jour) as $maj_date) {
8604     $valF[$maj_date]=$date;
8605     }
8606    
8607     // Vérification de la finalisation du document
8608     // correspondant au code barres
8609     if($valF["om_final_instruction"] === 't' or
8610     $valF["lettretype"] == '') {
8611     $code_barres = "";
8612    
8613     //Désactivation de l'autocommit
8614 softime 8989 $this->f->db->autoCommit(false);
8615 mbroquet 3730
8616     //On modifie les valeurs de l'instruction
8617     $instr->setParameter('maj', 170);
8618 nmeucci 3965 $instr->class_actions[170]["identifier"] =
8619 nmeucci 3972 "mise à jour des dates (depuis le menu suivi des pièces)";
8620 softime 8989 $retour = $instr->modifier($valF);
8621 mbroquet 3730
8622     //Si une erreur s'est produite, on défait les modifications
8623     //qui ont été faites
8624     if (!$retour){
8625     $instr->undoValidation();
8626     }
8627     //Sinon, on valide en base de données les modifications
8628     else {
8629 softime 8989 $this->f->db->commit();
8630 mbroquet 3730 }
8631    
8632     // Variable correct retourné depuis la classe instruction
8633     $correct = $instr->correct;
8634    
8635     // Si la modification sur l'instruction a échoué
8636     if ($correct === false) {
8637    
8638     // Message d'erreur de la classe instruction
8639     $error = $instr->msg;
8640     }
8641    
8642     } else {
8643     // Indique que le traitement est en erreur
8644     $correct = false;
8645     // Message d'erreur
8646     $error = sprintf(_("Le document n'est pas finalise."),
8647     "<span class='bold'>".$code_barres."</span>");
8648     }
8649     } else {
8650     // Récupération des infos du dossier
8651 softime 14542 $qres = $this->f->get_all_results_from_db_query(
8652     sprintf(
8653     'SELECT
8654     dossier.dossier_libelle,
8655     evenement.libelle as evenement,
8656     autorite_competente.code as autorite_competente_code,
8657     autorite_competente.libelle as autorite_competente,
8658     evenement.type as evenement_type,
8659     to_char(date_envoi_signature,\'DD/MM/YYYY\') as date_envoi_signature,
8660     to_char(date_retour_signature,\'DD/MM/YYYY\') as date_retour_signature,
8661     to_char(date_envoi_controle_legalite,\'DD/MM/YYYY\') as date_envoi_controle_legalite,
8662     to_char(date_retour_controle_legalite,\'DD/MM/YYYY\') as date_retour_controle_legalite,
8663     to_char(date_envoi_rar,\'DD/MM/YYYY\') as date_envoi_rar,
8664     to_char(date_retour_rar,\'DD/MM/YYYY\') as date_retour_rar
8665     FROM
8666     %1$sinstruction
8667     INNER JOIN %1$sdossier
8668     ON dossier.dossier=instruction.dossier
8669     LEFT JOIN %1$sautorite_competente
8670     ON dossier.autorite_competente=autorite_competente.autorite_competente
8671     INNER JOIN %1$sevenement
8672     ON instruction.evenement=evenement.evenement
8673     WHERE
8674     code_barres = \'%2$s\'',
8675     DB_PREFIXE,
8676     $this->f->db->escapeSimple($code_barres)
8677     ),
8678     array(
8679     "origin" => __METHOD__
8680     )
8681     );
8682     $infos = array_shift($qres['result']);
8683 mbroquet 3730
8684     // Vérification de la non modification des dates de suivi
8685     foreach(explode(";", $type_mise_a_jour) as $champ) {
8686 softime 11418 if ($champ === 'date_envoi_controle_legalite') {
8687     if ($instr->is_sent_to_cl() === true) {
8688     $error = __("Les dates de suivis ne peuvent etre modifiees");
8689     $date_error = true;
8690     break;
8691     }
8692     }
8693 mbroquet 3730 if($infos[$champ] != "" AND $infos[$champ] != $date) {
8694     $error = _("Les dates de suivis ne peuvent etre modifiees");
8695     $date_error = true;
8696 softime 11418 break;
8697 mbroquet 3730 }
8698     }
8699     }
8700     } else {
8701     $error = _("Le numero saisi ne correspond a aucun code barres d'instruction.");
8702     }
8703    
8704     } else {
8705     $error = _("Tous les champs doivent etre remplis.");
8706     }
8707     }
8708    
8709     /**
8710     * Affichage des messages et du formulaire
8711     */
8712     // Affichage du message de validation ou d'erreur
8713     if (isset($message) && isset($message_class) && $message != "") {
8714 softime 8989 $this->f->displayMessage($message_class, $message);
8715 mbroquet 3730 }
8716     // Affichage du message d'erreur
8717     if(!empty($error)) {
8718 softime 8989 $this->f->displayMessage("error", $error);
8719 mbroquet 3730 }
8720    
8721     // Affichage du message de validation de la saisie
8722     if($correct === true) {
8723 softime 8989 $this->f->displayMessage("ok", _("Saisie enregistree"));
8724 mbroquet 3730 }
8725     // Ouverture du formulaire
8726     echo "\t<form";
8727     echo " method=\"post\"";
8728     echo " id=\"suivi_mise_a_jour_des_dates_form\"";
8729     echo " action=\"\"";
8730     echo ">\n";
8731     // Paramétrage des champs du formulaire
8732     if(isset($infos)) {
8733     $champs = array("type_mise_a_jour", "date", "code_barres", "dossier_libelle", "evenement"
8734     , "autorite_competente", "date_envoi_signature",
8735     "date_retour_signature", "date_envoi_controle_legalite",
8736     "date_retour_controle_legalite", "date_envoi_rar",
8737     "date_retour_rar", "is_valid");
8738     } else {
8739     $champs = array("type_mise_a_jour", "date", "code_barres");
8740     }
8741     // Création d'un nouvel objet de type formulaire
8742 softime 7996 $form = $this->f->get_inst__om_formulaire(array(
8743     "validation" => 0,
8744     "maj" => 0,
8745     "champs" => $champs,
8746     ));
8747 mbroquet 3730 // Paramétrage des champs du formulaire
8748     // Parametrage du champ type_mise_a_jour
8749     $form->setLib("type_mise_a_jour", _("Date a mettre a jour")."* :");
8750     if(isset($infos)) {
8751     $form->setType("type_mise_a_jour", "selecthiddenstatic");
8752    
8753     } else {
8754     $form->setType("type_mise_a_jour", "select");
8755    
8756     }
8757     $form->setVal("type_mise_a_jour", $type_mise_a_jour);
8758     $contenu = array();
8759    
8760     $contenu[0][0] = "date_envoi_signature";
8761     $contenu[1][0] = _("date d'envoi pour signature Mairie/Prefet");
8762    
8763     $contenu[0][1] = "date_retour_signature";
8764     $contenu[1][1] = _("date de retour de signature Mairie/Prefet");
8765    
8766     $contenu[0][2] = "date_retour_signature;date_envoi_controle_legalite";
8767     $contenu[1][2] = _("date de retour de signature + Envoi controle legalite");
8768    
8769     $contenu[0][3] = "date_envoi_controle_legalite";
8770     $contenu[1][3] = _("date d'envoi au controle de legalite");
8771    
8772     $contenu[0][4] = "date_retour_controle_legalite";
8773     $contenu[1][4] = _("date de retour de controle de legalite");
8774    
8775     $contenu[0][5] = "date_retour_rar";
8776 softime 8989 $contenu[1][5] = __("date de notification du correspondant");
8777 mbroquet 3730
8778     $form->setSelect("type_mise_a_jour", $contenu);
8779    
8780     // Parametrage du champ date
8781     $form->setLib("date", _("Date")."* :");
8782     if(isset($infos)) {
8783     $form->setType("date", "hiddenstaticdate");
8784    
8785     } else {
8786     $form->setType("date", "date");
8787     }
8788     $form->setVal("date", $date);
8789     $form->setTaille("date", 10);
8790     $form->setMax("date", 10);
8791    
8792     // Parametrage du champ code_barres
8793     $form->setLib("code_barres", _("Code barres d'instruction")."* :");
8794     if(isset($infos)) {
8795     $form->setType("code_barres", "hiddenstatic");
8796     } else {
8797     $form->setType("code_barres", "text");
8798     }
8799     $form->setVal("code_barres", $code_barres);
8800     $form->setTaille("code_barres", 20);
8801     $form->setMax("code_barres", 20);
8802    
8803     // Ajout des infos du dossier correspondantes à l'instruction séléctionnée
8804     if(isset($infos)) {
8805    
8806     // Tous les champs sont défini par defaut à static
8807     foreach ($infos as $key => $value) {
8808     $form->setType($key, "static");
8809     if(in_array($key, $liste_champs)) {
8810     $form->setVal($key, $date);
8811     } else {
8812     $form->setVal($key, $value);
8813     }
8814     }
8815    
8816     // Les champs dont on viens de définir la valeur sont en gras
8817     foreach ($liste_champs as $value) {
8818     $form->setBloc($value,'DF',"",'bold');
8819     }
8820    
8821     // Parametrage du champ dossier
8822     $form->setLib("dossier_libelle", _("dossier_libelle")." :");
8823     $form->setType("dossier_libelle", "static");
8824     $form->setVal("dossier_libelle", $infos['dossier_libelle']);
8825    
8826     // Parametrage du champ evenement
8827     $form->setLib("evenement", _("evenement")." :");
8828     $form->setType("evenement", "static");
8829     $form->setVal("evenement", $infos['evenement']);
8830    
8831     // Parametrage du champ autorite_competente
8832     $form->setLib("autorite_competente", _("Autorite competente")." :");
8833     $form->setType("autorite_competente", "static");
8834     $form->setVal("autorite_competente", $infos['autorite_competente']);
8835    
8836 softime 8989 // Parametrage des libellés d'envoi avec AR
8837     $form->setLib("date_envoi_rar", __("date_envoi_ar")." :");
8838     $form->setLib("date_retour_rar", __("date_notification")." :");
8839 mbroquet 3730
8840     $form->setLib("date_envoi_signature", _("date_envoi_signature")." :");
8841     $form->setLib("date_retour_signature", _("date_retour_signature")." :");
8842     $form->setLib("date_envoi_controle_legalite", _("date_envoi_controle_legalite")." :");
8843     $form->setLib("date_retour_controle_legalite", _("date_retour_controle_legalite")." :");
8844     // Configuration des libellé en fonction de l'autorité compétente
8845     if($infos['autorite_competente_code'] == 'ETAT') {
8846     $form->setType("date_envoi_controle_legalite", "hiddendate");
8847     $form->setType("date_retour_controle_legalite", "hiddendate");
8848     }
8849    
8850     // Ajout d'un champ hidden permettant de savoir que le formulaire précédant est celui de vérification
8851     $form->setLib("is_valid", _("Valide")." :");
8852     $form->setType("is_valid", "hidden");
8853     $form->setVal("is_valid", 'true');
8854    
8855     $form->setFieldset('dossier_libelle','D',_('Synthese'));
8856     $form->setFieldset('is_valid','F');
8857    
8858     }
8859    
8860    
8861     // Création du fieldset regroupant les champs permettant la mise à jour des date
8862     $form->setFieldset('type_mise_a_jour','D',_('Mise a jour'));
8863     $form->setFieldset('code_barres','F');
8864     // Affichage du formulaire
8865     $form->entete();
8866     $form->afficher($champs, 0, false, false);
8867     $form->enpied();
8868     // Affichage du bouton
8869     echo "\t<div class=\"formControls\">\n";
8870     //
8871     if(!$date_error) {
8872 softime 8989 $this->f->layout->display_form_button(array("value" => _("Valider"), "name" => "validation"));
8873 mbroquet 3730 }
8874     // Si pas sur l'écran de validation
8875     if(isset($infos)) {
8876 softime 7996 echo "<a class=\"retour\" href=\"".OM_ROUTE_FORM."&obj=instruction_suivi_mise_a_jour_des_dates&action=170&idx=0";
8877 mbroquet 3730 echo "&amp;type_mise_a_jour=".$type_mise_a_jour."&amp;date=".$date."&amp;code_barres=".$code_barres;
8878     echo "\">Retour</a>";
8879     }
8880     echo "\t</div>\n";
8881     // Fermeture du formulaire
8882     echo "\t</form>\n";
8883     }
8884    
8885     /**
8886     * [view_pdf_lettre_rar description]
8887     *
8888     * @return [type] [description]
8889     */
8890     function view_pdf_lettre_rar() {
8891     // Vérification de l'accessibilité sur l'élément
8892     $this->checkAccessibility();
8893 softime 8989 //
8894     $this->f->disableLog();
8895 mbroquet 3730
8896 softime 8989 if($this->f->get_submitted_get_value('liste') != null) {
8897     $listeCodeBarres = explode(',',$this->f->get_submitted_get_value('liste'));
8898 mbroquet 3730
8899     // Classe permettant la mise en page de l'édition pdf
8900     require_once "../obj/pdf_lettre_rar.class.php";
8901     $pdf_lettre_rar = new pdf_lettre_rar('P', 'mm', 'A4');
8902     // Initialisation de la mise en page
8903 softime 8989 $pdf_lettre_rar->init($this->f);
8904 mbroquet 3730
8905     foreach ($listeCodeBarres as $code_barres) {
8906    
8907 softime 7067 // On récupère le dossier
8908 softime 14064 $qres = $this->f->get_one_result_from_db_query(
8909     sprintf(
8910     'SELECT
8911     dossier
8912     FROM
8913     %1$sinstruction
8914     WHERE
8915     code_barres = \'%2$s\'',
8916     DB_PREFIXE,
8917     $this->f->db->escapeSimple($code_barres)
8918     ),
8919     array(
8920     "origin" => __METHOD__,
8921     )
8922     );
8923    
8924 softime 7996 $inst_dossier = $this->f->get_inst__om_dbform(array(
8925     "obj" => "dossier",
8926 softime 14064 "idx" => $qres['result'],
8927 softime 7996 ));
8928 softime 7067
8929     // En fonction du type de dossier, on récupère un demandeur différent dans les requêtes
8930     $groupe = $inst_dossier->get_type_affichage_formulaire();
8931     switch ($groupe) {
8932     case 'CTX IN':
8933     $sql_demandeur = "(lien_dossier_demandeur.petitionnaire_principal IS TRUE AND demandeur.type_demandeur='plaignant')";
8934     break;
8935     case 'CTX RE':
8936     $sql_demandeur = "(lien_dossier_demandeur.petitionnaire_principal IS TRUE AND demandeur.type_demandeur='requerant')";
8937     break;
8938     case 'ADS':
8939     case 'DPC':
8940 softime 10573 case 'CONSULTATION ENTRANTE':
8941 softime 7067 default:
8942     $sql_demandeur = "((lien_dossier_demandeur.petitionnaire_principal IS TRUE AND demandeur.type_demandeur='petitionnaire') OR demandeur.type_demandeur='delegataire')";
8943     break;
8944     }
8945    
8946 mbroquet 3730 // Test si l'evenement est de type arrete et si un délégataire a été nommé
8947 softime 14542 $qres = $this->f->get_all_results_from_db_query(
8948     sprintf(
8949     'SELECT
8950 mbroquet 3730 dossier.dossier_libelle,
8951     evenement.type,
8952 softime 3834 count(lien_dossier_demandeur) as nbdemandeur,
8953     CASE
8954     WHEN division.libelle IS NOT NULL AND phase.code IS NOT NULL
8955 softime 14542 THEN CONCAT(phase.code, \' - \', division.libelle)
8956 softime 3834 ELSE
8957     phase.code
8958     END AS code_phase
8959 softime 14542 FROM
8960     %1$sinstruction
8961     LEFT JOIN %1$sdossier
8962     ON instruction.dossier = dossier.dossier
8963     LEFT JOIN %1$sdivision
8964     ON dossier.division = division.division
8965     INNER JOIN %1$sevenement
8966     ON instruction.evenement=evenement.evenement
8967     LEFT JOIN %1$sphase
8968     ON evenement.phase = phase.phase
8969     inner JOIN %1$slien_dossier_demandeur
8970     ON instruction.dossier=lien_dossier_demandeur.dossier
8971     inner join %1$sdemandeur
8972     ON demandeur.demandeur=lien_dossier_demandeur.demandeur
8973     WHERE
8974     code_barres = \'%2$s\'
8975     AND %3$s
8976     GROUP BY
8977     dossier.dossier_libelle,
8978     evenement.type,
8979     phase.code,
8980     division.libelle',
8981     DB_PREFIXE,
8982     $this->f->db->escapeSimple($code_barres),
8983     $sql_demandeur
8984     ),
8985     array(
8986     "origin" => __METHOD__
8987     )
8988     );
8989     $testDemandeur = array_shift($qres['result']);
8990 mbroquet 3730
8991    
8992     // Recuperation de l'adresse de destination
8993     // Envoi pour delegataire ou petitionnaire principal selon le type d'evenement
8994 softime 14542 $sqlAdresse = " AND demandeur.type_demandeur='petitionnaire' AND lien_dossier_demandeur.petitionnaire_principal IS TRUE";
8995 mbroquet 3730 if($testDemandeur['type'] != 'arrete' AND $testDemandeur['nbdemandeur'] > 1) {
8996 softime 14542 $sqlAdresse = " AND demandeur.type_demandeur='delegataire'";
8997 mbroquet 3730 }
8998    
8999 softime 14542 $qres = $this->f->get_all_results_from_db_query(
9000     sprintf(
9001     'SELECT
9002     CASE WHEN demandeur.qualite = \'particulier\'
9003     THEN TRIM(CONCAT_WS(\' \', pc.libelle, demandeur.particulier_nom, demandeur.particulier_prenom))
9004     ELSE TRIM(demandeur.personne_morale_denomination)
9005     END as ligne1,
9006     CASE WHEN demandeur.qualite = \'personne_morale\'
9007     THEN TRIM(demandeur.personne_morale_raison_sociale)
9008     ELSE \'\'
9009     END as ligne1_1,
9010     CASE WHEN demandeur.qualite = \'personne_morale\' AND (demandeur.personne_morale_nom IS NOT NULL OR demandeur.personne_morale_prenom IS NOT NULL)
9011     THEN TRIM(CONCAT_WS(\' \', \'rep. par\', demandeur.personne_morale_nom, demandeur.personne_morale_prenom))
9012     ELSE \'\'
9013     END as ligne1_2,
9014     trim(concat(demandeur.numero,\' \',demandeur.voie)) as ligne2,
9015     CASE demandeur.complement
9016     WHEN null THEN \'\'
9017     ELSE trim(demandeur.complement)
9018     END as ligne3,
9019     CASE demandeur.lieu_dit
9020     WHEN null THEN \'\'
9021     ELSE trim(demandeur.lieu_dit)
9022     END as ligne4,
9023     CONCAT_WS(\' \', demandeur.code_postal, demandeur.localite,
9024     (CASE WHEN demandeur.bp IS NOT NULL
9025     THEN CONCAT_WS(\' \', \'BP\', demandeur.bp)
9026     ELSE \'\'
9027     END),
9028     (CASE WHEN demandeur.cedex IS NOT NULL
9029     THEN CONCAT_WS(\' \', \'CEDEX\', demandeur.cedex)
9030     ELSE \'\'
9031     END))
9032     as ligne5,
9033     code_barres as code_barres
9034     FROM
9035     %1$sinstruction
9036     INNER JOIN %1$sdossier
9037     ON dossier.dossier = instruction.dossier
9038     INNER JOIN %1$slien_dossier_demandeur
9039     ON dossier.dossier = lien_dossier_demandeur.dossier
9040     INNER JOIN %1$sdemandeur
9041     ON lien_dossier_demandeur.demandeur = demandeur.demandeur
9042     LEFT OUTER JOIN %1$scivilite AS pc
9043     ON demandeur.particulier_civilite = pc.civilite
9044     OR demandeur.personne_morale_civilite = pc.civilite
9045     WHERE
9046     instruction.code_barres = \'%2$s\'
9047     %3$s',
9048     DB_PREFIXE,
9049     $this->f->db->escapeSimple($code_barres),
9050     $sqlAdresse
9051     ),
9052     array(
9053     "origin" => __METHOD__
9054     )
9055     );
9056     $adresse_dest = array_shift($qres['result']);
9057 mbroquet 3730
9058     // Création adresse destinataire sans ligne vide
9059     $adresse_destinataire = array();
9060     if (!empty($adresse_dest['ligne1'])) {
9061     $adresse_destinataire[] = $adresse_dest['ligne1'];
9062     }
9063     if (!empty($adresse_dest['ligne1_1'])) {
9064     $adresse_destinataire[] = $adresse_dest['ligne1_1'];
9065     }
9066     if (!empty($adresse_dest['ligne1_2'])) {
9067     $adresse_destinataire[] = $adresse_dest['ligne1_2'];
9068     }
9069     $adresse_destinataire[] = $adresse_dest['ligne2'];
9070     if (!empty($adresse_dest['ligne3'])) {
9071     $adresse_destinataire[] = $adresse_dest['ligne3'];
9072     }
9073     if (!empty($adresse_dest['ligne4'])) {
9074     $adresse_destinataire[] = $adresse_dest['ligne4'];
9075     }
9076     $adresse_destinataire[] = $adresse_dest['ligne5'];
9077    
9078     // Création du champ specifique
9079     $specifique_content = array();
9080     $specifique_content[] = $adresse_dest['ligne1'];
9081     $specifique_content[] = $adresse_dest['ligne1_1'];
9082     $specifique_content[] = $adresse_dest['ligne1_2'];
9083     $specifique_content[] = $testDemandeur['dossier_libelle'];
9084     $specifique_content[] = "|||||".$adresse_dest['code_barres']."|||||";
9085     unset($adresse_dest['code_barres']);
9086     // Ajout d'une page aux pdf
9087 softime 3834 $pdf_lettre_rar->addLetter($adresse_destinataire, $specifique_content, $testDemandeur['code_phase']);
9088 mbroquet 3730
9089     }
9090     $pdf_output = $pdf_lettre_rar->output("lettre_rar".date("dmYHis").".pdf","S");
9091 softime 7685 $om_edition = $this->f->get_inst__om_edition();
9092 softime 17542 $om_edition->set_object_linked($this);
9093 mbroquet 3730 $om_edition->expose_pdf_output($pdf_output, "lettre_rar".date("dmYHis").".pdf");
9094     }
9095     }
9096    
9097     /**
9098     * VIEW - view_bordereau_envoi_maire.
9099     *
9100     * Formulaire demandant :
9101     * - le code-barres de l'événement d'instruction
9102     * - la date d'envoi du courrier pour signature par le maire
9103     *
9104     * Lors de la validation :
9105     * => met à jour cette date dans l'événement d'instruction
9106     * => crée un lien permettant de générer en PDF le bordereau
9107     *
9108     * @return void
9109     */
9110     function view_bordereau_envoi_maire() {
9111     // Vérification de l'accessibilité sur l'élément
9112     $this->checkAccessibility();
9113    
9114     // Récupération des valeur passées en POST ou GET
9115     $code_barres = "";
9116     if($this->f->get_submitted_post_value('code_barres') !== null) {
9117     $code_barres = $this->f->get_submitted_post_value('code_barres');
9118     } elseif($this->f->get_submitted_get_value('code_barres')!==null) {
9119     $code_barres = $this->f->get_submitted_get_value('code_barres');
9120     }
9121     $date = "";
9122     if($this->f->get_submitted_post_value('date') !== null) {
9123     $date = $this->f->get_submitted_post_value('date');
9124     } elseif($this->f->get_submitted_get_value('date') !== null) {
9125     $date = $this->f->get_submitted_get_value('date');
9126     }
9127     $validation = 0;
9128     if($this->f->get_submitted_post_value('validation') !== null) {
9129     $validation = $this->f->get_submitted_post_value('validation');
9130     } elseif($this->f->get_submitted_get_value('validation') !== null) {
9131     $validation = $this->f->get_submitted_get_value('validation');
9132     }
9133    
9134     // Si le formulaire a été validé
9135     if ($this->f->get_submitted_post_value('validation') !== null) {
9136     // Tous les champs doivent obligatoirement être remplis
9137     if (!empty($date) && !empty($code_barres)) {
9138     $date_en = $this->dateDB($date);
9139     // Si date valide
9140     if ($date_en != "") {
9141     $id_instruction = $this->get_instruction_by_barcode($code_barres);
9142     // Si un événement d'instruction a été trouvé pour ce code-barres
9143     if ($id_instruction !== null) {
9144     $ret = $this->update_date_envoi_signature($id_instruction, $date_en);
9145     // Si mise à jour réussie de la date d'envoi du courrier
9146     // pour signature par l'autorité compétente
9147     if($ret === true) {
9148     // Message de validation avec lien PDF
9149     $message_class = "valid";
9150     $message = '&bullet; '._("Veuillez cliquer sur le lien ci-dessous pour telecharger votre bordereau");
9151     $message .= " : <br/><br/>";
9152     $message .= "<a class='om-prev-icon pdf-16'";
9153     $message .= " id=\"generer_bordereau_envoi_maire\"";
9154     $message .= " title=\""._("Bordereau")."\"";
9155 softime 7996 $message .= " href='".OM_ROUTE_FORM."&obj=instruction";
9156 mbroquet 3730 $message .= "&action=200";
9157     $message .= "&idx=".$id_instruction."'";
9158     $message .= " target='_blank'>";
9159     $message .= _("Bordereau d'envoi au maire");
9160     $message .= "</a><br/><br/>";
9161     $message .= '&bullet; '._("Rappel des informations saisies")." :<br/><br/>";
9162     $message .= _("Code du courrier")." : ".$code_barres."<br/>";
9163     $message .= _("Date d'envoi du courrier pour signature par le maire")." : ".$date;
9164    
9165     } else {
9166     // Message d'erreur
9167     $message_class = "error";
9168     $message = sprintf(_("Erreur lors de la mise a jour de l'evenement d'instruction correspondant au code barres %s."),
9169     $code_barres);
9170     }
9171     }
9172     else {
9173     $message_class = "error";
9174     $message = _("Le numero saisi ne correspond a aucun code-barres d'evenement d'instruction.");
9175     }
9176     }
9177     else {
9178     $message_class = "error";
9179     $message = _("La date est invalide.");
9180     }
9181     } else {
9182     $message_class = "error";
9183     $message = _("Tous les champs doivent etre remplis.");
9184     }
9185     }
9186    
9187     /**
9188     * Affichage des messages et du formulaire
9189     */
9190    
9191     // Affichage du message de validation ou d'erreur
9192     if (isset($message) && isset($message_class) && $message != "") {
9193     $this->f->displayMessage($message_class, $message);
9194     }
9195    
9196     // Ouverture du formulaire
9197     $datasubmit = $this->getDataSubmit();
9198     echo "\n<!-- ########## START DBFORM ########## -->\n";
9199     echo "<form";
9200     echo " id=\"bordereau_envoi_maire\"";
9201     echo " method=\"post\"";
9202     echo " name=\"f1\"";
9203     echo " action=\"";
9204     echo $datasubmit;
9205     echo "\"";
9206     echo ">\n";
9207    
9208     // Paramétrage des champs du formulaire
9209     $champs = array("code_barres","date");
9210    
9211     // Création d'un nouvel objet de type formulaire
9212 softime 7996 $form = $this->f->get_inst__om_formulaire(array(
9213     "validation" => 0,
9214     "maj" => 0,
9215     "champs" => $champs,
9216     ));
9217 mbroquet 3730
9218     $template_required_label = '%s *';
9219     // Parametrage du champ code_barres
9220     $form->setLib("code_barres", sprintf($template_required_label,_("Code du courrier")));
9221     $form->setType("code_barres", "text");
9222     $form->setVal("code_barres", $code_barres);
9223     $form->setTaille("code_barres", 20);
9224     $form->setMax("code_barres", 20);
9225     // Parametrage du champ date
9226     $form->setLib("date", sprintf($template_required_label,_("Date d'envoi du courrier pour signature par le maire")));
9227     $form->setType("date", "date") ;
9228     if (empty($date)) {
9229     $date = date('d/m/Y');
9230     }
9231     $form->setVal("date", $date);
9232     $form->setTaille("date", 10);
9233     $form->setMax("date", 10);
9234    
9235     // Création du bloc regroupant les champs
9236     $form->setBloc('code_barres','D');
9237     $form->setBloc('date','F');
9238     // Affichage du formulaire
9239     $form->entete();
9240     $form->afficher($champs, 0, false, false);
9241     $form->enpied();
9242     // Affichage du bouton
9243     printf("\t<div class=\"formControls\">\n");
9244     //
9245     $this->f->layout->display_form_button(array("value" => _("Valider"), "name" => "validation"));
9246     printf("\t</div>\n");
9247     // Fermeture du formulaire
9248     printf("\t</form>\n");
9249     }
9250    
9251     /**
9252     * VIEW - view_bordereau_envoi_maire.
9253     *
9254     * PDF de bordereau d'envoi au maire pour l'événement d'instruction instancié
9255     *
9256     * @return [void]
9257     */
9258     function view_generate_bordereau_envoi_maire() {
9259     // Vérification de l'accessibilité sur l'élément
9260     $this->checkAccessibility();
9261     // Récupération de la collectivité du dossier d'instruction
9262     $collectivite_di = $this->get_dossier_instruction_om_collectivite();
9263     // Récupération de ses paramètres
9264     $collectivite = $this->f->getCollectivite($collectivite_di);
9265     // Génération du PDF
9266     $result = $this->compute_pdf_output('etat', 'communaute_bordereau_envoi_maire', $collectivite, $this->getVal(($this->clePrimaire)));
9267     // Affichage du PDF
9268     $this->expose_pdf_output(
9269     $result['pdf_output'],
9270     $result['filename']
9271     );
9272     }
9273    
9274     /**
9275 softime 10808 * VIEW - view_rapport_instruction.
9276     *
9277     * Ouvre le sous-formulaire en ajaxIt dans un overlay.
9278     * Cette action est bindée pour utiliser la fonction popUpIt.
9279     *
9280     * @return void
9281     */
9282     function view_overlay_notification_manuelle() {
9283    
9284     // Vérification de l'accessibilité sur l'élément
9285     $this->checkAccessibility();
9286    
9287     printf(
9288     '<script type="text/javascript" >
9289     overlayIt(\'%1$s\',\'%2$s&objsf=%1$s&idxformulaire=%4$s&retourformulaire=dossier_instruction&obj=%1$s&action=411&idx=%3$s\', 1);
9290     </script>',
9291     'instruction_notification_manuelle',
9292     OM_ROUTE_SOUSFORM,
9293     $this->getVal($this->clePrimaire),
9294     $this->getVal('dossier')
9295     );
9296     }
9297    
9298     /**
9299 softime 11585 * VIEW - view_overlay_notification_service_consulte.
9300     *
9301     * Ouvre le sous-formulaire de notification des services consulte
9302     * en ajaxIt dans un overlay.
9303     * Cette action est bindée pour utiliser la fonction popUpIt.
9304     *
9305     * @return void
9306     */
9307     function view_overlay_notification_service_consulte() {
9308    
9309     // Vérification de l'accessibilité sur l'élément
9310     $this->checkAccessibility();
9311    
9312     printf(
9313     '<script type="text/javascript" >
9314     overlayIt(\'%1$s\',\'%2$s&objsf=%1$s&idxformulaire=%4$s&retourformulaire=dossier_instruction&obj=%1$s&action=420&idx=%3$s\', 1);
9315     </script>',
9316     'instruction_notification_manuelle',
9317     OM_ROUTE_SOUSFORM,
9318     $this->getVal($this->clePrimaire),
9319     $this->getVal('dossier')
9320     );
9321     }
9322    
9323     /**
9324     * VIEW - overlay_notification_tiers_consulte.
9325     *
9326     * Ouvre le sous-formulaire de notification des tiers consulte
9327     * en ajaxIt dans un overlay.
9328     * Cette action est bindée pour utiliser la fonction popUpIt.
9329     *
9330     * @return void
9331     */
9332     function view_overlay_notification_tiers_consulte() {
9333    
9334     // Vérification de l'accessibilité sur l'élément
9335     $this->checkAccessibility();
9336    
9337     printf(
9338     '<script type="text/javascript" >
9339     overlayIt(\'%1$s\',\'%2$s&objsf=%1$s&idxformulaire=%4$s&retourformulaire=dossier_instruction&obj=%1$s&action=430&idx=%3$s\', 1);
9340     </script>',
9341     'instruction_notification_manuelle',
9342     OM_ROUTE_SOUSFORM,
9343     $this->getVal($this->clePrimaire),
9344     $this->getVal('dossier')
9345     );
9346     }
9347 softime 12847
9348 softime 11585 /**
9349 softime 12847 * VIEW - view_modale_selection_document_signe
9350     *
9351     * Ouvre le sous-formulaire de notification des services consulte
9352     * en ajaxIt dans un overlay.
9353     * Cette action est bindée pour utiliser la fonction popUpIt.
9354     *
9355     * @return void
9356     */
9357     function view_modale_selection_document_signe() {
9358    
9359     // Vérification de l'accessibilité sur l'élément
9360     $this->checkAccessibility();
9361    
9362     printf(
9363     '<script type="text/javascript" >
9364     overlayIt(\'%1$s\',\'%2$s&objsf=%1$s&idxformulaire=%4$s&retourformulaire=dossier_instruction&obj=%1$s&action=115&idx=%3$s\', 1);
9365     </script>',
9366     'instruction_modale',
9367     OM_ROUTE_SOUSFORM,
9368     $this->getVal($this->clePrimaire),
9369     $this->getVal('dossier')
9370     );
9371     }
9372    
9373     /**
9374 softime 6565 * Retourne l'événement d'instruction dont on donne le code-barres, avec un filtre
9375     * pour exclure les dossiers du groupe contentieux.
9376 mbroquet 3730 *
9377     * @param [string] $barcode numéro du code-barres
9378     * @return [mixed] ID de son instruction ou null si aucun code
9379     */
9380     function get_instruction_by_barcode($barcode) {
9381     // Begin
9382     $this->begin_treatment(__METHOD__);
9383 softime 14064
9384 mbroquet 3730 // Vérification de l'existence de l'événement d'instruction
9385 softime 6565 // pour le code-barres donné, en excluant les dossiers liés au groupe CTX
9386 softime 14064 $qres = $this->f->get_one_result_from_db_query(
9387     sprintf(
9388     'SELECT
9389     instruction
9390     FROM
9391     %1$sinstruction
9392     INNER JOIN %1$sdossier
9393 softime 6565 ON dossier.dossier=instruction.dossier
9394 softime 14064 INNER JOIN %1$sdossier_instruction_type
9395 softime 6565 ON dossier.dossier_instruction_type = dossier_instruction_type.dossier_instruction_type
9396 softime 14064 INNER JOIN %1$sdossier_autorisation_type_detaille
9397 softime 6565 ON dossier_instruction_type.dossier_autorisation_type_detaille = dossier_autorisation_type_detaille.dossier_autorisation_type_detaille
9398 softime 14064 INNER JOIN %1$sdossier_autorisation_type
9399 softime 6565 ON dossier_autorisation_type_detaille.dossier_autorisation_type = dossier_autorisation_type.dossier_autorisation_type
9400 softime 14064 INNER JOIN %1$sgroupe
9401 softime 6565 ON dossier_autorisation_type.groupe = groupe.groupe
9402 softime 14064 AND groupe.code != \'CTX\'
9403     WHERE
9404     code_barres = \'%2$s\'',
9405     DB_PREFIXE,
9406     $this->f->db->escapeSimple($barcode)
9407     ),
9408     array(
9409     "origin" => __METHOD__,
9410     )
9411     );
9412    
9413 mbroquet 3730 // Retourne résultat
9414 softime 14064 return $this->end_treatment(__METHOD__, $qres['result']);
9415 mbroquet 3730 }
9416    
9417     /**
9418     * Met à jour le champ date d'envoi signature
9419     * avec la date fournie et pour l'instruction donnée
9420     *
9421     * @param [string] $id ID de l'événement d'instruction
9422     * @param [string] $date date au format EN
9423     * @return [boolean] true si mise à jour avec succès
9424     */
9425     function update_date_envoi_signature($id, $date) {
9426     // Préparation du tableau
9427     $valF = array();
9428     $valF['date_envoi_signature'] = $date;
9429     // Begin
9430     $this->begin_treatment(__METHOD__);
9431     // Requête
9432 softime 12847 $res = $this->f->db->autoexecute(
9433 mbroquet 3730 DB_PREFIXE.$this->table,
9434     $valF,
9435     DB_AUTOQUERY_UPDATE,
9436     $this->getCle($id)
9437     );
9438 softime 12847 $this->addToLog(
9439     __METHOD__."(): db->autoexecute(\"".DB_PREFIXE.'.'.$this->table."\", ".print_r($valF, true).", DB_AUTOQUERY_UPDATE, \"".$this->getCle($id)."\");",
9440     VERBOSE_MODE
9441     );
9442     if ($this->f->isDatabaseError($res, true) !== false) {
9443 mbroquet 3730 $this->end_treatment(__METHOD__, false);
9444     }
9445     //
9446     return $this->end_treatment(__METHOD__, true);
9447     }
9448    
9449     /**
9450     * Méthode permettant de définir des valeurs à envoyer en base après
9451     * validation du formulaire d'ajout.
9452     * @param array $val tableau des valeurs retournées par le formulaire
9453     */
9454 softime 6929 function setValFAjout($val = array()) {
9455 mbroquet 3730 // Mise à jour du flag created_by_commune lors d'un changement de décision
9456     // par un utilisateur de commune sur un dossier instruit par la comcom
9457 softime 6565 if ($this->isInstrCanChangeDecision($this->valF["dossier"])) {
9458 mbroquet 3730 $this->valF['created_by_commune'] = true;
9459     }
9460 softime 8593
9461     //
9462     if ($this->evenement_has_an_edition($this->valF['evenement']) === false) {
9463     if (isset($this->valF['flag_edition_integrale']) === true) {
9464     unset($this->valF['flag_edition_integrale']);
9465     }
9466     if (isset($this->valF['signataire_arrete']) === true) {
9467     unset($this->valF['signataire_arrete']);
9468     }
9469     }
9470 mbroquet 3730 }
9471 nmeucci 3876
9472 fmichon 3892
9473 fmichon 4708 /**
9474     * Récupère l'instance d'un événement de workflow.
9475     *
9476     * @param mixed $evenement Identifiant de l'événement.
9477     *
9478     * @return object
9479     */
9480     function get_inst_evenement($evenement = null) {
9481     //
9482     return $this->get_inst_common("evenement", $evenement);
9483     }
9484 softime 3976
9485 fmichon 3892 /**
9486 softime 3976 * Logue l'action de l'instruction dans son DI.
9487 nmeucci 3933 *
9488 softime 3976 * @param string $id Clé primaire de l'instruction.
9489     * @param array $val Valeurs de l'instruction.
9490     *
9491     * @return bool Vrai si traitement effectué avec succès
9492 nmeucci 3876 */
9493 softime 3976 private function add_log_to_dossier($id, array $val) {
9494 nmeucci 3933 $maj = $this->getParameter("maj");
9495 nmeucci 3943 // Action = Trace par défaut
9496     $action = $this->get_backtrace();
9497     // Action = Identifant de l'action si contexte connu
9498     if (empty($maj) === false
9499     || (empty($maj) === true && $maj === 0)) {
9500     $action = $this->get_action_param($maj, 'identifier');
9501 nmeucci 3965 if ($action === 'modifier_suivi') {
9502     $action = "modifier (via l'action suivi des dates)";
9503     }
9504 nmeucci 4108 if ($action === 'notifier_commune'
9505     && isset($val['mails_destinataires']) === true) {
9506     $action = "notification de la commune (courriels : ";
9507     $action .= $val['mails_destinataires'].")";
9508     }
9509 nmeucci 3943 }
9510 nmeucci 3876 // Création du log
9511     $log = array(
9512     'date' => date('Y-m-d H:i:s'),
9513     'user' => $_SESSION['login'],
9514     'action' => $action,
9515     'values' => array(
9516     'date_evenement' => $this->dateDB($val['date_evenement']),
9517     'date_retour_rar' => $this->dateDB($val['date_retour_rar']),
9518     'date_retour_signature' => $this->dateDB($val['date_retour_signature']),
9519     'evenement' => $val['evenement'],
9520     'action' => $val['action'],
9521 nmeucci 3963 'instruction' => $id,
9522 nmeucci 3876 'etat' => $val['etat'],
9523     ),
9524     );
9525     // Ajout du log
9526 softime 3976 $di = $this->get_inst_dossier($val['dossier']);
9527 nmeucci 3876 $ret = $di->add_log_instructions($log);
9528     if ($ret === false) {
9529     $this->correct = false;
9530     $this->msg = '';
9531     $this->addToMessage($di->msg);
9532     }
9533     return $ret;
9534     }
9535 nmeucci 3943
9536 softime 3976
9537 nmeucci 3943 /**
9538 softime 3976 * Retourne le contexte de déboguage formaté en HTML.
9539 nmeucci 3943 *
9540 softime 3976 * @return string Une ligne par trace
9541 nmeucci 3943 */
9542     private function get_backtrace() {
9543     $trace = debug_backtrace();
9544 nmeucci 3957 $backtrace = '';
9545     $i = 1;
9546 nmeucci 3943 foreach ($trace as $key => $value) {
9547 nmeucci 3957 $func = $trace[$key]['function'];
9548     // On ne s'autolog pas
9549     if ($func === 'get_backtrace'
9550     || $func === 'add_log_to_dossier') {
9551     continue;
9552     }
9553     $backtrace .= $i.') ';
9554     // Si dans une classe
9555     if (isset($trace[$key]['class']) === true
9556     && empty($trace[$key]['class']) === false) {
9557 nmeucci 3963 $backtrace .= $trace[$key]['class'].'->'.$func;
9558 nmeucci 3957 }
9559     // Si procédural
9560     else {
9561     $file = $trace[$key]['file'];
9562 nmeucci 3963 $line = $trace[$key]['line'];
9563 softime 3976 $truncated_file = $this->f->get_relative_path($file);
9564 nmeucci 3963 if ($truncated_file !== false) {
9565     $file = $truncated_file;
9566     }
9567     $backtrace .= $func.' IN<br/>&nbsp;&nbsp;&nbsp;&nbsp; '.$file.':'.$line;
9568 nmeucci 3957 }
9569     $backtrace .= '<br/>';
9570     $i++;
9571 nmeucci 3943 }
9572 nmeucci 3957 return $backtrace;
9573 nmeucci 3943 }
9574 nmeucci 3963
9575 nmeucci 4108 /**
9576     * CONDITION - is_notifiable.
9577     *
9578     * Condition pour afficher l'action notifier_commune.
9579     *
9580     * @return boolean
9581     */
9582     public function is_notifiable() {
9583     // L'instruction doit être finalisée, ce qui revient à dire
9584     // définalisable sans bypass
9585     if ($this->is_unfinalizable_without_bypass() === false) {
9586     return false;
9587     }
9588     // La collectivité de l'utilisateur doit être de niveau multi
9589     if ($this->f->has_collectivite_multi() === false) {
9590     return false;
9591     }
9592     // Le paramètre multi de l'objet du courriel doit exister
9593     if ($this->f->getParameter('param_courriel_de_notification_commune_objet_depuis_instruction') === NULL) {
9594     return false;
9595     }
9596     // Le paramètre multi du modèle du courriel doit exister
9597     if ($this->f->getParameter('param_courriel_de_notification_commune_modele_depuis_instruction') === NULL) {
9598     return false;
9599     }
9600     // A ce stade toutes les conditions sont satisfaites
9601     return true;
9602     }
9603 nmeucci 3963
9604 nmeucci 4108 /**
9605     * TREATMENT - notifier_commune.
9606     *
9607     * Notifie aux communes et par courriel la finalisation d'une instruction.
9608     *
9609     * @return boolean
9610     */
9611     public function notifier_commune() {
9612     // Cette méthode permet d'exécuter une routine en début des méthodes
9613     // dites de TREATMENT.
9614     $this->begin_treatment(__METHOD__);
9615 softime 14542 $message = __('Erreur de paramétrage :');
9616 softime 12654 $erreurParametrage = false;
9617     // Récupération du paramétrage de la collectivité du dossier
9618 nmeucci 4108 $id_di = $this->getVal('dossier');
9619     $di = $this->get_inst_dossier($id_di);
9620     $collectivite_di = $di->getVal('om_collectivite');
9621 softime 12654 // Récupération de l'url permettant d'accèder à l'instruction et au dossier
9622     $urlAcces = $this->f->get_parametre_notification_url_acces($collectivite_di);
9623     if (empty($urlAcces) && empty(PATH_BASE_URL)) {
9624     $erreurParametrage = true;
9625     $message .= '<br>'.__("* l'url de notification n'est pas correctement paramétré");
9626 nmeucci 4108 }
9627 softime 12654
9628     // Récupération de la liste des mails
9629     $adresses = $this->f->get_param_courriel_de_notification_commune($collectivite_di);
9630     if (empty($adresses)) {
9631     $erreurParametrage = true;
9632     $message .= '<br>'.__("* aucun courriel valide de destinataire de la commune");
9633 nmeucci 4108 }
9634 softime 12654
9635     // Vérification du paramétrage des mails
9636     $paramMail = $this->f->get_notification_commune_parametre_courriel_type($collectivite_di);
9637     if (empty($paramMail) || empty($paramMail['parametre_courriel_type_message'])) {
9638     $erreurParametrage = true;
9639     $message .= '<br>'.__("* le modèle du courriel envoyé aux communes est vide");
9640 nmeucci 4108 }
9641 softime 12654 if (empty($paramMail) || empty($paramMail['parametre_courriel_type_titre'])) {
9642     $erreurParametrage = true;
9643     $message .= '<br>'.__("* l'objet du courriel envoyé aux communes est vide");
9644 nmeucci 4108 }
9645 softime 12654
9646     // Si il y a des erreurs de paramétrage on ne déclenche pas la notification et
9647     // un message a destination de l'utilisateur est affiché
9648     if ($erreurParametrage) {
9649     $message .= '<br>'.__("Veuillez contacter votre administrateur.");
9650     $this->addToMessage($message);
9651 nmeucci 4108 return $this->end_treatment(__METHOD__, false);
9652     }
9653 softime 12654
9654     // Création d'un notification et de sa tâche associé pour chaque mail
9655     foreach ($adresses as $adresse) {
9656     // Ajout de la notif et récupération de son id
9657     $destinataire = array(
9658     'destinataire' => $adresse,
9659     'courriel' => $adresse
9660     );
9661     $idNotif = $this->ajouter_notification(
9662     $this->getVal($this->clePrimaire),
9663     $this->f->get_connected_user_login_name(),
9664     $destinataire,
9665     $collectivite_di
9666     );
9667     if ($idNotif === false) {
9668     $this->addToMessage(__("Veuillez contacter votre administrateur."));
9669     return $this->end_treatment(__METHOD__, false);
9670 nmeucci 4108 }
9671 softime 12654 // Création de la tache en lui donnant l'id de la notification
9672     $notification_by_task = $this->notification_by_task(
9673     $idNotif,
9674     $this->getVal('dossier'),
9675     'mail',
9676     'notification_commune'
9677     );
9678     if ($notification_by_task === false) {
9679     $this->addToMessage(__("Erreur lors de la préparation de la notification des communes."));
9680     $this->addToMessage(__("Veuillez contacter votre administrateur."));
9681     return $this->end_treatment(__METHOD__, false);
9682     }
9683 nmeucci 4108 }
9684 softime 12654 $this->addToMessage(__('La commune a été notifiée.'));
9685 nmeucci 4108 return $this->end_treatment(__METHOD__, true);
9686     }
9687    
9688     /**
9689 softime 5169 * Récupère l'instance de l'instructeur
9690     *
9691     * @param integer $instructeur Identifiant de l'instructeur.
9692     *
9693     * @return object
9694     */
9695     protected function get_inst_instructeur($instructeur) {
9696     //
9697     return $this->get_inst_common("instructeur", $instructeur);
9698     }
9699    
9700    
9701     /**
9702     * Récupère l'instance de l'utilisateur
9703     *
9704     * @param integer $om_utilisateur Identifiant de l'utilisateur.
9705     *
9706     * @return object
9707     */
9708     protected function get_inst_om_utilisateur($om_utilisateur) {
9709     //
9710     return $this->get_inst_common("om_utilisateur", $om_utilisateur);
9711     }
9712    
9713    
9714 softime 6565 /**
9715 softime 5295 * Récupère l'instance de la division.
9716     *
9717     * @param integer $division Identifiant de la division.
9718     *
9719     * @return object
9720     */
9721     protected function get_inst_division($division) {
9722     //
9723     return $this->get_inst_common("division", $division);
9724     }
9725    
9726    
9727     /**
9728     * Récupère l'instance de la direction.
9729     *
9730     * @param integer $direction Identifiant de la direction.
9731     *
9732     * @return object
9733     */
9734     protected function get_inst_direction($direction) {
9735     //
9736     return $this->get_inst_common("direction", $direction);
9737     }
9738    
9739    
9740     /**
9741     * Récupère la collectivité d'un instructeur en passant par sa division puis
9742     * par sa direction.
9743     *
9744     * @param integer $instructeur Identifiant de l'instructeur.
9745     *
9746     * @return integer
9747     */
9748     protected function get_instructeur_om_collectivite($instructeur) {
9749     // Chemin vers la collectivité d'un instructeur
9750     $inst_instr = $this->get_inst_instructeur($instructeur);
9751     $inst_division = $this->get_inst_division($inst_instr->getVal('division'));
9752     $inst_direction = $this->get_inst_direction($inst_division->getVal('direction'));
9753    
9754     // Collectivité
9755     $om_collectivite = $inst_direction->getVal('om_collectivite');
9756    
9757     //
9758     return $om_collectivite;
9759     }
9760    
9761 softime 6565 /*
9762     * CONDITION - can_user_access_dossier_contexte_ajout
9763     *
9764     * Vérifie que l'utilisateur a bien accès au dossier d'instruction passé dans le
9765     * formulaire d'ajout.
9766     * Cette méthode vérifie que l'utilisateur est lié au groupe du dossier, et si le
9767     * dossier est confidentiel qu'il a accès aux confidentiels de ce groupe.
9768     *
9769     */
9770     function can_user_access_dossier_contexte_ajout() {
9771 softime 5295
9772 softime 6565 ($this->f->get_submitted_get_value('idxformulaire') !== null ? $id_dossier =
9773     $this->f->get_submitted_get_value('idxformulaire') : $id_dossier = "");
9774     //
9775     if ($id_dossier !== "") {
9776 softime 7996 $dossier = $this->f->get_inst__om_dbform(array(
9777     "obj" => "dossier_instruction",
9778     "idx" => $id_dossier,
9779     ));
9780 softime 6565 //
9781     return $dossier->can_user_access_dossier();
9782     }
9783     return false;
9784     }
9785    
9786     /*
9787     * CONDITION - can_user_access_dossier
9788     *
9789     * Vérifie que l'utilisateur a bien accès au dossier lié à l'instruction instanciée.
9790     * Cette méthode vérifie que l'utilisateur est lié au groupe du dossier, et si le
9791     * dossier est confidentiel qu'il a accès aux confidentiels de ce groupe.
9792     *
9793     */
9794     function can_user_access_dossier_contexte_modification() {
9795    
9796     $id_dossier = $this->getVal('dossier');
9797     //
9798     if ($id_dossier !== "" && $id_dossier !== null) {
9799 softime 7996 $dossier = $this->f->get_inst__om_dbform(array(
9800     "obj" => "dossier_instruction",
9801     "idx" => $id_dossier,
9802     ));
9803 softime 6565 //
9804     return $dossier->can_user_access_dossier();
9805     }
9806     return false;
9807     }
9808    
9809 softime 8593 /**
9810 softime 10713 * TREATMENT - envoyer_a_signature_sans_relecture
9811     *
9812     * Permet d'envoyer le document de l'instruction au parapheur pour signature sans relecture
9813     *
9814     * @return boolean true si l'envoi a été effectué avec succès false sinon
9815     */
9816     function envoyer_a_signature_sans_relecture() {
9817     return $this->envoyer_a_signature();
9818     }
9819    
9820     /**
9821     * TREATMENT - envoyer_a_signature_avec_relecture
9822     *
9823     * Permet d'envoyer le document de l'instruction au parapheur pour signature avec relecture
9824     *
9825     * @return boolean true si l'envoi a été effectué avec succès false sinon
9826     */
9827     function envoyer_a_signature_avec_relecture() {
9828 softime 10808 $is_forced_view_files = true;
9829     return $this->envoyer_a_signature($is_forced_view_files);
9830 softime 10713 }
9831    
9832     /**
9833 softime 10573 * TREATMENT - envoyer_a_signature
9834     *
9835     * Permet d'envoyer le document de l'instruction au parapheur pour signature
9836 softime 10713 *
9837     * @param boolean $is_forced_view_files Indique si il y a une relecture (true) ou non (false)
9838 softime 10573 *
9839     * @return boolean true si l'envoi a été effectué avec succès false sinon
9840     */
9841 softime 10713 function envoyer_a_signature($is_forced_view_files = false) {
9842 softime 10573 $this->begin_treatment(__METHOD__);
9843     $this->correct = true;
9844    
9845     // Instanciation de l'objet signataire_arrete
9846     $inst_signataire_arrete = $this->f->get_inst__om_dbform(array(
9847     'obj' => 'signataire_arrete',
9848     'idx' => $this->getVal('signataire_arrete'),
9849     ));
9850    
9851     // Instanciation de l'objet dossier
9852     $inst_dossier = $this->f->get_inst__om_dbform(array(
9853     'obj' => 'dossier',
9854     'idx' => $this->getVal('dossier'),
9855     ));
9856    
9857 softime 15037 //Instanciation de la classe electronicsignature
9858     $inst_es = $this->get_electronicsignature_instance();
9859     if ($inst_es === false) {
9860     $this->correct = false;
9861     return $this->end_treatment(__METHOD__, false);
9862     }
9863    
9864     // Vérifie si la notification se fait via l'application ou via le parapheur
9865     try {
9866     $notification_required = $inst_es->signer_notification_is_delegated();
9867     } catch(electronicsignature_connector_method_not_implemented_exception $_) {
9868     // Si la méthode n'existe pas, on considère que la notification est faite par le parapheur
9869     $notification_required = false;
9870     }
9871    
9872     // Si la notification est faite par l'application vérifie que l'adresse mail du
9873     // signataire est correcte. Si ce n'est pas le cas le document n'est pas envoyé
9874     // au parapheur car il ne sera pas accessible sans le lien transmis dans la
9875     // notification
9876     if ($notification_required === true) {
9877     $signer_mail = $inst_signataire_arrete->getVal('email');
9878     $signer_name = trim($inst_signataire_arrete->getVal('prenom').' '.$inst_signataire_arrete->getVal('nom'));
9879    
9880     $err_msg = __('Le document n\'a pas pu être envoyé en signature car ');
9881    
9882     if (empty($signer_mail)) {
9883     $this->correct = false;
9884     $err_detail = sprintf(__("l'email du signataire '%s' est vide."), $signer_name);
9885     $this->addToMessage($err_msg.$err_detail);
9886     $this->addToLog(__METHOD__.$err_msg.$err_detail.' Instruction : '.$this->getVal($this->clePrimaire), DEBUG_MODE);
9887     return $this->end_treatment(__METHOD__, false);
9888     }
9889     if (! $this->f->checkValidEmailAddress($signer_mail)) {
9890     $this->correct = false;
9891     $err_detail = sprintf(__("l'email du signataire '%s' est invalide (%s)."), $signer_name, $signer_mail);
9892     $this->addToMessage($err_msg.$err_detail);
9893     $this->addToLog(__METHOD__.$err_msg.$err_detail.' Instruction : '.$this->getVal($this->clePrimaire), DEBUG_MODE);
9894     return $this->end_treatment(__METHOD__, false);
9895     }
9896     }
9897    
9898 softime 10573 // Récupération du document à signer
9899     $file = $this->f->storage->get($this->getVal('om_fichier_instruction'));
9900     if ($file === OP_FAILURE) {
9901     $this->correct = false;
9902     $this->addToMessage(__("Une erreur est survenue lors de la récupération du contenu du document de l'instruction."));
9903     // Termine le traitement
9904     return $this->end_treatment(__METHOD__, false);
9905     }
9906    
9907     // Initialisation des paramètre à passer pour l'envoi en signature
9908 softime 18769 $this->f->getUserInfos();
9909 softime 10808 $data = array(
9910 softime 10573 "om_utilisateur_email" => $this->f->om_utilisateur['email'],
9911     "om_utilisateur_nom" => $this->f->om_utilisateur['nom'],
9912     "signataire_arrete_email" => $inst_signataire_arrete->getVal('email'),
9913     "signataire_arrete_nom" => $inst_signataire_arrete->getVal('nom'),
9914     "signataire_arrete_prenom" => $inst_signataire_arrete->getVal('prenom'),
9915 softime 11876 // Permet d'envoyer en signature l'instruction le jour de la date limite
9916 softime 14064 "date_limite_instruction" => $this->compute_date_limite(1) != null ? $this->compute_date_limite(1) : null,
9917 softime 10573 "dossier" => $this->getVal('dossier'),
9918 softime 10713 "is_forced_view_files" => $is_forced_view_files,
9919     'commentaire_signature' => $is_forced_view_files === true ? __('relecture demandee.') : null
9920 softime 10573 );
9921    
9922 softime 10808 // Initialisation des métadonnées
9923     $metadonnee_dossier = $file['metadata'];
9924 softime 18436 // Récupération du libellé du document transmis au parapheur
9925     $metadonnee_dossier['filename'] = $this->getVal('fichier_instruction_name');
9926 softime 11228 $metadonnee_dossier['titre_document'] = $this->getDocumentTitre();
9927 softime 10808
9928     $metadonnee_dossier['url_di'] = sprintf(
9929 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',
9930 softime 11418 $this->f->get_param_base_path_metadata_url_di() !== null ? $this->f->get_param_base_path_metadata_url_di() : PATH_BASE_URL,
9931 softime 15037 $this->getVal('dossier')
9932 softime 10808 );
9933    
9934     $optional_data = null;
9935     // Si il y a des paramètres supplémentaire spécifié dans le signataire alors on les récupère
9936     if ($inst_signataire_arrete->getVal('parametre_parapheur') !== null && $inst_signataire_arrete->getVal('parametre_parapheur') !== '') {
9937     $optional_data = json_decode($inst_signataire_arrete->getVal('parametre_parapheur'), true);
9938     if (json_last_error() !== JSON_ERROR_NONE) {
9939     $this->correct = false;
9940     $this->addToMessage(__("Les paramètres supplémentaires envoyés au parapheur ne sont pas au bon format."));
9941     $this->addToLog(__METHOD__."(): ".
9942     __("Erreur lors du décodage du format json des paramètres supplémentaires envoyé au parapheur.
9943     Tableau : ").var_export($inst_signataire_arrete->getVal('parametre_parapheur'), true)
9944     );
9945     // Termine le traitement
9946     return $this->end_treatment(__METHOD__, false);
9947     }
9948     }
9949    
9950 softime 10573 // Appel de la méthode de l'abstracteur send_for_signature()
9951     // Cette méthode doit retourner un tableau de valeur
9952     try {
9953 softime 10808 $result = $inst_es->send_for_signature($data, $file['file_content'], $metadonnee_dossier, $optional_data);
9954 softime 10573 } catch (electronicsignature_exception $e) {
9955     $this->handle_electronicsignature_exception($e);
9956     return $this->end_treatment(__METHOD__, false);
9957     }
9958    
9959     // Après avoir reçu le résultat du parapheur, il faut mettre à jour les champs
9960     $valF = array();
9961    
9962     // Pour appeler la fonction modifier il faut traiter tous les champs de l'objet
9963     foreach($this->champs as $identifiant => $champ) {
9964     $valF[$champ] = $this->val[$identifiant];
9965     }
9966     // On fait ensuite nos modifications spécifiques
9967     $valF['id_parapheur_signature'] = $result['id_parapheur_signature'];
9968     $valF['statut_signature'] = $result['statut'];
9969     $valF['commentaire_signature'] = isset($result['commentaire_signature']) == true ? $result['commentaire_signature'] : null;
9970     $valF['date_envoi_signature'] = date("Y-m-d", strtotime($result['date_envoi_signature']));
9971     $valF['historique_signature'] = $this->get_updated_historique_signature($result);
9972 softime 15037 $valF['parapheur_lien_page_signature'] = isset($result['signature_page_url']) ? $result['signature_page_url'] : null;
9973 softime 18769 $this->setParameter("maj", 1);
9974 softime 10573 $ret = $this->modifier($valF);
9975    
9976     if ($ret === false) {
9977     $this->correct = false;
9978     $this->addToMessage(__("Une erreur est survenue lors de la mise à jour des champs."));
9979     // Termine le traitement
9980     return $this->end_treatment(__METHOD__, false);
9981     }
9982    
9983 softime 15037 // Notification du signataire
9984     if ($notification_required === true) {
9985     if ($this->notify_signer($signer_name, $signer_mail, $data['om_utilisateur_nom']) === false) {
9986     $msg = __("Une erreur s'est produite lors de la notification du signataire \"%s (%s)\". Annulation de l'envoi pour signature du document%s.");
9987     $this->addToMessage(sprintf($msg, $signer_name, $signer_mail, ''));
9988     $this->addToLog(sprintf($msg, $signer_name, $signer_mail, ' : '.$this->getVal($this->clePrimaire)), DEBUG_MODE);
9989     // Met à jour les valeurs de l'objet courant pour prendre en compte les modifications faites
9990     // precedemment
9991     $this->init_record_data($this->getVal($this->clePrimaire));
9992     $this->annuler_envoi_en_signature();
9993     $this->correct = false;
9994     return $this->end_treatment(__METHOD__, true);
9995     }
9996     }
9997    
9998 softime 10573 // Message
9999     $this->addToMessage(__("Le document a été envoyé pour signature dans le parapheur."));
10000 softime 15037 if ($this->f->is_option_enabled('option_afficher_lien_parapheur') === true
10001     && array_key_exists('signature_page_url', $result) === true) {
10002 softime 10573 $this->addToMessage(sprintf(
10003 softime 11228 '<br> > <a href="%1$s" title="%2$s" target="_blank">%2$s</a>',
10004     $result['signature_page_url'],
10005     __("Signez directement le document")
10006 softime 10573 ));
10007     }
10008 softime 15037 if ($notification_required !== true) {
10009     $this->addToMessage(__("L'envoi de la notification au signataire est effectué par la plateforme."));
10010     }
10011 softime 10573
10012     // Tout s'est bien passé, on termine le traitement
10013     return $this->end_treatment(__METHOD__, true);
10014     }
10015    
10016     /**
10017 softime 15037 * Notifie le signataire d'un document à signer.
10018     * Gère l'affichage des messages à destination de l'utilisateur selon l'état du traitement.
10019     * En cas d'erreur ajoute une ligne dans les logs de l'application.
10020     *
10021     * @param string $signer_name Nom du signataire
10022     * @param string $signer_mail Mail du signataire
10023     * @param string $user_name Nom de l'utilisateur openADS courant
10024     *
10025     * @return boolean true si succés, false si erreur
10026     */
10027     protected function notify_signer($signer_name, $signer_mail, $user_name) {
10028     // message d'erreur
10029     $err_msg_log = sprintf(
10030     __("Échec de la notification du signataire \"%s (%s)\" lors de l'envoi au parapaheur du document de l'instruction : %s"),
10031     $signer_name,
10032     $signer_mail,
10033     $this->getVal($this->clePrimaire)
10034     );
10035     $err_msg = sprintf(
10036     '%s %s (%s)"',
10037     __("Échec de la notification du signataire"),
10038     $signer_name,
10039     $signer_mail
10040     );
10041    
10042     // vérification des informations requises
10043     if (empty($signer_name)) {
10044     $err_detail = __("le nom du signataire est vide");
10045     $this->addToLog(__METHOD__.', '.$err_msg_log.', '.$err_detail, DEBUG_MODE);
10046     $this->addToMessage($err_msg.', '.$err_detail);
10047     return false;
10048     }
10049     if (empty($signer_mail)) {
10050     $err_detail = __("le courriel du signataire est vide");
10051     $this->addToLog(__METHOD__.', '.$err_msg_log.', '.$err_detail, DEBUG_MODE);
10052     $this->addToMessage($err_msg.', '.$err_detail);
10053     return false;
10054     }
10055     if (empty($this->getVal('dossier'))) {
10056     $err_detail = __("l'identifiant du dossier est vide");
10057     $this->addToLog(__METHOD__.', '.$err_msg_log.', '.$err_detail, DEBUG_MODE);
10058     $this->addToMessage($err_msg.', '.$err_detail);
10059     return false;
10060     }
10061    
10062     // ajout de la notification à la liste des notifications de l'instruction
10063     $instruction_id = $this->getVal($this->clePrimaire);
10064     $inst_notif = $this->f->get_inst__om_dbform(array(
10065     "obj" => "instruction_notification",
10066     "idx" => "]",
10067     ));
10068     $notif_val = array(
10069     'instruction_notification' => null,
10070     'instruction' => $instruction_id,
10071     'automatique' => true,
10072     'emetteur' => $user_name,
10073     'date_envoi' => null,
10074     'destinataire' => "$signer_name <$signer_mail>",
10075     'courriel' => $signer_mail,
10076     'date_premier_acces' => null,
10077     'statut' => '',
10078     'commentaire' => ''
10079     );
10080     $add_notif = $inst_notif->ajouter($notif_val);
10081     if ($add_notif === false) {
10082     $err_detail = __("Échec de l'ajout de la notification.");
10083     $this->addToLog(__METHOD__.' '.$err_msg_log.'. '.$err_detail.' Notification : '.var_export($notif_val, true), DEBUG_MODE);
10084     $this->addToMessage($err_msg);
10085     return false;
10086     }
10087     $notification_id = $inst_notif->getVal($inst_notif->clePrimaire);
10088    
10089     // ajout d'une tâche de notification (envoi du mail)
10090     $notification_task = $this->notification_by_task(
10091     $notification_id,
10092     $this->getVal('dossier'),
10093     'mail',
10094     'notification_signataire'
10095     );
10096     if ($notification_task === false) {
10097     $err_detail = sprintf(
10098     __("Échec de l'ajout de la tâche de notification (notification %s)."),
10099     $notification_id);
10100     $this->addToLog(__METHOD__.' '.$err_msg_log.'. '.$err_detail, DEBUG_MODE);
10101     $this->addToMessage($err_msg);
10102     return false;
10103     }
10104    
10105     // Vérification de la réussite de l'envoi du mail
10106     // Fais une requête pour récupérer la liste des notifications de signataire faites par mail
10107     // et associées à l'instruction en cours. Récupère uniquement la dernière qui doit être celle
10108     // qui viens d'être créée.
10109     // Si la tâche d'envoi du mail est en erreur alors on considère que l'envoi du mail a échoué.
10110     $qres = $this->f->get_one_result_from_db_query(
10111     sprintf(
10112     'SELECT
10113     state
10114     FROM
10115     %1$stask
10116     WHERE
10117     type = \'notification_signataire\'
10118     AND category = \'mail\'
10119     AND dossier = \'%2$s\'
10120     ORDER BY
10121     task DESC
10122     LIMIT 1',
10123     DB_PREFIXE,
10124     $this->f->db->escapeSimple($this->getVal('dossier'))
10125     ),
10126     array(
10127     'origin' => __METHOD__
10128     )
10129     );
10130     if ($qres['result'] === 'error') {
10131     $err_detail = sprintf(
10132     __("Échec de l'envoi du mail de notification (notification %s)."),
10133     $notification_id);
10134     $this->addToLog(__METHOD__.' '.$err_msg_log.'. '.$err_detail, DEBUG_MODE);
10135     $this->addToMessage($err_msg);
10136     return false;
10137     }
10138 softime 18436 // TODO gérer les autres cas (gestion d'erreur)
10139 softime 15037
10140     // succès de la planification de la notification
10141     $this->addToMessage(sprintf(
10142     __('Le signataire "%s (%s)" sera notifié prochainement'),
10143     $signer_name,
10144     $signer_mail));
10145     return true;
10146     }
10147    
10148     /**
10149 softime 11876 * Permet de récupérer la bonne date limite en fonction de si l'instruction
10150     * est en incomplet notifié ou non.
10151     * On peut ajouter des jours à cette date grâce au paramètre "delay".
10152     * Cette fonction est utilisée dans un cas spécifique où on veut envoyer
10153     * l'instruction en signature le jour de la date limite.
10154     *
10155     * @param int $delay Le nombre de jour à ajouter à la date limite.
10156     *
10157     * @return string $date_limite la date limite calculé ou false
10158     */
10159     private function compute_date_limite($delay) {
10160     // Instanciation de l'objet dossier
10161     $inst_dossier = $this->f->get_inst__om_dbform(array(
10162     'obj' => 'dossier',
10163     'idx' => $this->getVal('dossier'),
10164     ));
10165    
10166     $date_to_compute = null;
10167     if ($inst_dossier->getVal('incomplet_notifie') === 't') {
10168     $date_to_compute = $inst_dossier->getVal('date_limite_incompletude');
10169     } else {
10170     $date_to_compute = $inst_dossier->getVal('date_limite');
10171     }
10172 softime 14064 if ($date_to_compute != null) {
10173     return date("Y-m-d", strtotime($date_to_compute."+ $delay days"));
10174     }
10175 softime 11876
10176 softime 14064 return null;
10177 softime 11876 }
10178    
10179     /**
10180 softime 10573 * Permet de récupérer la traduction de la valeur de statut_signature
10181     *
10182     * @return string la valeur de statut_signature traduite | false
10183     */
10184     function get_trad_for_statut($value_to_trad){
10185     $statut_signature_tab = array(
10186     'waiting' => __('en préparation'),
10187     'in_progress' => __('en cours de signature'),
10188     'canceled' => __('signature annulée'),
10189 softime 10808 'expired' => __('délai de signature expiré'),
10190 softime 10573 'finished' => __('signé')
10191     );
10192     if (array_key_exists($value_to_trad, $statut_signature_tab) === true) {
10193     return $statut_signature_tab[$value_to_trad];
10194     }
10195    
10196     return false;
10197     }
10198    
10199     /**
10200     * Permet de mettre à jour le tableau json sotcké dans le champ historique_signature
10201     *
10202     * @return string (json) la valeur de historique_signature mis à jour | false
10203     */
10204     function get_updated_historique_signature($historique_signature_values) {
10205    
10206     $historique_signature_value_tab = $this->get_historique_signature_decoded();
10207    
10208     if ($historique_signature_value_tab === false) {
10209     $this->addToLog(__METHOD__."(): erreur historique signature", DEBUG_MODE);
10210     return false;
10211     }
10212    
10213     $last_val_historique_signature = array();
10214    
10215     // Si la tableau récupéré n'est pas vide alors
10216     // on récupère la dernière ligne du tableau
10217     if (empty($historique_signature_value_tab) === false) {
10218     $last_val_historique_signature = end($historique_signature_value_tab);
10219     }
10220    
10221     $format_date = '';
10222     $format_date_hour = '';
10223     $date_converted=array();
10224    
10225     $date_to_convert = array(
10226     'date_envoi_signature' => $historique_signature_values['date_envoi_signature'],
10227 softime 11876 'date_limite_instruction' => $this->compute_date_limite(0),
10228 softime 10573 'date_retour_signature' => $historique_signature_values['date_retour_signature']
10229     );
10230    
10231     // Conversion des dates en fonction de leur format
10232     foreach ($date_to_convert as $key => $value) {
10233     $date_converted[$key] = null;
10234     if ($value != null) {
10235     $format_date = 'd/m/Y';
10236     $format_date_hour = 'd/m/Y H:i:s';
10237     $date_converted[$key] = empty(date_parse($value)['hour']) === false ? date($format_date_hour, strtotime($value)) : date($format_date, strtotime($value));
10238     }
10239     }
10240    
10241     // Ce tableau permet de lister les colonnes de historique_signature et de les rendre traduisibles.
10242     // Il faut en effet mettre les gettext avec l'intitulé explicite au moins
10243     // une fois afin qu'il puisse être reconnu par le logiciel de traduction.
10244     $tab_for_columns_trad = array(
10245     __('entry_date'),
10246     __('id_parapheur_signature'),
10247     __('emetteur'),
10248     __('signataire'),
10249     __('date_envoi'),
10250     __('date_limite'),
10251     __('date_retour'),
10252     __('statut_signature'),
10253     __('commentaire_signature')
10254     );
10255    
10256     array_push($historique_signature_value_tab, array(
10257     'entry_date' => date('d/m/Y H:i:s'),
10258     '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'],
10259     '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'],
10260     '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'],
10261     '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'],
10262     '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'],
10263     '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'],
10264     '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']),
10265     'commentaire_signature' => isset($historique_signature_values['commentaire_signature']) === false || $historique_signature_values['commentaire_signature'] == null ? null : $historique_signature_values['commentaire_signature'],
10266     ));
10267    
10268     return json_encode($historique_signature_value_tab, JSON_HEX_APOS);
10269     }
10270 softime 11876
10271     /**
10272     * TREATMENT - annuler_envoi_en_signature
10273     *
10274     * Permet d'annuler l'envoi du document de l'instruction au parapheur pour signature
10275     *
10276     * @return boolean true si l'annulation a été effectué avec succès false sinon
10277     */
10278     function annuler_envoi_en_signature() {
10279     $this->begin_treatment(__METHOD__);
10280     $this->correct = true;
10281 softime 10573
10282 softime 11876 //Instanciation de la classe electronicsignature
10283     $inst_es = $this->get_electronicsignature_instance();
10284     if ($inst_es === false) {
10285     $this->correct = false;
10286     return $this->end_treatment(__METHOD__, false);
10287     }
10288 softime 10573
10289 softime 11876 $data = array();
10290     if (! empty($this->getVal('id_parapheur_signature'))) {
10291     $data['id_parapheur_signature'] = $this->getVal('id_parapheur_signature');
10292     } else {
10293     $this->correct = false;
10294     $this->addToMessage(__("Il n'y a pas d'identifiant de parapheur."));
10295     return $this->end_treatment(__METHOD__, false);
10296     }
10297    
10298     // Appel de la méthode de l'abstracteur cancel_send_for_signature()
10299     // Cette méthode doit retourner un tableau de valeur
10300     try {
10301     $result = $inst_es->cancel_send_for_signature($data);
10302     } catch (electronicsignature_exception $e) {
10303     $this->handle_electronicsignature_exception($e);
10304     return $this->end_treatment(__METHOD__, false);
10305     }
10306    
10307     // Après avoir reçu le résultat du parapheur, il faut mettre à jour les champs
10308     $valF = array();
10309    
10310     // Pour appeler la fonction modifier il faut traiter tous les champs de l'objet
10311     foreach($this->champs as $identifiant => $champ) {
10312     $valF[$champ] = $this->val[$identifiant];
10313     }
10314     // On fait ensuite nos modifications spécifiques
10315     $valF['id_parapheur_signature'] = null;
10316     $valF['statut_signature'] = $result['statut'];
10317     $valF['commentaire_signature'] = isset($result['commentaire_signature']) == true ? $result['commentaire_signature'] : null;
10318     $valF['date_envoi_signature'] = null;
10319     $valF['historique_signature'] = $this->get_updated_historique_signature($result);
10320    
10321 softime 18769 $this->setParameter("maj", 1);
10322 softime 11876 $ret = $this->modifier($valF);
10323    
10324     if ($ret === false) {
10325     $this->correct = false;
10326     $this->addToMessage(__("Une erreur est survenue lors de la mise à jour des champs."));
10327     // Termine le traitement
10328     return $this->end_treatment(__METHOD__, false);
10329     }
10330    
10331     // Message
10332     $this->addToMessage(__("L'annulation a été effectuée avec succès."));
10333    
10334     // Tout s'est bien passé, on termine le traitement
10335     return $this->end_treatment(__METHOD__, true);
10336     }
10337    
10338    
10339 softime 10573 /**
10340     * Récupère le contenu du champ historique_signature et le converti en tableau
10341     *
10342     * @return array sinon false en cas d'erreur
10343     */
10344     protected function get_historique_signature_decoded() {
10345 softime 11876 $val = str_replace("'", '"', $this->getVal('historique_signature'));
10346     if ($val === '' || $val == 'false') {
10347 softime 10573 $val = json_encode(array());
10348     }
10349     if($this->isJson($val) === false) {
10350     return false;
10351     }
10352     return json_decode($val, true);
10353     }
10354    
10355 softime 10808 /**
10356     * Récupère les informations à afficher dans le tableau de suivi à l'aide
10357     * d'une requête sql. Stocke ces informations dans un tableau.
10358 softime 12433 * Converti le tableau au format json et renvoi le json obtenu.
10359 softime 10808 *
10360 softime 12433 * Pour identifier quel suivi est affiché (notification des demandeurs, des services ou
10361     * de tiers) ce sont les tâches liées aux notifications qui sont utilisés.
10362     * La clause where de la requête est construite à partir du tableau contenant les types
10363     * de tâches fourni en paramètre.
10364     * Il est également possible d'afficher les notifications n'étant pas lié à des tâches.
10365     *
10366     * Si le suivi concerne la notification des demandeurs via le portail citoyen,
10367     * la date de premier accès ne sera pas affichée.
10368     *
10369     * @param array liste des tâches permettant d'identifier quelles notification afficher
10370     * @param boolean permet d'afficher les notifications non liées à des tâches
10371 softime 10808 * @return json
10372     */
10373 softime 15037 public function get_json_suivi_notification($typeTache, $nonLieTache = false) {
10374 softime 11585 $whereTypeTache = '';
10375 softime 15037 $sqlTaskNull = 'INNER';
10376 softime 12654
10377     // Liste des champs à afficher. Permet également la traduction des noms de colonnes.
10378     $listeChampsTrad = array(
10379     __('emetteur'),
10380     __('date_envoi'),
10381     __('destinataire'),
10382     __('date_premier_acces'),
10383     __('instruction'),
10384     __('annexes'),
10385     __('statut'),
10386     __('commentaire')
10387     );
10388     $listeChamps = array(
10389     'emetteur',
10390     'date_envoi',
10391     'destinataire',
10392     'date_premier_acces',
10393     'instruction',
10394     'annexes',
10395     'statut',
10396     'commentaire'
10397     );
10398    
10399 softime 12124 // Défini si on veux que la requête récupère également les notifications qui n'ont pas
10400     // de tâches associées. C'est le cas pour les notifications de demandeurs lorsque la
10401     // notification du demandeur principal n'a pas pu être envoyée à cause d'un mauvais
10402     // paramétrage
10403     if(is_bool($nonLieTache) && $nonLieTache === true) {
10404 softime 15037 $sqlTaskNull = 'LEFT';
10405 softime 12124 }
10406     // Prépare la clause where pour ne récupérer que les notifications liées à certain type de tâches
10407     // Permet de différencier les notifications des demandeurs de celle des services et de celles des
10408     // tiers consulté
10409 softime 12433 if (is_array($typeTache) && $typeTache != array()) {
10410 softime 11585 if (is_array($typeTache)) {
10411     $whereTypeTache = sprintf(
10412 softime 15835 'AND (task.task IS NULL OR (task.task IS NOT NULL AND task.type IN (%1$s)))',
10413 softime 15037 "'".implode("', '", $typeTache)."'"
10414 softime 11585 );
10415     }
10416 softime 12433 // La date de premier accès n'a pas besoin d'être renseigné pour
10417     // les notifications des demandeurs via le portail citoyen.
10418     // Les notifications des demandeurs sont liés à 3 types de tâches
10419     // notification_recepisse, notification_instruction, notification_decision
10420     // Si le suivi de la notification concerne un de ces types de tâches on
10421     // considère que c'est une notification de demandeurs.
10422     // Dans ce cas on vérifie si cette notification est paramétrée pour passer
10423     // via le portail. Par défaut si rien n'est paramétré on considère que la
10424     // notification est faite via le portail
10425     if ((in_array('notification_recepisse', $typeTache) ||
10426     in_array('notification_instruction', $typeTache) ||
10427     in_array('notification_decision', $typeTache))) {
10428     $dossier = $this->getVal('dossier');
10429     $collectivite_di = $this->get_dossier_instruction_om_collectivite($dossier);
10430     $modeNotification = $this->f->get_param_option_notification($collectivite_di);
10431 softime 14064 if ($modeNotification === PORTAL) {
10432 softime 12654 $listeChamps = array(
10433     'emetteur',
10434     'date_envoi',
10435     'destinataire',
10436     'instruction',
10437     'annexes',
10438     'statut',
10439     'commentaire'
10440     );
10441 softime 12433 }
10442     }
10443 softime 12654 // Il n'y a pas d'annexe pour la notification des communes donc pas besoin
10444     // de les afficher dans le suivi
10445     if (in_array('notification_depot_demat', $typeTache)) {
10446     $listeChamps = array(
10447     'emetteur',
10448     'date_envoi',
10449     'destinataire',
10450     'instruction',
10451     'statut',
10452     'commentaire'
10453     );
10454     }
10455 softime 11585 }
10456 softime 12433
10457 softime 10808 $valSuivi = array();
10458     // Récupération des infos nécessaires à l'affichage du tableau
10459     $sql = sprintf(
10460 softime 11585 'SELECT DISTINCT
10461 softime 10869 instruction_notification.instruction_notification,
10462 softime 12124 -- Affiche la mention automatique avec le nom de l emetteur si la notification a été envoyé automatiquement
10463 softime 10869 CASE WHEN instruction_notification.automatique = TRUE
10464     THEN TRIM(CONCAT(instruction_notification.emetteur, \' \', \'(automatique)\'))
10465     ELSE instruction_notification.emetteur
10466     END as emetteur,
10467 softime 10808 date_envoi,
10468     instruction_notification.destinataire,
10469 softime 10869 instruction_notification.date_premier_acces,
10470 softime 10808 evenement.libelle as instruction,
10471 softime 10869 instruction_notification.statut,
10472     instruction_notification.commentaire,
10473 softime 12433 annexes.instruction_annexe as annexes
10474 softime 10808 FROM
10475     %1$sinstruction_notification
10476     LEFT JOIN %1$sinstruction
10477     ON instruction.instruction = instruction_notification.instruction
10478     LEFT JOIN %1$sevenement
10479     ON instruction.evenement = evenement.evenement
10480 softime 10869 LEFT JOIN %1$sinstruction_notification_document
10481     ON instruction_notification.instruction_notification = instruction_notification_document.instruction_notification
10482     AND instruction_notification_document.annexe = true
10483 softime 12124 -- Récupère les tâches liées au notification pour pouvoir par la suite identifier le type de notification
10484 softime 15037 %4$s JOIN %1$stask
10485 softime 11585 ON instruction_notification.instruction_notification::CHARACTER VARYING = task.object_id
10486 softime 15835 AND task.type LIKE \'notification%%\'
10487 softime 12124 -- Récupération de la liste des annexes sous la forme d une liste
10488 softime 11585 LEFT JOIN (
10489     SELECT
10490     instruction_notification,
10491 softime 12124 -- Récupère la liste des annexes de la notification
10492 softime 12433 -- sous la forme d un json pour récupérer toutes les informatiosn nécessaire
10493     -- à l affichage du lien vers les annexes
10494     CONCAT(
10495     \'[\',
10496     STRING_AGG(
10497     -- Affiche le nom du fichier selon le type de document/pièce
10498     CASE
10499     WHEN instruction_notification_document.document_type = \'instruction\'
10500     THEN CONCAT(
10501     \'{
10502     "obj" : "instruction",
10503     "champs" : "om_fichier_instruction",
10504     "label" : "\', evenement.libelle, \'",
10505     "id" : "\', instruction.instruction,\'"
10506     }\'
10507     )
10508     WHEN instruction_notification_document.document_type = \'consultation\'
10509     THEN CONCAT(
10510 softime 15218 \'{
10511     "obj" : "consultation",
10512     "champs" : "fichier",
10513     "label" : "\', CONCAT_WS( \' - \', \'Avis\', service.libelle, to_char(consultation.date_retour,\'DD/MM/YYYY\')), \'",
10514     "id" : "\', consultation.consultation, \'"
10515     }\'
10516 softime 12433 )
10517     ELSE
10518     CONCAT(
10519     \'{
10520     "obj" : "document_numerise",
10521     "champs" : "uid",
10522     "label" : "\', document_numerise.nom_fichier, \' - \', document_numerise_type.libelle, \'",
10523     "id" : "\', document_numerise.document_numerise,\'"
10524     }\'
10525     )
10526     END,
10527     \', \'),
10528     \']\'
10529 softime 11585 ) AS instruction_annexe
10530     FROM
10531     %1$sinstruction_notification_document
10532     LEFT JOIN %1$sinstruction
10533     ON instruction_notification_document.instruction = instruction.instruction
10534     LEFT JOIN %1$sevenement
10535     ON instruction.evenement = evenement.evenement
10536     LEFT JOIN %1$sconsultation
10537     ON instruction_notification_document.document_id = consultation.consultation
10538     LEFT JOIN %1$sservice
10539     ON consultation.service = service.service
10540 softime 12433 LEFT JOIN %1$sdocument_numerise
10541     ON instruction_notification_document.document_id = document_numerise.document_numerise
10542     LEFT JOIN %1$sdocument_numerise_type
10543     ON document_numerise.document_numerise_type = document_numerise_type.document_numerise_type
10544 softime 11585 WHERE
10545     instruction_notification_document.annexe = \'t\'
10546     GROUP BY
10547     instruction_notification
10548     ) AS annexes
10549     ON
10550     annexes.instruction_notification = instruction_notification.instruction_notification
10551 softime 10808 WHERE
10552 softime 10869 instruction.instruction = %2$s
10553 softime 15835 %3$s
10554 softime 10869 ORDER BY
10555     date_envoi ASC, instruction_notification.destinataire ASC',
10556 softime 10808 DB_PREFIXE,
10557 softime 14542 intval($this->getVal('instruction')),
10558 softime 15037 $whereTypeTache,
10559     $sqlTaskNull
10560 softime 10808 );
10561 softime 14542 $qres = $this->f->get_all_results_from_db_query($sql, array(
10562     "origin" => __METHOD__
10563     )
10564     );
10565 softime 12433 // Préparation du lien de téléchargement des annexes
10566     $htmlList =
10567     '<style>
10568     #content .gridjs-td a.lien_annexe {
10569     text-decoration : underline dotted 1px;
10570     }
10571     #content a.lien_annexe:hover {
10572     text-decoration : underline solid 1px;
10573     color : #46aede;
10574     }
10575     ol {padding-left : 10px;}
10576     </style>
10577     <ol>%1$s</ol>';
10578     $lienTelechargement =
10579     '<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">
10580     Annexe
10581     </a>';
10582 softime 10808 // Stockage des infos de chaque notification dans un tableau
10583 softime 14542 foreach ($qres['result'] as $row) {
10584 softime 10808 $valNotif = array();
10585     foreach($listeChamps as $champ) {
10586     $valNotif[$champ] = $row[$champ];
10587 softime 10815 if (($champ === 'date_envoi'
10588     || $champ === 'date_premier_acces')
10589     && $row[$champ] !== null
10590     && $row[$champ] !== '') {
10591 softime 10814 //
10592     $valNotif[$champ] = date('d/m/Y H:i:s', strtotime($row[$champ]));
10593 softime 12433 } else if ($champ === 'annexes') {
10594     $listeAnnexe = '';
10595     $infoAnnexes = json_decode($row[$champ], true);
10596     if (! empty($infoAnnexes) && json_last_error() === JSON_ERROR_NONE) {
10597     // A partir des infos récupérées prépare le code html du lien vers chacune
10598     // des annexes et ajoute un élément de liste par annexe
10599     foreach($infoAnnexes as $annexe) {
10600     $listeAnnexe .= sprintf(
10601     '<li>%s</li>',
10602     sprintf($lienTelechargement,
10603     $annexe['obj'],
10604     $annexe['champs'],
10605     $annexe['id'],
10606     $annexe['label']
10607     )
10608     );
10609     }
10610     // Construction de la liste des annexes
10611     $valNotif[$champ] = sprintf(
10612     $htmlList,
10613     $listeAnnexe
10614     );
10615     }
10616 softime 10814 }
10617 softime 10808 }
10618     array_push($valSuivi, $valNotif);
10619     }
10620    
10621     // Passage du tableau au format json
10622     return json_encode($valSuivi, JSON_HEX_APOS);
10623     }
10624    
10625 softime 10573 /**
10626     * Traitement des erreurs retournées par l'abstracteur electronicsignature.
10627     *
10628     * @param electronicsignature_exception $exception Exception retournée par l'abstracteur.
10629     *
10630     * @return void
10631     */
10632     public function handle_electronicsignature_exception(electronicsignature_exception $exception) {
10633 softime 18769 $this->correct = false;
10634     $this->addToMessage($exception->getMessage());
10635 softime 10573 }
10636    
10637    
10638     /**
10639     * Retourne une instance du connecteur electronicsignature, et la créer si elle n'existe pas.
10640     *
10641     * @param boolean $with_handle_error Flag pour afficher ou non le message d'erreur à l'utilisateur.
10642     * @return electronicsignature Instance de l'abstracteur.
10643     */
10644     public function get_electronicsignature_instance($with_handle_error = true) {
10645     if(isset($this->electronicsignature_instance)) {
10646     return $this->electronicsignature_instance;
10647     }
10648     // Instanciation du connecteur electronicsignature
10649     try {
10650     require_once "electronicsignature.class.php";
10651     $collectivites = array("collectivite_idx" => $this->get_dossier_instruction_om_collectivite(), "collectivite_multi_idx" => $this->f->get_idx_collectivite_multi());
10652     $this->electronicsignature_instance = new electronicsignature($collectivites);
10653     } catch (electronicsignature_exception $e) {
10654     if ($with_handle_error === true) {
10655     $this->handle_electronicsignature_exception($e);
10656     }
10657     return false;
10658     }
10659     return $this->electronicsignature_instance;
10660     }
10661    
10662     /**
10663 softime 11418 * TREATMENT - envoyer_au_controle_de_legalite
10664     *
10665     * Ajoute la tâche envoi_CL.
10666     * C'est le traitement de la tâche qui mettra à jour la date d'envoi au contrôle de légalité.
10667     *
10668     * @return [type] [description]
10669     */
10670     function envoyer_au_controle_de_legalite() {
10671     $this->begin_treatment(__METHOD__);
10672     $this->correct = true;
10673    
10674     //
10675     if ($this->can_be_sended_to_cl() === true) {
10676     // Création de la task 'envoi_CL'
10677     $inst_task = $this->f->get_inst__om_dbform(array(
10678     "obj" => "task",
10679     "idx" => 0,
10680     ));
10681     $task_val = array(
10682     'type' => 'envoi_CL',
10683     'object_id' => $this->getVal('instruction'),
10684     'dossier' => $this->getVal('dossier'),
10685     );
10686     // Change l'état de la tâche de notification en fonction de l'état de
10687     // transmission du dossier d'instruction
10688     $inst_di = $this->get_inst_dossier($this->getVal('dossier'));
10689     if ($this->f->is_option_mode_service_consulte_enabled() === false
10690     && ($inst_di->getVal('etat_transmission_platau') == 'non_transmissible'
10691     || $inst_di->getVal('etat_transmission_platau') == 'transmis_mais_non_transmissible')) {
10692     //
10693 softime 18436 $task_val['state'] = task::STATUS_DRAFT;
10694 softime 11418 }
10695     $add_task = $inst_task->add_task(array('val' => $task_val));
10696     if ($add_task === false) {
10697     $this->addToMessage(sprintf('%s %s',
10698     __("Une erreur s'est produite lors de la création tâche."),
10699     __("Veuillez contacter votre administrateur.")
10700     ));
10701     $this->correct = false;
10702     return $this->end_treatment(__METHOD__, false);
10703     }
10704     // Mise à jour du champs 'envoye_cl_platau'
10705     $instr_val = array(
10706     'envoye_cl_platau' => 't',
10707     );
10708     $res = $this->f->db->autoExecute(
10709     DB_PREFIXE.$this->table,
10710     $instr_val,
10711     DB_AUTOQUERY_UPDATE,
10712     $this->getCle($this->getVal($this->clePrimaire))
10713     );
10714 softime 12124 $this->addToLog(__METHOD__."(): db->autoexecute(\"".DB_PREFIXE.'.'.$this->table."\", ".print_r($instr_val, true).", DB_AUTOQUERY_UPDATE, \"".$this->getCle($this->clePrimaire)."\");", VERBOSE_MODE);
10715 softime 11418 if ($this->f->isDatabaseError($res, true) === true) {
10716     $this->addToMessage(sprintf('%s %s',
10717     __("Une erreur s'est produite lors de la mise à jour de l'instruction."),
10718     __("Veuillez contacter votre administrateur.")
10719     ));
10720     $this->correct = false;
10721     return $this->end_treatment(__METHOD__, false);
10722     }
10723     // Message de validation à l'utilisateur
10724     $this->addToMessage(__('Votre demande de transfert au contrôle de légalité à bien été prise en compte.'));
10725     $this->addToMessage(__("La date d'envoi au contrôle de légalité sera mise à jour ultérieurement."));
10726     }
10727     //
10728     return $this->end_treatment(__METHOD__, true);
10729     }
10730    
10731    
10732     /**
10733 softime 8593 * Retourne le lien de retour (VIEW formulaire et VIEW sousformulaire).
10734     *
10735     * @param string $view Appel dans le contexte de la vue 'formulaire' ou de
10736     * la vue 'sousformulaire'.
10737     *
10738     * @return string
10739     */
10740     function get_back_link($view = "formulaire") {
10741     //
10742     $href = parent::get_back_link($view);
10743     //
10744     $crud = $this->get_action_crud();
10745 mbroquet 3730
10746 softime 8593 // Redirection vers le formulaire de modification à la validation du
10747     // formulaire d'ajout si l'événement associé possède une lettre type
10748     if (($crud === 'create'
10749     || ($crud === null
10750     && $this->getParameter('maj') == 0))
10751     && $this->correct == true
10752     && $this->evenement_has_an_edition($this->valF['evenement']) === true) {
10753 softime 7996
10754 softime 8593 // On instancie l'instruction
10755     $inst_instruction = $this->f->get_inst__om_dbform(array(
10756     "obj" => "instruction",
10757     "idx" => $this->valF[$this->clePrimaire],
10758     ));
10759    
10760     // Si l'instruction n'est pas finalisée automatiquement
10761     if ($inst_instruction->getVal('om_final_instruction') !== 't') {
10762     $href = str_replace("&action=3", "&action=1", $href);
10763     //
10764     if (strpos($href, "&retour=tab") !== false) {
10765     $href = str_replace("&retour=tab", "&retour= form", $href);
10766     } else {
10767     $href .= "&retour=form";
10768     }
10769     }
10770     }
10771    
10772     //
10773     return $href;
10774     }
10775    
10776 softime 10573 public function view_json_data() {
10777     $this->checkAccessibility();
10778     $this->f->disableLog();
10779     $view = $this->get_json_data();
10780     printf(json_encode($view));
10781     }
10782    
10783     public function get_json_data() {
10784     $val = array_combine($this->champs, $this->val);
10785     foreach ($val as $key => $value) {
10786     $val[$key] = strip_tags($value);
10787     }
10788     $val['tacite'] = 'f';
10789     $inst_ad = $this->f->get_inst__om_dbform(array(
10790     "obj" => "avis_decision",
10791     "idx" => $val['avis_decision'],
10792     ));
10793     if (preg_match('/[tT]acite/', $inst_ad->getVal('libelle')) === 1) {
10794     $val['tacite'] = 't';
10795     }
10796     return $val;
10797     }
10798    
10799 softime 13528 /**
10800     * Permet de récupérer l'identifiant de l'instruction sur le dossier, ayant
10801     * comme événement lié le suivant définit dans l'événement de l'instruction
10802     * instanciée.
10803     *
10804     * @param string $next_type Correspond aux trois déclenchement automatique
10805     * de création d'instruction paramétré sur un événement.
10806     * @param integer $instruction Identifiant de l'instruction à instancier.
10807     * @return mixed Identifiant de l'instruction recherchée ou false.
10808     */
10809 softime 11418 public function get_related_instructions_next($next_type = 'retour_signature', $instruction = null) {
10810     if (in_array($next_type, array('retour_signature', 'retour_ar', 'suivant_tacite', )) === false) {
10811     return false;
10812     }
10813     $result = array();
10814     $evenements = array();
10815     if ($instruction === null) {
10816     $instruction = $this->getVal($this->clePrimaire);
10817     $evenement = $this->getVal('evenement');
10818     $dossier = $this->getVal('dossier');
10819     } else {
10820     $inst = $this->f->get_inst__om_dbform(array(
10821     "obj" => "instruction",
10822     "idx" => $instruction,
10823     ));
10824     $evenement = $inst->getVal('evenement');
10825     $dossier = $inst->getVal('dossier');
10826     }
10827 softime 13528 // Récupération de l'identifiant de l'événement paramétré comme suivant
10828     // sur l'instruction instanciée
10829 softime 13137 $qres = $this->f->get_one_result_from_db_query(
10830     sprintf(
10831     'SELECT
10832     evenement_%3$s
10833     FROM
10834     %1$sevenement
10835     WHERE
10836     evenement = %2$s',
10837     DB_PREFIXE,
10838     intval($evenement),
10839     $next_type
10840     ),
10841     array(
10842     "origin" => __METHOD__,
10843     "force_return" => true,
10844     )
10845 softime 11418 );
10846 softime 13137 if ($qres["code"] !== "OK") {
10847 softime 11418 return false;
10848     }
10849 softime 13137 $ev_next = $qres["result"];
10850 softime 13528 // Récupération de l'instruction dans le dossier utilisant l'événement
10851     // suivant identifié dans la requête précédente
10852     $qres = $this->f->get_one_result_from_db_query(
10853 softime 13137 sprintf(
10854     'SELECT
10855     MAX(instruction.instruction) as instruction
10856     FROM
10857     %1$sinstruction
10858     WHERE
10859     dossier = \'%3$s\'
10860     AND evenement = %2$s',
10861     DB_PREFIXE,
10862     intval($ev_next),
10863 softime 14064 $this->f->db->escapeSimple($dossier)
10864 softime 13137 ),
10865     array(
10866     "origin" => __METHOD__,
10867     "force_return" => true,
10868     )
10869 softime 11418 );
10870 softime 13137 if ($qres["code"] !== "OK") {
10871 softime 11418 return false;
10872     }
10873 softime 13137 return $qres["result"];
10874 softime 11418 }
10875    
10876 softime 10573 public function get_related_instructions($instruction = null) {
10877     $result = array();
10878     $evenements = array();
10879     if ($instruction === null) {
10880     $instruction = $this->getVal($this->clePrimaire);
10881     $evenement = $this->getVal('evenement');
10882     $dossier = $this->getVal('dossier');
10883     } else {
10884     $inst = $this->f->get_inst__om_dbform(array(
10885     "obj" => "instruction",
10886     "idx" => $instruction,
10887     ));
10888     $evenement = $inst->getVal('evenement');
10889     $dossier = $inst->getVal('dossier');
10890     }
10891     //
10892 softime 13137 $qres = $this->f->get_one_result_from_db_query(
10893     sprintf(
10894     'SELECT
10895     evenement
10896     FROM
10897     %1$sevenement
10898     WHERE
10899     evenement_retour_ar = %2$s
10900     OR evenement_retour_signature = %2$s',
10901     DB_PREFIXE,
10902     intval($evenement)
10903     ),
10904     array(
10905     "origin" => __METHOD__,
10906     "force_return" => true,
10907     )
10908 softime 10573 );
10909 softime 13137 if ($qres["code"] !== "OK") {
10910 softime 10573 return false;
10911     }
10912 softime 13137 $ev_parent = $qres["result"];
10913 softime 10573 //
10914 softime 13137 $qres = $this->f->get_one_result_from_db_query(
10915     sprintf(
10916     'SELECT
10917     MAX(instruction.instruction) as instruction
10918     FROM
10919     %1$sinstruction
10920     WHERE
10921     dossier = \'%3$s\'
10922     AND evenement = %2$s',
10923     DB_PREFIXE,
10924     intval($ev_parent),
10925     $this->f->db->escapeSimple($dossier)
10926     ),
10927     array(
10928     "origin" => __METHOD__,
10929     "force_return" => true,
10930     )
10931 softime 10573 );
10932 softime 13137 if ($qres["code"] !== "OK") {
10933 softime 10573 return false;
10934     }
10935 softime 13137 $result[] = $qres["result"];
10936 softime 10573 //
10937 softime 13137 $qres = $this->f->get_one_result_from_db_query(
10938     sprintf(
10939     'SELECT
10940     evenement_retour_ar
10941     FROM
10942     %1$sevenement
10943     WHERE
10944 softime 14542 evenement = %2$d
10945     AND evenement_retour_ar != %3$d',
10946 softime 13137 DB_PREFIXE,
10947     intval($ev_parent),
10948     intval($evenement)
10949     ),
10950     array(
10951     "origin" => __METHOD__,
10952     "force_return" => true,
10953     )
10954 softime 10573 );
10955 softime 13137 if ($qres["code"] !== "OK") {
10956 softime 10573 return false;
10957     }
10958 softime 13137 $evenements[] = $qres["result"];
10959 softime 10573 //
10960 softime 13137 $qres = $this->f->get_one_result_from_db_query(
10961     sprintf(
10962     'SELECT
10963     evenement_retour_signature
10964     FROM
10965     %1$sevenement
10966     WHERE
10967     evenement = %2$s
10968     AND evenement_retour_signature != %3$s
10969     ',
10970     DB_PREFIXE,
10971     intval($ev_parent),
10972     intval($evenement)
10973     ),
10974     array(
10975     "origin" => __METHOD__,
10976     "force_return" => true,
10977     )
10978 softime 10573 );
10979 softime 13137 if ($qres["code"] !== "OK") {
10980 softime 10573 return false;
10981     }
10982 softime 13137 $evenements[] = $qres["result"];
10983 softime 10573 foreach ($evenements as $value) {
10984     if ($value !== null) {
10985 softime 13137 $qres = $this->f->get_one_result_from_db_query(
10986     sprintf(
10987     'SELECT
10988     MAX(instruction.instruction) as instruction
10989     FROM
10990     %1$sinstruction
10991     WHERE
10992     dossier = \'%3$s\'
10993     AND evenement = %2$s',
10994     DB_PREFIXE,
10995     intval($value),
10996     $this->f->db->escapeSimple($dossier)
10997     ),
10998     array(
10999     "origin" => __METHOD__,
11000     "force_return" => true,
11001     )
11002 softime 10573 );
11003 softime 13137 if ($qres["code"] !== "OK") {
11004 softime 10573 return false;
11005     }
11006 softime 13137 $result[] = $qres["result"];
11007 softime 10573 }
11008     }
11009     return $result;
11010     }
11011    
11012     protected function getDocumentType($champ = null) {
11013     $evenementId = $this->getVal('evenement');
11014     if (! empty($evenementId)) {
11015     $evenement = $this->f->findObjectById('evenement', $evenementId);
11016     if (! empty($evenement)) {
11017     return __("Instruction").':'.$evenement->getVal('libelle');
11018     }
11019     }
11020     return parent::getDocumentType();
11021     }
11022    
11023 softime 10808 /**
11024     * Récupère à l'aide d'une requête sql la liste des demandeurs
11025     * pouvant être notifié. C'est à dire les demandeurs acceptant
11026     * les notifications et pour lesquels une adresse mail existe.
11027     *
11028     * Dans le cas, d'une notification pour le portail citoyen, seul
11029     * le pétitionnaire principal doit être notifier et uniquement si
11030     * il a une adress mail et qu'il accepte les notifications.
11031     *
11032     * @param string identifiant du dossier
11033     * @param boolean true si il faut récupérer la liste des demandeurs notifiable
11034     * pour une notification de categorie portail
11035     * @return array liste des demandeurs pouvant être notifié
11036     */
11037 softime 18436 public function get_demandeurs_notifiable($idDossier = null, $portail = false) {
11038 softime 10808 if ($idDossier === null) {
11039     $idDossier = $this->getVal('dossier');
11040     }
11041     // Ajoute une condition sur le where pour ne récupérer que le pétitionnaire principal
11042     // pour une notification depuis le portail citoyen
11043     $sqlPetitionnairePrincipal = '';
11044 softime 12124 // Gestion des champs nécessaires pour la notification d'un demandeur
11045     $condition_demandeur = "AND demandeur.notification = 't'
11046     AND demandeur.courriel IS NOT NULL";
11047 softime 10808 if ($portail === true) {
11048     $sqlPetitionnairePrincipal = 'AND lien_dossier_demandeur.petitionnaire_principal = true';
11049 softime 12124 $condition_demandeur = "AND (
11050     (notification = 't' AND courriel IS NOT NULL)
11051     OR demande.source_depot = 'portal'
11052     )";
11053 softime 10808 }
11054    
11055     $listeDemandeursNotifiable = array();
11056    
11057     // Requête de récupération des demandeurs
11058 softime 14542 $qres = $this->f->get_all_results_from_db_query(
11059     sprintf(
11060     'SELECT
11061     demandeur.demandeur,
11062     CASE
11063     WHEN demandeur.qualite=\'particulier\'
11064     THEN TRIM(CONCAT(demandeur.particulier_nom, \' \', demandeur.particulier_prenom, \' \', demandeur.courriel))
11065     ELSE
11066     TRIM(CONCAT(demandeur.personne_morale_raison_sociale, \' \', demandeur.personne_morale_denomination, \' \', demandeur.courriel))
11067     END AS destinataire,
11068     demandeur.courriel,
11069     petitionnaire_principal
11070     FROM
11071     %1$sdossier
11072     INNER JOIN %1$slien_dossier_demandeur
11073     ON dossier.dossier = lien_dossier_demandeur.dossier
11074     INNER JOIN %1$sdemandeur
11075     ON lien_dossier_demandeur.demandeur = demandeur.demandeur
11076     -- Récupération de la plus ancienne demande associée au dossier (la demande
11077     -- de création du dossier)
11078     INNER JOIN (
11079     SELECT
11080     demande,
11081     dossier_instruction,
11082     source_depot
11083     FROM
11084     %1$sdemande
11085     WHERE
11086     dossier_instruction = \'%2$s\'
11087     ORDER BY
11088     demande ASC
11089     LIMIT 1
11090     ) as demande
11091     ON dossier.dossier = demande.dossier_instruction
11092     WHERE
11093     dossier.dossier = \'%2$s\'
11094     %3$s
11095     %4$s',
11096     DB_PREFIXE,
11097     $this->f->db->escapeSimple($idDossier),
11098     $condition_demandeur,
11099     $sqlPetitionnairePrincipal
11100     ),
11101     array(
11102     "origin" => __METHOD__
11103     )
11104 softime 10808 );
11105     // Récupération des infos des demandeurs et stockage dans un tableau
11106     // ayant pour clé les id des demandeurs
11107 softime 14542 foreach ($qres['result'] as $row) {
11108 softime 10869 $listeDemandeursNotifiable[$row['demandeur']] = $row;
11109 softime 10808 }
11110    
11111     return $listeDemandeursNotifiable;
11112     }
11113    
11114     /**
11115     * Renvoie la liste des notifications liées à l'instruction
11116     *
11117     * @param integer id de l'instruction dont on cherche les notifications
11118     * @return array liste des instruction_notification liés à l'instruction
11119     */
11120 softime 12124 public function get_instruction_notification($id_instruction, $typeNotification = null, $nonLieTache = false) {
11121 softime 18436 // Compose la clause définissant dans la requête le type de tâche attendus
11122     $clause_type_tache = '';
11123 softime 11585 if ($typeNotification != null) {
11124     if (is_array($typeNotification)) {
11125 softime 18436 $clause_type_tache = sprintf(
11126     'AND task.type IN (\'%1$s\')',
11127     implode("', '", $typeNotification),
11128 softime 11585 );
11129     } else {
11130 softime 18436 $clause_type_tache = sprintf(
11131     'AND task.type = \'%1$s\'',
11132 softime 15037 $typeNotification
11133 softime 11585 );
11134     }
11135     }
11136 softime 18436
11137     // Récupère les notifications liées à des tâches du type voulu et les stocke dans un tableau
11138 softime 14542 $qres = $this->f->get_all_results_from_db_query(
11139     sprintf('
11140     SELECT
11141     instruction_notification.instruction_notification
11142     FROM
11143     %1$sinstruction_notification
11144 softime 18436 INNER JOIN %1$stask
11145 softime 14542 ON instruction_notification.instruction_notification::CHARACTER VARYING = task.object_id
11146 softime 18436 %3$s
11147 softime 14542 WHERE
11148 softime 15037 instruction = %2$s',
11149 softime 14542 DB_PREFIXE,
11150     intval($id_instruction),
11151 softime 18436 $clause_type_tache
11152 softime 14542 ),
11153     array(
11154 softime 18436 "origin" => __METHOD__,
11155     'log_level' => DEBUG_MODE
11156 softime 14542 )
11157 softime 10808 );
11158 softime 18436 $listeInstrNotif = array();
11159 softime 14542 foreach ($qres['result'] as $row) {
11160 softime 10808 $listeInstrNotif[] = $row['instruction_notification'];
11161     }
11162 softime 18436
11163     // Défini si on veux que la requête récupère également les notifications qui n'ont pas
11164     // de tâches associées. C'est le cas pour les notifications de demandeurs lorsque la
11165     // notification du demandeur principal n'a pas pu être envoyée à cause d'un mauvais
11166     // paramétrage
11167     if(is_bool($nonLieTache) && $nonLieTache === true) {
11168     $qres = $this->f->get_all_results_from_db_query(
11169     sprintf('
11170     SELECT
11171     instruction_notification.instruction_notification
11172     FROM
11173     %1$sinstruction_notification
11174     LEFT JOIN %1$stask
11175     ON instruction_notification.instruction_notification::CHARACTER VARYING = task.object_id
11176     AND task.type LIKE \'%%notification%%\'
11177     WHERE
11178     instruction = %2$s
11179     AND task.task IS NULL',
11180     DB_PREFIXE,
11181     intval($id_instruction)
11182     ),
11183     array(
11184     "origin" => __METHOD__
11185     )
11186     );
11187    
11188     foreach ($qres['result'] as $row) {
11189     $listeInstrNotif[] = $row['instruction_notification'];
11190     }
11191     }
11192    
11193 softime 10808 return $listeInstrNotif;
11194     }
11195    
11196     /**
11197     * Crée une clé d'accès unique permettant à un utilisateur
11198     * anonyme de récupérer le document.
11199     *
11200     * @return string clé d'accès du document
11201     */
11202 softime 18436 function getCleAccesDocument() {
11203 softime 10869 // Initialisation d'un tableau
11204     $number_list = array();
11205    
11206     // Génération aléatoire d'un nombre sur 4 caractères, 4 fois
11207     for ($i = 0; $i < 4; $i++) {
11208     $number_list[] = str_pad(mt_rand(0, 9999), 4, 0, STR_PAD_LEFT);
11209     }
11210    
11211     // Transformation en chaîne tout en séparant les nombres par un "-"
11212     $result = implode('-', $number_list);
11213    
11214     // Vérifie si la clé existe déjà et si c'est le cas génére une nouvelle clé
11215     if ($this->getUidDocumentInstructionWithKey($result) != null) {
11216     return $this->getCleAccesDocument();
11217     }
11218    
11219     //
11220     return $result;
11221 softime 10808 }
11222    
11223     /**
11224 softime 10869 * Récupère une clé et renvoie l'uid du document liée à cette
11225     * clé. Si la clé n'existe pas renvoie null.
11226     *
11227     * @param string $cleGen clé dont on cherche l'instruction
11228     * @return integer|null
11229     */
11230     protected function getUidDocumentInstructionWithKey($cleGen) {
11231 softime 14064 $qres = $this->f->get_one_result_from_db_query(
11232     sprintf(
11233     'SELECT
11234     instruction.om_fichier_instruction
11235     FROM
11236     %1$sinstruction_notification_document
11237     LEFT JOIN %1$sinstruction
11238     ON instruction_notification_document.instruction = instruction.instruction
11239     WHERE
11240     instruction_notification_document.cle = \'%2$s\'',
11241     DB_PREFIXE,
11242     $this->f->db->escapeSimple($cleGen)
11243     ),
11244     array(
11245     "origin" => __METHOD__,
11246     )
11247 softime 10869 );
11248 softime 14064
11249     return $qres['result'];
11250 softime 10869 }
11251    
11252     /**
11253     * Récupère une clé, fait une requête pour récupérer l'id de la notification liée a cette clé.
11254     * Récupère l'instance de instruction_notification dont l'id a été récupéré et la renvoie.
11255     *
11256     * @param string $cleGen
11257     * @return instruction_notification
11258     */
11259     protected function getInstanceNotificationWithKey($key) {
11260 softime 14064 $qres = $this->f->get_one_result_from_db_query(
11261     sprintf(
11262     'SELECT
11263     instruction_notification
11264     FROM
11265     %1$sinstruction_notification_document
11266     WHERE
11267     cle = \'%2$s\'',
11268     DB_PREFIXE,
11269     $this->f->db->escapeSimple($key)
11270     ),
11271     array(
11272     "origin" => __METHOD__,
11273     )
11274 softime 10869 );
11275    
11276     // Récupération de l'instance de notification
11277     $instNotif = $this->f->get_inst__om_dbform(array(
11278     "obj" => "instruction_notification",
11279 softime 14064 "idx" => $qres['result'],
11280 softime 10869 ));
11281     return $instNotif;
11282     }
11283    
11284    
11285     /**
11286 softime 10808 * Affiche la page de téléchargement du document de la notification.
11287     *
11288     * @param boolean $content_only Affiche le contenu seulement.
11289     *
11290     * @return void
11291     */
11292 softime 10869 public function view_telecharger_document_anonym() {
11293 softime 10808 // Par défaut on considère qu'on va afficher le formulaire
11294     $idx = 0;
11295     // Flag d'erreur
11296     $error = false;
11297     // Message d'erreur
11298     $message = '';
11299    
11300 softime 10869 // Paramètres GET : récupération de la clé d'accès
11301     $cle_acces_document = $this->f->get_submitted_get_value('key');
11302 softime 10808 $cle_acces_document = $this->f->db->escapeSimple($cle_acces_document);
11303 softime 10869 // Vérification de l'existence de la clé et récupération de l'uid du fichier
11304     $uidFichier = $this->getUidDocumentInstructionWithKey($cle_acces_document);
11305     if ($uidFichier != null) {
11306     // Récupération du document
11307     $file = $this->f->storage->get($uidFichier);
11308 softime 10808
11309 softime 10869 // Headers
11310     header("Cache-Control: no-cache, must-revalidate"); // HTTP/1.1
11311     header("Expires: Sat, 26 Jul 1997 05:00:00 GMT"); // Date dans le passé
11312     header("Content-Type: ".$file['metadata']['mimetype']);
11313     header("Accept-Ranges: bytes");
11314     header("Content-Disposition: inline; filename=\"".$file['metadata']['filename']."\";" );
11315     // Affichage du document
11316     echo $file['file_content'];
11317 softime 10808
11318 softime 10869 // Récupération de la date de premier accès et maj du suivi uniquement
11319     // si la date de 1er accès n'a pas encore été remplis
11320     $inst_notif = $this->getInstanceNotificationWithKey($cle_acces_document);
11321     if ($inst_notif->getVal('date_premier_acces') == null ||
11322     $inst_notif->getVal('date_premier_acces') == '') {
11323     $notif_val = array();
11324     foreach ($inst_notif->champs as $champ) {
11325     $notif_val[$champ] = $inst_notif->getVal($champ);
11326     }
11327     $notif_val['date_premier_acces'] = date("d/m/Y H:i:s");
11328     $notif_val['statut'] = 'vu';
11329     $notif_val['commentaire'] = 'Le document a été vu';
11330     $suivi_notif = $inst_notif->modifier($notif_val);
11331 softime 10808 }
11332    
11333     } else {
11334 softime 10869 // Page vide 404
11335     printf('Ressource inexistante');
11336     header('HTTP/1.0 404 Not Found');
11337 softime 10808 }
11338     }
11339    
11340 softime 11228 /**
11341     * Récupère le titre du document envoyé au parapheur
11342     */
11343 softime 10808 protected function getDocumentTitre($champ = null) {
11344     $title = $this->getTitle();
11345     $dossier = $this->getDossier();
11346     return $dossier.' '.$title;
11347     }
11348    
11349 softime 10869 /**
11350     * Surcharge permettant de ne pas afficher le fil d'Ariane dans
11351     * l'overlay de notification des demandeurs.
11352     */
11353     function getSubFormTitle($ent) {
11354 softime 11876 $actionSansPath = array('411', '420', '430');
11355     if (in_array($this->getParameter('maj'), $actionSansPath)) {
11356 softime 10869 return '';
11357     }
11358     return parent::getSubFormTitle($ent);
11359     }
11360 softime 13137
11361     /**
11362     * Traitement de la notification automatique des tiers consulté.
11363     *
11364     * Récupère la liste des adresses mails des tiers notifiables. Pour chaque adresses
11365     * récupérées ajoute une notification et une tâche de notification par mail.
11366     * La création de la tâche de notification par mail déclenchera l'envoi du mail
11367     * et la mise à jour du suivi.
11368     *
11369     * Les tiers notifiables sont ceux :
11370     * - n’ayant pas un ID PLAT’AU correspondant à l’ID PLAT’AU du service consultant
11371     * - ayant une habilitation dont le type est listé dans les paramètres de
11372     * notification de l’événement,
11373     * - intervenant sur la commune ou le département du dossier
11374     * - ayant au moins une adresse mail valide
11375     *
11376     * @param evenement instance de l'événement associée à l'instruction
11377     * @param dossier instance du dossier de l'instruction
11378     * @return boolean indique si le traitement à réussi
11379     */
11380 softime 18436 public function traitement_notification_automatique_tiers_consulte($evenement, $dossier) {
11381 softime 13137 // Récupération de l'identifiant plat'au du service consultant
11382     $consultationEntrante = $dossier->get_inst_consultation_entrante();
11383     // Récupération de la liste des types d'habilitations autorisées pour
11384     // cette notification
11385     $typesHabilitationsNotifiable = $evenement->get_types_habilitation_notifiable();
11386     // Récupération du département et de la commune du dossier
11387     $commune = $dossier->getVal('commune');
11388     // Le département est récupéré à partir de la commune du dossier donc si la
11389     // commune n'a pas pu être récupéré on ne récupère pas non plus le département.
11390     $idDepartement = null;
11391     if (! empty($commune)) {
11392     $departement = $dossier->get_inst_departement_dossier();
11393     $idDepartement = $departement->getVal($departement->clePrimaire);
11394     }
11395     // Récupération des courriels des tiers notifiables
11396     $tiersANotifier = $this->get_courriels_tiers_notifiable(
11397     $typesHabilitationsNotifiable,
11398     $consultationEntrante->getVal('service_consultant_id'),
11399     $commune,
11400     $idDepartement
11401     );
11402     // Traitement de chacune des listes de diffusion pour extraire les
11403     // courriels, vérifier la validité des courriels et envoyer la
11404     // notification
11405     $notificationSend = false;
11406     if (empty($tiersANotifier)) {
11407     $this->addToLog(
11408     sprintf(
11409 softime 14542 '%s() : %s %s : %s',
11410 softime 13137 __METHOD__,
11411     __("La récupération des tiers à échoué."),
11412     __('Paramétrage'),
11413     var_export(
11414     array(
11415     'types_habilitations_notifiable' => $typesHabilitationsNotifiable,
11416     'service_consultant' => $consultationEntrante->getVal('service_consultant_id'),
11417     'id_commune' => $commune,
11418     'id_departement' => $idDepartement
11419     ),
11420     true
11421     )
11422     ),
11423     DEBUG_MODE
11424     );
11425     return false;
11426     }
11427     foreach($tiersANotifier as $tierANotifier) {
11428     // Découpe la liste de diffusion pour stocker les adresses mails
11429     // des tiers dans un tableau
11430     $courriels =
11431     array_filter(
11432     array_map(
11433     'trim',
11434     preg_split("/\r\n|\n|\r/", $tierANotifier['liste_diffusion'])));
11435    
11436     foreach ($courriels as $courriel) {
11437     // Pour chaque adresse mail vérifie si l'adresse est valide
11438     if (! $this->f->checkValidEmailAddress($courriel)) {
11439     continue;
11440     }
11441     $destinataire = array(
11442     'destinataire' => $tierANotifier['libelle'].' : '.$courriel,
11443     'courriel' => $courriel
11444     );
11445     // Si l'adresse est valide ajoute une nouvelle notification
11446     // et une tâche d'envoi de mails
11447     $idNotif = $this->ajouter_notification(
11448     $this->getVal($this->clePrimaire),
11449     $this->f->get_connected_user_login_name(),
11450     $destinataire,
11451     $this->get_dossier_instruction_om_collectivite(),
11452     array(),
11453     true
11454     );
11455     if ($idNotif === false) {
11456     $this->addToLog(
11457     __METHOD__.
11458     __("L'ajout de la notification a échoué."),
11459     DEBUG_MODE
11460     );
11461     return false;
11462     }
11463     // Création de la tache en lui donnant l'id de la notification
11464     $notification_by_task = $this->notification_by_task(
11465     $idNotif,
11466     $dossier->getVal('dossier'),
11467     'mail',
11468     'notification_tiers_consulte'
11469     );
11470     if ($notification_by_task === false) {
11471     $this->addToLog(
11472     __METHOD__.
11473     __("L'ajout de la tâche de notification a échoué."),
11474     DEBUG_MODE
11475     );
11476     $this->addToMessage(
11477     __("Erreur lors de la génération de la notification au(x) pétitionnaire(s).")
11478     );
11479     return false;
11480     }
11481     $notificationSend = true;
11482     }
11483     }
11484     // Si aucune notification n'a été envoyé car il n'y a pas de courriels
11485     // valide, affiche un message dans les logs pour avoir un suivi.
11486     if (! $notificationSend) {
11487     $this->addToLog(
11488     sprintf(
11489     '%s %s : %s %s : %s',
11490     __METHOD__,
11491     __("Il n'y a pas de tiers notifiable pour l'instruction"),
11492     $evenement->getVal('libelle'),
11493     __("du dossier"),
11494     $this->getVal('dossier')
11495     ),
11496     DEBUG_MODE
11497     );
11498     }
11499     return true;
11500     }
11501    
11502     /**
11503     * Récupère, à l'aide d'une requête, la liste de diffusion des tiers
11504     * respectant les conditions suvantes :
11505     * - le tiers consulté dois accepté les notifications
11506     * - la liste de diffusion ne dois pas être vide
11507     * - l'uid du tiers consulté ne dois pas être celui passé en paramètre
11508     * si pas d'uid passé en paramètre alors on ne filtre pas selon l'uid
11509     * du tiers
11510     * - le type d'habilitation des tiers dois appartenir à la liste
11511     * fournie en paramètre
11512     * - le tiers dois être associé à la commune ou au département passé
11513     * en paramètre
11514     *
11515     * @param array $typesHabilitations tableau contenant la liste des types d'habilitation
11516     * pouvant être notifiée
11517     * @param integer $idPlautau uid de l'acteur plat'au du dossier qui ne dois pas être notifié
11518     * @param integer $commune identifiant de la commune du dossier
11519     * @param integer $departement identifiant du département du dossier
11520     *
11521     * @return array listes de diffusion des tiers notifiable
11522     */
11523 softime 18436 public function get_courriels_tiers_notifiable(array $typesHabilitations, $idPlatau, $commune, $departement) {
11524 softime 13137 // Si paramètre non renseigné alors ne renvoie rien
11525     if (empty($typesHabilitations) || empty($commune) || empty($departement)) {
11526     return false;
11527     }
11528     // Si il n'y a pas d'acteur associé au dossier alors on ne filtre pas sur l'uid de l'acteur
11529     $filtreServiceConsulteDI = '';
11530     if (! empty($idPlatau)) {
11531     $filtreServiceConsulteDI = sprintf(
11532 softime 14064 "-- Filtre les tiers ayant une ligne correspondante a l uid platau du service
11533     -- en charge du dossier
11534     AND (tiers_consulte.uid_platau_acteur !~ ('\y' || '%s' || '\y')
11535     OR tiers_consulte.uid_platau_acteur IS NULL)",
11536 softime 13137 $this->f->db->escapeSimple($idPlatau)
11537     );
11538     }
11539     $rst = $this->f->get_all_results_from_db_query(
11540     sprintf(
11541     'SELECT
11542 softime 14064 -- Tiers notifiables lié à la commune du dossier
11543 softime 13137 tiers_consulte.liste_diffusion,
11544     tiers_consulte.libelle
11545     FROM
11546     %1$shabilitation_tiers_consulte
11547     LEFT JOIN %1$stiers_consulte
11548     ON habilitation_tiers_consulte.tiers_consulte = tiers_consulte.tiers_consulte
11549     LEFT JOIN %1$slien_habilitation_tiers_consulte_commune
11550     ON habilitation_tiers_consulte.habilitation_tiers_consulte = lien_habilitation_tiers_consulte_commune.habilitation_tiers_consulte
11551 softime 14064 -- Conservation uniquement des tiers acteur de dossiers
11552     JOIN %1$slien_dossier_tiers
11553     ON tiers_consulte.tiers_consulte = lien_dossier_tiers.tiers
11554     WHERE
11555     tiers_consulte.accepte_notification_email IS TRUE
11556     AND tiers_consulte.liste_diffusion IS NOT NULL
11557     %3$s
11558     AND habilitation_tiers_consulte.type_habilitation_tiers_consulte IN (%2$s)
11559     AND lien_habilitation_tiers_consulte_commune.commune = %4$d
11560     -- Filtre sur les tiers acteur du dossier
11561     AND lien_dossier_tiers.dossier = \'%6$s\'
11562     UNION
11563     SELECT
11564     -- Tiers notifiables lié au département du dossier
11565     tiers_consulte.liste_diffusion,
11566     tiers_consulte.libelle
11567     FROM
11568     %1$shabilitation_tiers_consulte
11569     LEFT JOIN %1$stiers_consulte
11570     ON habilitation_tiers_consulte.tiers_consulte = tiers_consulte.tiers_consulte
11571 softime 13137 LEFT JOIN %1$slien_habilitation_tiers_consulte_departement
11572     ON habilitation_tiers_consulte.habilitation_tiers_consulte = lien_habilitation_tiers_consulte_departement.habilitation_tiers_consulte
11573 softime 14064 -- Conservation uniquement des tiers acteur de dossiers
11574     JOIN %1$slien_dossier_tiers
11575     ON tiers_consulte.tiers_consulte = lien_dossier_tiers.tiers
11576 softime 13137 WHERE
11577     tiers_consulte.accepte_notification_email IS TRUE
11578     AND tiers_consulte.liste_diffusion IS NOT NULL
11579     %3$s
11580     AND habilitation_tiers_consulte.type_habilitation_tiers_consulte IN (%2$s)
11581 softime 14064 AND lien_habilitation_tiers_consulte_departement.departement = %5$d
11582     -- Filtre sur les tiers acteur du dossier
11583     AND lien_dossier_tiers.dossier = \'%6$s\'',
11584 softime 13137 DB_PREFIXE,
11585     implode(', ', $typesHabilitations),
11586     $filtreServiceConsulteDI,
11587     intval($commune),
11588 softime 14064 intval($departement),
11589     $this->f->db->escapeSimple($this->getVal('dossier'))
11590 softime 13137 ),
11591     array(
11592     "origin" => __METHOD__
11593     )
11594     );
11595 softime 14064 // Faire un order by sur un union ne fonctionne pas. A la place
11596     // c'est le tableau des résultats qui est ordonné.
11597     usort($rst['result'], function($a, $b) {
11598     return strcmp($a['libelle'], $b['libelle']);
11599     });
11600 softime 13137 return $rst['result'];
11601     }
11602 softime 17036
11603     /**
11604 softime 17542 * Gestion spécifique de l'affichage des documents dans le tableau des
11605     * documents d'instruction.
11606     * Prend en compte qu'une instruction peut également avoir un document lié
11607     * dans la table storage.
11608     *
11609     * @return void
11610 softime 17036 */
11611 softime 17542 public function view_telecharger_editions() {
11612     // Récupère l'identifiant du document dans l'URL appelant l'action
11613     $idx = $this->f->get_submitted_get_value('idx');
11614     $obj = $this->table;
11615     $champ = 'om_fichier_instruction';
11616     // Cas d'un document historisé (dans la table storage)
11617     if (strpos($idx, 'STORAGE_') !== false) {
11618     $idx = substr($idx, 8);
11619     $obj = 'storage';
11620     $champ = 'uid';
11621 softime 17036 }
11622 softime 17542 // Ouvre le document
11623     $lien = '../app/index.php?module=form&snippet=file&obj='.$obj.'&champ='.$champ.'&id='.$idx;
11624     header("Location: ".$lien);
11625     }
11626 softime 13137 }

Properties

Name Value
svn:keywords "Id"

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26